Nur die Endpunkte, die Flimmer wirklich braucht, samt der Felder, die uns interessieren. Antworten werden zehn Minuten zwischengespeichert, damit Tippen im Suchfeld nicht jedes Zeichen einzeln nach draußen trägt. Zugang wahlweise über den klassischen API-Schlüssel oder das Bearer-Token — TMDB gibt beides aus, und Selbsthoster haben mal das eine, mal das andere.
Serien und Filme tracken — selbst gehostet, ohne fremde Konten.
Episodenfortschritt, eigene Universen mit mehreren Reihenfolgen, Statistiken
und Benachrichtigungen, wenn es weitergeht.
Flimmer ist ein selbst hostbarer Tracker für Serien und Filme — benannt nach der Flimmerkiste und dem warmen Flimmern, das ein Bildschirm im dunklen Zimmer verbreitet. Metadaten kommen von TMDB, die Daten bleiben auf deinem Server.
Was Flimmer kann
- Tracking — Serien und Filme mit Status (Schaue gerade, Pausiert, Abgeschlossen, Abgebrochen, Watchlist), Episodenfortschritt einzeln oder staffelweise, „+1 Episode"-Knopf, Rewatch-Zählung, Bewertung, Notizen, Tags.
- Universen — MCU, Star Wars, Wizarding World … beliebige Filme und Serien in einem Universum bündeln, mit mehreren Reihenfolgen (Erscheinung, Story-Chronologie, Einsteiger-Route) und Gesamtfortschritt.
- Metadaten von TMDB — Suche, Poster, Staffeln und Episoden, offizielle Collections, Streaming-Verfügbarkeit in deiner Region.
- Benachrichtigungen — bei neuen Episoden und Releases, per E-Mail, ntfy, Gotify oder Webhook (Discord/Slack-kompatibel), pro Nutzer einstellbar.
- Mehrere Nutzer — jede Person hat ihre eigene Bibliothek; Universen lassen sich teilen. Der erste registrierte Zugang wird Administrator.
- REST-API und PWA — dokumentierte Schnittstelle mit eigenen API-Schlüsseln, installierbar auf dem Startbildschirm.
Schnellstart
Voraussetzungen: Docker und Docker Compose.
git clone https://git.wilde-server.de/florian.wilde/flimmer.git
cd flimmer
cp .env.example .env
In der .env mindestens diese drei Werte setzen:
POSTGRES_PASSWORD=ein-langes-zufaelliges-passwort
AUTH_SECRET=noch-ein-langes-zufaelliges-geheimnis
APP_URL=https://flimmer.example.com
Geheimnisse erzeugen:
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
Dann starten:
docker compose up -d
Flimmer läuft auf http://localhost:3000. Der erste Zugang, der sich registriert, wird automatisch Administrator — lege ihn also gleich an. Danach lässt sich die Registrierung in der Verwaltung schließen.
TMDB-Schlüssel
Ohne TMDB findet die Suche keine Metadaten. Der Schlüssel ist kostenlos:
- Konto auf themoviedb.org anlegen
- Unter Einstellungen → API einen Schlüssel beantragen
- In die
.enveintragen unddocker compose up -derneut ausführen:
TMDB_API_KEY=dein-schluessel
TMDB_REGION=DE
TMDB_LANGUAGE=de-DE
Betrieb hinter einem Reverse Proxy
APP_URL muss auf die öffentliche Adresse zeigen — daraus werden Links in
Benachrichtigungen und der OIDC-Rücksprung gebildet. Als Healthcheck eignet
sich /api/health; der Endpunkt prüft auch die Datenbankverbindung.
Beispiel für Caddy:
flimmer.example.com {
reverse_proxy flimmer:3000
}
Aktualisieren
cd flimmer
git pull
docker compose build
docker compose up -d
Datenbankmigrationen laufen automatisch beim Start des Containers — ein eigener Handgriff ist nicht nötig. Vor einem Update ein Backup zu ziehen ist trotzdem eine gute Angewohnheit.
Backup
Alles, was zählt, steckt in der Datenbank; das Volume flimmer-data enthält
nur den Bild-Cache und lässt sich jederzeit neu aufbauen.
# Sicherung
docker compose exec -T db pg_dump -U flimmer -d flimmer --clean --if-exists \
| gzip > flimmer-$(date +%F).sql.gz
# Rückspielen
gunzip -c flimmer-2026-09-01.sql.gz \
| docker compose exec -T db psql -U flimmer -d flimmer
Für einen nächtlichen Lauf genügt ein Cron-Eintrag mit demselben Befehl. Wer zusätzlich den Bild-Cache sichern will:
docker run --rm -v flimmer_flimmer-data:/data -v "$PWD":/backup alpine \
tar czf /backup/flimmer-data.tar.gz -C /data .
Konfiguration
Sämtliche Einstellungen laufen über Umgebungsvariablen; die vollständige Liste
mit Erklärungen steht in .env.example. Die wichtigsten:
| Variable | Bedeutung |
|---|---|
APP_URL |
Öffentliche Adresse der Instanz |
AUTH_SECRET |
Geheimnis für Sitzungen — mindestens 32 Zeichen |
TMDB_API_KEY |
TMDB-Schlüssel für Metadaten |
TMDB_REGION |
Region für die Streaming-Verfügbarkeit (Standard DE) |
ALLOW_REGISTRATION |
Selbstregistrierung bei der Erstinbetriebnahme |
ENABLE_SCHEDULER |
Eingebauter Hintergrundlauf für Sync und Benachrichtigungen |
SMTP_* |
E-Mail-Versand |
OIDC_* |
Optionale SSO-Anbindung (Authelia, Keycloak, Authentik …) |
Entwicklung
npm install
docker compose -f docker-compose.dev.yml up -d # nur PostgreSQL
cp .env.example .env # DATABASE_URL auf localhost:5439
npm run db:migrate
npm run db:seed # Demo-Konten
npm run dev
| Befehl | Wirkung |
|---|---|
npm run dev |
Entwicklungsserver |
npm run build |
Produktionsbuild |
npm run typecheck |
TypeScript prüfen |
npm run db:migrate |
Migration erzeugen und anwenden |
npm run db:studio |
Prisma Studio |
npm run db:seed |
Beispieldaten |
npm run icons |
Favicon und PWA-Icons aus dem SVG-Logo neu erzeugen |
Aufbau des Projekts:
src/
app/ Routen (App Router), API-Endpunkte
components/ Wiederverwendbare Bausteine
lib/ Serverseitige Logik: DB, Auth, TMDB, Benachrichtigungen
i18n/ Oberflächentexte
prisma/ Schema, Migrationen, Seed
public/brand/ Logo in allen Varianten
docker/ Entrypoint des Containers
docs/ Anleitung, Design-Dokumentation
Technik
Next.js (App Router) mit TypeScript, PostgreSQL über Prisma, Tailwind CSS.
Warum Next und nicht SvelteKit: Oberfläche, REST-API und Hintergrundläufe
stecken in einem Deployment, Server Components halten den Datenbankzugriff
serverseitig, und der standalone-Build ergibt ein schlankes Image ohne
Build-Werkzeuge. Für ein selbst gehostetes Werkzeug zählt vor allem, dass ein
einziger Container genügt.
Lizenz
MIT — siehe LICENSE.
Metadaten stammen von TMDB. Flimmer wird von TMDB weder betrieben noch unterstützt.