Runlight cuenta quién visita tu sitio y de dónde viene, desde dentro de tu propia aplicación, con cada cifra guardada en tu propia base de datos.
Runlight tiene licencia MIT y se configura con un paquete y una ruta, con un script de menos de 2 KB comprimido con gzip. No usa cookies y no guarda nada personal.
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
Las aplicaciones Laravel, Symfony y PHP sin framework en PHP 8.2 o posterior necesitan unas pocas líneas cada una, como muestra la documentación de PHP.
pip install runlight
Django, Flask, FastAPI y cualquier otra aplicación WSGI o ASGI en Python 3.11 o posterior necesitan unas pocas líneas cada una, como muestra la documentación de Python.
bundle add runlight
Después, una aplicación Rails ejecuta bin/rails generate runlight:install, como muestra la documentación de Rails. Sinatra, Hanami, Roda y otras aplicaciones Rack en Ruby 3.2 o posterior añaden un driver de base de datos como sqlite3, como muestra la documentación de Ruby.
go get runlight.sh/go modernc.org/sqlite
Cualquier aplicación net/http, chi o Echo en Go 1.25 o posterior necesita unas pocas líneas, y cualquier driver de database/sql puede sustituir a SQLite, como muestra la documentación de Go.
implementation("sh.runlight:runlight:0.1.1")
Esa línea es para Gradle, y Maven usa las mismas coordenadas. El servidor propio del JDK, los contenedores de servlets y Spring Boot en Java 21 o posterior necesitan unas pocas líneas cada uno, como muestra la documentación de Java.
dotnet add package Runlight.AspNetCore
Una aplicación ASP.NET Core en .NET 10 o posterior añade un driver como Microsoft.Data.Sqlite y llama a app.MapRunlight(), como muestra la documentación de .NET.
{:runlight, "~> 0.1"}
Añade esa línea a las deps de mix.exs. Una aplicación Phoenix o Plug en Elixir 1.18 o posterior guarda las tablas de Runlight en su propio repo de Ecto, como muestra la documentación de Elixir.
cargo add runlight runlight-sqlx --features runlight/axum,runlight-sqlx/sqlite
Runlight funciona sobre tokio detrás de axum, hyper o cualquier servidor que acepte un servicio tower, como muestra la documentación 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
Ejecútalo en una carpeta nueva junto a la raíz de tu web, apunta un dominio a public y añade una línea de cron, como muestra la documentación de PHP. Solo necesita PHP, sin Node.
pip install runlight && runlight
El comando runlight arranca el servidor en el puerto 3000 e imprime un enlace para crear tu cuenta, como muestra la documentación de Python.
bundle add runlight sqlite3 puma && bundle exec runlight serve
Ejecútalo en una carpeta nueva después de bundle init, como muestra la documentación de Ruby.
go install runlight.sh/go/cmd/runlight@latest
Después ejecuta runlight, que arranca el servidor en el puerto 3000, como muestra la documentación de Go.
java -cp runlight.jar:sqlite-jdbc.jar sh.runlight.server.Cli
Antes descarga de Maven Central el jar de runlight y el driver JDBC de tu base de datos, como muestra la documentación de Java.
dotnet tool install --global Runlight.Server
Después ejecuta runlight serve en una carpeta vacía, como muestra la documentación de .NET.
wp plugin install https://github.com/runlightsh/runlight/releases/latest/download/runlight.zip --activate
También puedes descargar el zip y subirlo en Plugins, Añadir nuevo plugin en WordPress.
composer require drupal/runlight
Composer trae la biblioteca de Runlight que el módulo necesita para ejecutar Runlight dentro de Drupal. Después actívalo en Ampliar o con drush pm:install runlight.
composer require runlight/craft
Después ejecuta php craft plugin/install runlight, o instálalo en Settings, Plugins en el Control Panel de Craft.
Pégalo en cualquier agente de código para configurar Runlight. El mismo prompt está en /prompt.txt.
Panel
Todo cabe en una página.
El panel se monta dentro de tu aplicación en /runlight. Su primera línea dice cuántas personas vinieron y cómo se compara con antes. Seis cifras están encima de un gráfico, y debajo están las páginas, fuentes, lugares, dispositivos, campañas y agentes de IA, donde un clic en cualquiera de ellos filtra todo lo demás.
Este es el panel tal como lo sirve el paquete, con un mes de un blog de demostración.
Instalación
La instalación son tres archivos en la aplicación que ya tienes.
Un archivo dice dónde viven las cifras, y una etiqueta de script en tu layout cuenta cada página. Entre ambos hay una ruta que sirve todo lo que está bajo /runlight, desde el script que recoge las visitas hasta el panel que las muestra. Como el script envía los datos a tu propio dominio, los bloqueadores de anuncios no tienen nada 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>Ese ejemplo es de Next.js. Nuxt, SvelteKit, Astro, Remix, Express, NestJS, Fastify, Koa, Hono, Bun, Deno y Cloudflare Workers necesitan unas pocas líneas cada uno, y la documentación tiene los pasos para cada framework. Runlight también está escrito para PHP, Python, Ruby, Go, Java, .NET, Elixir y Rust, así que una aplicación Laravel, Django, Rails, Phoenix, Spring Boot o ASP.NET Core obtiene el mismo panel con un paquete en su propio lenguaje. Define RUNLIGHT_TOKEN y abre /runlight para iniciar sesión.
Privacidad
Cuenta personas sin saber quiénes son.
Cada día, a medianoche en la zona horaria de tu sitio, Runlight crea una nueva sal aleatoria. Un visitante es un hash de esa sal, tu sitio, su dirección IP y el user agent de su navegador, recortado a 64 bits. La dirección y el user agent nunca se guardan, y una sal se borra como mucho a los cuatro días, así que a partir de entonces nadie, ni siquiera tú, puede saber si dos visitas vinieron de la misma persona.
Runlight no usa cookies y no guarda nada en los navegadores de tus visitantes, así que no hay nada que poner en un banner. Lo único que el script escribe en el almacenamiento local es una marca de exclusión que puedes poner en tu propio navegador para que no se cuenten tus visitas.
- visitante
- a6fbd78a579b03bf
- llegó
- 2026-10-06 18:29 UTC, en /blog/building-runlight
- se quedó
- 3 páginas vistas, 4 min 27 s de atención, salió desde /
- vino de
- Hacker News (Redes sociales), news.ycombinator.com
- lugar
- New York, US-NY, US
- dispositivo
- escritorio, Windows 10, Edge 129, 1920x1080, en-US
Esto es todo lo que Runlight guarda de una visita de la demo. Nunca guarda la dirección IP ni el user agent, y ningún identificador que guarda dura más de un día. La documentación de privacidad explica cómo funciona.
Fuentes
Sabe cuándo una visita vino de ChatGPT.
Runlight convierte los referentes en fuentes que reconoces y agrupa esas fuentes en canales como búsqueda, redes sociales, correo, campañas e IA. El canal IA reúne a las personas que llegaron haciendo clic desde ChatGPT, Claude, Perplexity, Gemini y los demás. Los clics que pasan por los rastreadores de boletines o por el webmail cuentan como correo.
Los agentes de IA que acceden a tus páginas para responder a una pregunta nunca ejecutan JavaScript, así que ningún tracker los ve. Runlight los cuenta con una línea de middleware, rl.observe(request).




