CUSTOM APP

Deine Content-Maschine in 5 Stationen.

Der Bauplan zum Reel: Thema rein, Video raus. Fünf Stationen mit Erklärung, Tools und fertigem Prompt für Claude Code. Gebaut mit Next.js, Supabase, Remotion und ElevenLabs.

  • Fortgeschritten

ERGEBNIS

Das ist dabei rausgekommen.

Der Überblick aus dem Reel. Darunter steht der Bauplan mit allen Prompts.

  • 5Stationen von Thema bis Video
  • 1Dashboard als Zentrale
  • 2Freigaben: Skript und fertiges Reel

DAS BRAUCHST DU

Womit das gebaut ist.

  • Claude Code
  • Remotion
  • ElevenLabs
  • whisper.cpp
  • Supabase
  • Next.js
  • Codex CLI

Der Überblick: fünf Stationen.

Du gibst ein Thema rein, am Ende kommt ein Video raus. Dazwischen laufen fünf Stationen, und am Schluss schaust du kurz drüber und gibst frei.

Alles läuft in einem eigenen Dashboard (Next.js und Supabase). Gebaut wird es mit Claude Code, Station für Station. Das Rendern übernimmt ein kleiner Worker auf deinem Rechner. Unten findest du zuerst den Master-Prompt für das Grundgerüst, dann pro Station eine Erklärung, die Tools mit Links und einen fertigen Prompt zum Einfügen in Claude Code.

Zu jedem Werkzeug steht dabei, ob es Open Source ist und ob du ein Abo oder ein Konto brauchst. Die Übersicht findest du unter Was du brauchst und was es kostet. Alles wurde am 06.10.2026 gegen die offiziellen Seiten und GitHub geprüft.

  1. Radar: Quellen scannen

    1. Augen

    Das Radar fragt Quellen wie GitHub, Hacker News, RSS-Feeds und Instagram ab, gruppiert die Funde zu Themen und rankt sie. Du wählst ein Thema.

  2. Hook Lab

    2. Autor

    Fünf Hook-Varianten und das Skript, Faktencheck per Websuche, dann Freigabe.

  3. ElevenLabs, Wort-Timing inklusive

    3. Stimme

    Die Stimme entsteht aus dem Skript. ElevenLabs liefert die Zeitstempel für jedes Wort gleich mit. Bei eigenen Aufnahmen übernimmt das zum Beispiel whisper.cpp.

  4. Szenen-Spec per KI

    4. Regisseur

    Aus Skript und Timing plant eine KI die Szenen. Die Spec wird per Zod und weiteren Regeln geprüft und bis zu zweimal automatisch repariert.

  5. Remotion-Render per Worker

    5. Studio

    Der Worker auf deinem Rechner holt den Auftrag, rendert das 9:16-Video, lädt es hoch, und du gibst frei oder verwirfst.

Der Master-Prompt: Grundgerüst.

Baue mir das Grundgerüst der Content-Maschine. Hier entsteht das Dashboard, in dem ein Thema als ein Eintrag durch alle fünf Stationen wandert.

Zuerst
Starte hier. Alle Stationen setzen auf diesem Gerüst auf.
Was entsteht
Login, Pipeline-Seite mit fünf Spalten, Tabelle content_items mit Row Level Security, CLAUDE.md.
Tools
Claude Code zum Bauen, Next.js und Supabase für Dashboard, Login und Datenbank.
Noch keine KI
Die Stationen sind hier nur Platzhalter mit Status. Die echte Logik kommt mit den Prompts unten.
PROMPT-0-GRUNDGERUEST.md
KONTEXT
Ich baue mir eine Content-Maschine: Thema rein, fertiges 9:16-Video raus. Am Ende schaue ich kurz drüber und gebe frei. Ich bin der einzige Nutzer. Gesteuert wird alles in einem eigenen Dashboard.

Die Maschine hat fünf Stationen, jede ist ein eigener Schritt in einer Pipeline:
1. Augen (Radar): scannt Quellen nach Themen, über die gerade gesprochen wird, gruppiert und rankt die Funde, ich wähle ein Thema.
2. Autor (Hook Lab): schreibt mehrere Hook-Varianten und das Skript, prüft Fakten per Websuche, ich gebe frei.
3. Stimme: eigene Aufnahme oder ElevenLabs, danach Wort-Timing (bei ElevenLabs kommt es mit der Stimme, bei eigener Aufnahme zum Beispiel per whisper.cpp), damit Schnitte und Untertitel an Wörtern hängen.
4. Regisseur: eine KI plant aus Skript und Wort-Timing die Szenen und gibt eine strukturierte Szenen-Spec aus (Szenen, Held, Timing, Kamera). Die Spec wird per Zod validiert und bei Fehlern automatisch repariert.
5. Studio: Remotion rendert das 9:16-Video lokal. Ein Render-Worker auf meinem Rechner holt Aufträge aus dem Dashboard, lädt das Ergebnis hoch, ich sehe die Vorschau und gebe frei oder verwerfe.

Stack: Next.js (App Router, TypeScript), Tailwind CSS, Supabase (Auth + Postgres + Storage), Zod, Remotion. Ein Render-Worker als Node-Skript (TypeScript) im Repo.

ZIEL
Ein lauffähiges Grundgerüst, in dem ein Thema als ein Eintrag (content_item) durch alle fünf Stationen wandert. In diesem Schritt sind die Stationen nur Platzhalter mit Status, keine echte KI-Logik. Die echte Logik kommt Station für Station mit eigenen Prompts.

