Faceless Shorts
Du erstellst ein fertiges vertikales Kurzvideo zu einem Thema: Skript, Stimme, wortweise Captions, animierte Szenen, Sound und Musik, gerendert als MP4. Alles ist Code: Canvas-Zeichnung, Headless-Chrome-Capture, ffmpeg, eine lokale Kokoro-Stimme, lokales Whisper-Wort-Timing, numpy-Sound. Keine KI-Bilder oder -Videos, keine API-Keys, keine Extra-Credits.
SKILL = der Ordner, in dem sich diese Datei befindet. Projekte liegen in ~/faceless-shorts/<short-name>/.
Ein Stil: Mascot Explainer (mascot-explainer). DU als flacher Cartoon-Mascot (in Code aus einem Foto gezeichnet, geriggt, lippensynchron), der „N schnelle Schritte“ präsentiert: eine Karte nach der anderen, Zahlenplättchen, die in ein Eck-Badge knallen, eine Live-Checkliste, wortweise Headline-Captions, Kamera-Wackeln + Sound bei jedem Treffer. 30–45 s · 9:16. Am besten geeignet für Anleitungen, Tipps, „N Schritte zu …“, Tech-/Geld-/Produktivitäts-Erklärvideos, bei denen der Creator die Marke ist.
Der Stil = styles/mascot-explainer/style-sheet.png (das Aussehen in einem Bild, gezeichnet durch seinen eigenen Code) + STYLE.md (die Regeln + die Engine-Anleitung) + example/ (ein komplettes Projekt, das unverändert rendert). Lies STYLE.md vollständig, bevor du planst.
0. Erste Nutzung auf einem Computer
bash SKILL/scripts/setup.sh bis All set ausgegeben wird (prüft Node 22+, ffmpeg, Chrome; baut ~/.faceless-shorts/venv; lädt die Kokoro-Stimme ~340 MB und Whisper small.en ~0,5 GB herunter). Installiere fehlende Komponenten auf dem offiziellen, kostenlosen Weg und frage nach, bevor etwas ein Passwort benötigt. Danach muss bash SKILL/scripts/selftest.sh SELFTEST PASSED ausgeben: Öffne das Kontaktblatt, schneide die Namen aus und betrachte sie.
1. Aufnahme (EINE Nachricht, Standardwerte vorausgefüllt)
Frage nur nach dem, was unbekannt ist, und zwar auf einmal: Thema (oder „du suchst 3 Ideen aus“), ein Link zu einem Kurzvideo, dessen Format gefällt (optional), Länge (Standard ~30 s), Stimme (SKILL/scripts/py SKILL/scripts/voice.py --list; Standard am_michael), Voiceover-Modus: KI-Stimme (Standard) · eigene Aufnahme (Aufnahme nach Skriptansicht; words.py --audio) · nur Captions (noch keine Stimme; estimate.py), Musik (eingebauter Beat · keine · eigene lizenzfreie Datei), Endzeile/Handle und ein klares Frontfoto von dir (optional) und ein Outfit, oder der Name eines Mascots, der in ~/faceless-shorts/_mascots/ gespeichert ist. „Einfach los“ = die Standardwerte.
2. Der Plan (EIN Bildschirm, dann warten)
Zeige: Titel · die vollständige Narration, eine Zeile pro Cut, mit den Caption-Blöcken (1. Schau auf die | echte *Absenderadresse) · die Shot-Liste, eine Zeile pro Shot (was wir sehen, was sich bewegt, auf welches Wort es trifft) · neue Komponenten, die du zum Kit hinzufügen wirst, falls vorhanden · Fakten und ihre Quellen. Frage „Soll ich es bauen?“ und warte.
Skript-Regeln. Schreibe es so, wie eine Person tatsächlich mit einem Freund spricht: vollständige, fließende Sätze mit Verbindungswörtern („Na ja,“, „wo“, „aber“, „also“, „was bedeutet“), keine Liste von kurzen caption-artigen Aussagen. ~90–110 Wörter für 35 s. Eine Zeile ist ein CUT, kein Satz: Teile jeden Satz in 1–3 Zeilen an natürlichen Pausen (Kommas, „und“, „wo“), sodass sich das Bild alle 1,5–3,5 s ändert, während die Stimme weiterfließt (voice.py spricht jeden ganzen Satz in einem Durchgang). Form: Ein Haken mit einer echten, belegten Zahl, ein Einzeiler-Versprechen, 3–6 Schritte, die mit „Eins, …“ beginnen, eine klare abschließende Handlung. Schreibe Zahlen so, wie sie gesprochen werden („sieben“). Lies es laut in Gedanken: Wenn es sich wie Captions anhört, schreibe es um. Nur originäre Texte: Übernimm ein Format, das dir gefällt, aber niemals das Skript oder die Shots eines anderen Creators. Jede Tatsache wird mit einer zuverlässigen Quelle überprüft (führe sie in script.json unter „sources“ auf).
3. Bauen
bash SKILL/scripts/new_video.sh mascot-explainer <short-name>kopiert das Beispiel nach~/faceless-shorts/<short-name>/.- Schreibe
script.json(Zeilen + Caption-Blöcke + Lücken; siehe STYLE.md). Erstelle zuerst den Mascot (mascot.json, STYLE.md §2), rendere sein Pose-Blatt und hole das OK des Benutzers ein, bevor du Shots schreibst. - Timing:
SKILL/scripts/py SKILL/scripts/voice.py <proj>dannSKILL/scripts/py SKILL/scripts/words.py <proj>(eigene Aufnahme:words.py <proj> --audio their.m4a; nur Captions:estimate.py <proj>). - Schreibe
src/shots.jsum: Ein Shot pro Zeile (oder zwei bei langen Zeilen), jeder platziert mitcut(i)und seinen Schlüsselmomenten auf Wörtern mitWd('word', line). Verwende das Kit (src/core/kit.js) wieder; füge dort neue Komponenten im Look des Stils hinzu. - Im Projekt:
node tools/capture.mjs check(muss CHECK OK ausgeben) →node tools/capture.mjs cues→SKILL/scripts/py tools/mix.py .→ QA (Abschnitt 4) →node tools/capture.mjs video renders/<name>.mp4. Iteration über einen Shot:node tools/capture.mjs frames review/f "4.2,4.6"und anschauen.
4. QA: Zeige niemals einen Frame, den du nicht angesehen hast
node tools/capture.mjs sheet review/all.jpg 0.5 10 (ein Frame alle 0,5 s, mit Zeitstempel) und lies das gesamte Blatt, dann Schlüsselframes in voller Größe. Frage bei jedem Frame:
- Ergibt es Sinn? Eine Karte nach der anderen; die Pose des Mascots passt zur Zeile; Props bewegen sich mit dem, was sie hält. Nichts erscheint vor seiner Ursache.
- Passt es zur Narration in diesem Moment? Das Bild ändert sich kurz vor seiner Zeile; Enthüllungen treffen auf ihr Wort.
- Kollidiert etwas? Arme, Stempel und Ausbrüche kreuzen niemals versehentlich die Headline, die Karte, das Badge, die Checkliste oder einander.
- Captions: 1–4 Wörter, höchstens ein violettes Akzentwort, richtig geschrieben, niemals vor dem gesprochenen Wort gezeigt.
- Style Sheet: Nur die Palette, flache Formen, harte Ink-Shadows, Rot nur für Gefahr.
- Sound: Stimme klar über der Musik; Effekte leise (keine harten Ticks oder Pieptöne). Behebe, rendere das Blatt neu, überprüfe erneut. Teile dem Benutzer mit, was du gefunden und behoben hast.
5. Ausliefern
Öffne das MP4 für den Benutzer. Gib außerdem: eine Share-Kopie, falls > 35 MB (ffmpeg -i in.mp4 -c:v libx264 -crf 21 -preset slow -c:a aac -b:a 160k -movflags +faststart share.mp4), den besten Cover-Frame (capture.mjs frames), einen Titel, eine Caption und 5–8 Hashtags. Im Modus „eigene Aufnahme“ gib ihnen auch das Skript mit dem Timing jeder Zeile zum Vorlesen. Biete eine Runde präziser Änderungen an und rendere nur das Geänderte neu.
5b. Auf YouTube via Zapier veröffentlichen (nur wenn der Benutzer das Hochladen verlangt)
Alle Aufrufe sind Code-Mode-Tools: Führe sie innerhalb von execute als tools.zapier.* aus (rufe sie nicht als normale Tools auf). Einmal in einem echten Upload validiert; die Werte unten sind exakt.
- Verbinden. Wenn
list_zapier_skillseinen gespeicherten Skill zum Hochladen hat, verwende ihn. Andernfalls stelle sicher, dass die YouTube-App aktiviert ist:discover_zapier_actions({ app: "YouTube" })→enable_zapier_action({ selected_api: "YouTubeV4CLIAPI", app_display_name: "YouTube", action: "upload_video" }). Falls noch keine Verbindung existiert, gibtmanage_zapier_connections({ selected_api: "YouTubeV4CLIAPI" })eine Connect-URL für den Benutzer zurück. - Datei hosten. Die
video-/thumbnail-Parameter der Aktion benötigen eine URL, die Zapiers Server abrufen können; ein lokaler Pfad ist stillschweigend falsch. Lege das MP4 auf einem temporären Host ab, in dieser Reihenfolge (alle getestet am 03.11.2026; unter Windowscurl.exeverwenden):- a. litterbox (1 h bis 72 h Ablauf, bis zu 1 GB):
curl -F "reqtype=fileupload" -F "time=1h" -F "fileToUpload=@renders/<name>.mp4" https://litterbox.catbox.moe/resources/internals/api.php→ gibt die direkte URL als Klartext zurück. - b. uguu.se (ca. 3 h Ablauf, gut für Kurzvideos unter 35 MB):
curl -F "files[]=@renders/<name>.mp4" https://uguu.se/upload→ gibt JSON zurück; verwendefiles[0].url(dend.uguu.se/...-Link). - c. catbox (permanent, kein Ablauf): gleicher Aufruf wie (a) ohne
-F "time=1h". Für immer öffentlich, daher nur mit Zustimmung des Benutzers. - Überspringe diese (am 03.11.2026 als defekt bestätigt, keine Wiederholungsversuche verschwenden): 0x0.st (Uploads deaktiviert), tmpfiles.org (Link ist eine Betrachterseite, nicht die Rohdatei), gofile.io (Raw-Download benötigt ein Account-Token), file.io (curl-API leitet auf die Web-App weiter), bashupload.com, temp.sh (tot).
- Überprüfe immer die URL, bevor du sie verwendest:
curl -sSI <url>muss 200/206 mit einem Video-Content-Type zurückgeben. Vertraue niemals dem JSON eines Hosts ohne Überprüfung. - Teile dem Benutzer mit, dass dies sein Video auf einen öffentlichen temporären Host legt, der von selbst abläuft.
- a. litterbox (1 h bis 72 h Ablauf, bis zu 1 GB):
- Zuerst bestätigen. Dies schreibt auf den echten Kanal des Benutzers, daher bestätige vor der Ausführung: Titel, Sichtbarkeit (privat / nicht gelistet / öffentlich) und Kategorie. Löse
category_idmitinspect_zapier_actions({ tool_name: "youtube_upload_video", enum_property: "category_id" })auf, falls nötig. Bildung = 27 (Standard für Anleitungs-Reels), Comedy = 23, Howto & Style = 26. - Hochladen.
execute_zapier_write_action({ selected_api: "YouTubeV4CLIAPI", action: "upload_video", tool_name: "youtube_upload_video", params: { video: "<temp URL>", title, description (Ende mit #shorts), tags: [5-8 Hashtags ohne #], category_id: "27", privacy_status, made_for_kids: false, embeddable: true, notify_subscribers: true, default_language: "en", license: "youtube" } }) - Bericht. Das Ergebnis enthält
id; der Link isthttps://www.youtube.com/watch?v=<id>. Ein vertikales Video von 60 s oder weniger wird automatisch zu einem Short (kein zusätzliches Feld). Öffne die lokale Datei für den Benutzer (tools.browser.preview({ path: "renders/<name>.mp4" })) und gib die YouTube-URL als Text aus. Der In-App-Browser kann youtube.com oft mit ERR_ABORTED nicht laden; das ist kein fehlgeschlagener Upload. - Thumbnails. Nicht gelistete Uploads akzeptieren über diese Aktion kein benutzerdefiniertes Thumbnail; biete den gespeicherten Cover-Frame an, falls der Benutzer das Video später öffentlich macht.
Niemals
Generiere Bilder oder Videos mit KI; gib Geld oder Credits des Benutzers aus; lade auf YouTube oder einen anderen Host hoch, ohne dass der Benutzer darum bittet und bestätigt; kopiere das Skript, die Shots oder Frames eines anderen Creators; überschreibe ein Benutzerprojekt ohne Nachfrage; versende einen Frame, den du dir nicht angesehen hast.