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
pnpm add @runlight/sdk better-sqlite3
yarn add @runlight/sdk better-sqlite3
bun add @runlight/sdk better-sqlite3
composer require runlight/runlight
Apps mit Laravel, Symfony oder reinem PHP ab PHP 8.2 brauchen jeweils ein paar Zeilen, die die PHP-Doku zeigt.
pip install runlight
Django, Flask, FastAPI und jede andere WSGI- oder ASGI-App ab Python 3.11 brauchen jeweils ein paar Zeilen, die die Python-Doku zeigt.
bundle add runlight
Eine Rails-App führt danach bin/rails generate runlight:install aus, wie die Rails-Doku zeigt. Sinatra, Hanami, Roda und andere Rack-Apps ab Ruby 3.2 fügen einen Datenbanktreiber wie sqlite3 hinzu, wie die Ruby-Doku zeigt.
go get runlight.sh/go modernc.org/sqlite
Jede net/http-App, chi oder Echo ab Go 1.25 braucht ein paar Zeilen, und jeder database/sql-Treiber kann SQLite ersetzen, wie die Go-Doku zeigt.
implementation("sh.runlight:runlight:0.1.1")
Diese Zeile ist für Gradle, und Maven nimmt dieselben Koordinaten. Der eigene Server des JDK, Servlet-Container und Spring Boot ab Java 21 brauchen jeweils ein paar Zeilen, die die Java-Doku zeigt.
dotnet add package Runlight.AspNetCore
Eine ASP.NET-Core-App ab .NET 10 fügt einen Treiber wie Microsoft.Data.Sqlite hinzu und ruft app.MapRunlight() auf, wie die .NET-Doku zeigt.
{:runlight, "~> 0.1"}
Füge diese Zeile zu den Deps in mix.exs hinzu. Eine Phoenix- oder Plug-App ab Elixir 1.18 hält die Tabellen von Runlight in ihrem eigenen Ecto-Repo, wie die Elixir-Doku zeigt.
cargo add runlight runlight-sqlx --features runlight/axum,runlight-sqlx/sqlite
Runlight läuft auf tokio hinter axum, hyper oder jedem Server, der einen Tower-Service annimmt, wie die Rust-Doku zeigt.
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
Führ es in einem neuen Ordner neben deinem Web-Root aus, lass eine Domain auf public zeigen und füge eine Cron-Zeile hinzu, wie die PHP-Doku zeigt. Es braucht nur PHP, kein Node.
pip install runlight && runlight
Der Befehl runlight startet den Server auf Port 3000 und gibt einen Link aus, über den du dein Konto anlegst, wie die Python-Doku zeigt.
bundle add runlight sqlite3 puma && bundle exec runlight serve
Führ es in einem neuen Ordner nach bundle init aus, wie die Ruby-Doku zeigt.
go install runlight.sh/go/cmd/runlight@latest
Führ dann runlight aus, das den Server auf Port 3000 startet, wie die Go-Doku zeigt.
java -cp runlight.jar:sqlite-jdbc.jar sh.runlight.server.Cli
Lade vorher das runlight-Jar und den JDBC-Treiber deiner Datenbank von Maven Central herunter, wie die Java-Doku zeigt.
dotnet tool install --global Runlight.Server
Führ dann runlight serve in einem leeren Ordner aus, wie die .NET-Doku zeigt.
wp plugin install https://github.com/runlightsh/runlight/releases/latest/download/runlight.zip --activate
Du kannst auch das Zip herunterladen und es in WordPress unter Plugins, Neues Plugin hinzufügen hochladen.
composer require drupal/runlight
Composer bringt die Runlight-Bibliothek mit, die das Modul braucht, um Runlight in Drupal auszuführen. Aktiviere es dann unter Erweitern oder mit drush pm:install runlight.
composer require runlight/craft
Führ dann php craft plugin/install runlight aus, oder installiere es im Craft-Control-Panel unter Settings, Plugins.
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.
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).




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.


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.


Links
Kurzlinks auf deiner eigenen Domain werden wie Besuche gezählt.
Erstelle t.example.com/sale im Dashboard, und jeder Klick wird mit Quelle, Land, Gerät und Kampagne gezählt. Runlight kommt mit Tausenden von Links zurecht. Hol deine aus Umami, Dub, Bitly, Short.io, Rebrandly oder einer CSV herüber, mit ihrem Klickverlauf, sofern der Dienst ihn teilt.


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.


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.