O Runlight conta quem visita seu site e de onde as pessoas vieram, de dentro do seu próprio app, com cada número guardado no seu próprio banco de dados.
O Runlight tem licença MIT e se configura com um pacote e uma rota, com um script de menos de 2 KB com gzip. Ele não define cookies e não guarda nada pessoal.
npm install @runlight/sdk better-sqlite3
pnpm add @runlight/sdk better-sqlite3
yarn add @runlight/sdk better-sqlite3
bun add @runlight/sdk better-sqlite3
composer require runlight/runlight
Apps em Laravel, Symfony e PHP puro, no PHP 8.2 ou mais recente, pedem poucas linhas cada, como mostram as docs de PHP.
pip install runlight
Django, Flask, FastAPI e qualquer outro app WSGI ou ASGI, no Python 3.11 ou mais recente, pedem poucas linhas cada, como mostram as docs de Python.
bundle add runlight
Um app Rails então roda bin/rails generate runlight:install, como mostram as docs de Rails. Sinatra, Hanami, Roda e outros apps Rack, no Ruby 3.2 ou mais recente, adicionam um driver de banco de dados como sqlite3, como mostram as docs de Ruby.
go get runlight.sh/go modernc.org/sqlite
Qualquer app net/http, chi ou Echo, no Go 1.25 ou mais recente, pede poucas linhas, e qualquer driver database/sql pode substituir o SQLite, como mostram as docs de Go.
implementation("sh.runlight:runlight:0.1.1")
Essa linha é para o Gradle, e o Maven usa as mesmas coordenadas. O servidor do próprio JDK, servlet containers e Spring Boot, no Java 21 ou mais recente, pedem poucas linhas cada, como mostram as docs de Java.
dotnet add package Runlight.AspNetCore
Um app ASP.NET Core, no .NET 10 ou mais recente, adiciona um driver como Microsoft.Data.Sqlite e chama app.MapRunlight(), como mostram as docs de .NET.
{:runlight, "~> 0.1"}
Adicione essa linha às deps em mix.exs. Um app Phoenix ou Plug, no Elixir 1.18 ou mais recente, guarda as tabelas do Runlight no próprio repo Ecto, como mostram as docs de Elixir.
cargo add runlight runlight-sqlx --features runlight/axum,runlight-sqlx/sqlite
O Runlight roda sobre tokio atrás de axum, hyper ou qualquer servidor que aceite um tower service, como mostram as docs de Rust.
docker run -p 3000:3000 -v runlight:/data ghcr.io/runlightsh/runlight
npx runlight.sh
composer require runlight/runlight && cp -r vendor/runlight/runlight/standalone public
Rode isso numa pasta nova ao lado da raiz do seu site, aponte um domínio para public e adicione uma linha de cron, como mostram as docs de PHP. Ele só precisa de PHP, sem Node.
pip install runlight && runlight
O comando runlight inicia o servidor na porta 3000 e mostra um link para criar sua conta, como mostram as docs de Python.
bundle add runlight sqlite3 puma && bundle exec runlight serve
Rode isso numa pasta nova depois de bundle init, como mostram as docs de Ruby.
go install runlight.sh/go/cmd/runlight@latest
Depois rode runlight, que inicia o servidor na porta 3000, como mostram as docs de Go.
java -cp runlight.jar:sqlite-jdbc.jar sh.runlight.server.Cli
Baixe antes o jar runlight e o driver JDBC do seu banco de dados do Maven Central, como mostram as docs de Java.
dotnet tool install --global Runlight.Server
Depois rode runlight serve numa pasta vazia, como mostram as docs de .NET.
wp plugin install https://github.com/runlightsh/runlight/releases/latest/download/runlight.zip --activate
Você também pode baixar o zip e enviá-lo em Plugins, Adicionar novo, no WordPress.
composer require drupal/runlight
O Composer traz a biblioteca do Runlight de que o módulo precisa para rodar o Runlight dentro do Drupal. Depois ative-o em Estender ou com drush pm:install runlight.
composer require runlight/craft
Depois rode php craft plugin/install runlight, ou instale-o em Settings, Plugins no Control Panel do Craft.
Cole-o em qualquer agente de código para configurar o Runlight. O mesmo prompt está em /prompt.txt.
Painel
Tudo cabe numa página só.
O painel é montado dentro do seu app em /runlight. A primeira linha diz quantas pessoas vieram e como isso se compara com antes. Seis números ficam acima de um gráfico, e abaixo deles estão as páginas, origens, locais, dispositivos, campanhas e agentes de IA, onde um clique em qualquer um deles filtra todo o resto.
Este é o painel do jeito que o pacote o serve, mostrando um mês de um blog de demonstração.
Instalação
A configuração leva três arquivos no app que você já tem.
Um arquivo diz onde os números ficam, e uma tag de script no seu layout conta cada página. Entre os dois fica uma rota que serve tudo em /runlight, do script que coleta as visitas ao painel que as mostra. Como o script envia os dados para o seu próprio domínio, os bloqueadores de anúncios não têm o que bloquear.
lib/runlight.ts
import { runlight } from "@runlight/sdk";
import { sqlite } from "@runlight/sdk/sqlite"; // or postgres
export const rl = runlight({
store: sqlite({ path: "./data/runlight.db" }),
site: { hostnames: ["example.com"], timezone: "Europe/London" },
});app/runlight/[[...path]]/route.ts
import { rl } from "@/lib/runlight";
export const { GET, POST, PUT, PATCH, DELETE, OPTIONS } = rl.routes();app/layout.tsx
<script defer src="/runlight/s.js"></script>Esse exemplo é em Next.js. Nuxt, SvelteKit, Astro, Remix, Express, NestJS, Fastify, Koa, Hono, Bun, Deno e Cloudflare Workers pedem poucas linhas cada, e as docs têm os passos para cada framework. O Runlight também foi escrito para PHP, Python, Ruby, Go, Java, .NET, Elixir e Rust, então um app Laravel, Django, Rails, Phoenix, Spring Boot ou ASP.NET Core recebe o mesmo painel de um pacote na própria linguagem. Defina RUNLIGHT_TOKEN e abra /runlight para entrar.
Privacidade
Ele conta as pessoas sem saber quem elas são.
Todo dia, à meia-noite no fuso horário do seu site, o Runlight cria um novo salt aleatório. Um visitante é um hash desse salt, do seu site, do endereço IP da pessoa e do user agent do navegador dela, truncado em 64 bits. O endereço e o user agent nunca são gravados, e um salt é apagado em até quatro dias, então a partir daí ninguém, nem você, consegue dizer se duas visitas vieram da mesma pessoa.
O Runlight não define cookies e não guarda nada nos navegadores dos seus visitantes, então não há nada para pôr num banner. A única coisa que o script grava no armazenamento local é uma marcação de exclusão que você pode definir no seu próprio navegador, para que suas visitas não sejam contadas.
- visitante
- a6fbd78a579b03bf
- chegou
- 2026-10-06 18:29 UTC, em /blog/building-runlight
- ficou
- 3 visualizações, 4m 27s de engajamento, saiu por /
- veio de
- Hacker News (Redes sociais), news.ycombinator.com
- local
- New York, US-NY, US
- dispositivo
- computador, Windows 10, Edge 129, 1920x1080, en-US
Isto é tudo o que o Runlight guarda sobre uma visita da demonstração. Ele nunca guarda o endereço IP nem o user agent, e nenhum identificador que ele guarda dura mais de um dia. As docs de privacidade explicam como funciona.
Origens
Ele sabe quando uma visita veio do ChatGPT.
O Runlight transforma referências em origens que você reconhece e agrupa essas origens em canais como busca, redes sociais, e-mail, campanhas e IA. O canal IA reúne as pessoas que clicaram a partir do ChatGPT, Claude, Perplexity, Gemini e dos demais. Os cliques que passam por rastreadores de newsletter ou webmail contam como e-mail.
Os agentes de IA que leem suas páginas para responder a uma pergunta nunca rodam JavaScript, então nenhum script de rastreamento os vê. O Runlight os conta com uma linha de middleware, rl.observe(request).




