Communitygithub.com

funi-ai/demo-video

Cria vídeos de demonstração, prévias para lojas, vídeos de cabeçalho/pesquisa da App Store e loops GIF a partir da gravação de tela REAL do usuário: cortado, acelerado, ampliado, emoldurado, legendado e narrado usando ffmpeg local. Modelos adicionam apenas o que não é o produto: narração (Eleven v3, Gemini TTS para turco), música e som de interface.

O que é demo-video?

Esta skill transforma gravações de tela do usuário em vídeos de demonstração profissionais, prévias para lojas de aplicativos, vídeos de cabeçalho e pesquisa da App Store, vídeos promocionais para Google Play, vídeos de lançamento no Product Hunt e loops GIF para changelogs. Todo o processamento de vídeo é feito localmente via ffmpeg, garantindo que os pixels do produto nunca passem por um modelo de IA. A interface do usuário nunca é regenerada, apenas cortada, acelerada, ampliada, emoldurada e legendada. A narração é gerada sob demanda usando Eleven Labs v3 ou Gemini TTS (para turco), e música/sons de interface podem ser adicionados. A skill opera com um único arquivo `cut.json` que define as cenas e variantes, processado pelo script `democut.py`. Suporta múltiplos destinos simultaneamente (web, App Store, Google Play, Product Hunt) a partir da mesma gravação. Custos de geração são transparentes com limites configuráveis, e a skill segue regras rígidas de privacidade (sem dados reais, sem desfoque) e validação (verificação de poster frame, folha de contato e validação de conformidade com as lojas).

Funciona com✓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

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

Demo video

Uma demonstração de produto, uma prévia para loja ou um loop de funcionalidade construído a partir da gravação de tela REAL do usuário. A interface nunca é regenerada: a gravação é cortada, acelerada, ampliada, emoldurada, legendada e narrada. A Apple estabelece a mesma regra para prévias (2.3.4: capturas de tela em vídeo do próprio aplicativo, narração e sobreposições permitidas). Um único cut.json armazena as gravações, as cenas ordenadas e as variantes; democut.py as transforma em arquivos com ffmpeg local, e o recorte é gratuito.

Etapa 0 — Verificação prévia

Uma vez por sessão:

python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" tools
  • kind: "ffmpeg_missing" → não é possível fazer o corte localmente. Informe e ofereça a rota paga do utilitário em references/routing-utility.md, ou peça ao usuário para instalar o ffmpeg. Nunca improvise com outras ferramentas.
  • Mantenha can.burn_captions (libass), can.duck (sidechaincompress), can.webm. Os que faltam alteram o que você promete, nunca o que você afirma.
  • Somente quando algo será gerado (narração, música, som, dublagem, uma placa):
    command -v genmedia
    python3 "${CLAUDE_SKILL_DIR}/scripts/gm.py" preflight
    
    blockers não vazio, CLI ausente ou mais antigo que 0.7.0 → /genmedia-skills:setup. Chave ausente → o usuário executa genmedia setup ou exporta FAL_KEY por conta própria; aguarde. Nunca leia, imprima, solicite ou digite uma chave. Mantenha config.announce_above_usd e config.confirm_above_usd (padrões 0.50 e 2).
  • Retome primeiro: .genmedia/projects/<slug>/demo-video/cut.json existe → continue a partir dele, nunca inicie um segundo corte para o mesmo produto.

