Communitygithub.com

funi-ai/demo-video

Erstelle Produktdemos, Store-Vorschaubilder und Feature-Loops aus echten Bildschirmaufnahmen – beschnitten, beschleunigt, gezoomt, gerahmt, untertitelt und vertont, alles mit lokalem ffmpeg.

Was ist demo-video?

Dieses Skill ermöglicht es KI-Agenten, aus echten Benutzer-Bildschirmaufnahmen professionelle Produktdemos, App-Store-Vorschauvideos, Header-Videos, Google-Play-Promo-Videos, GIF-Loops und mehr zu erstellen. Es arbeitet mit lokalem ffmpeg, um die Aufnahmen zu schneiden, zu beschleunigen, zu zoomen, einzurahmen, zu untertiteln und zu vertonen. Modelle werden nur für Elemente eingesetzt, die nicht das Produkt selbst sind: Erzählung (Eleven v3, Gemini TTS für Türkisch), Musik und UI-Sounds. Der Workflow ist stark strukturiert: von der Aufnahmeanalyse über das Erstellen eines Schnittplans (cut.json) bis hin zur Generierung verschiedener Varianten (Web, App Store, Google Play, Product Hunt) und der Validierung der Ergebnisse. Es ist nicht für generierte B-Roll-Clips, Erklärvideos mit generierten Bildern, bezahlte Anzeigen oder andere Zwecke geeignet. Das Skill unterstützt Claude Code, Cursor und Codex und stellt sicher, dass die Benutzeroberfläche nie neu generiert wird, wie von Apple für Vorschauen gefordert.

Funktioniert mit✓Claude Code~Codex CLI~Cursor✓Gemini CLI
npx skills add https://github.com/funi-ai/claude-plugins/tree/main/plugins/genmedia-skills/skills/demo-video

In Ihrer bevorzugten KI fragen

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

Dokumentation

Was macht demo-video?

Ein Produkt-Demo, eine Store-Vorschau oder eine Feature-Schleife, die aus einer echten Bildschirmaufnahme des Benutzers erstellt wird. Die Oberfläche wird niemals neu generiert: Die Aufnahme wird geschnitten, beschleunigt, gezoomt, gerahmt, untertitelt und vertont. Apple gibt die gleiche Regel für Vorschauen vor (2.3.4: Video-Bildschirmaufnahmen der App selbst, Erzählung und Overlays erlaubt). Ein cut.json enthält die Aufnahmen, die geordneten Szenen und die Varianten; democut.py wandelt sie mit lokalem ffmpeg in Dateien um, und erneutes Schneiden ist kostenlos.

Schritt 0 — Vorbereitung

Einmal pro Sitzung:

python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" tools
  • kind: "ffmpeg_missing" → Kein lokales Schneiden möglich. Sag dies und biete den kostenpflichtigen Utility-Weg in references/routing-utility.md an oder fordere den Benutzer auf, ffmpeg zu installieren. Improvisiere niemals mit anderen Tools.
  • Behalte can.burn_captions (libass), can.duck (sidechaincompress), can.webm. Fehlende ändern, was du versprichst, niemals, was du behauptest.
  • Nur wenn etwas generiert wird (Erzählung, Musik, Sound, Synchronisation, eine Grafik):
    command -v genmedia
    python3 "${CLAUDE_SKILL_DIR}/scripts/gm.py" preflight
    
    blockers nicht leer, CLI fehlt oder älter als 0.7.0 → /genmedia-skills:setup. Schlüssel fehlt → der Benutzer führt genmedia setup aus oder exportiert FAL_KEY selbst; warte. Lies, drucke, fordere oder tippe niemals einen Schlüssel. Behalte config.announce_above_usd und config.confirm_above_usd (Standard 0.50 und 2).
  • Setze zuerst fort: .genmedia/projects/<slug>/demo-video/cut.json existiert → fahre damit fort, starte niemals einen zweiten Schnitt für dasselbe Produkt.

