Runlight compte qui visite votre site et d’où viennent ces visites, depuis votre propre application, en gardant chaque chiffre dans votre propre base de données.
Runlight est sous licence MIT et s’installe avec un paquet et une route, plus un script de moins de 2 Ko compressé avec gzip. Il ne pose aucun cookie et ne stocke rien de personnel.
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
Les applications Laravel, Symfony et PHP pur sur PHP 8.2 ou plus récent demandent chacune quelques lignes, que montre la documentation PHP.
pip install runlight
Django, Flask, FastAPI et toute autre application WSGI ou ASGI sur Python 3.11 ou plus récent demandent chacune quelques lignes, que montre la documentation Python.
bundle add runlight
Une application Rails lance ensuite bin/rails generate runlight:install, comme le montre la documentation Rails. Sinatra, Hanami, Roda et les autres applications Rack sur Ruby 3.2 ou plus récent ajoutent un pilote de base de données comme sqlite3, comme le montre la documentation Ruby.
go get runlight.sh/go modernc.org/sqlite
Toute application net/http, chi ou Echo sur Go 1.25 ou plus récent demande quelques lignes, et n’importe quel pilote database/sql peut remplacer SQLite, comme le montre la documentation Go.
implementation("sh.runlight:runlight:0.1.1")
Cette ligne est pour Gradle, et Maven prend les mêmes coordonnées. Le serveur intégré au JDK, les conteneurs de servlets et Spring Boot sur Java 21 ou plus récent demandent chacun quelques lignes, que montre la documentation Java.
dotnet add package Runlight.AspNetCore
Une application ASP.NET Core sur .NET 10 ou plus récent ajoute un pilote comme Microsoft.Data.Sqlite et appelle app.MapRunlight(), comme le montre la documentation .NET.
{:runlight, "~> 0.1"}
Ajoutez cette ligne aux deps de mix.exs. Une application Phoenix ou Plug sur Elixir 1.18 ou plus récent garde les tables de Runlight dans son propre repo Ecto, comme le montre la documentation Elixir.
cargo add runlight runlight-sqlx --features runlight/axum,runlight-sqlx/sqlite
Runlight tourne sur tokio derrière axum, hyper ou tout serveur qui accepte un service tower, comme le montre la documentation 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
Lancez cette commande dans un nouveau dossier à côté de la racine de votre site, faites pointer un domaine vers public et ajoutez une ligne de cron, comme le montre la documentation PHP. Il suffit de PHP, sans Node.
pip install runlight && runlight
La commande runlight démarre le serveur sur le port 3000 et affiche un lien pour créer votre compte, comme le montre la documentation Python.
bundle add runlight sqlite3 puma && bundle exec runlight serve
Lancez cette commande dans un nouveau dossier après bundle init, comme le montre la documentation Ruby.
go install runlight.sh/go/cmd/runlight@latest
Lancez ensuite runlight, qui démarre le serveur sur le port 3000, comme le montre la documentation Go.
java -cp runlight.jar:sqlite-jdbc.jar sh.runlight.server.Cli
Téléchargez d’abord le jar runlight et le pilote JDBC de votre base de données depuis Maven Central, comme le montre la documentation Java.
dotnet tool install --global Runlight.Server
Lancez ensuite runlight serve dans un dossier vide, comme le montre la documentation .NET.
wp plugin install https://github.com/runlightsh/runlight/releases/latest/download/runlight.zip --activate
Vous pouvez aussi télécharger le zip et le téléverser sous Extensions, Ajouter une extension dans WordPress.
composer require drupal/runlight
Composer apporte la bibliothèque Runlight dont le module a besoin pour faire tourner Runlight dans Drupal. Activez-le ensuite sous Étendre ou avec drush pm:install runlight.
composer require runlight/craft
Lancez ensuite php craft plugin/install runlight, ou installez-le sous Settings, Plugins dans le panneau de contrôle de Craft.
Collez-le dans n’importe quel agent de code pour installer Runlight. Le même prompt se trouve sur /prompt.txt.
Tableau de bord
Tout tient sur une seule page.
Le tableau de bord se monte dans votre application sous /runlight. Sa première ligne dit combien de personnes sont venues et comment cela se compare à la période d’avant. Six chiffres sont placés au-dessus d’un graphique, et en dessous se trouvent les pages, les sources, les lieux, les appareils, les campagnes et les agents IA, où un clic sur n’importe quel élément filtre tout le reste.
Voici le tableau de bord tel que le paquet le sert, avec un mois d’un blog de démonstration.
Installation
L’installation tient en trois fichiers dans l’application que vous avez déjà.
Un fichier dit où vivent les chiffres, et une balise script dans votre layout compte chaque page. Entre les deux se trouve une route qui sert tout ce qui est sous /runlight, du script qui collecte les visites au tableau de bord qui les affiche. Comme le script envoie ses données à votre propre domaine, les bloqueurs de publicité n’ont rien à bloquer.
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>Cet exemple utilise Next.js. Nuxt, SvelteKit, Astro, Remix, Express, NestJS, Fastify, Koa, Hono, Bun, Deno et Cloudflare Workers demandent chacun quelques lignes, et la documentation donne les étapes pour chaque framework. Runlight est aussi écrit en PHP, Python, Ruby, Go, Java, .NET, Elixir et Rust, donc une application Laravel, Django, Rails, Phoenix, Spring Boot ou ASP.NET Core obtient le même tableau de bord grâce à un paquet dans son propre langage. Définissez RUNLIGHT_TOKEN et ouvrez /runlight pour vous connecter.
Confidentialité
Il compte les gens sans savoir qui ils sont.
Chaque jour, à minuit dans le fuseau horaire de votre site, Runlight crée un nouveau sel aléatoire. Un visiteur est un hachage de ce sel, de votre site, de son adresse IP et du user agent de son navigateur, réduit à 64 bits. L’adresse et le user agent ne sont jamais écrits nulle part, et un sel est supprimé dans les quatre jours. À partir de là, personne, vous compris, ne peut savoir si deux visites venaient de la même personne.
Runlight ne pose aucun cookie et ne stocke rien dans le navigateur de vos visiteurs, il n’y a donc rien à mettre dans un bandeau. La seule chose que le script écrit jamais dans le stockage local est un marqueur d’exclusion que vous pouvez poser dans votre propre navigateur, pour que vos visites ne soient pas comptées.
- visiteur
- a6fbd78a579b03bf
- arrivée
- 2026-10-06 18:29 UTC, sur /blog/building-runlight
- séjour
- 3 pages vues, 4 min 27 s d’attention, sortie par /
- provenance
- Hacker News (Réseaux sociaux), news.ycombinator.com
- lieu
- New York, US-NY, US
- appareil
- ordinateur, Windows 10, Edge 129, 1920x1080, en-US
Voici tout ce que Runlight garde d’une visite de la démo. Il ne garde jamais l’adresse IP ni le user agent, et aucun identifiant qu’il garde ne dure plus d’un jour. La documentation sur la confidentialité explique comment cela fonctionne.
Sources
Il sait quand une visite vient de ChatGPT.
Runlight transforme les référents en sources que vous reconnaissez et regroupe ces sources en canaux comme la recherche, les réseaux sociaux, l’e-mail, les campagnes et l’IA. Le canal IA réunit les personnes qui ont cliqué depuis ChatGPT, Claude, Perplexity, Gemini et les autres. Les clics qui passent par des traceurs de newsletter ou par un webmail comptent comme e-mail.
Les agents IA qui récupèrent vos pages pour répondre à une question n’exécutent jamais de JavaScript, donc aucun traceur ne les voit. Runlight les compte avec une ligne de middleware, rl.observe(request).




