O localhostly é uma alternativa grátis ao LocalXpose
Se você está saindo do LocalXpose, é isto que você recebe: um comando, uma URL HTTPS pública e uma conta grátis sem plano pago por trás. Rode localhostly 3000 e a porta 3000 responde em https://brave-amber-fox.localhostly.iblabs.io, atrás de NAT. O cadastro só pede um e-mail: 2 túneis, 1000 requisições por minuto e 25 GiB por mês.
Pegue seu token Instale o localhostly
$ localhostly 3000 https://brave-amber-fox.localhostly.iblabs.io → http://127.0.0.1:3000 Ctrl+C to stop. Requests: 21:14:03 GET / 200 12ms 21:14:05 POST /api/webhook 201 31ms
A conta grátis em números
Há uma conta só e ela é grátis: sem plano pago nem cartão por trás. Os limites dela são os cinco números abaixo. O limite de tráfego soma os dois sentidos; o mês vira no dia 1, em UTC. Ao chegar a um limite, o visitante recebe uma página 429 que nomeia o limite e diz quando ele acaba.
- 2 túneis abertos ao mesmo tempo; o nome reservado não conta
- 1000 requisições por minuto, numa janela deslizante de 60 segundos
- 25 GiB de tráfego por mês, nos dois sentidos
- R$ 0 por mês, sem pedir cartão
- 429 ao passar de um limite, com o cabeçalho
Retry-After
Um comando, uma URL pública
localhostly 3000 abre uma conexão WebSocket de saída do seu computador para o servidor do localhostly e a mantém; nada é aberto no seu roteador nem no firewall. Quando um visitante abre a sua URL, o servidor lê o nome no endereço, manda a requisição por essa conexão, e o agente a reproduz na sua porta local e devolve a resposta em stream. Passam HTTP e WebSocket.
- Pegue um token. Digite seu e-mail no formulário de cadastro. O token aparece na página de cadastro; nenhum e-mail de confirmação é enviado.
- Salve o token.
localhostly login <token>o guarda em~/.localhostly/config.json, legível só pelo seu usuário. - Abra o túnel.
localhostly 3000. O terminal mostra a URL pública e, depois, uma linha por requisição: hora, método, caminho, status e milissegundos.
O seu app recebe o método, o caminho, os cabeçalhos e o corpo do visitante, com X-Forwarded-For, X-Forwarded-Proto: https e X-Forwarded-Host. Use --host meuapp.test:3000 para mandar outro endereço e outro Host a ele. O nome vem de um sorteio de 3 palavras em inglês, adjetivo, cor e animal, e ninguém o escolhe.
O túnel fica aberto enquanto o agente responde aos pings
O túnel fica aberto enquanto o agente responde aos pings do servidor: um a cada 30 segundos, e a conexão é fechada depois de 60 segundos sem resposta. Numa medição, um túnel ocioso por 620 segundos não caiu.
Se a conexão cair, o agente reconecta sozinho, esperando 1 segundo e dobrando até 60 segundos, e recupera o mesmo nome por 10 minutos depois da queda; depois de uma queda mais longa ele volta com um nome novo e escreve name changed. Para ele seguir de pé depois de reiniciar o computador, instale-o como serviço do sistema, abaixo.
Webhooks e clientes de API pulam a página de aviso
O navegador vê uma página de aviso na primeira visita, dizendo que o site roda no computador de alguém; o botão dela grava um cookie por 24 horas. Uma chamada de webhook, um curl ou qualquer cliente de API não é um navegador e não recebe página de aviso: a requisição chega direto ao seu app, e qualquer outro cliente a pula com o cabeçalho X-Localhostly-Skip-Warning.
Cole https://<nome>.localhostly.iblabs.io/<seu caminho> nas configurações de webhook do provedor, e cada chamada aparece no seu terminal com método, caminho, status e tempo.
Respostas em stream e uploads grandes passam
O corpo da requisição viaja em pedaços de até 64 KiB, nos dois sentidos, e nunca fica inteiro na memória. A medição mandou um upload de 20 MiB com o pico de memória abaixo de 100 MiB e entregou um download de 20 MiB a um visitante lento do mesmo jeito.
Server-Sent Events chegam ao visitante conforme o seu app os escreve: num stream medido, eventos escritos em 0, 3 e 6 segundos chegaram em 0,6 s, 3,6 s e 6,6 s. O seu app tem 60 segundos para mandar o primeiro byte; depois disso não há prazo, por isso downloads longos passam. O WebSocket do visitante chega ao seu app, e o upgrade só completa quando o seu app o aceita, com o subprotocolo que ele escolheu.
Tranque o túnel com senha ou lista de IPs
Com --password todo visitante precisa digitar uma senha na caixa de login do navegador; sem valor, o localhostly gera uma de 12 caracteres e a mostra só no seu terminal. O seu app nunca vê o cabeçalho Authorization do visitante.
Com --allow 203.0.113.7,10.0.0.0/8 só esses endereços IP ou faixas entram, IPv4 ou IPv6, até 64 entradas; qualquer outro endereço recebe uma página 403 que o mostra, e o upgrade de WebSocket dele também recebe 403. Um túnel com --allow não mostra página de aviso, e com --password junto o visitante precisa dos dois.
- O registro do servidor guarda método, caminho sem a query, status, tempo, nome do túnel e conta, nunca o corpo de uma requisição nem um cookie.
- Do nosso lado, o token existe só como o hash SHA-256 dele.
- O HTTPS termina no balanceador do localhostly: o servidor do localhostly vê e repassa o seu tráfego, então não é criptografia de ponta a ponta.
Deixe o túnel como serviço do sistema
localhostly service install 3000 instala o túnel como serviço do sistema: systemd no Linux, launchd no macOS, serviço do Windows. Ele reconecta sozinho, lembra o nome e o pede de novo depois de reiniciar, e continua tentando se o servidor recusar. localhostly service status diz se ele está rodando; localhostly service uninstall o remove.
Instalar
O localhostly roda no Node.js 24 ou mais novo.
-
Teste sem instalar:
npx localhostly 3000 -
Instale de vez:
npm i -g localhostly
Depois, salve o token com localhostly login <token>, e localhostly 3000 abre o túnel.
Pegue seu token
O cadastro pede um e-mail e nada mais, e não há plano a escolher: o token aparece na página de cadastro, sem e-mail de confirmação, e localhostly login <token> o salva no seu computador.