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

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.

Um painel do Runlight mostrando que 6.696 pessoas visitaram o site nos últimos 30 dias, 36% a mais que nos 30 dias anteriores. Cartões de visitantes, visitas, visualizações, páginas por visita, taxa de rejeição e duração da visita ficam acima de um gráfico de visitantes por dia. O mesmo painel no modo claro.

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).

O quadro Origens mostra os canais como uma barra colorida com Busca orgânica, Redes sociais, Direto, IA, E-mail, Referências e Campanha.
O quadro Agentes de IA mostra quais agentes leram páginas, separados entre agentes que leem para uma pessoa e crawlers.

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.

A visão ao vivo mostra 10 pessoas no site, as visualizações por minuto, as páginas, origens e países ativos agora e uma lista com entradas como Alguém em Portland, Estados Unidos viu /about vindo de ChatGPT.

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.

O quadro Conversões lista Read the Runlight post, Newsletter signup, Purchase e Email me, cada uma com uma taxa e uma contagem, com US$ 6.309 de receita no título.

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.

Amazon SESResendPostmarkSendGridMailgunBrevoMailjetMailerSendSparkPostSMTPWebhook
Um e-mail de relatório semanal dizendo que 1.438 pessoas visitaram o site na semana passada, seguido de seis métricas, páginas principais, origens, países e conversões.

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.