En direct
La vue en direct montre ce qui se passe en ce moment.
Cliquez sur « en ce moment » pour voir la dernière demi-heure minute par minute, les pages où se trouvent les gens, leur provenance et un fil continu de ce qu’ils ont fait. La vue se met à jour toutes les dix secondes.


Objectifs
Runlight compte les conversions et ce qu’elles ont rapporté.
Un objectif peut être un événement que vous envoyez ou une page que quelqu’un atteint (/thanks* fonctionne). Ce peut aussi être un clic sur un élément, sans aucun code. Une fois que vous avez appuyé sur « Choisir sur mon site » puis cliqué sur le bouton dans votre propre page, Runlight le compte à partir de ce moment.
Donnez à un objectif une valeur fixe ou lisez le montant dans l’événement, et le bloc affiche les revenus de chaque objectif, répartis par source et par page.
Les objectifs sont calculés au moment où vous les lisez, donc un objectif d’événement ou de page ajouté aujourd’hui compte aussi le mois dernier.


Liens
Les liens courts sur votre propre domaine sont comptés comme des visites.
Créez t.example.com/sale depuis le tableau de bord, et chaque clic est compté avec sa source, son pays, son appareil et sa campagne. Runlight gère des milliers de liens. Importez les vôtres depuis Umami, Dub, Bitly, Short.io, Rebrandly ou un CSV, avec leur historique de clics quand le service le partage.