En directo
La vista en directo muestra lo que está pasando ahora mismo.
Haz clic en “ahora mismo” para ver la última media hora minuto a minuto, las páginas en las que está la gente, de dónde vino y una lista continua de lo que hizo. Se actualiza cada diez segundos.


Objetivos
Runlight cuenta las conversiones y lo que valieron.
Un objetivo puede ser un evento que envías o una página a la que llega alguien (/thanks* funciona). También puede ser un clic en algo, que no necesita código. Después de pulsar “Elegir en mi sitio” y hacer clic en el botón de tu propia página, Runlight lo cuenta a partir de ese momento.
Dale a un objetivo un valor fijo o lee el importe del evento, y el recuadro muestra los ingresos de cada objetivo, desglosados por fuente y página.
Los objetivos se calculan cuando los consultas, así que un objetivo de evento o de página que añades hoy cuenta también el mes pasado.


Enlaces
Los enlaces cortos en tu propio dominio se cuentan como visitas.
Crea t.example.com/sale desde el panel y cada clic se cuenta con su fuente, país, dispositivo y campaña. Runlight maneja miles de enlaces. Trae los tuyos desde Umami, Dub, Bitly, Short.io, Rebrandly o un CSV, con su historial de clics cuando el servicio lo comparte.


Informes
El correo semanal se lee como el panel.
Elige quién recibe un resumen semanal o mensual, cada uno en su propio idioma. Sale desde tu propia dirección a través del servicio de correo que ya usas, y cada correo permite darse de baja con un clic. Las claves se guardan cifradas y nunca se vuelven a mostrar.


Este es el correo semanal del sitio de demostración, que se vuelve claro u oscuro según la aplicación de correo de quien lo lee.
Además
Runlight también cubre el resto de lo que esperarías.
- Compartir
- Un enlace privado de solo lectura abre el panel de un sitio, y deja de funcionar cuando lo borras.
- Comparar
- Puedes comparar un rango con el periodo anterior o con los mismos días de un año antes, y puedes elegir tú las fechas de comparación.
- Filtros
- Puedes combinar filtros por página, fuente, campaña, país, ciudad, dispositivo, navegador y más.
- Idiomas
- El panel y los correos están en inglés, francés, español, alemán y portugués.
- Sitios
- Una instalación puede contar varios sitios, que distingue por nombre de host.
- Almacenes
- En un servidor Runlight usa SQLite, Postgres, MySQL, MariaDB o el SQLite propio de Bun, y en el edge usa Turso o Cloudflare D1.
- API
- Todo lo que hay en el panel está disponible como JSON en
/runlight/api. - Pregunta a tu IA
- Claude, Cursor y otras aplicaciones que hablan MCP pueden responder preguntas sobre tus estadísticas con un token de solo lectura. Mira cómo conectar una.
Por qué
Tu analítica puede vivir en la aplicación que sirve tus páginas.
Runlight cuenta desde la aplicación que ya tienes en marcha y guarda las cifras en la base de datos de la que ya haces copias de seguridad. Sabes qué páginas lee la gente y de dónde viene mientras cada visita se queda en tus propios servidores, y el coste no cambia por mucho que crezca tu tráfico.
Nunca guarda nada que pueda decir quién era un visitante, así que no tienes que añadir un banner de cookies ni confiar tus visitantes a un tercero. Los datos son tuyos desde la primera visita, y se quedan en una base de datos que puedes consultar o borrar cuando quieras.
Cuenta tu primera visita en unos cinco minutos.