Ao vivo
A visão ao vivo mostra o que está acontecendo agora.
Clique em “agora” para ver a última meia hora minuto a minuto, as páginas em que as pessoas estão, de onde vieram e uma lista contínua do que fizeram. Ela se atualiza a cada dez segundos.


Metas
O Runlight conta as conversões e quanto elas valeram.
Uma meta pode ser um evento que você envia ou uma página a que alguém chega (/thanks* funciona). Também pode ser um clique em algo, que não precisa de código. Depois que você aperta “Escolher no meu site” e clica no botão na sua própria página, o Runlight passa a contá-lo a partir dali.
Dê a uma meta um valor fixo ou leia o valor do evento, e o quadro mostra a receita de cada meta, dividida por origem e página.
As metas são calculadas quando você as lê, então uma meta de evento ou de página que você adiciona hoje conta o mês passado também.


Links
Links curtos no seu próprio domínio são contados como visitas.
Crie t.example.com/sale pelo painel e cada clique é contado com a origem, o país, o dispositivo e a campanha. O Runlight dá conta de milhares de links. Traga os seus do Umami, Dub, Bitly, Short.io, Rebrandly ou de um CSV, com o histórico de cliques quando o serviço o compartilha.


Relatórios
O e-mail semanal se lê como o painel.
Escolha quem recebe um resumo semanal ou mensal, cada um no próprio idioma. Ele sai do seu próprio endereço pelo serviço de e-mail que você já usa, e todo e-mail tem um link para cancelar a inscrição com um clique. As chaves são guardadas criptografadas e nunca são mostradas de novo.