UX-Regeln

  1. Antworte in der Sprache des Benutzers. Erzählung, say-Zeilen und Text auf dem Bildschirm bleiben in der Sprache, in der sie ausgeliefert werden; Modell-Prompts sind auf Englisch. Pfade, IDs und Feldnamen bleiben wie sie sind.
  2. Kein JSON, Filtergraphen, Anforderungs-IDs oder Tool-Erzählung im Chat. Höchstens eine Statuszeile pro langem Schritt.
  3. Fragebudget: 2, eine nach der anderen, mit beschrifteten Optionen, nur wenn die Antwort fehlt:
    • Q1 die Aufnahme, wenn keine Datei angegeben wurde: Frage nach Pfaden und übergib die kurze Aufnahmeliste aus references/recording-tips.md. Es gibt keinen Standard für Filmmaterial.
    • Q2 wohin es geht, wenn die Anfrage es nicht sagt: A Website-Demo (16:9) · B App Store Vorschau · C App Store Header- oder Suchergebnis-Video · D Google Play Promo · E Product Hunt Launch-Video · F eine stumme Schleife oder GIF. Mehrere können ausgewählt werden; ein Schnitt dient allen. Alles andere ist ein Standard, den du in der Lieferung angibst: 60 s für eine Demo, 20 s für eine Store-Vorschau, 12 s für ein App-Store-Header- oder Suchvideo, 6 s für eine Schleife; Erzählung an für eine Demo, aus für eine Schleife oder ein Header- oder Suchvideo; Musik aus, wenn nicht verlangt; Untertitel als separate Datei; Schnitte, keine Überblendungen; kein Geräterahmen, es sei denn, ein Store- oder Social-Media-Ziel wünscht einen.
  4. Die Schnittkarte ist ein harter Stopp. Zeige die Szenenliste (Zeiten, was passiert, was gesagt wird, Längen) und warte auf ein Ja, bevor etwas generiert oder gerendert wird. Stille ist keine Zustimmung, und ein Ja zu einer älteren Version ist kein Ja zu dieser.
  5. Erzählung vor Bild. Generiere die Stimme pro Szene, lass time sie messen und schneide das Bild darauf zu. Timing einer Szene niemals durch Raten, wie lange ein Satz dauert (references/narration-and-audio.md).
  6. Schau vor der Lieferung. Lies das Standbild und ein Kontaktblatt der fertigen Datei, und lies das erste Bild eines GIFs. Eine Demo, die validiert, aber den falschen Bildschirm zeigt, ist immer noch falsch.
  7. Fakten und Privatsphäre kommen vom Benutzer. Bewertungen, Zählungen, Auszeichnungen, Kundennamen und Logos erscheinen nur, wenn der Benutzer sie geliefert hat. Wenn ein Bild echte Daten zeigt, ist die Lösung eine neue Aufnahme, keine Unschärfe; sag das deutlich.
  8. Kosten: Der Schnitt, die Rahmen, die Schleifen und jede Überprüfung sind USD 0. Vor jeder Generierung schätze und wende das Tor aus der Vorbereitung an: unter announce_above_usd → ausführen und angeben; bis confirm_above_usd → eine Zeile, dann ausführen; darüber → explizites Ja. Zitiere niemals einen Preis aus dem Gedächtnis.
  9. Begrenzt: höchstens 3 Reparaturversuche pro Schritt, jedes Mal ändert sich etwas; eine Content-Policy-Ablehnung wird niemals unverändert erneut gesendet; ein Auftrag mit einer Request-ID wird fortgesetzt, niemals erneut eingereicht.

Discovery-Schutzschild

scripts/video-surfaces.json ist ein datierter Cache (verified_on, gelesen von democut.py specs): ein null ist eine Zahl, die niemand von der offiziellen Seite gelesen hat, fülle sie niemals aus dem Gedächtnis, und wenn ein Store eine Datei ablehnt, gewinnt die offizielle Seite und die Zeile wird korrigiert.