Regras de UX

  1. Responda no idioma do usuário. A narração, as linhas say e o texto na tela permanecem no idioma em que são enviados; os prompts dos modelos são em inglês. Caminhos, IDs e nomes de campos permanecem como estão.
  2. Sem JSON, gráficos de filtro, IDs de requisição ou narração de ferramentas no chat. No máximo uma linha de status por etapa longa.
  3. Orçamento de perguntas: 2, uma de cada vez, opções rotuladas, somente quando a resposta estiver faltando:
    • P1 a gravação, quando nenhum arquivo foi fornecido: peça os caminhos e forneça a pequena lista de captura de references/recording-tips.md. Não há padrão para filmagem.
    • P2 para onde vai, quando a solicitação não diz: A demonstração para site (16:9) · B Prévia da App Store · C Vídeo de cabeçalho ou resultados de pesquisa da App Store · D Promo do Google Play · E Vídeo de lançamento do Product Hunt · F um loop ou GIF silencioso. Vários podem ser escolhidos; um corte atende a todos. Todo o resto é um padrão que você declara na entrega: 60 s para uma demonstração, 20 s para uma prévia de loja, 12 s para um cabeçalho ou vídeo de pesquisa da App Store, 6 s para um loop; narração ativada para uma demonstração, desativada para um loop ou um cabeçalho ou vídeo de pesquisa; música desativada a menos que solicitada; legendas como arquivo adicional; cortes, sem dissoluções; sem moldura de dispositivo a menos que um destino de loja ou rede social exija uma.
  4. O cartão de corte é uma parada obrigatória. Mostre a lista de cenas (horários, o que acontece, o que é dito, durações) e aguarde um "sim" antes que qualquer coisa seja gerada ou renderizada. Silêncio não é aprovação, e um sim para uma versão anterior não é um sim para esta.
  5. Narração antes da imagem. Gere a voz por cena, deixe time medi-la, e corte a imagem para ela. Nunca cronometre uma cena adivinhando quanto tempo uma frase leva (references/narration-and-audio.md).
  6. Olhe antes de entregar. Leia o quadro de pôster e uma folha de contato do arquivo finalizado, e leia o primeiro quadro de qualquer GIF. Uma demonstração que valida mas mostra a tela errada ainda está errada.
  7. Fatos e privacidade vêm do usuário. Avaliações, contagens, prêmios, nomes de clientes e logotipos aparecem apenas quando o usuário os forneceu. Se um quadro mostrar dados reais, a solução é uma nova gravação, não um desfoque; diga isso claramente.
  8. Custo: o corte, os quadros, os loops e cada verificação custam USD 0. Antes de qualquer geração, estime e aplique a barreira da verificação prévia: abaixo de announce_above_usd → execute e informe; até confirm_above_usd → uma linha, depois execute; acima → sim explícito. Nunca cite um preço de memória.
  9. Limitado: no máximo 3 tentativas de reparo por etapa, algo muda a cada vez; uma rejeição de política de conteúdo nunca é reenviada inalterada; um trabalho com um ID de requisição é retomado, nunca reenviado.

Barreira de descoberta

scripts/video-surfaces.json é um cache datado (verified_on, lido por democut.py specs): um null é um número que ninguém leu na página oficial, nunca o preencha de memória, e quando uma loja rejeita um arquivo, a página oficial vence e a linha é corrigida.

Antes da primeira chamada paga para um endpoint em uma sessão:

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

status deve ser active; campos, enums e limites vêm do esquema. Não ativo → o próximo nível dessa tarefa em references/routing-audio.md. Nunca genmedia run com um prompt em vez de um ID de endpoint. Novos lançamentos estão sob namespaces de fornecedores, não apenas fal-ai/.

Roteamento