Este é o e-mail semanal do site de demonstração, que fica claro ou escuro conforme o app de e-mail de quem lê.
Também
O Runlight também cobre o resto do que você esperaria.
- Compartilhamento
- Um link privado e só de leitura abre o painel de um site, e ele para de funcionar quando você o apaga.
- Comparação
- Você pode comparar um período com o anterior ou com os mesmos dias do ano anterior, e pode escolher você mesmo as datas da comparação.
- Filtros
- Você pode combinar filtros de página, origem, campanha, país, cidade, dispositivo, navegador e mais.
- Idiomas
- O painel e os e-mails estão em inglês, francês, espanhol, alemão e português.
- Sites
- Uma instalação pode contar vários sites, diferenciados pelo nome do host.
- Stores
- Num servidor o Runlight usa SQLite, Postgres, MySQL, MariaDB ou o SQLite do próprio Bun, e no edge usa Turso ou Cloudflare D1.
- API
- Tudo o que está no painel está disponível em JSON em
/runlight/api. - Pergunte à sua IA
- Claude, Cursor e outros apps que falam MCP podem responder a perguntas sobre suas estatísticas com um token só de leitura. Veja como conectar um.
Por quê
Seu analytics pode viver no app que serve suas páginas.
O Runlight faz a contagem no app que você já roda e guarda os números no banco de dados de que você já faz backup. Você descobre quais páginas as pessoas leem e de onde vieram enquanto cada visita fica nos seus próprios servidores, e o custo continua o mesmo, por mais que seu tráfego cresça.
Ele nunca guarda nada que possa dizer quem foi um visitante, então você não tem banner de cookies para adicionar nem terceiros a quem confiar seus visitantes. Os dados são seus desde a primeira visita e ficam num banco de dados que você pode consultar ou apagar quando quiser.
Conte sua primeira visita em cerca de cinco minutos.