Runlight zählt, wer deine Website besucht und woher die Leute kommen, direkt aus deiner eigenen App heraus, und jede Zahl bleibt in deiner eigenen Datenbank.

Runlight steht unter der MIT-Lizenz und braucht zur Einrichtung ein Paket und eine Route, dazu ein Skript, das gzip-komprimiert unter 2 KB bleibt. Es setzt keine Cookies und speichert nichts Persönliches.

npm install @runlight/sdk better-sqlite3

Füge ihn in einen beliebigen Coding-Agenten ein, damit er Runlight einrichtet. Denselben Prompt gibt es unter /prompt.txt.

Dashboard

Alles passt auf eine Seite.

Das Dashboard wird in deiner App unter /runlight eingebunden. Seine erste Zeile sagt, wie viele Leute gekommen sind und wie das im Vergleich zu vorher aussieht. Sechs Zahlen stehen über einem Diagramm, und darunter folgen Seiten, Quellen, Orte, Geräte, Kampagnen und KI-Agenten, wobei ein Klick auf einen beliebigen Eintrag alles andere filtert.

Ein Runlight-Dashboard, das zeigt, dass in den letzten 30 Tagen 6.696 Personen die Website besucht haben, 36 % mehr als in den 30 Tagen davor. Karten für Besucher, Besuche, Seitenaufrufe, Seiten pro Besuch, Absprungrate und Besuchsdauer stehen über einem Diagramm der Besucher pro Tag. Dasselbe Dashboard im hellen Design.

So liefert das Paket das Dashboard aus, hier mit einem Monat eines Demo-Blogs.

Installation

Die Einrichtung braucht drei Dateien in der App, die du schon hast.

Eine Datei sagt, wo die Zahlen liegen, und ein Script-Tag in deinem Layout zählt jede Seite. Dazwischen sitzt eine Route, die alles unter /runlight ausliefert, vom Skript, das Besuche sammelt, bis zum Dashboard, das sie zeigt. Weil das Skript an deine eigene Domain sendet, haben Werbeblocker nichts zu blockieren.

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>

Dieses Beispiel ist Next.js. Nuxt, SvelteKit, Astro, Remix, Express, NestJS, Fastify, Koa, Hono, Bun, Deno und Cloudflare Workers brauchen jeweils ein paar Zeilen, und die Doku hat die Schritte für jedes Framework. Runlight gibt es außerdem für PHP, Python, Ruby, Go, Java, .NET, Elixir und Rust, sodass eine App mit Laravel, Django, Rails, Phoenix, Spring Boot oder ASP.NET Core dasselbe Dashboard aus einem Paket in ihrer eigenen Sprache bekommt. Setze RUNLIGHT_TOKEN und öffne /runlight, um dich anzumelden.

Datenschutz

Es zählt Menschen, ohne zu wissen, wer sie sind.

Jeden Tag um Mitternacht in der Zeitzone deiner Website erzeugt Runlight einen neuen zufälligen Salt. Ein Besucher ist ein Hash aus diesem Salt, deiner Website, seiner IP-Adresse und dem User-Agent seines Browsers, gekürzt auf 64 Bit. Adresse und User-Agent werden nie aufgeschrieben, und ein Salt wird innerhalb von vier Tagen gelöscht. Ab dann kann niemand, auch du nicht, sagen, ob zwei Besuche von derselben Person kamen.

Runlight setzt keine Cookies und speichert nichts in den Browsern deiner Besucher, es gibt also nichts, was in ein Banner müsste. Das Einzige, was das Skript je in den lokalen Speicher schreibt, ist ein Opt-out-Flag, das du in deinem eigenen Browser setzen kannst, damit deine Besuche nicht gezählt werden.

Besucher
a6fbd78a579b03bf
angekommen
2026-10-06 18:29 UTC, auf /blog/building-runlight
geblieben
3 Seitenaufrufe, 4m 27s aktiv, gegangen von /
kam von
Hacker News (Soziale Medien), news.ycombinator.com
Ort
New York, US-NY, US
Gerät
desktop, Windows 10, Edge 129, 1920x1080, en-US

Das ist alles, was Runlight über einen Besuch aus der Demo behält. Es behält nie die IP-Adresse oder den User-Agent, und keine Kennung, die es behält, hält länger als einen Tag. Die Doku zum Datenschutz erklärt, wie das funktioniert.

Quellen

Es weiß, wenn ein Besuch von ChatGPT kam.

Runlight macht aus Verweisen Quellen, die du wiedererkennst, und fasst diese Quellen zu Kanälen wie Suche, soziale Medien, E-Mail, Kampagnen und KI zusammen. Im Kanal KI landen Leute, die sich von ChatGPT, Claude, Perplexity, Gemini und den übrigen herübergeklickt haben. Klicks, die über Newsletter-Tracker oder Webmail laufen, zählen als E-Mail.

KI-Agenten, die deine Seiten abrufen, um eine Frage zu beantworten, führen nie JavaScript aus, daher sieht sie kein Tracker. Runlight zählt sie mit einer Zeile Middleware, rl.observe(request).

