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

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.

Un tableau de bord Runlight qui montre que 6 696 personnes ont visité le site ces 30 derniers jours, 36 % de plus que les 30 jours précédents. Des cartes pour les visiteurs, les visites, les pages vues, les pages par visite, le taux de rebond et la durée de visite sont placées au-dessus d’un graphique des visiteurs par jour. Le même tableau de bord en thème clair.

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

Le bloc Sources montre les canaux sous forme de barre colorée avec Recherche naturelle, Réseaux sociaux, Direct, IA, E-mail, Sites référents et Campagne.
Le bloc Agents IA montre quels agents ont récupéré des pages, répartis entre les agents qui lisent pour une personne et les crawlers.

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.

La vue en direct montre 10 personnes sur le site, les pages vues par minute, les pages, sources et pays actifs en ce moment, et un fil comme Quelqu’un à Portland, États-Unis a vu /about depuis ChatGPT.

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.

Le bloc Conversions liste Read the Runlight post, Newsletter signup, Purchase et Email me, chacun avec un taux et un nombre, et 6 309 $ de revenus dans l’en-tête.

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.

Amazon SESResendPostmarkSendGridMailgunBrevoMailjetMailerSendSparkPostSMTPWebhook
Un e-mail de rapport hebdomadaire qui indique que 1 438 personnes ont visité le site la semaine dernière, suivi de six métriques, des pages, sources et pays principaux, et des conversions.

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.