SCHRITTE
1. Lege das Projekt mit create-next-app an (TypeScript, Tailwind, App Router, src-Ordner, ESLint). Kein zusätzliches UI-Framework.
2. Installiere @supabase/supabase-js, @supabase/ssr und zod. Lege Supabase-Clients in src/lib/supabase/ an (browser.ts, server.ts, admin.ts mit `import 'server-only'`).
3. Auth: Login-Seite /login mit E-Mail und Passwort. Alle anderen Seiten erfordern eine Session (Middleware). Ausnahme: /api/reel-worker/*, das sich selbst per Token schützt.
4. Datenbank (supabase/migrations/001_pipeline.sql):
   - content_items: id uuid primary key default gen_random_uuid(), user_id uuid not null references auth.users(id) on delete cascade, title text not null, topic text, stage text not null default 'radar' mit check (stage in ('radar','autor','stimme','regisseur','studio','fertig','verworfen')), created_at, updated_at.
   - Row Level Security auf jeder Tabelle: Policy `user_id = auth.uid()` für select, insert, update, delete.
5. Oberfläche: Seite /pipeline mit fünf Spalten (Augen, Autor, Stimme, Regisseur, Studio), jede Karte ist ein content_item. Button "Neues Thema" legt manuell einen Eintrag an. Pro Karte ein Button "Weiter zur nächsten Station", der nur den Status ändert.
6. Lege eine CLAUDE.md an: Stack, Ordnerstruktur, Konventionen (user_id + RLS auf jeder Tabelle, Migrationen nummeriert, kein any, Zod an jeder Systemgrenze, keine Keys im Code).
7. Lege .env.example mit den Variablennamen an (NEXT_PUBLIC_SUPABASE_URL, NEXT_PUBLIC_SUPABASE_ANON_KEY, SUPABASE_SERVICE_ROLE_KEY). Keine echten Werte.

DATEISTRUKTUR (Ziel)
src/app/login/page.tsx
src/app/pipeline/page.tsx
src/app/api/reel-worker/ (leer, kommt in Station 5)
src/lib/supabase/{browser,server,admin}.ts
src/lib/stages.ts (Liste der fünf Stationen, einzige Quelle für Namen und Reihenfolge)
supabase/migrations/001_pipeline.sql
CLAUDE.md, .env.example

AKZEPTANZKRITERIEN
- npm run build und npm run lint laufen ohne Fehler durch.
- Ohne Login lande ich auf /login, danach auf /pipeline.
- Ich lege ein Thema an und schiebe es durch alle fünf Spalten.
- Ein zweiter Test-Account sieht meine Einträge nicht (RLS-Test).
- Im Repo steht kein Key.

REGELN
Zeige mir zuerst das Datenmodell und warte auf mein OK, bevor du die Migration schreibst. Die Migration spiele ich selbst ein. Baue nicht mehr als beschrieben.

Station 1: Augen (Radar).

Das Radar sucht Quellen nach Themen ab, über die gerade gesprochen wird, und macht daraus Vorschläge, aus denen du eines wählst. Hier steht, was mein Radar wirklich abfragt und welche Wege es für dich gibt.

So macht es mein Radar
Mein Radar läuft nachts von allein (geplante Aufrufe auf Vercel, sogenannte Cron-Jobs). Jede Quelle ist ein eigenes kleines Modul mit derselben Aufgabe: Funde holen und in ein einheitliches Format bringen. Fällt eine Quelle aus, laufen die anderen weiter, und der Grund steht pro Quelle in der Debug-Ansicht. Sechs Quelltypen sind gebaut. Aktiv sind GitHub, Hacker News, RSS-Feeds und Instagram. Reddit und YouTube sind fertig, aber ausgeschaltet (siehe unten). TikTok fehlt mit Absicht: Es gibt dafür keine offizielle Schnittstelle für Trend-Abfragen.
GitHub
Offizielle Suche der REST-Schnittstelle von GitHub, ohne Schlüssel. Gesucht wird nach Stichwörtern wie MCP-Server oder KI-Agenten: Repos mit mindestens 40 Sternen, die zuletzt aktiv waren, dazu eine zweite Suche nur nach Repos der letzten 14 Tage. Ohne Token sind 10 Suchen pro Minute erlaubt, mit Token 30. Das Token ist also nur ein Bonus. Das Radar merkt sich die Sternezahl täglich und erkennt so Sprünge.
Hacker News
Die Suche von Algolia (hn.algolia.com/api), ohne Schlüssel. Pro Stichwort ein Aufruf (zum Beispiel AI agent oder MCP server), nur Beiträge der letzten 21 Tage mit mindestens 40 Punkten. Die offizielle Firebase-Schnittstelle nutze ich nicht, weil sie pro Beitrag einen eigenen Aufruf braucht.
RSS-Feeds
Die Feed-Liste steht in einer Datenbanktabelle, nicht im Code: Einen Blog ergänzt du ohne neues Deployment. Gelesen wird Feed für Feed mit der Bibliothek rss-parser. Ein toter Feed wird markiert und blockiert die anderen nicht. Der Platz (höchstens 40 Funde pro Quelle) wird reihum auf die Feeds verteilt, damit ein gesprächiger Blog nicht alle anderen verdrängt.
Instagram
Hier liest das Radar nicht selbst. Ein eigener Nachtlauf holt die Beiträge der Konten, die ich beobachte, über die Business-Discovery-Abfrage von Meta (offizielle Instagram-Graph-API, mit dem Facebook-Login-Token meines Business-Kontos) und legt sie in eine Tabelle. Das Radar liest diese Tabelle und behält nur Ausreißer: Beiträge mit mindestens doppelt so viel Wirkung wie der Median des Kontos. Aufrufzahlen liefert die Abfrage bei fremden Konten nicht, gerechnet wird deshalb mit Likes und Kommentaren. Konten, die Meta nicht findet oder die privat sind, liefern einen Fehler.
Reddit (bei mir aus)
Der Baustein ist fertig, aber ausgeschaltet. Die öffentlichen JSON-Adressen (/top.json) antworten von Servern aus oft mit Fehler 403, bei meinem Test am 06.10.2026 auch von meinem Rechner. Zuverlässig ist nur der offizielle Weg mit App-Registrierung, dafür brauchst du die Zustimmung zu den Data API Terms. Die Variante /.rss hinter der Subreddit-Adresse antwortete bei mir mit 200. Ob das von einem Server aus klappt, ist nicht garantiert.
YouTube (bei mir aus)
Der Baustein ist fertig und läuft, sobald ein API-Schlüssel gesetzt ist. Pro Stichwort zwei Aufrufe der YouTube Data API: erst die Suche (nur kurze Videos, nach Aufrufen sortiert, kostet 100 Kontingenteinheiten), danach ein Aufruf für die Zahlen der Treffer (1 Einheit). Videos unter 20.000 Aufrufen zählen nicht als Fund.
Was danach passiert
Eine KI ordnet jeden neuen Fund ein. Ähnliche Funde werden zu Themen gruppiert, per Vergleich ihrer Bedeutung (Embeddings, über den Dienst Voyage). Ohne Voyage-Schlüssel fällt das Radar auf einfachen Wortvergleich zurück. Ein Thema gilt nur als Trend, wenn mindestens zwei Belege von verschiedenen Urhebern oder Quellen dahinterstehen, sonst heißt es Entdeckung. Daraus entstehen Chancen, die nach Themenpassung, Formatpassung, bisheriger Leistung, Neuheit, Frische und weiteren Punkten gerankt werden. Du wählst eine Chance, sie geht ins Hook Lab.
Option: Agent Reach
Agent Reach (MIT-Lizenz) gibt Claude Code im Terminal Zugriff auf mehrere Plattformen. Es ist für den Agenten gedacht, nicht als Bibliothek für deine App, und es ist nicht Teil meines Radars. Mein Test mit agent-reach doctor (Version 1.5.0, 06.10.2026): Ohne Einrichtung laufen Webseiten, YouTube (Untertitel und Suche), RSS, V2EX und die Bilibili-Suche. GitHub läuft über die Kommandozeile gh (öffentliche Repos und Suche), doctor prüft das nicht live, ein Test mit gh search repos klappte bei mir. Reddit, Instagram und Facebook brauchen die Browser-Erweiterung OpenCLI, die deine eingeloggte Chrome-Sitzung nutzt. X braucht exportierte Cookies. Für Reddit gibt es laut Doku keinen Weg ohne Anmeldung, weil der anonyme Zugang gesperrt ist. TikTok bringt Agent Reach nicht mit. Die Installation übernimmt Claude Code selbst, Schritt für Schritt steht sie auf meiner Seite Agent Reach.
Wie Agent Reach ins Radar kommt
Entweder lässt du Claude Code im Terminal recherchieren und legst die Funde per Hand ins Radar (der Prompt unten baut dafür ein Formular). Oder dein Connector ruft die darunterliegenden Kommandozeilen-Werkzeuge direkt auf, zum Beispiel gh für GitHub oder yt-dlp für YouTube.
Option: Apify
Apify ist eine Plattform, auf der fertige Scraper (dort „Actors“ genannt) laufen, zum Beispiel für Instagram. Du startest einen Lauf und bekommst die Daten als Liste zurück. Das kostet Geld und wird nach Verbrauch abgerechnet. Es gibt einen Gratis-Tarif mit Startguthaben, aktuelle Preise stehen auf apify.com/pricing. Bei mir hat Apify die Instagram-Beobachtung bis zum 07.09.2026 geliefert. Bei mir lief das schnell ins Geld, das Monatslimit war früh aufgebraucht und das Radar stand danach still. Deshalb bin ich über einen Zwischenschritt auf die offizielle Meta-Abfrage umgestiegen. Nimm Apify, wenn du Daten brauchst, die keine offizielle Schnittstelle liefert, und setze ein Monatslimit.
Instagram, dein eigenes Konto
Für dein eigenes Konto nutzt du die offizielle Instagram-API mit Creator- oder Business-Konto, die neun Schritte stehen auf meiner Seite Instagram an Claude anschließen (Repo: instagram-agent-skill, MIT). Fremde Konten liest Agent Reach nur über deine eingeloggte Chrome-Sitzung. Das ist keine offizielle Schnittstelle: Prüfe die Bedingungen von Instagram und halte die Abfragen klein.
Tools
Claude Code baut den Scanner, Next.js und Supabase halten Dashboard und Daten.
Falle
Jede Plattform hat eigene Nutzungsbedingungen, und sie ändern sich. Lies sie vor jeder Anbindung, bei Reddit zum Beispiel die Data API Terms. Nutze Cookies und eingeloggte Sitzungen nur mit einem eigenen Konto, nur zum Lesen und in kleinen Mengen. Agent Reach warnt selbst vor Kontosperren und rät zu einem Zweitkonto. Funde können Namen und Profile enthalten, speichere nur, was du brauchst. Und plane Kosten ein: Bei mir läuft das Radar nachts automatisch und jeder KI-Aufruf kostet Geld. Lass Scans in deinem Bau deshalb zuerst nur auf Klick laufen.
Geklappt, wenn
Ein gewähltes Thema steht als Eintrag in der Pipeline.
PROMPT-1-AUGEN.md
KONTEXT
Grundgerüst steht (Next.js, Supabase, Pipeline-Seite, content_items, CLAUDE.md). Ich baue jetzt Station 1 "Augen" (Radar): Es sammelt Funde aus Quellen, über die gerade gesprochen wird, gruppiert und rankt sie, und ich wähle ein Thema, das als content_item in die Pipeline geht.

EINGABE
Eine Liste von Quellen, in der Oberfläche pflegbar. Typen: github, reddit, youtube, hackernews, rss, instagram. Pro Quelle: Typ, Name, Adresse oder Suchbegriff, aktiv ja/nein. Zusätzlich kann ich einen Fund von Hand anlegen (Titel, Link, Zusammenfassung), zum Beispiel aus einer Recherche mit Claude Code und Agent Reach.

AUSGABE
Eine Rangliste von Themen-Clustern. Jedes Cluster: Titel, kurze Zusammenfassung, die zugehörigen Funde mit Link, eine Rangzahl. Ein Klick auf "Thema wählen" legt ein content_item (Stage 'autor') mit dem Thema an.

DATENBANK (supabase/migrations/002_radar.sql)
- radar_sources: user_id, type (check auf die sechs Typen), name, target, active boolean default true, last_error text.
- radar_items: user_id, source_id (nullable, weil von Hand angelegte Funde keine Quelle haben), title, url, summary, found_at, cluster_id (nullable).
- radar_clusters: user_id, title, summary, rank integer, created_at, chosen boolean default false.
- RLS wie überall: user_id = auth.uid().

LOGIK
1. src/lib/radar/connectors/<typ>.ts: pro Quelltyp ein Connector mit derselben Signatur `fetchItems(source): Promise<RawItem[]>`. Eine reine Funktion übersetzt die Fremdantwort in RawItem (testbar ohne Netz), eine dünne Hülle holt sie. Beginne mit den Connectors, die ohne Zugangsdaten gehen:
   - rss: beliebiger RSS- oder Atom-Feed, mit der Bibliothek rss-parser. Jeder Feed wird einzeln abgefangen.
   - hackernews: die Suche von Algolia (https://hn.algolia.com/api/v1/search?tags=story&query=...), gefiltert nach Alter und Mindestpunkten. Lies zuerst die Doku.
   - github: offizielle REST-Schnittstelle, Repository-Suche (https://api.github.com/search/repositories), gefiltert nach Mindest-Sternen und letzter Aktivität, sortiert nach Sternen. Eigener User-Agent im Header. Ein Token aus der Umgebung ist optional und hebt nur das Limit an (ohne Token 10 Suchen pro Minute, mit Token 30, prüfe die aktuelle Doku).
   - reddit: Subreddit-Feed per RSS (https://www.reddit.com/r/<name>/.rss), mit eigenem User-Agent. Nutze nicht die .json-Adressen, sie liefern ohne Anmeldung oft einen Fehler 403. Auch der RSS-Weg kann von Server-IPs blockiert werden: Dann ist das eine Fehlermeldung pro Quelle, kein Grund für Wiederholungen. Der zuverlässige Weg wäre die offizielle API mit App-Registrierung (OAuth), baue sie jetzt nicht.
   Die übrigen legst du als Stubs an, die einen klaren Fehler "noch nicht verbunden" liefern:
   - youtube: offizielle YouTube Data API v3 (search.list, danach videos.list für die Zahlen), braucht einen API-Schlüssel (YOUTUBE_API_KEY, nur Name in .env.example). search.list verbraucht deutlich mehr Kontingent als videos.list, lies die Quota-Doku.
   - instagram: nur über die offizielle Instagram-API (Business Discovery der Graph API oder eigenes Creator-Konto). Baue das jetzt nicht.
2. Prüfe vor jedem Connector die offiziellen Nutzungsbedingungen der Plattform und notiere das Ergebnis in docs/radar-quellen.md (Quelle, Schnittstelle, Bedingungen, Limits). Kleine Abfragen, keine Schleifen über viele Seiten, kein Umgehen von Sperren. Ein 403 oder 429 ist eine Meldung pro Quelle (in radar_sources.last_error), kein Grund für Wiederholungen. Fällt ein Connector aus, laufen die anderen weiter.
3. Agent Reach (https://github.com/Panniantong/agent-reach, MIT) ist ein Werkzeug für Agenten wie Claude Code, keine Bibliothek. Installiere es nicht selbst. Beschreibe in docs/radar-quellen.md in fünf Zeilen, wie ich es installiere (die Anleitung im Repo unter docs/install.md) und welche Kanäle ohne Zugangsdaten laufen (Web, YouTube, RSS, GitHub über gh). Reddit, Instagram und Facebook brauchen eine eingeloggte Browser-Sitzung (OpenCLI), X braucht Cookies. Frage mich, bevor du Cookies oder Browser-Sitzungen anfasst. Ergebnisse einer solchen Recherche lege ich über das Formular "Fund von Hand anlegen" ins Radar.
4. src/lib/radar/cluster.ts: gruppiert Funde mit ähnlichem Thema. Starte mit einem einfachen Wortvergleich (Überlappung der Wörter in Titel und Zusammenfassung, Schwelle als Konstante). Ein KI-Aufruf mit Zod-Schema für die Antwort gibt jedem Cluster Titel und Zusammenfassung. Ein Cluster heißt nur dann "Trend", wenn mindestens zwei Funde von verschiedenen Quellen oder Urhebern darin liegen, sonst "Entdeckung".
5. src/lib/radar/rank.ts: ordnet die Cluster. Einfache, nachvollziehbare Regel (zum Beispiel Zahl der Quellen, in denen das Thema auftaucht, plus Aktualität). Die Regel steht als Kommentar oben in der Datei.
6. Route src/app/api/radar/scan/route.ts: läuft nur auf Klick (POST, eingeloggt). Kein automatischer Lauf, bis du die Kosten pro Scan kennst. Jeder KI-Aufruf wird in einer Tabelle ai_runs (Schritt, Modell, Tokens, Zeitpunkt) protokolliert.
7. Seite /radar: Quellenliste, Formular "Fund von Hand anlegen", Button "Jetzt scannen", darunter die Rangliste mit "Thema wählen".

AKZEPTANZKRITERIEN
- Mit mindestens einer RSS-Quelle liefert ein Scan Funde und mindestens ein Cluster.
- Ein Hacker-News-Feed liefert Funde, ohne dass ein Schlüssel in der Umgebung steht. Ein Reddit-Feed liefert Funde oder eine klare Fehlermeldung pro Quelle.
- Ein von Hand angelegter Fund wird beim nächsten Scan mit geclustert.
- "Thema wählen" erzeugt genau ein content_item in der Spalte Autor.
- Ein kaputter Connector bricht den Scan nicht ab: Der Fehler steht pro Quelle in der Oberfläche, die anderen laufen weiter.
- Ohne Klick läuft nie ein KI-Aufruf.
- npm run build und npm run lint laufen durch, keine Keys im Code.

REGELN
Zeige mir zuerst das Datenmodell und warte auf mein OK. Die Migration spiele ich selbst ein. Kein any, Zod an jeder Systemgrenze.

Station 2: Autor (Hook Lab).

Der Autor schreibt mehrere Hook-Varianten und das Skript. Die Fakten werden per Websuche geprüft, dann gibst du frei.

Hooks
Fünf Varianten zum selben Thema, jede mit einem anderen Mechanismus (zum Beispiel Nutzen, Neugier, Gegenthese, Problem). Du wählst die, die du sagen würdest. Auf Wunsch gibt es neue Runden, etwa kürzer oder provokanter.
Skript
Entsteht zum gewählten Hook, in deinem Ton. Als Stimmprobe bekommt die KI deine eigenen, stärksten gesprochenen Hooks. Die Regeln dafür stehen an einer Stelle im Code, damit du sie anpassen kannst.
Faktencheck
Jede Tatsachenbehauptung im Skript wird einzeln per Websuche geprüft und bekommt ein Urteil mit Quelle (zum Beispiel bestätigt, unsicher, veraltet, widersprüchlich, nicht belegt). Freigeben geht erst, wenn keine Aussage mehr ungeprüft, nicht belegt oder widersprüchlich ist. Reine Unterhaltungsvideos ohne Tatsachenbehauptungen gebe ich bewusst ohne Faktencheck frei.
Tools
Claude Code baut die Station. Die KI-Aufrufe laufen über deinen KI-Anbieter, dafür brauchst du dort ein Konto, siehe Was du brauchst und was es kostet. Bei mir ist das die Anthropic-API (Claude), Websuche und Seitenabruf sind dort als Werkzeug eingebaut. Supabase speichert Hooks, Skripte und Prüfungen.
Geklappt, wenn
Ein freigegebenes Skript, dessen Aussagen belegt sind.
PROMPT-2-AUTOR.md
KONTEXT
Radar steht, ein gewähltes Thema landet als content_item in der Spalte Autor. Ich baue jetzt Station 2 "Autor" (Hook Lab): Aus dem Thema entstehen mehrere Hook-Varianten und das Skript. Die Fakten werden per Websuche geprüft, dann gebe ich frei.

EINGABE
content_item mit Thema und den Radar-Funden dazu (Titel, Link, Zusammenfassung).

AUSGABE
- Fünf Hook-Varianten, jede mit einem anderen Mechanismus (Text, Mechanismus in einem Wort, zum Beispiel Nutzen, Neugier, Gegenthese, Problem). Ich wähle eine.
- Ein Skript zum gewählten Hook (gesprochener Text, in kurzen Sätzen, mit Absätzen als Sinnabschnitte).
- Ein Faktencheck: pro Behauptung im Skript ein Eintrag mit Quelle (Link) und Status belegt oder offen. Offene Behauptungen werden mir rot angezeigt.
- Freigabe-Button (nur nach bestandenem Faktencheck). Erst danach geht das content_item zur Station Stimme.

DATENBANK (supabase/migrations/003_autor.sql)
- content_hooks: user_id, item_id, text, mechanism, chosen boolean default false.
- content_scripts: user_id, item_id, version integer, text, approved boolean default false, created_at.
- fact_checks: user_id, script_id, claim, source_url (nullable), status check in ('belegt','offen').
- RLS wie überall.

LOGIK
1. src/lib/autor/hooks.ts: ein KI-Aufruf, Antwort per Zod-Schema validiert (Array von { text, mechanism }). Bei ungültiger Antwort einmal automatisch mit der Fehlermeldung reparieren lassen, dann abbrechen mit klarer Meldung.
2. src/lib/autor/script.ts: schreibt das Skript zum gewählten Hook. Ton und Regeln (Duzen, kurze Sätze, keine Floskeln) stehen als Konstante oben in der Datei, damit ich sie anpassen kann.
3. src/lib/autor/factcheck.ts: zerlegt das Skript in prüfbare Behauptungen und prüft jede per Websuche (Such-Tool des KI-Anbieters). Gibt Quelle und Status zurück. Erfinde nie eine Quelle: Ohne Fund ist der Status 'offen'. Begrenze die Zahl der Websuchen pro Aufruf und die Menge an Text, die pro Seitenabruf geladen wird, sonst werden Faktenchecks teuer.
4. Routen unter src/app/api/autor/: hooks, script, factcheck, approve. Jede läuft nur auf Klick, jeder KI-Aufruf geht in ai_runs.
5. Seite /pipeline/[id]/autor: Hooks nebeneinander, Auswahl, Skript editierbar, Faktencheck-Liste, Freigabe.
6. Freigabe erst, wenn ein Hook gewählt ist, das Skript gespeichert ist und der Faktencheck gelaufen ist, ohne dass eine Aussage offen bleibt. Ausnahme: Ein Skript ohne Tatsachenbehauptungen darf ich bewusst ohne Faktencheck freigeben (eigener Button).

AKZEPTANZKRITERIEN
- Aus einem Thema entstehen fünf Hooks, ich wähle einen, es entsteht ein Skript.
- Jede Behauptung im Faktencheck hat eine Quelle oder ist als offen markiert.
- Eine absichtlich kaputte KI-Antwort (im Test gemockt) wird einmal repariert oder sauber abgelehnt.
- Nach Freigabe steht das content_item in der Spalte Stimme.
- npm run build und npm run lint laufen durch.

REGELN
Zeige mir zuerst das Datenmodell und warte auf mein OK. Migration spiele ich selbst ein. Kein any.

Station 3: Stimme.

Die Stimme entsteht aus dem Skript, bei mir mit ElevenLabs, oder du nimmst selbst auf. Danach folgt das Wort-Timing, damit Schnitte und Untertitel an Wörtern hängen.

Stimme
Bei mir erzeugt ElevenLabs die Stimme aus dem freigegebenen Skript, nur auf Klick, und das Dashboard zeigt vorher die Zeichenzahl. ElevenLabs ist ein Online-Dienst mit Gratis-Tarif (laut Preisseite 10.000 Credits pro Monat). Die kommerzielle Lizenz gibt es laut Preisseite erst ab dem Starter-Tarif, Stand 06.10.2026. Stimme, Modell und Tempo sind Einstellungen, nicht fest im Code.
Ohne ElevenLabs
Nimm deine Stimme selbst auf, oder erzeuge sie lokal mit VoiceStudio (Open Source, AGPL-3.0, kein Abo, kein Credit-System). Meine Seite dazu: VoiceStudio. Eine eigene Aufnahme brauchst du in deinem Bau über einen Upload-Weg (in meinem Dashboard gibt es ihn nicht, dort läuft alles über ElevenLabs). Klone nur Stimmen, für die du eine Erlaubnis hast. Die Hardware-Anforderung hängt laut Repo von der Engine ab.
Wort-Timing
Bei ElevenLabs kommt das Timing mit: Der Endpunkt text-to-speech/{voice_id}/with-timestamps liefert das Audio und für jedes Zeichen Start und Ende. Daraus baue ich Wörter und Sätze, ohne zweiten Schritt. Nur bei eigener Aufnahme brauchst du eine Transkription mit Zeitstempeln, zum Beispiel whisper.cpp (MIT-Lizenz, läuft lokal, kein Konto). Die Hilfe von whisper-cli kennt dafür unter anderem -ojf (JSON mit mehr Angaben), -ml und -sow (Segmente pro Wort). Die README verlangt 16-bit-WAV, deshalb wandle ich vorher mit ffmpeg auf 16 kHz mono um. Neuere Builds lesen laut --help auch mp3, flac und ogg. Für Deutsch nimm ein mehrsprachiges Modell, die Modelle mit .en im Namen sind die englischen.
Warum Timing
Ohne Wort-Timing schneidest du nach Gefühl. Mit Timing hängen Szenenwechsel und Untertitel direkt an den gesprochenen Wörtern.
Falle
Prüfe, ob die erkannten Wörter zum Skript passen, bevor du weitermachst. Bei ElevenLabs sind die Wörter ohnehin dein Skript, bei whisper.cpp können Erkennungsfehler vorkommen. Zugangsdaten gehören nur in die Umgebung, nie ins Repo.
Geklappt, wenn
Audio und Wort-Timing liegen vor.
PROMPT-3-STIMME.md
KONTEXT
Das Skript ist freigegeben. Ich baue jetzt Station 3 "Stimme": Aus dem Skript entsteht eine Audiodatei (eigene Aufnahme oder ElevenLabs), danach das Wort-Timing, damit Schnitte und Untertitel an Wörtern hängen.

EINGABE
Freigegebenes Skript. Zwei Wege: (a) ich lade eine eigene Aufnahme hoch, (b) die Stimme wird per ElevenLabs aus dem Skript erzeugt (nur auf Klick, Kosten sichtbar machen, bevor ich klicke).

AUSGABE
- Eine Audiodatei im Supabase Storage (privater Bucket).
- Eine Timing-Datei (JSON): Liste von Wörtern mit Startzeit und Endzeit in Sekunden, dazu die Gesamtdauer.

DATENBANK (supabase/migrations/004_stimme.sql)
- content_voiceovers: user_id, item_id, script_id, source check in ('upload','elevenlabs'), audio_path, duration_seconds, status check in ('neu','audio_da','timing_da','fehler'), error text.
- word_timings: user_id, voiceover_id, words jsonb (Array von { word, start, end }).
- Privater Storage-Bucket "voice" mit Policy pro Nutzer. RLS wie überall.

LOGIK
1. src/lib/stimme/elevenlabs.ts: Text rein, Audio raus. API-Key nur serverseitig aus der Umgebung (ELEVENLABS_API_KEY, Name in .env.example, kein Wert). Stimme und Modell als Einstellung, nicht fest im Code. Lies die aktuelle ElevenLabs-Doku, bevor du die API ansprichst.
2. Upload-Weg: Datei-Upload nach Storage, Dauer auslesen.
3. Wort-Timing, ElevenLabs-Weg: Der Endpunkt text-to-speech/{voice_id}/with-timestamps liefert das Audio (base64) und für jedes Zeichen Start- und Endzeit. Rechne daraus Wörter mit start und end (ein Wort endet am Leerzeichen) und validiere sie mit dem Zod-Schema src/lib/stimme/timing-schema.ts (Wörter, start, end, Dauer). Lies zuerst die aktuelle ElevenLabs-Doku zu diesem Endpunkt. Es ist kein zweiter Transkriptions-Schritt nötig.
   Wort-Timing, Upload-Weg: Nur für eigene Aufnahmen legst du ein Skript scripts/transcribe.ts an, das whisper.cpp (https://github.com/ggml-org/whisper.cpp, MIT) mit Wort-Zeitstempeln aufruft und nach demselben Schema validiert ausgibt. Das läuft lokal auf meinem Rechner (im Render-Worker aus Station 5), nicht auf Vercel. Lies zuerst die README von whisper.cpp und `whisper-cli --help` und nutze die dort beschriebenen Optionen für JSON-Ausgabe und Wort-Zeitstempel. whisper-cli liest nur 16-bit-WAV: Das Skript wandelt die Audiodatei vorher mit ffmpeg um (16 kHz, mono). Für Deutsch ein mehrsprachiges Modell nehmen (ohne .en im Namen). Beschreibe in der README, wie man whisper.cpp und ffmpeg installiert und ein Modell lädt, nach der offiziellen Anleitung im Repo.
4. Prüfung: Die Wörter im Timing müssen zum Skript passen (wichtig beim Upload-Weg). Weicht die Wortzahl stark ab, zeige eine Warnung statt still weiterzumachen.
5. Seite /pipeline/[id]/stimme: Upload oder "Mit ElevenLabs erzeugen", Audio-Player, Timing-Status, Button "Weiter zum Regisseur" (erst aktiv, wenn Timing da ist).

AKZEPTANZKRITERIEN
- Ein Upload erzeugt eine abspielbare Audiodatei im privaten Bucket.
- Ein ElevenLabs-Lauf liefert ein Timing-JSON, das das Zod-Schema besteht, ohne zusätzlichen Transkriptions-Schritt.
- scripts/transcribe.ts liefert für eine eigene Beispielaufnahme ein Timing-JSON, das das Zod-Schema besteht.
- Ohne Klick wird nie ElevenLabs aufgerufen.
- Fehlt der API-Key, zeigt die Oberfläche eine klare Meldung statt eines Absturzes.
- npm run build und npm run lint laufen durch, kein Key im Repo.

REGELN
Zeige mir zuerst das Datenmodell und warte auf mein OK. Migration spiele ich selbst ein. Kein any.

Station 4: Regisseur.

Eine KI plant aus Skript und Timing die Szenen und gibt eine strukturierte Szenen-Spec aus: Szenen, Held, Timing, Kamera.

Spec statt Freitext
Die KI antwortet nicht mit Prosa, sondern mit JSON in einem festen Format. Das macht den nächsten Schritt berechenbar.
Validierung
Ein Zod-Schema prüft die Spec, dazu kommen eigene Regeln (zum Beispiel lückenlose Szenen) und ein Selbsttest ohne KI-Aufruf. Besteht die Spec nicht, geht die Fehlerliste zurück an die KI, und die Spec wird automatisch repariert, bei mir höchstens zweimal.
Tools
Bei mir läuft die KI über codex exec (Codex CLI, Open Source unter Apache-2.0), mit meinem ChatGPT-Login statt API-Schlüssel. Codex braucht allgemein einen ChatGPT-Login oder einen OpenAI-API-Key, siehe die Anmeldung in der Doku. Der Aufruf ist gekapselt, du kannst auch Claude Code oder einen anderen Anbieter einsetzen. Das Schema baust du mit Zod (MIT).
Falle
Begrenze die Reparaturversuche. Ohne Limit entsteht ein Endlosloop, der Kosten und Zeit frisst.
Geklappt, wenn
Eine gültige Szenen-Spec mit Szenen, Held, Timing und Kamera.
PROMPT-4-REGISSEUR.md
KONTEXT
Skript, Audio und Wort-Timing liegen vor. Ich baue jetzt Station 4 "Regisseur": Eine KI plant aus Skript und Wort-Timing die Szenen und gibt eine strukturierte Szenen-Spec aus. Die Spec wird per Zod validiert und bei Fehlern automatisch repariert. Bei mir läuft die KI über `codex exec` (Codex CLI) auf meinem Rechner.

EINGABE
Skript (Text), Wort-Timing (Liste aus { word, start, end }), Gesamtdauer.

AUSGABE
Eine Szenen-Spec als JSON, die das Zod-Schema besteht:
- scenes: Array. Pro Szene: id, start (Sekunden), end (Sekunden), hero (was im Bild im Mittelpunkt steht, kurzer Text), camera (zum Beispiel 'static', 'push-in', 'pan-left'), text_on_screen (optional), word_range (Index erstes und letztes Wort aus dem Timing).
- Regeln, die das Schema prüft: Szenen sind lückenlos und überlappungsfrei, die erste beginnt bei 0, die letzte endet bei der Gesamtdauer, jede Szene liegt auf Wortgrenzen.

DATEISTRUKTUR
src/lib/director/scene-spec.ts (Zod-Schema + abgeleiteter TypeScript-Typ, einzige Quelle der Wahrheit)
src/lib/director/prompt.ts (baut den Prompt für die KI aus Skript und Timing)
src/lib/director/run.ts (ruft die KI auf, validiert, repariert)
scripts/director.ts (CLI: Skript-Pfad und Timing-Pfad rein, scene-spec.json raus)
src/lib/director/__tests__/ (Tests)

LOGIK
1. run.ts ruft die KI über `codex exec` auf (Kindprozess), gibt den Prompt über stdin oder als Argument, fordert ausschließlich JSON an und liest die Ausgabe. Lies zuerst die aktuelle Dokumentation der Codex CLI zu `codex exec` und nutze die dort beschriebenen Optionen. Bei mir läuft es so (gegen `codex exec --help` geprüft): `codex exec --skip-git-repo-check --ephemeral -s read-only -C <leeres Temp-Verzeichnis> -o <Ausgabedatei> "<Prompt>"`, optional mit `--output-schema <schema.json>` und `-m <Modell>`. Die Antwort liest du aus der Ausgabedatei. Der Prozess bekommt ein Zeitlimit. Der Aufruf ist austauschbar gekapselt (eine Funktion `callModel(prompt): Promise<string>`), damit man später einen anderen Anbieter einsetzen kann.
2. Validierung: JSON parsen, dann mit dem Zod-Schema prüfen.
3. Reparatur: Schlägt die Validierung fehl, geht die Zod-Fehlerliste zusammen mit der kaputten Ausgabe zurück an die KI mit der Bitte, nur das JSON zu korrigieren. Höchstens zwei Reparaturversuche, danach klarer Fehler mit der letzten Fehlerliste.
4. Ergebnis wird als scene_specs-Zeile gespeichert (user_id, item_id, spec jsonb, attempts integer, created_at). Migration supabase/migrations/005_regisseur.sql, RLS wie überall.
5. Seite /pipeline/[id]/regisseur: Button "Szenen planen", Anzeige der Szenen als Zeitleiste, Hinweis, wie viele Reparaturversuche nötig waren, Button "Weiter zum Studio".

AKZEPTANZKRITERIEN
- Tests laufen durch: gültige Spec besteht, Spec mit Lücke, Überlappung oder falscher Gesamtdauer fällt durch.
- Test mit gemockter KI: erste Antwort kaputt, zweite korrekt, es wird genau einmal repariert.
- Test mit dauerhaft kaputter Antwort: nach zwei Versuchen ein klarer Fehler, kein Endlosloop.
- scripts/director.ts erzeugt für ein Beispiel eine scene-spec.json, die das Schema besteht.
- npm run build, npm run lint und npm test laufen durch.

REGELN
Zeige mir zuerst das Zod-Schema und warte auf mein OK, bevor du den Rest baust. Kein any.

Station 5: Studio.

Remotion rendert das fertige 9:16-Video lokal. Ein Render-Worker auf deinem Rechner holt Aufträge aus dem Dashboard.

Render-Worker
Ein Skript auf deinem Mac fragt das Dashboard alle zehn Sekunden nach Aufträgen, plant bei Bedarf die Szenen (Station 4), rendert und lädt das Ergebnis über einen vorsignierten Upload-Link hoch. Es braucht nur die Dashboard-Adresse und ein Token, keine Datenbank-Keys. Stürzt der Worker ab, wird der Auftrag nach 30 Minuten erneut vergeben, höchstens dreimal.
Remotion
Remotion baut Videos aus React-Code. Die Szenen-Spec aus Station 4 wird zu Szenen, das Wort-Timing zu Karaoke-Untertiteln. Gerendert wird im Format 1080 mal 1920 Pixel bei 30 Bildern pro Sekunde.
Lizenz
Remotion hat eine eigene Lizenz, kein klassisches Open Source. Kostenlos nutzen darfst du es laut Lizenztext als Einzelperson, als gewinnorientierte Organisation mit bis zu 3 Mitarbeitenden, als gemeinnützige Organisation oder zum Ausprobieren. Alle anderen brauchen eine Company License (Preise auf remotion.pro). Im Text steht, dass sich die Lizenz mit Remotion 5.0 leicht ändert, lies sie vor dem Einsatz in einer Firma noch einmal.
Clips aus langen Videos
Hast du ein langes Video und willst daraus Clips, ist SupoClip (AGPL-3.0, läuft per Docker) eine Alternative. Es schneidet vorhandenes Material und baut kein Video aus einem Skript. Laut meiner Seite SupoClip brauchst du dafür einen AssemblyAI-Key und einen LLM-Anbieter (oder lokal Ollama), kostenlos ist es also nicht ganz.
Freigabe
Nach dem Upload siehst du die Vorschau im Dashboard und entscheidest: Freigeben oder Verwerfen.
Geklappt, wenn
Eine abspielbare Vorschau im Dashboard.
PROMPT-5-STUDIO.md
KONTEXT
Szenen-Spec, Audio und Wort-Timing liegen vor. Ich baue jetzt Station 5 "Studio": Remotion rendert das fertige 9:16-Video lokal. Ein Render-Worker auf meinem Rechner holt Aufträge aus dem Dashboard, rendert, lädt das Ergebnis hoch, im Dashboard sehe ich die Vorschau und gebe frei oder verwerfe.

EINGABE
scene_specs (Station 4), Audio-Datei, word_timings.

AUSGABE
- Eine MP4 im Format 1080x1920 (9:16) im privaten Storage-Bucket "renders".
- Im Dashboard: Status des Auftrags, Vorschau-Player, Buttons "Freigeben" und "Verwerfen".

DATEISTRUKTUR
remotion/ (eigenes Remotion-Projekt im Repo)
  src/Root.tsx (Composition "Reel", 1080x1920, fps als Konstante)
  src/Reel.tsx (liest die Szenen-Spec und baut pro Szene eine Sequence)
  src/Captions.tsx (Untertitel Wort für Wort aus dem Timing)
worker/
  index.ts (Polling-Schleife)
  render.ts (Remotion-Render per @remotion/renderer)
src/app/api/reel-worker/ (Routen: claim, upload-url, complete, fail)
supabase/migrations/006_studio.sql

DATENBANK
render_jobs: user_id, item_id, spec_id, status check in ('wartet','läuft','fertig','fehler','freigegeben','verworfen'), video_path, error text, created_at, updated_at. RLS wie überall.

LOGIK
1. Button "Rendern" im Dashboard legt einen render_job mit Status 'wartet' an.
2. Der Worker läuft nur auf meinem Rechner (`npm run worker`). Er kennt keine Datenbank-Keys. Er spricht nur mit den Routen unter /api/reel-worker/* und authentifiziert sich per Bearer-Token. In seiner .env stehen nur REEL_DASHBOARD_URL und REEL_WORKER_TOKEN (Namen in .env.example, keine Werte). Das Token prüft die Route serverseitig mit einem konstanten Vergleich.
3. Ablauf im Worker: next-job holen (setzt Status atomar auf 'läuft'), Audio und Spec laden, mit Remotion rendern, per vorsignierter Upload-URL hochladen, complete melden. Bei Fehler: fail mit Meldung. Kein Job: kurz warten, nochmal fragen.
4. Remotion-Komposition: Dauer kommt aus der Spec (calculateMetadata). Jede Szene wird als Sequence auf den Zeiten aus der Spec gespielt, die Audiodatei läuft durch, Untertitel kommen aus dem Wort-Timing. Beachte die Remotion-Regeln für Animationen (nur über useCurrentFrame, keine CSS-Transitions). Lies die aktuelle Remotion-Dokumentation zu @remotion/renderer, bevor du das einbaust.
5. Seite /pipeline/[id]/studio: Status live (Polling genügt), Vorschau-Player mit signierter URL, "Freigeben" setzt das content_item auf 'fertig', "Verwerfen" auf 'verworfen'.

AKZEPTANZKRITERIEN
- Ein Auftrag aus dem Dashboard wird vom Worker abgeholt und in eine abspielbare 9:16-MP4 gerendert.
- Der Worker funktioniert ohne einen einzigen Datenbank-Key in seiner Umgebung.
- Falsches oder fehlendes Token: die Routen antworten mit 401 (Kontrollprobe mit einem Fantasie-Token).
- Ein absichtlich kaputter Auftrag landet auf 'fehler' mit lesbarer Meldung, der Worker läuft weiter.
- Zwei Worker holen nie denselben Job.
- npm run build und npm run lint laufen durch, kein Key im Repo.

REGELN
Zeige mir zuerst die Routen und das Datenmodell und warte auf mein OK. Migration spiele ich selbst ein. Kein any.

Reihenfolge, in der du baust.

Bau die Stationen in dieser Reihenfolge, jede braucht die davor.

Zuerst das Grundgerüst
Master-Prompt, Login, Pipeline-Seite. Ohne das hat keine Station einen Platz.
Dann Autor, vor dem Radar
Du kannst ein Thema auch von Hand anlegen. So testest du Hooks und Skript, bevor das Radar steht.
Dann Stimme
Skript rein, Audio und Wort-Timing raus.
Dann Regisseur
Er braucht Skript und Timing aus den Stationen davor.
Dann Studio
Erst jetzt gibt es alles, was Remotion zum Rendern braucht.
Zuletzt Augen
Das Radar ist die bequemste Station, aber nicht die, ohne die nichts geht.
Vor jedem Prompt
Lass dir das Datenmodell von Claude Code vorschlagen und lies es. Spiel Migrationen selbst ein und prüfe die Zugriffsregeln mit einem zweiten Test-Account.
Eine Woche testen
Benutze jede Station im Alltag, bevor du die nächste baust. Was nervt, korrigierst du, solange sie klein ist.

Was du brauchst und was es kostet.

Eine ehrliche Liste ohne Preistabelle, weil ich Preise nicht dauerhaft belegen kann. Geprüft am 06.10.2026 gegen die offiziellen Seiten und GitHub.

Claude Code
Abo oder Konto nötig: ja. Laut Doku brauchst du ein Claude-Abo oder ein Anthropic-Console-Konto. Open Source: nicht belegt, das Repo nennt keine Lizenz.
KI-Aufrufe der Maschine
Abo oder Konto nötig: ja, bei einem KI-Anbieter deiner Wahl. Bei mir: Radar-Analyse, Hook Lab und Faktencheck laufen über die Anthropic-API (Claude, mit Websuche), das kostet pro Aufruf. Der Regisseur läuft über Codex CLI: Open Source (Apache-2.0), mit ChatGPT-Login oder OpenAI-API-Key. Optional für das Radar: Voyage (Embeddings), ohne läuft es mit einfachem Wortvergleich.
Next.js und Zod
Open Source ja (beide MIT), Abo nein.
Supabase
Open Source ja (Apache-2.0), und es lässt sich selbst hosten. Die gehostete Variante ist ein Dienst von Supabase, ihre Preise prüfst du auf supabase.com.
Remotion
Eigene Lizenz, kein klassisches Open Source. Kostenlos für Einzelpersonen und Firmen bis 3 Mitarbeitende, darüber Company License, Details bei Station 5.
ElevenLabs
Online-Dienst, Gratis-Tarif vorhanden, kommerzielle Lizenz erst ab Starter. Das Wort-Timing ist im Preis der Stimme enthalten. Ersatz ohne Abo: eigene Aufnahme (Timing dann per whisper.cpp) oder VoiceStudio (AGPL-3.0).
whisper.cpp und ffmpeg
whisper.cpp: Open Source (MIT), läuft lokal, kein Konto. ffmpeg brauchst du nur zum Umwandeln der Audiodatei.
Agent Reach
Open Source (MIT), laut meiner Seite keine laufenden Kosten. Einen Proxy (etwa 1 US-Dollar im Monat) braucht es nur auf einem Server, nicht am eigenen Rechner. Für Reddit, Instagram und Facebook brauchst du die Browser-Erweiterung OpenCLI und eine eingeloggte Sitzung.
Apify
Online-Dienst, kostenpflichtig und nach Verbrauch abgerechnet. Es gibt einen Gratis-Tarif mit Startguthaben, aktuelle Preise auf apify.com/pricing. Open Source: nein (die Plattform). Meine Erfahrung: Beim Instagram-Lauf läuft das schnell ins Geld.
Instagram-API
Kostenlos laut meiner Seite, aber nur mit Creator- oder Business-Konto. Der Schlüssel läuft nach 60 Tagen ab. Auch die Business-Discovery-Abfrage für fremde Konten, die mein Radar nutzt, kostet nichts, braucht aber ein Facebook-Login-Token.
Dein Rechner
Der Render-Worker läuft bei dir. Du brauchst Node.js und genug Platz und Leistung zum Rendern.

PROMPTS

Alles, was du brauchst.

Der Master-Prompt für das Grundgerüst und die Checkliste zum Abhaken.

PROMPT-0-GRUNDGERUEST.md
KONTEXT
Ich baue mir eine Content-Maschine: Thema rein, fertiges 9:16-Video raus. Am Ende schaue ich kurz drüber und gebe frei. Ich bin der einzige Nutzer. Gesteuert wird alles in einem eigenen Dashboard.

Die Maschine hat fünf Stationen, jede ist ein eigener Schritt in einer Pipeline:
1. Augen (Radar): scannt Quellen nach Themen, über die gerade gesprochen wird, gruppiert und rankt die Funde, ich wähle ein Thema.
2. Autor (Hook Lab): schreibt mehrere Hook-Varianten und das Skript, prüft Fakten per Websuche, ich gebe frei.
3. Stimme: eigene Aufnahme oder ElevenLabs, danach Wort-Timing (bei ElevenLabs kommt es mit der Stimme, bei eigener Aufnahme zum Beispiel per whisper.cpp), damit Schnitte und Untertitel an Wörtern hängen.
4. Regisseur: eine KI plant aus Skript und Wort-Timing die Szenen und gibt eine strukturierte Szenen-Spec aus (Szenen, Held, Timing, Kamera). Die Spec wird per Zod validiert und bei Fehlern automatisch repariert.
5. Studio: Remotion rendert das 9:16-Video lokal. Ein Render-Worker auf meinem Rechner holt Aufträge aus dem Dashboard, lädt das Ergebnis hoch, ich sehe die Vorschau und gebe frei oder verwerfe.

Stack: Next.js (App Router, TypeScript), Tailwind CSS, Supabase (Auth + Postgres + Storage), Zod, Remotion. Ein Render-Worker als Node-Skript (TypeScript) im Repo.

ZIEL
Ein lauffähiges Grundgerüst, in dem ein Thema als ein Eintrag (content_item) durch alle fünf Stationen wandert. In diesem Schritt sind die Stationen nur Platzhalter mit Status, keine echte KI-Logik. Die echte Logik kommt Station für Station mit eigenen Prompts.

SCHRITTE
1. Lege das Projekt mit create-next-app an (TypeScript, Tailwind, App Router, src-Ordner, ESLint). Kein zusätzliches UI-Framework.
2. Installiere @supabase/supabase-js, @supabase/ssr und zod. Lege Supabase-Clients in src/lib/supabase/ an (browser.ts, server.ts, admin.ts mit `import 'server-only'`).
3. Auth: Login-Seite /login mit E-Mail und Passwort. Alle anderen Seiten erfordern eine Session (Middleware). Ausnahme: /api/reel-worker/*, das sich selbst per Token schützt.
4. Datenbank (supabase/migrations/001_pipeline.sql):
   - content_items: id uuid primary key default gen_random_uuid(), user_id uuid not null references auth.users(id) on delete cascade, title text not null, topic text, stage text not null default 'radar' mit check (stage in ('radar','autor','stimme','regisseur','studio','fertig','verworfen')), created_at, updated_at.
   - Row Level Security auf jeder Tabelle: Policy `user_id = auth.uid()` für select, insert, update, delete.
5. Oberfläche: Seite /pipeline mit fünf Spalten (Augen, Autor, Stimme, Regisseur, Studio), jede Karte ist ein content_item. Button "Neues Thema" legt manuell einen Eintrag an. Pro Karte ein Button "Weiter zur nächsten Station", der nur den Status ändert.
6. Lege eine CLAUDE.md an: Stack, Ordnerstruktur, Konventionen (user_id + RLS auf jeder Tabelle, Migrationen nummeriert, kein any, Zod an jeder Systemgrenze, keine Keys im Code).
7. Lege .env.example mit den Variablennamen an (NEXT_PUBLIC_SUPABASE_URL, NEXT_PUBLIC_SUPABASE_ANON_KEY, SUPABASE_SERVICE_ROLE_KEY). Keine echten Werte.

DATEISTRUKTUR (Ziel)
src/app/login/page.tsx
src/app/pipeline/page.tsx
src/app/api/reel-worker/ (leer, kommt in Station 5)
src/lib/supabase/{browser,server,admin}.ts
src/lib/stages.ts (Liste der fünf Stationen, einzige Quelle für Namen und Reihenfolge)
supabase/migrations/001_pipeline.sql
CLAUDE.md, .env.example

AKZEPTANZKRITERIEN
- npm run build und npm run lint laufen ohne Fehler durch.
- Ohne Login lande ich auf /login, danach auf /pipeline.
- Ich lege ein Thema an und schiebe es durch alle fünf Spalten.
- Ein zweiter Test-Account sieht meine Einträge nicht (RLS-Test).
- Im Repo steht kein Key.

REGELN
Zeige mir zuerst das Datenmodell und warte auf mein OK, bevor du die Migration schreibst. Die Migration spiele ich selbst ein. Baue nicht mehr als beschrieben.

WORAUF ES ANKOMMT

Darauf musst du achten.

  • Thema rein, Video raus

    Die Maschine nimmt dir die Schritte dazwischen ab. Du entscheidest an den Stellen, an denen es zählt: Thema wählen, Hook wählen, Skript freigeben, am Ende das fertige Reel freigeben.

  • Station für Station

    Du musst nicht alles auf einmal bauen. Jede Station funktioniert allein. Fang mit der an, die dir heute am meisten Handarbeit abnimmt.

Deine Content-Maschine, Station für Station.

Mit dem Master-Prompt anfangen: kopieren, in Claude Code einfügen, Grundgerüst bauen.

Du kommst vom Reel? Das hier ist der Bauplan, Stichwort MASCHINE. Mehr Tipps auf @till.schae

Weiterlesen

Alle Anleitungen zu Coding und Agenten an einem Ort, von Skills über Connectors bis zu den Repos.

Coding & Agenten