Projekteinrichtung
Ziel: Aus einem frischen Clone eine Pipeline machen, die im Stil dieser Person montiert – verstehen, was ihm gefällt, seine Dienste anbinden und Frames seines zukünftigen Videos zeigen. Sprich die Sprache des Benutzers, kurz und menschlich.
Das Projekt hat keinen eigenen Stil. Alles, was das Aussehen des Videos betrifft – Palette, Schriften, Untertitel, Karten, Sticker, Poster, Tempo, Punch-Ins, Grading, Sound – wählt der Benutzer aus oder wird aus seinen Referenzen übernommen. Du bietest keine „Standard“- oder „beliebte“ Option an, unterstellst keine eigenen Vorlieben und nichts von dem, was bereits im Projekt liegt (Platzhalter in harness.config.json und Demo sind kein Stil, sondern leerer Raum).
Regeln für das Interview
- Ein Block – eine Nachricht, Blöcke werden niemals zusammengeklebt. Lege nicht zwei Blöcke in eine
AskUserQuestion: Eine Reihe von Fragen wird schnell nach der ersten Antwort abgehakt. Blöcke 4 (Dienste), 6 (Palette), 7 (Schriften), 8 (Montageart) – Gespräche mit mehreren Nachrichten. - Kein „(empfehle ich)“ beim Geschmack. Diese Kennzeichnung ist nur bei rein technischen Entscheidungen erlaubt – bei der Transkriptionsmethode (Block 3). Bei Farben, Schriften, Stil, Diensten und Fragen zur Person gibt es sie nicht; beschreibe die Optionen neutral, was jede bietet.
- Optionen stammen aus den Antworten und Referenzen der Person. Wenn es weder Antworten noch Referenzen gibt – sammle 2–3 deutlich unterschiedliche Optionen passend zu Thema und Ton und zeige sie als Frames; die Wahl liegt bei ihm.
- Zeige, nicht beschreibe: Palette, Schriften und Montageart als fertige Frames mit
video/scripts/variants.py. - Einen Block überspringen („überspringen“) – nur auf Wort des Benutzers. Dann bleibt im Profil ein neutraler Platzhalter, und das sagst du direkt: „später kann es eingerichtet werden – sag "richte Untertitel ein"“.
- Rate nichts über die Person. Marke, Name, Thema, Zielgruppe und Ton – nur aus seinen Antworten, nicht aus der E-Mail des Kontos, dem Systemnamen, dem Ordnernamen oder dem Repository-Link. Der Kontoname im Repository-Link ist der Autor der Vorlage, nicht der Benutzer.
- Technik gehört nicht ins Interview: Safe-Zonen, Schnitt ohne abgeschnittene Enden, Two-Pass-Loudnorm, Mechanik von Punch-Ins an Schnitten – das ist kein Geschmack, sondern wie die Pipeline arbeitet (
CLAUDE.md, „Mechanik“). - Schlüssel gehen niemals durch den Chat. Der Benutzer trägt sie selbst in
video/.envein; du prüfst den Zugriff mitdoctor.sh, ohne etwas auszugeben. Wurde ein Schlüssel im Chat gesendet – nicht verwenden, empfehle, ihn zu widerrufen und einen neuen zu erstellen. - Alles, was über
brew/pipinstalliert wird oder viel wiegt – zuerst „was und wie viel“, dann „ja“.
Schritt 0. Begrüßung (eine Nachricht)
Zwei bis drei Zeilen: Das hier ist die Montage von vertikalen „Talking-Head“-Videos mit Claude Code + Remotion; das Projekt hat keinen eigenen Stil – jetzt richten wir alles auf dich ein: Erzähle von dir, schicke ~10 Reels, die dir gefallen, wähle Farben, Schriften und Montageart (ich zeige Optionen als Frames), binde die benötigten Dienste an. Gehe direkt zu Schritt 1 über.
Schritt 1. Umgebung
cd video && ( [ -d node_modules ] || npm install ) && bash scripts/doctor.sh
Zeige das Ergebnis als kurze Tabelle. Für jedes MISSING biete den Befehl aus der Ausgabe an und führe ihn nach Zustimmung aus:
- Remotion-Skills (obligatorisch):
npx -y skills add remotion-dev/skills --skill '*' --agent claude-code -yaus dem Projektstamm. ffmpeg,node,python3,yt-dlp(für Referenzen) –brew install …(macOS); Linux – Paketmanager; Windows – WSL.- whisper / rembg – wenn sie nach Antworten benötigt werden (Schritt 3).
Kein brew – gib den Link https://brew.sh und warte (die Installation fragt nach dem Passwort, der Benutzer führt sie selbst aus).
Schritt 2. Interview
Block 1 – Wer bist du
Marke / Kanalname; wer im Bild; worum es in den Videos geht; Plattformen und Handles (Reels, TikTok, Shorts, Telegram…); Zielgruppe; Ton; Sprache der Videos; finaler Call-to-Action.
Frage offen – lass ihn in eigenen Worten antworten, auch in einer Nachricht. Wenn du Optionen vorgibst (für Ton oder CTA), sind sie neutral und für jede Person gleich, ohne unterstelltes Thema oder Nische.
Block 2 – Referenzen (~10 Reels)
Bitte: „Schicke etwa 10 Links zu Reels, die dir vom Schnitt her gefallen – Instagram, TikTok oder Shorts. Am besten die, denen du ähneln möchtest. Daran erkenne ich deinen Geschmack: Tempo, Untertitel, Grafik, Farben, Schriften.“ Weniger als 5 – bitte um mehr: Aus 3 Videos lässt sich kein allgemeiner Geschmack ableiten. Erkläre, dass ohne Referenzen in den Blöcken 6–8 ausführlicher nachgefragt werden muss.
Nach Erhalt der Links – starte sofort die Analyse im Hintergrund und gehe zu Block 3 über:
cd video && python3 scripts/refs.py "URL1" "URL2" … > ../takes/refs.log 2>&1 # run_in_background
Das Skript lädt sie in takes/refs/ herunter (nicht in git) und misst: Dauer, Häufigkeit des Bildwechsels, Wechsel im Hook, Lautstärke, Sprechgeschwindigkeit, erste Phrase, helle Farben (palette.png); erstellt NN-sheet.jpg (24 Frames pro Video) und NN-hook.jpg (erste 3 s). Wenn ein Teil der Links mit Anforderung einer Anmeldung FAILED ist – Optionen aus SERVICES.md → „Instagram“: Neustart mit COOKIES_FROM=chrome (nur nach explizitem „Ja“) oder lass ihn selbst herunterladen und die mp4 in takes/refs/ ablegen (dann übergib die Pfade statt der Links).
Block 3 – Transkription der Sprache
- whisper.cpp lokal (empfohlen auf Mac): Kostenlos, offline;
brew install whisper-cpp+ Modell large-v3-turbo 1,6 GB. - ElevenLabs Scribe: Kostenpflichtig (Credits), keine Installation nötig, funktioniert auf jedem System; benötigt einen Schlüssel (Block 4).
Block 4 – Dienste (eine Nachricht pro Dienst)
Frage nicht mit einer einzigen Frage „was soll angebunden werden?“. Gehe die Dienste nacheinander durch – eine Nachricht pro Dienst: Was bietet er für die Montage (1–2 Zeilen mit Beispiel), wie viel kostet es, was wird vom Benutzer benötigt und wie lange dauert es. Frage: „binden wir jetzt an / später / nicht nötig“.
| Dienst | Was er für die Montage bietet | Zugriff | Zeit |
|---|---|---|---|
| ElevenLabs | Transkription mit Scribe; klangliche Akzente nach deinem Geschmack; Sprachausgabe | API-Key | ~3 Min |
| Higgsfield | Kurze Videoeinlagen (B-Roll), wenn du über etwas sprichst, das man zeigen kann | Browser-Login | ~2 Min + nach Neustart |
| 21st.dev | Fertige React-Komponenten als Grundlage neuer Grafiken | API-Key | ~3 Min |
| Buffer | Entwürfe von Beiträgen für Reels / TikTok / Shorts | Browser-Login + Kanäle in Buffer | ~5 Min |
Reihenfolge: ElevenLabs → Higgsfield → 21st.dev → Buffer. Wenn in Block 3 Scribe gewählt wurde – ElevenLabs ist obligatorisch, sag das auch so. „Später“ und „nicht nötig“ sind normale Antworten.
Für jeden, der mit „jetzt“ beantwortet wurde – führe durch den Abschnitt aus SERVICES.md: Links und Schritte in eigenen Worten, warte auf „fertig“, konfiguriere deinen Teil und prüfe:
- Schlüssel (ElevenLabs, 21st.dev): Wenn
video/.envnicht existiert –cp video/.env.example video/.env; der Benutzer trägt den Schlüssel selbst ein (open -e video/.env). Prüfung –bash video/scripts/doctor.sh, Abschnittaccess. Abgelehnt – wahrscheinlich nicht vollständig kopiert oder ohne die erforderlichen Berechtigungen; lass ihn einen neuen erstellen. - 21st.dev: Füge nach der Schlüsselprüfung den Server lokal hinzu (der Schlüssel wird direkt in der Shell aus
.envgelesen):Keincd video && set -a && . ./.env && set +a && cd .. && claude mcp add --transport http 21st https://21st.dev/api/mcp --header "x-api-key: $TWENTYFIRST_API_KEY" --scope localclaudeim PATH – gib dem Benutzer diesen Befehl zur Ausführung im Terminal. - OAuth (Higgsfield, Buffer, optional ElevenLabs MCP): Ergänze die ausgewählten Server in der
video/.mcp.json:Browser-Login – nach Neustart von Claude Code ({ "mcpServers": { "higgsfield": { "type": "http", "url": "https://mcp.higgsfield.ai/mcp" }, "buffer": { "type": "http", "url": "https://mcp.buffer.com/mcp" }, "elevenlabs": { "type": "http", "url": "https://api.elevenlabs.io/v1/mcp" } } }/mcp→ Server → Authenticate): sag es jetzt und erinnere in Schritt 5. Für Buffer bitte vorher die Kanäle in Buffer selbst anbinden (Instagram – professionelles Konto).
Markiere die angebundenen in integrations. Wenn du bei einem Dienst länger als 15 Minuten hängst – schlage vor, es zu verschieben: „binden wir später an – sag "binde Buffer an"“.
Block 5 – Was dir gefällt (anhand der Referenzen)
Warte auf das Ende der Analyse (ps -axo command | grep "[r]efs.py"), lies takes/refs/refs.json, schau dir jedes NN-hook.jpg und NN-sheet.jpg und palette.png an. Notiere zu jedem Video das, was die Zahlen nicht zeigen: Untertitel (wo, Größe, Groß-/Kleinschreibung, Fettung, Farbe, Worthervorhebung, Hintergrund), Grafiken (Karten und ihr Aussehen, Sticker, Screenshots, B-Roll, Emojis), Bildausschnitt und Punch-Ins, Anteil des nackten Gesichts, Grafiken-Palette, Schriften, was im Hook ist (Text-Poster, Frage, Aktion), Endcard.
Fasse es zu einem „Geschmacksprofil“ zusammen: 5–7 Gemeinsamkeiten, die mindestens in der Hälfte der Videos vorkommen, mit Zahlen (Mediane aus refs.py). Zeige es in einer Nachricht und frage: „trifft das auf dich zu? Was davon möchtest du bei dir haben, was nicht?“ Das Akzeptierte wird zu Vorschlägen in den Blöcken 6–8 – dort zeigst du es als Frames neben anderen Optionen, nicht wendest du es stillschweigend an. Was sich nicht in Einstellungen umsetzen lässt (Emoji-Sticker, Greenscreen…) – notiere als Wunsch im Profil.
Block 6 – Palette (2–3 Nachrichten)
6.1 Fragen – in einer Nachricht, im offenen Text:
- Gibt es Hausfarben – Logo, Website, Kanalgestaltung, Cover? Sende hex, einen Link zur Website oder lege ein Logo / einen Screenshot in
takes/brand/ab. - Was soll in den Videos farblich hervorgehoben werden: Zahlen, Schlüsselwörter, Aufrufe?
- Welches Gefühl soll vermittelt werden: streng, warm, hell, ruhig?
- Welche Farben auf keinen Fall?
Wurde ein Bild gesendet – extrahiere die Hauptfarben:
python3 -c "
from PIL import Image; import sys
im = Image.open(sys.argv[1]).convert('RGB').resize((200, 200)).quantize(6)
pal = im.getpalette(); cnt = sorted(im.getcolors(), reverse=True)
print([('#%02X%02X%02X' % tuple(pal[i*3:i*3+3]), round(100*n/40000)) for n, i in cnt])
" takes/brand/logo.png
Link zu einer Website – öffne sie und finde die Hauptfarben (Logo, Buttons, CSS-Variablen).
6.2 Kandidaten – 2–3 Paletten nach vier Rollen: dark (Kacheln, Screens), light (Text), accent (Hervorhebung), pain (Karte „so nicht“, falls sie benötigt wird):
- aus den Referenzen –
recurring_coloursinrefs.jsonundpalette.png; prüfe anhand der Storyboards, ob die Farbe Grafik oder Text ist, und nicht eine Wand, ein Gegenstand im Bild oder Haut; - aus Hausfarben, falls vorhanden;
- nach den Antworten aus 6.1 – Gefühl und was hervorgehoben werden soll.
Lesbarkeit (Technik, nicht Geschmack): Text auf Kacheln und über dem Footage muss lesbar sein – prüfe den Kontrast jedes Kandidaten (light auf dark ≥ 7:1, accent auf dark ≥ 3:1); wenn ein Kandidat nicht besteht – sag es und schlage den nächsten vor, der besteht:
python3 -c "
import sys
def L(h):
c=[int(h[i:i+2],16)/255 for i in (1,3,5)]
c=[x/12.92 if x<=0.03928 else ((x+0.055)/1.055)**2.4 for x in c]
return 0.2126*c[0]+0.7152*c[1]+0.0722*c[2]
a,b=sorted([L(sys.argv[1]),L(sys.argv[2])]); print(round((b+0.05)/(a+0.05),1))
" '#FFFFFF' '#141414'
6.3 Zeige als Frames:
cd video && python3 scripts/variants.py out/palette-options.png 70,368 \
'{"label":"A","colors":{"dark":"#…","light":"#…","accent":"#…","pain":"#…"}}' \
'{"label":"B","colors":{…}}' '{"label":"C","colors":{…}}'
Zeige das Blatt (SendUserFile), beschrifte: „A – aus deinen Referenzen, B – aus dem Logo, C – nach dem Gefühl“. Korrekturen („A, aber Akzent dunkler“) – neuer Durchlauf. Das Ausgewählte kommt in colors.
Block 7 – Schriften (2–3 Nachrichten)
Zwei Schriften: Text (Untertitel und Karten, Gewichte 500 / 600 / 700) und Poster (Überschrift zu Beginn des Videos, falls es eine gibt). Beide müssen das Alphabet der Videosprache unterstützen.
7.1 Fragen – in einer Nachricht: Gibt es Hausschriften (Namen oder Dateien in takes/brand/); welcher Charakter – streng, freundlich, technologisch, redaktionell; Untertitel leicht oder dicht.
Wenn es Block 2 gab – schau dir die Untertitel und Überschriften auf den Storyboards an und sag, was du siehst: Typ (geometrische Grotesk, Neo-Grotesk, schmal, abgerundet, mit Serifen), Fettung, Groß-/Kleinschreibung. Rate nicht den genauen Namen anhand des Bildes – suche eine ähnliche freie Schrift.
7.2 Kandidaten – 2–3 Paare „Text + Poster“ aus @fontsource mit dem benötigten Alphabet, unterschiedlich im Charakter, passend zu seinen Antworten und Referenzen. Für Russisch prüfe auf Kyrillisch; Bebas Neue – nur Latein. Gekaufte Hausschrift – in video/src/fonts/ + @font-face mit font-display: block manuell; erinnere an die Lizenz, wenn das Repository öffentlich ist.
7.3 Zeige als Frames:
cd video && npm i @fontsource/<a> @fontsource/<b> # Kandidaten
ls node_modules/@fontsource/<a>/ | grep -c cyrillic # für ru > 0
ls node_modules/@fontsource/<a>/ | grep -E '^[0-9]+\.css$' # verfügbare Gewichte
grep -m1 font-family node_modules/@fontsource/<a>/400.css # genauer Familienname
Füge in video/src/index.css die Imports der Kandidaten-Gewichte hinzu (@import "@fontsource/<a>/600.css"; …), dann:
python3 scripts/variants.py out/font-options.png 70,368 \
'{"label":"A","fonts":{"text":"…","poster":"…","posterWeight":700}}' '{"label":"B","fonts":{…}}'
Zeige, beschrifte. Nach der Auswahl lasse in index.css nur die ausgewählten Imports und entferne die überflüssigen Pakete (npm un …).
Block 8 – Montageart (eine Nachricht pro Thema)
Vier Themen, jedes in einer eigenen Nachricht: Frage, was in den Referenzen sichtbar ist („in 7 von 10 Untertiteln zentriert, groß“), dann 2–3 Optionen als Frames mit variants.py (Keys style.*, Frames 70,270,368). Kein „empfehle ich“.
8.1 Untertitel (style.captions):
- wo:
cycle– Phrasen wandern über das Bild (oben-links → oben-rechts → unten);rail– immer unten;center– zentriert; - Größe
size: [normales Wort, hervorgehobenes]in px (≈ 48 klein, 60 mittel, 76 groß); - Fettung
weight(500–800); Groß-/Kleinschreibungcase:lower/asis/upper; - Hervorhebung
highlight:color(Schlüsselwörter in der Akzentfarbe) /size(größer) /both/none; - Hintergrund
box:true– Kachel unter der Zeile,false– Schatten.
8.2 Grafik:
- Karten
style.cards:glass(halbtransparentes Glas) /solid(dichte Kachel) /none; wie oft – in Worten inediting-taste.md§3; - Sticker-Piktogramme in Pausen
style.stickers:true/false; - Poster-Überschrift hinter dem Kopf zu Beginn
style.poster:enabled, Groß-/Kleinschreibungcase(upper/asis), kleiner Untertitelkicker. Aktiviert – rembg benötigt (~30 Min im Hintergrund pro Video, Modell ~1 GB einmalig); - B-Roll (falls Higgsfield angebunden): ob benötigt, wie viel – in Worten in
brand-kit.md§5.
8.3 Bewegung und Bild:
- Tempo
style.pace:relaxed(weniger Schnitte, längere Einstellungen, ruhig) /dynamic(häufige Schnitte, schnelle Zoom-Effekte) /punchy(scharfe Wechsel, aktive Punch-Ins); - Punch-Ins
style.punchins:smart(nur auf Schlüsselwörter oder Anfangsphrase) /always(jede Phrase) /none; - Kamera
style.camera:fixed(statisch, Sprecher an einer Stelle) /subtle(leichte Mikrobewegungen) /dynamic_angle(Wechsel der Position von Aufnahme zu Aufnahme); - Safe-Zonen
style.safe_zones:tight(60/40) /wide(10/90); - Grading
style.grading:natural(minimale Farbkorrektur, hautnah) /teal(Mode-Trend, warme Haut + kalter Hintergrund) /vintage(gedämpfte Töne, Filmkorn) /high_contrast(kräftige Kontraste).
8.4 Sound:
- Musik
style.music:quiet_background(leise, atmosphärisch) /rhythmic(rhythmisch, an Schnitten getaktet) /none; - Soundeffekte
style.sfx:transitions(nur an Schnitten) /words(hervorgehobene Wörter) /none; - Sprachbearbeitung
style.voice_processing:clean(leichtes Rauschen entfernen, EQ) /radio(tiefe Stimme, Hall) /none; - Lautstärke
style.volume:auto(Loudnorm, Anpassung an die Empfehlung der Plattform) /manual(fester Wert in LUFS, angeben).
Wichtig für Block 8: Variants-Frames zeigen die Auswahl in einem Standard-Layout – die tatsächliche Anordnung der Elemente hängt vom Inhalt der Referenz und dem spezifischen Skript ab. Der Benutzer wählt eine Option für jede Untersektion, selbst wenn „alles zusammen“ logischer erscheint. Jede Option wird unabhängig angewandt.
Schritt 3. Abschluss und Konfiguration
Sobald alle Blöcke abgeschlossen sind:
-
Erstelle
takes/harness.config.json:{ "configured": true, "brand": "Markenname", "voiceLanguage": "de", "colors": {"dark": "#…", "light": "#…", "accent": "#…", "pain": "#…"}, "fonts": {"text": "…", "poster": "…", "posterWeight": 700}, "style": { "captions": {…}, "cards": "…", "stickers": true/false, "poster": {…}, "pace": "…", "punchins": "…", "camera": "…", "safe_zones": "…", "grading": "…", "music": "…", "sfx": "…", "voice_processing": "…", "volume": "…" }, "services": ["elevenlabs", …], "integrations": { "elevenlabs": true/false, "higgsfield": true/false, "21st": true/false, "buffer": true/false } } -
Erstelle
takes/brand-kit.mdmit Abschnitten:- Marke und Kanal
- Zielgruppe
- Ton und Stimme
- Farbpalette
- Schriftarten
- B-Roll / Grafiken (wenn Higgsfield angebunden)
-
Erstelle
takes/editing-taste.mdmit Abschnitten:- Tempo und Schnitt
- Untertitel (Position, Größe, Hervorhebung)
- Karten und Grafiken (Format, Häufigkeit)
- Bewegung (Punch-Ins, Zooms)
- Sound (Musik, Effekte, Sprachbearbeitung)
-
Erstelle
takes/exemplars.md– Liste der ausgewählten Referenzvideos mit einer kurzen Beschreibung, warum jedes typisch für den gewünschten Stil ist. -
Lösche temporäre Dateien aus
takes/refs/(außerrefs.jsonund Profilen), wenn der Benutzer zustimmt.
Ausgabe an den Benutzer: „Das Projekt ist eingerichtet! Erstelle dein erstes Video mit claude video oder passe Einstellungen an, indem du sagst "ändere Farbe" / "ändere Untertitel" / "ändere Schrift" usw.“
Wichtige Hinweise
- Unterbrich das Interview nicht durch Funktionen. Wenn der Benutzer während des Interviews eine Frage stellt oder eine Pause macht – antworte kurz und kehre zum letzten Unterbrechungspunkt zurück. Wenn der Benutzer nach einer Einstellung fragt, die noch nicht besprochen wurde – notiere sie dir für den entsprechenden Block.
- Wenn der Benutzer während des Interviews einen Befehl eingibt (z. B.
claude video), den du noch nicht implementiert hast – erkläre, dass das Projekt noch nicht eingerichtet ist, und setze das Interview fort. - Nach Abschluss der Konfiguration kannst du das Profil auf Befehl ändern: „ändere die Farbe auf …“ oder „ändere den Stil auf dynamischer“ aktualisiert die entsprechenden Abschnitte der Konfigurationsdateien. Der Benutzer muss das Interview nicht erneut durchlaufen, sollte aber sicherstellen, dass neue Einstellungen mit dem vorhandenen Inhalt kompatibel sind.
Fehlerbehebung
scripts/doctor.shgibtMISSINGfür Remotion-Skills aus – führe erneutnpx -y skills add …aus.scripts/refs.pyschlägt fehl mit „Kein Zugriff“ – der Benutzer muss die Cookies für Chrome exportieren oder die Dateien manuell herunterladen.- Die Transkription schlägt fehl – wenn whisper.cpp nicht installiert ist, vorschlagen, ElevenLabs Scribe zu verwenden.
- Die Konfigurationsdatei wird nicht gespeichert – überprüfe die Schreibrechte im
takes/-Verzeichnis. variants.pyzeigt leere Frames – stelle sicher, dassvideo/node_modulesinstalliert ist und führenpm installimvideo-Verzeichnis aus.