NecessidadeComoPorquê
Cortar, acelerar, ampliar, emoldurar, juntar, sobrepor, mixar, loudness, GIF, verificaçõesdemocut.py (ffmpeg local)exato, gratuito, repetível; os pixels do produto nunca passam por um modelo
Olhar uma gravação ou resultado sem assisti-lodemocut.py analyze, sheet, grab; frames.py sheetdetectores e folhas de contato em vez de adivinhações
Narraçãofal-ai/elevenlabs/tts/eleven-v3; Turco: fal-ai/gemini-3.1-flash-ttsTTS padrão; o caminho turco é verificado por esquema
Trilha sonora, sons de interfaceelevenlabs/music/v2.5 (duração exata), fal-ai/elevenlabs/sound-effects/v2controle de duração; barato por segundo
Temporizações de legenda precisas por palavrafal-ai/elevenlabs/speech-to-text/scribe-v2 → audiokit.py captionstimestamps por palavra
Outro idioma para um arquivo finalizadofal-ai/elevenlabs/dubbinguma chamada por idioma
Moldura de dispositivo, cartão final, texto exato na imagem/genmedia-skills:launch-graphics (layers, PNGs compostos)o texto é composto onde é exato, nunca gerado
Placa de fundo atrás de um dispositivo emolduradobytedance/seedream/v5/pro/text-to-imageuma placa por vídeo, sem letras
Sem ffmpeg localfal-ai/ffmpeg-api/* em references/routing-utility.mdcentavos por chamada, um fallback e não o padrão

Desempates e armadilhas:

  1. A interface nunca é gerada, reestilizada, reenquadrada ou "melhorada". video-reframe, video-edit e upscalers repintam o texto da interface: são para filmagens geradas, não para uma gravação.
  2. Ampliação em frações do quadro fonte, leia de grab --grid ou sheet --grid; hold para detalhe, push uma vez para guiar o olhar, pull uma vez para revelar contexto (references/editing.md).
  3. Uma prévia de loja não é a demonstração com um final mais curto: é sua própria variante com seu próprio subconjunto de cenas.
  4. Play e Product Hunt aceitam uma URL do YouTube, não um arquivo: entregue o arquivo e diga quem faz o upload.
  5. Um vídeo de cabeçalho ou resultados de pesquisa da App Store (ativo criativo do iOS 27) é sua própria variante silenciosa e em loop: appstore-header-video (3840x1646) ou appstore-search-video (3:2), 30 ou 60 fps, 5-30 s, uma ideia, cenas de 2 s ou mais, terminando onde começou. A Apple não lista um vídeo universal; as imagens estáticas são trabalho de launch-graphics (references/surfaces.md seção 1a).
  6. Uma gravação de telefone precisa de uma moldura de telefone; time recusa uma incompatibilidade de proporção de 30%.
  7. Gravação embutida apenas quando can.burn_captions; caso contrário, um arquivo adicional, ou a rota de legenda paga, dito claramente.
  8. O usuário nomeou um modelo → use-o após a verificação ao vivo.

Fluxo de trabalho

  1. Recepção. Objetivo, destinos, gravações, marca. Leia cada arquivo que o usuário nomeou. Em seguida, por gravação:
    python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" init --slug <slug> --name "<Produto>" --target web-16x9
    python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" source add --slug <slug> --id app --file ./recordings/demo.mov --os desktop
    
    A resposta carrega tamanho, fps, duração, áudio, qualquer letterboxing embutido e os destinos que a proporção se ajusta. Uma gravação menor que o destino, ou que mostre dados reais, recebe um pedido de regravação agora, não após a edição (references/recording-tips.md).
  2. Olhe para ela.
    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
    
    Leia a folha. dead_spans e keep_spans são candidatos, nunca uma edição: uma tela parada às vezes é o objetivo. grab --at <s> --grid para qualquer quadro em que você vai ampliar.
  3. Cartão de corte. Cenas em ordem: id, entrada/saída da fonte, velocidade, zoom, o que o espectador vê, o que a voz diz, duração; em seguida, as variantes, o que é gerado, o que é necessário do usuário e as suposições. Mostre-o, pare, aguarde um sim (references/editing.md).
  4. Narração, medida (apenas se a demonstração for narrada). Preço e execute um lote por references/narration-and-audio.md, um arquivo por cena, depois deixe os números decidirem a imagem:
    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. Escreva o corte. Edite .genmedia/projects/<slug>/demo-video/cut.json com a ferramenta Escrever ou Editar: scenes, audio, variants. Cada campo: references/cut-json.md. Molduras de dispositivo vêm de launch-graphics layers (references/frames-and-loops.md).
  6. Barreira.
    python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" time --slug <slug>
    
    Corrija cada erro antes de renderizar: scene_shorter_than_voice (alongue o intervalo, diminua a velocidade ou corte palavras — nunca acelere a voz), duration_out_of_range em um destino de loja, wrong_size, fps_not_allowed, transition_too_long, frame_aspect_mismatch, overlay_invisible. Aja sobre os avisos (quick_cut, fast_motion, narration_muted em um vídeo de ativo criativo) ou explique os que você mantém.
  7. Construa.
    python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" build --slug <slug>
    
    Timeout Bash de 600000 ms. As cenas são armazenadas em cache por conteúdo: uma revisão re-renderiza apenas o que mudou (--scene <id>, --force). Em seguida, legendas e loops:
    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. Olhe o resultado. Leia o quadro de pôster, depois uma folha de contato do arquivo finalizado, depois o primeiro quadro do GIF:
    python3 "${CLAUDE_SKILL_DIR}/scripts/frames.py" sheet genmedia-output/<slug>/demo-video/<variant>/<slug>.mp4 --count 9 --cols 3
    
    Verifique os primeiros 3 segundos, os quadros ampliados (legíveis?), o último quadro (estabilizado?), cada quadro para dados privados e leia o arquivo de sugestões letra por letra.
  9. Valide e entregue.
    python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" validate --slug <slug>
    
    Tamanho exato, fps, duração dentro da janela da plataforma, codec e perfil, limite de bytes, configuração de áudio, loudness medido e pico verdadeiro, e em um destino de loop a emenda (loop_seam). Em seguida, a mensagem de entrega. Revisões: edite o corte, reconstrua, valide novamente.

Entrega

<Produto> demo: genmedia-output/<slug>/demo-video/
Master 16:9: web-16x9/<slug>.mp4 (1920x1080, <n> s) · pôster web-16x9/<slug>-poster.png
Prévia App Store: appstore-iphone/<slug>.mp4 (886x1920, <n> s, H.264 High, AAC 256k) <apenas se construído>
Vídeo de cabeçalho / pesquisa App Store: appstore-header-video/<slug>.mov (3840x1646, <n> s, <fps> fps, loop silencioso) · quadro de pôster para selecionar no App Store Connect: <t> s <apenas se construído>
Promo Play / Product Hunt: o mesmo master — ambas as plataformas aceitam uma URL do YouTube, então faça upload e cole o link <apenas se construído>
Loops: loop-16x9/<slug>-loop.mp4 · <slug>-loop.gif (<n> MB, <w>px@<fps>) · primeiro quadro <slug>-loop-first.png <apenas se construído>
Legendas: <variant>/<slug>.srt, .vtt (<language>) <apenas se construído> · manifest.json
Sua gravação, inalterada: cortada, <acelerada onde esperou>, ampliada em <o que>, <emoldurada em um dispositivo desenhado>. Nada na interface foi regenerado.
Escolhido para você: <duração, número de cenas, narração ligada/desligada, música, legendas, molduras, ajuste — todos os padrões que o usuário não definiu>
Notas para loja: <uma linha para cada que se aplica: prévias da App Store têm 15-30 s, até 3 por dispositivo, apenas capturas de tela (2.3.4) · vídeos de cabeçalho e pesquisa em loop sem áudio (pesquisa: nunca sem mudo), mostrados no iOS 27 e iPadOS 27 ou posterior, e seu quadro de pôster é fixado uma vez aprovado · apenas os primeiros 30 s de uma promoção do Play são reproduzidos automaticamente · imagens do Product Hunt, incluindo GIF, ficam abaixo de 3 MB e o GIF anima ao passar o mouse>
Gerado: <nenhum, USD 0 | narração <n> linhas em <modelo>, música, est. USD <x>> · Os arquivos são locais; nada foi enviado.
Próximo: nomeie uma cena e o que mudar (entrada/saída, velocidade, zoom, palavras); recortar é gratuito.

Traduza-o; mantenha caminhos, tamanhos e texto na tela inalterados.

Erros

SinalFaça
kind: "ffmpeg_missing"Sem ffmpeg local. Diga que o corte não pode ser feito aqui; ofereça a rota ffmpeg-api da fal (references/routing-utility.md) ou peça ao usuário para instalá-lo.
source_changedA gravação foi movida ou alterada. source add --replace, depois verifique novamente cada entrada/saída: as temporizações antigas não significam mais nada.
check_failed de timeCada entrada nomeia uma cena e um número. Corrija o corte; nada é renderizado enquanto um erro persistir.
scene_shorter_than_voiceAlongue o intervalo, diminua speed, ou corte palavras. Nunca acelere a narração para caber.
duration_out_of_rangeUma janela oficial foi perdida (prévias da App Store 15-30 s, cabeçalho e vídeos de pesquisa 5-30 s). Remova ou encurte cenas apenas para essa variante.
wrong_size, fps_not_allowed, fps_too_highO tamanho ou fps da variante quebra sua linha. Remova a substituição ou escolha um valor que a linha aceita (specs).
loop_seam de validateO loop salta em seu recomeço. Termine no estado de abertura ou mantenha a mesma região, construa, valide novamente.
frame_aspect_mismatchA gravação e a variante diferem em proporção em mais de 30% (a. recuse o destino, b. remova a incompatibilidade, c. informe o

…

[truncado para tradução]

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`).

Habilidades Relacionadas