Die Box Quellen zeigt Kanäle als farbigen Balken mit Organische Suche, Soziale Medien, Direkt, KI, E-Mail, Verweise und Kampagne.
Die Box KI-Agenten zeigt, welche Agenten Seiten abgerufen haben, aufgeteilt in Agenten, die für eine Person lesen, und Crawler.

Live

Die Live-Ansicht zeigt, was gerade jetzt passiert.

Klick auf „gerade hier“, um die letzte halbe Stunde Minute für Minute zu sehen, die Seiten, auf denen Leute gerade sind, woher sie kamen und einen laufenden Verlauf dessen, was sie getan haben. Die Ansicht aktualisiert sich alle zehn Sekunden.

Die Live-Ansicht zeigt 10 Personen auf der Website, Seitenaufrufe pro Minute, die gerade aktiven Seiten, Quellen und Länder und einen Verlauf wie Jemand in Portland, Vereinigte Staaten hat /about angesehen, über ChatGPT.

Ziele

Runlight zählt Conversions und was sie wert waren.

Ein Ziel kann ein Ereignis sein, das du sendest, oder eine Seite, die jemand erreicht (/thanks* funktioniert). Es kann auch ein Klick auf etwas sein, und das braucht keinen Code. Nachdem du auf „Auf meiner Website wählen“ gedrückt und auf deiner eigenen Seite den Button angeklickt hast, zählt Runlight ihn ab diesem Moment.

Gib einem Ziel einen festen Wert oder lies den Betrag aus dem Ereignis, dann zeigt die Box den Umsatz für jedes Ziel, aufgeschlüsselt nach Quelle und Seite.

Ziele werden berechnet, wenn du sie liest. Ein Ereignis- oder Seitenziel, das du heute hinzufügst, zählt also auch den letzten Monat.

Die Box Conversions listet Read the Runlight post, Newsletter signup, Purchase und Email me auf, jeweils mit Rate und Anzahl, und 6.309 $ Umsatz in der Überschrift.

Berichte

Die wöchentliche E-Mail liest sich wie das Dashboard.

Wähle, wer eine wöchentliche oder monatliche Zusammenfassung bekommt, jeweils in der eigenen Sprache. Sie geht von deiner eigenen Adresse über den E-Mail-Dienst raus, den du schon nutzt, und jede E-Mail lässt sich mit einem Klick abbestellen. Schlüssel werden verschlüsselt gespeichert und nie wieder angezeigt.

Amazon SESResendPostmarkSendGridMailgunBrevoMailjetMailerSendSparkPostSMTPWebhook
Eine wöchentliche Bericht-E-Mail, die sagt, dass letzte Woche 1.438 Personen die Website besucht haben, gefolgt von sechs Kennzahlen, Top-Seiten, Quellen, Ländern und Conversions.

Das ist die wöchentliche E-Mail für die Demo-Website. Sie wird hell oder dunkel, passend zur Mail-App des Lesers.

Außerdem

Runlight deckt auch alles andere ab, was du erwarten würdest.

Teilen
Ein privater, schreibgeschützter Link öffnet das Dashboard einer Website und funktioniert nicht mehr, sobald du ihn löschst.
Vergleichen
Du kannst einen Zeitraum mit dem Zeitraum davor oder denselben Tagen ein Jahr früher vergleichen, und du kannst die Vergleichsdaten selbst wählen.
Filter
Du kannst Filter auf Seite, Quelle, Kampagne, Land, Stadt, Gerät, Browser und mehr kombinieren.
Sprachen
Das Dashboard und die E-Mails gibt es auf Englisch, Französisch, Spanisch, Deutsch und Portugiesisch.
Websites
Eine Installation kann mehrere Websites zählen und unterscheidet sie am Hostnamen.
Stores
Auf einem Server nutzt Runlight SQLite, Postgres, MySQL, MariaDB oder das eigene SQLite von Bun, und am Edge nutzt es Turso oder Cloudflare D1.
API
Alles im Dashboard gibt es als JSON unter /runlight/api.
Frag deine KI
Claude, Cursor und andere Apps, die MCP sprechen, können mit einem Lese-Token Fragen zu deinen Statistiken beantworten. So verbindest du eine App.

Warum

Deine Analyse kann in der App leben, die deine Seiten ausliefert.

Runlight zählt in der App, die du schon betreibst, und hält die Zahlen in der Datenbank, die du schon sicherst. Du erfährst, welche Seiten Leute lesen und woher sie kamen, während jeder Besuch auf deinen eigenen Servern bleibt, und die Kosten bleiben gleich, egal wie stark dein Traffic wächst.

Es behält nie etwas, das verraten könnte, wer ein Besucher war. Du musst also kein Cookie-Banner einbauen und keinem Dritten deine Besucher anvertrauen. Die Daten gehören dir vom ersten Besuch an, und sie bleiben in einer Datenbank, die du abfragen oder löschen kannst, wann immer du willst.

Zähl deinen ersten Besuch in etwa fünf Minuten.