Vor dem ersten bezahlten Aufruf eines Endpunkts in einer Sitzung:

genmedia models --endpoint_id <endpoint_id> --json
python3 "${CLAUDE_SKILL_DIR}/scripts/gm.py" schema <endpoint_id>

status muss active sein; Felder, Enums und Grenzen kommen aus dem Schema. Nicht aktiv → die nächste Stufe dieser Aufgabe in references/routing-audio.md. Führe niemals genmedia run mit einem Prompt anstelle einer Endpunkt-ID aus. Neue Versionen liegen unter Hersteller-Namespaces, nicht nur fal-ai/.

Routing

BedarfWieWarum
Trimmen, Beschleunigen, Zoomen, Rahmen, Zusammenfügen, Overlay, Mischen, Lautstärke, GIF, Überprüfungendemocut.py (lokales ffmpeg)exakt, kostenlos, wiederholbar; die Pixel des Produkts durchlaufen nie ein Modell
Eine Aufnahme oder ein Ergebnis ansehen, ohne sie anzusehendemocut.py analyze, sheet, grab; frames.py sheetDetektoren und Kontaktblätter statt Vermutungen
Erzählungfal-ai/elevenlabs/tts/eleven-v3; Türkisch: fal-ai/gemini-3.1-flash-ttsStandard TTS; der türkische Pfad ist schema-verifiziert
Musikbett, UI-Soundselevenlabs/music/v2.5 (exakte Länge), fal-ai/elevenlabs/sound-effects/v2Längensteuerung; günstig pro Sekunde
Wortgenaue Untertitel-Zeitsteuerungfal-ai/elevenlabs/speech-to-text/scribe-v2 → audiokit.py captionsWort-Zeitstempel
Eine andere Sprache für eine fertige Dateifal-ai/elevenlabs/dubbingein Aufruf pro Sprache
Geräterahmen, Endkarte, exakter Text auf dem Bild/genmedia-skills:launch-graphics (layers, zusammengesetzte PNGs)Text wird dort zusammengesetzt, wo er exakt ist, niemals generiert
Hintergrundplatte hinter einem gerahmten Gerätbytedance/seedream/v5/pro/text-to-imageeine Platte pro Video, keine Beschriftung
Kein lokales ffmpegfal-ai/ffmpeg-api/* in references/routing-utility.mdCent pro Aufruf, ein Fallback und nicht der Standard

Tie-Breaker und Fallen:

  1. Die Oberfläche wird niemals generiert, neu gestaltet, neu gerahmt oder "verbessert". video-reframe, video-edit und Upscaler übermalen UI-Text: sie sind für generiertes Filmmaterial, nicht für eine Aufnahme.
  2. Zoom in Bruchteilen des Quellbilds, lese von grab --grid oder sheet --grid ab; hold für Details, push einmal, um das Auge zu führen, pull einmal, um Kontext zu enthüllen (references/editing.md).
  3. Eine Store-Vorschau ist nicht die Demo mit einem kürzeren Ende: Es ist ihre eigene Variante mit ihrem eigenen Szenen-Subset.
  4. Play und Product Hunt nehmen eine YouTube-URL, keine Datei: Liefere die Datei und sage, wer sie hochlädt.
  5. Ein App-Store-Header- oder Suchergebnis-Video (iOS 27 Creative Asset) ist seine eigene stumme, sich wiederholende Variante: appstore-header-video (3840x1646) oder appstore-search-video (3:2), 30 oder 60 fps, 5-30 s, eine Idee, Szenen von 2 s oder mehr, enden dort, wo es begann. Apple listet kein universelles Video auf; die Standbilder sind launch-graphics-Arbeit (references/surfaces.md Abschnitt 1a).
  6. Eine Telefonaufnahme benötigt einen Telefonrahmen; time verweigert eine 30%ige Seitenverhältnisabweichung.
  7. Einbrennen nur, wenn can.burn_captions; sonst eine separate Datei oder der kostenpflichtige Untertitel-Weg, klar ausgesprochen.
  8. Der Benutzer hat ein Modell genannt → verwende es nach der Live-Überprüfung.

Arbeitsablauf

  1. Aufnahme. Ziel, Ziele, Aufnahmen, Marke. Lies jede Datei, die der Benutzer genannt hat. Dann, pro Aufnahme:
    python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" init --slug <slug> --name "<Product>" --target web-16x9
    python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" source add --slug <slug> --id app --file ./recordings/demo.mov --os desktop
    
    Die Antwort enthält Größe, fps, Dauer, Audio, etwaige eingebrannte Letterboxen und die Ziele, die zum Seitenverhältnis passen. Eine Aufnahme, die kleiner als das Ziel ist oder die echte Daten zeigt, bekommt jetzt eine Bitte um Wiederholung, nicht nach dem Schnitt (references/recording-tips.md).
  2. Schau es dir an.
    python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" analyze --slug <slug> --source app
    python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" sheet --slug <slug> --source app --count 12 --cols 4 --grid
    
    Lies das Blatt. dead_spans und keep_spans sind Kandidaten, niemals ein Schnitt: Ein stiller Bildschirm ist manchmal der Punkt. grab --at <s> --grid für jedes Bild, in das du zoomen wirst.
  3. Schnittkarte. Szenen in Reihenfolge: id, Quelle in/out, Geschwindigkeit, Zoom, was der Betrachter sieht, was die Stimme sagt, Länge; dann die Varianten, was generiert wird, was vom Benutzer benötigt wird, und die Annahmen. Zeige es, stoppe, warte auf ein Ja (references/editing.md).
  4. Erzählung, gemessen (nur wenn die Demo vertont ist). Preis und führe einen Batch pro references/narration-and-audio.md aus, eine Datei pro Szene, dann lass die Zahlen das Bild bestimmen:
    python3 "${CLAUDE_SKILL_DIR}/scripts/gm.py" price fal-ai/elevenlabs/tts/eleven-v3,elevenlabs/music/v2.5 --explain
    python3 "${CLAUDE_SKILL_DIR}/scripts/gm.py" batch --plan .genmedia/projects/<slug>/demo-video/voice-plan.json
    
  5. Schreibe den Schnitt. Bearbeite .genmedia/projects/<slug>/demo-video/cut.json mit dem Write- oder Edit-Tool: scenes, audio, variants. Jedes Feld: references/cut-json.md. Geräterahmen kommen von launch-graphics layers (references/frames-and-loops.md).
  6. Tor.
    python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" time --slug <slug>
    
    Behebe jeden Fehler vor dem Rendern: scene_shorter_than_voice (verlängere den Bereich, verlangsame ihn oder schneide Wörter — beschleunige niemals die Stimme), duration_out_of_range bei einem Store-Ziel, wrong_size, fps_not_allowed, transition_too_long, frame_aspect_mismatch, overlay_invisible. Handle die Warnungen (quick_cut, fast_motion, narration_muted bei einem Creative-Asset-Video) oder erkläre die, die du behältst.
  7. Erstelle.
    python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" build --slug <slug>
    
    600000 ms Bash-Timeout. Szenen werden nach Inhalt gecacht: Eine Revision rendert nur das neu, was sich geändert hat (--scene <id>, --force). Dann Untertitel und Schleifen:
    python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" captions --slug <slug> --variant <id> --formats srt,vtt
    python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" gif --slug <slug> --variant loop-16x9 --budget-mb 3 --seconds 6
    
  8. Schau dir das Ergebnis an. Lies das Standbild, dann ein Kontaktblatt der fertigen Datei, dann das erste Bild des GIFs:
    python3 "${CLAUDE_SKILL_DIR}/scripts/frames.py" sheet genmedia-output/<slug>/demo-video/<variant>/<slug>.mp4 --count 9 --cols 3
    
    Überprüfe die ersten 3 Sekunden, die gezoomten Bilder (lesbar?), das letzte Bild (stabil?), jedes Bild auf private Daten und lies die Cue-Datei Buchstabe für Buchstabe.
  9. Validiere und liefere.
    python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" validate --slug <slug>
    
    Exakte Größe, fps, Dauer innerhalb des Plattformfensters, Codec und Profil, Byte-Grenze, Audio-Konfiguration, gemessene Lautstärke und True Peak, und bei einem Schleifenziel die Naht (loop_seam). Dann die Liefernachricht. Revisionen: Bearbeite den Schnitt, erstelle neu, validiere erneut.

Lieferung

<Product> Demo: genmedia-output/<slug>/demo-video/
Master 16:9: web-16x9/<slug>.mp4 (1920x1080, <n> s) · Poster web-16x9/<slug>-poster.png
App Store Vorschau: appstore-iphone/<slug>.mp4 (886x1920, <n> s, H.264 High, AAC 256k) <nur wenn erstellt>
App Store Header / Suchvideo: appstore-header-video/<slug>.mov (3840x1646, <n> s, <fps> fps, stumme Schleife) · Standbild zur Auswahl in App Store Connect: <t> s <nur wenn erstellt>
Play Promo / Product Hunt: das gleiche Master – beide Plattformen nehmen eine YouTube-URL, also lade es hoch und füge den Link ein <nur wenn erstellt>
Schleifen: loop-16x9/<slug>-loop.mp4 · <slug>-loop.gif (<n> MB, <w>px@<fps>) · erstes Bild <slug>-loop-first.png <nur wenn erstellt>
Untertitel: <variant>/<slug>.srt, .vtt (<Sprache>) <nur wenn erstellt> · manifest.json
Deine Aufnahme, unverändert: geschnitten, <beschleunigt, wo gewartet wurde>, gezoomt auf <was>, <in einem gezeichneten Gerät gerahmt>. Nichts in der Oberfläche wurde neu generiert.
F:"für dich: <Länge, Szenenanzahl, Erzählung ein/aus, Musik, Untertitel, Rahmen, Passform – jeder Standard, den der Benutzer nicht gesetzt hat>
Store-Hinweise: <eine Zeile pro zutreffendem Punkt: App Store Vorschauen sind 15–30 s, bis zu 3 pro Gerät, nur Bildschirmaufnahmen (2.3.4) · Header- und Suchvideos werden stummgeschleift (Suche: niemals ungedämpft), erscheinen auf iOS 27 und iPadOS 27 oder später, und ihr Standbild wird nach Genehmigung fixiert · nur die ersten 30 s einer Play Promo laufen automatisch ab · Product Hunt Bilder, einschließlich GIF, bleiben unter 3 MB und das GIF animiert beim Hovern>
Generiert: <keins, USD 0 | Erzählung <n> Zeilen auf <Modell>, Musik, geschätzt USD <x>> · Dateien sind lokal; nichts wurde hochgeladen.
Nächstes: Nenne eine Szene und was zu ändern ist (in/out, Geschwindigkeit, Zoom, Wörter); erneutes Schneiden ist kostenlos.

Übersetze es; behalte Pfade, Größen und Text auf dem Bildschirm unverändert.

Fehler

SignalTu
kind: "ffmpeg_missing"Kein lokales ffmpeg. Sage, dass der Schnitt hier nicht gemacht werden kann; biete den fal ffmpeg-api-Weg (references/routing-utility.md) an oder fordere den Benutzer auf, es zu installieren.
source_changedDie Aufnahme wurde verschoben oder geändert. source add --replace, dann überprüfe jedes in/out erneut: Die alten Zeiten bedeuten nichts mehr.
check_failed von timeJeder Eintrag nennt eine Szene und eine Zahl. Behebe den Schnitt; nichts wird gerendert, solange ein Fehler besteht.
scene_shorter_than_voiceVerlängere den Bereich, senke speed oder schneide Wörter. Beschleunige niemals die Erzählung, um sie anzupassen.
duration_out_of_rangeEin offizielles Fenster wurde verfehlt (App Store Vorschauen 15–30 s, Header- und Suchvideos 5–30 s). Entferne oder verkürze Szenen nur für diese Variante.
wrong_size, fps_not_allowed, fps_too_highDie Größe oder fps der Variante verletzt ihre Zeile. Entferne die Überschreibung oder wähle einen Wert, den die Zeile akzeptiert (specs).
loop_seam von validateDie Schleife springt beim Neustart. Beende mit dem Anfangszustand oder halte denselben Bereich, erstelle, validiere erneut.
frame_aspect_mismatchDas Seitenverhältnis passt nicht zum Ziel. Wähle ein anderes Target oder schneide die Quelle zu (references/editing.md).
overlay_invisibleEin Overlay hat die Größe Null oder liegt an einer Position, die eine Kante verdeckt. Behebe die Koordinaten in cut.json.
Kein Speicher mehrDer ffmpeg-Prozess hatte nicht genug Speicher. Teile den Schnitt in 2 kürzere und füge sie zusammen, oder erhöhe den Speicher (--memory).
StimmfehlerEin Modell-Aufruf ist fehlgeschlagen oder hat leere Ergebnisse geliefert (dub, transcribe, tts). Überprüfe die Audio-Datei selbst, wenn möglich, und behebe das Problem.
kind: "genmedia_timeout"Ein externer Dienst hat nicht in 30 s geantwortet. Warte 30 s und wiederhole den letzten Schritt.
content_policyDer Anbieter hat den Prompt abgelehnt. Verkürze oder umschreibe den Prompt für diese Szene (references/narration-and-audio.md). Sende niemals denselben Prompt erneut.
unknown_kind von democut.pyEin unbekannter Fehler im Tool. Zeige die Ausgabe und schlage vor, dass der Benutzer --debug ausführt.

Referenzen

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

funi-ai/ads

Ads from the user's REAL product: UGC and polished ad videos (presenter, unboxing, showcase, testimonial, TV spot) and static ads with copy. Physical products: keyframes locked to the product photo, Seedance clips or TTS + OmniHuman, GPT Image 2.5 copy. Apps and SaaS: real captures and recordings, composited, never regenerated. Use when: "make a UGC ad for this product", "15 second TikTok ad", "static ad with this headline", "app install ad from my screen recording", "A/B ad variants", "bu ürün için reklam videosu yap", "uygulamam için reklam hazırla", "indirim görseli hazırla". Chain: consumes `product-photoshoot` stills, `character` @handles, `launch-graphics` pages; produces ads and a manifest. NOT for: text-free product photos (use `product-photoshoot`); posters (use `image`); listing cards (use `marketplace-cards`); store screenshots, OG cards (use `launch-graphics`); one clip (use `video`); organic shorts (use `short-video`); product demos (use `demo-video`); thumbnails (use `youtube-thumbnail`).

funi-ai/youtube-thumbnail

Thumbnails and covers that survive at small size: YouTube thumbnails (16:9), Shorts, Reels and TikTok covers (9:16), podcast and course covers (1:1), from a title plus an optional face photo, @handle character, brand colours or a frame of the user's own video. Text baked in by GPT Image 2.5; faces locked through reference edits. Use when: "make a thumbnail for my video", "YouTube thumbnail with my face", "Shorts cover", "podcast cover art", "thumbnail from this frame", "change only the text on the thumbnail", "videoma thumbnail yap", "kapak görseli hazırla", "küçük resimdeki yazıyı değiştir". Chain: consumes an @handle from `character` and stills or frames from `image` and `video`; produces sized PNG and JPEG. NOT for: posters, photo edits (use `image`); logos (use `brandkit`); link cards, OG images (use `launch-graphics`); ad creatives (use `ads`); the video (use `video`, `short-video`); new characters (use `character`); batches (use `pipelines`); model choice (use `models`); setup problems (use `setup`).

Verwandte Skills