Rapports
L’e-mail hebdomadaire se lit comme le tableau de bord.
Choisissez qui reçoit un résumé hebdomadaire ou mensuel, chacun dans sa propre langue. Il part de votre propre adresse via le service d’e-mail que vous utilisez déjà, et chaque e-mail permet de se désabonner en un clic. Les clés sont stockées chiffrées et ne sont plus jamais affichées.


Voici l’e-mail hebdomadaire du site de démonstration, qui passe en clair ou en sombre selon l’application de messagerie du lecteur.
Aussi
Runlight couvre aussi tout le reste de ce que vous attendez.
- Partage
- Un lien privé en lecture seule ouvre le tableau de bord d’un site, et il cesse de fonctionner quand vous le supprimez.
- Comparaison
- Vous pouvez comparer une période à la période précédente ou aux mêmes jours un an plus tôt, et vous pouvez choisir vous-même les dates de comparaison.
- Filtres
- Vous pouvez combiner des filtres sur la page, la source, la campagne, le pays, la ville, l’appareil, le navigateur et plus encore.
- Langues
- Le tableau de bord et les e-mails existent en anglais, français, espagnol, allemand et portugais.
- Sites
- Une seule installation peut compter plusieurs sites, distingués par leur nom d’hôte.
- Stockage
- Sur un serveur, Runlight utilise SQLite, Postgres, MySQL, MariaDB ou le SQLite intégré de Bun, et sur l’edge il utilise Turso ou Cloudflare D1.
- API
- Tout ce qui figure sur le tableau de bord est disponible en JSON sous
/runlight/api. - Interrogez votre IA
- Claude, Cursor et les autres applications qui parlent MCP peuvent répondre à vos questions sur vos statistiques avec un jeton en lecture seule. Voyez comment en connecter une.
Pourquoi
Vos statistiques peuvent vivre dans l’application qui sert vos pages.
Runlight compte depuis l’application que vous faites déjà tourner et garde les chiffres dans la base de données que vous sauvegardez déjà. Vous apprenez quelles pages les gens lisent et d’où ils viennent, tandis que chaque visite reste sur vos propres serveurs, et le coût ne bouge pas, quelle que soit la croissance de votre trafic.
Il ne garde jamais rien qui permettrait de savoir qui était un visiteur, vous n’avez donc aucun bandeau cookies à ajouter ni aucun tiers à qui confier vos visiteurs. Les données vous appartiennent dès la première visite, et elles restent dans une base de données que vous pouvez interroger ou supprimer quand vous voulez.
Comptez votre première visite en cinq minutes environ.