Communitygithub.com

nestedbit/faceless-shorts

Erstelle Mascot-Erklärvideos / YouTube Shorts / TikToks vollständig per Code auf dem eigenen Computer – der Creator als flacher Cartoon-Mascot, der in Code aus einem Foto gezeichnet wird (animiert, lippensynchron zur Stimme) und nummerierte Schritt-für-Schritt-Karten präsentiert, mit Zahlenplättchen, die in ein Eck-Badge knallen, einer Live-Checkliste, wortweisen Headline-Captions und Sound bei jedem Treffer. Kostenlose lokale KI-Stimme und Wort-Timing, keine zusätzlichen Kosten über den Claude-Plan hinaus.

Was ist faceless-shorts?

Faceless Shorts ist ein KI-Agenten-Skill, der es ermöglicht, komplette vertikale Kurzvideos (z. B. YouTube Shorts, TikToks oder Reels) direkt auf dem eigenen Computer zu erstellen – und zwar vollständig durch Code: Scripting, Sprachsynthese, wortweise Captions, animierte Szenen, Sound und Musik, alles gerendert in ein MP4. Der Skill verwendet ausschließlich lokale Tools wie Node.js, ffmpeg, Kokoro (TTS), Whisper (Wort-Timing) und numpy – keine KI-Bilder oder -Videos, keine API-Schlüssel, keine zusätzlichen Credits. Der primäre Stil ist „Mascot Explainer“: Der Ersteller wird als flacher Cartoon-Mascot dargestellt, der aus einem einzigen Foto in Code gezeichnet, rigged und lippensynchron animiert wird. Der Mascot präsentiert nummerierte Schritte auf Karten, mit dynamischen Zahlentiles, einer Live-Checkliste, wortweisen Captions und Kameraeffekten. Der Skill eignet sich besonders für Anleitungen, Tipps, „N Schritte zu …“ und Erklärvideos aus den Bereichen Technik, Finanzen oder Produktivität, bei denen der Creator selbst die Marke ist. Plattformen: Claude Code, Cursor, Codex und andere KI-Agenten, die Code ausführen können. Die Funktionsweise beginnt mit einem einmaligen Setup (Node 22+, ffmpeg, Chrome, Kokoro-Modell ~340 MB, Whisper small.en ~0,5 GB), gefolgt von der Aufnahme des Themas, der automatischen Script- und Szenenerstellung, der Sprach- und Wort-Timing-Generierung, der Shot-Programmierung in JavaScript und schließlich der Rendering-Pipeline (Capture, Mix, Video-Export). Ein QA-Schritt prüft jeden Frame auf Konsistenz, Kollisionen und korrekte Caption-Timings. Der Skill kann optional Videos über Zapier auf YouTube veröffentlichen, nach expliziter Benutzerfreigabe.

Funktioniert mit✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/nestedbit/faceless-shorts/tree/HEAD

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

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

  1. bash SKILL/scripts/new_video.sh mascot-explainer <short-name> kopiert das Beispiel nach ~/faceless-shorts/<short-name>/.
  2. 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.
  3. Timing: SKILL/scripts/py SKILL/scripts/voice.py <proj> dann SKILL/scripts/py SKILL/scripts/words.py <proj> (eigene Aufnahme: words.py <proj> --audio their.m4a; nur Captions: estimate.py <proj>).
  4. Schreibe src/shots.js um: Ein Shot pro Zeile (oder zwei bei langen Zeilen), jeder platziert mit cut(i) und seinen Schlüsselmomenten auf Wörtern mit Wd('word', line). Verwende das Kit (src/core/kit.js) wieder; füge dort neue Komponenten im Look des Stils hinzu.
  5. 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.

  1. Verbinden. Wenn list_zapier_skills einen 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, gibt manage_zapier_connections({ selected_api: "YouTubeV4CLIAPI" }) eine Connect-URL für den Benutzer zurück.
  2. 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 Windows curl.exe verwenden):
    • 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; verwende files[0].url (den d.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.
  3. 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_id mit inspect_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.
  4. 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" } })
  5. Bericht. Das Ergebnis enthält id; der Link ist https://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.
  6. 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.

Verwandte Skills