Communitygithub.com

scrapbook-editor

Transforma uma gravação vertical bruta (9:16) num short finalizado no ESTILO SCRAPBOOK, validado pelo usuário (2026-10-05), reproduzido exatamente em qualquer take: todos os pausas cortadas (jump cuts, alternando entre plano aberto e fechado a cada corte); legendas baixas, três palavras por vez, a palavra sendo dita em amarelo; o gancho nas DUAS FACES da referência (palavras brancas Archivo, a palavra IMPORTANTE em Fraunces amarelo) com uma linha no PAPEL; o papel apenas para os títulos e duas ou três frases muito importantes: a colagem de fragmentos de caderno pautado da referência, plana, escrita à mão (Gochi Hand), pousando e se desdobrando, respirando, dobrando-se, o desenho em marcador vermelho sobre ela enquanto é dita (uma palavra riscada, um sublinhado); adesivos die-cut de emoji com contorno branco ao redor da cabeça para o que o locutor lista; GIFs de reação reais do GIPHY como polaroides, grandes (0,80 da largura) no meio da tela, sempre no mesmo lugar, surgindo e sendo descartados; seções nos mesmos fragmentos balançando com a câmera avançando...

O que é scrapbook-editor?

O scrapbook-editor é uma skill especializada para agentes de IA (como Claude Code, Cursor, Codex) que automatiza a edição de vídeos verticais no estilo 'scrapbook' (álbum de recortes). Ela pega uma gravação bruta de 9:16 de uma pessoa falando e a transforma em um short polido, cortando todas as pausas, alternando entre planos aberto e fechado a cada corte (jump cuts), e adicionando elementos visuais como legendas baixas (três palavras por vez com a palavra falada em amarelo), colagens de papel, adesivos de emoji, GIFs de reação (como polaroides), e uma trilha sonora. O estilo é baseado em uma referência validada pelo usuário (um vídeo de 72,7 segundos) e deve ser reproduzido exatamente em qualquer novo take, sem variações não solicitadas. A skill depende de ferramentas como ffmpeg, Python e Apple Vision (para detecção facial) e pode ser executada em macOS, usando scripts Node.js para transcrição, renderização e mixagem. Ela é ideal para criadores de conteúdo que precisam de um fluxo de trabalho consistente e profissional para vídeos de redes sociais, garantindo que cada edição siga o mesmo padrão visual e sonoro.

Funciona com✓Claude Code~Codex CLI✓Cursor✓Gemini CLI
npx skills add https://github.com/ihsaneGTM/gtm-skills/tree/main/plugins/video/skills/scrapbook-editor

Perguntar na sua IA favorita

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

Documentação

scrapbook-editor: uma gravação bruta se torna um short scrapbook

O usuário fornece uma gravação vertical de si mesmo falando. Esta skill corta todas as pausas dela e transforma o quadro em um scrapbook pelo qual o locutor fala, editado como um motion designer faria no After Effects: o título da referência em duas faces (palavras brancas, a importante em uma bela serifa colorida, uma linha no papel) e adesivos no gancho, os memes de reação da internet colocados no rosto como polaroides, fragmentos de papel para os títulos e apenas as palavras muito importantes, o desenho em marcador vermelho enquanto falam, adesivos para o que listam, as telas reais que nomeiam, legendas baixas no quadro palavra por palavra, uma base musical e um som para cada coisa que pousa.

O estilo é VALIDADO (o usuário, 2026-10-05): reproduza-o exatamente. § A linguagem do scrapbook (abaixo do pipeline) é a aparência do corte validado (workspace/videos/scrapbook-dev-sales.mp4, seu plano: example/plan.mjs): as mesmas figuras, nos mesmos tamanhos e lugares, com as mesmas faces, papel, movimento, sons e níveis, em qualquer take. Começou como a MEDIÇÃO de uma edição real (um vídeo de lista de 72,7 s, « 7 habilidades Claude », editado pelo usuário para um cliente: example/README.md é sua anatomia completa) e levou seis revisões para ser estabelecida (§ As decisões do usuário). init.sh a estrutura; nunca invente outra aparência, nunca varie uma que o usuário não pediu para variar.

Esta skill roda no motor da skill short-editor. Sua transcrição, renderização, mixagem, prévias, construção e verificação são os mesmos arquivos: leia ../short-editor/SKILL.md § Pré-requisitos, § Onde as coisas vivem e § 4 a § 6 uma vez; eles se aplicam aqui como escritos, e este arquivo diz apenas o que difere. Leia antes do primeiro corte, toda execução:

  • scripts/example/README.md: a edição de referência, passo a passo, e o corte de desenvolvimento
  • ../../references/pitfalls.md § Transcrição e legendas, § Método de trabalho: as armadilhas com as quais uma edição é escrita (suas outras seções quando chegar a sua etapa: § Áudio antes de um som medido manualmente, § ffmpeg e § O shell antes de um comando próprio; as ferramentas do motor seguem o resto)

Leia quando a etapa precisar: ../../references/audio-spec.md nos níveis (o padrão de loudness, como um nível é medido como ouvido). As figuras do motor: node plugins/video/skills/short-editor/scripts/api.mjs <módulo> [figura], nunca suas fontes.

Não consigo assistir ao vídeo nem ouvi-lo. Onde há uma pausa, onde está o rosto, quão alto um som pousa: cada um é uma medição (tighten.py, face.mjs, measure.mjs), depois uma olhada nos quadros compostos (preview.mjs) e em um momento em movimento quadro a quadro (build.sh --slice). verify.mjs fica entre "está pronto" e um arquivo quebrado. Nunca pule.

Todos os caminhos abaixo são relativos à raiz da pasta GTM by Pipecorn. $K significa plugins/video/skills/scrapbook-editor/scripts (esta skill), $E significa plugins/video/skills/short-editor/scripts (o motor). Execute ambos pelo caminho absoluto.

Pré-requisitos (verificação pré-voo: verifique antes de qualquer trabalho)

Os do motor: ffmpeg + ffprobe no PATH (brew install ffmpeg) e python3 (Xcode Command Line Tools) são necessários e não instaláveis a partir daqui; pare e diga o comando se algum estiver faltando. Todo o resto se autoprovisiona: $K/py.sh executa o bootstrap.mjs do motor (pacotes node, o venv de fala-para-texto com numpy); init.sh busca as três faces (Archivo, Fraunces e a mão de marcador do papel, Gochi Hand por padrão: Google Fonts, OFL) para o assets/fonts/ do projeto (ou as encontra em ~/Library/Fonts), e sounds.mjs os sons de papel (oito gravações Mixkit, uma vez por máquina, em plugins/video/assets/sfx/paper/, nunca commitadas: a Licença Mixkit permite seu uso em vídeos, não sua redistribuição), preparados e medidos no assets/sfx-paper/ do projeto, e copia o pacote Motionix da prateleira (plugins/video/assets/sfx/motionix/, preparado pelo estilo explainer; licença não declarada no pacote: veja seu README antes de qualquer publicação) para assets/sfx-motionix/. Nada é instalado globalmente.

Opcional, e dito quando faltar (nunca um bloqueador):

  • swiftc (Xcode Command Line Tools): face.mjs encontra o rosto com Apple Vision, então uma polaroid POUSA NELE e os adesivos ficam AO REDOR da cabeça. Sem ele, leia o rosto em um quadro de prévia e defina face no project.json ({x, y, w, h}, frações do quadro).
  • GIPHY_API_KEY em .env.local: os GIFs de reação reais do estilo validado (gif.mjs). Grátis: developers.giphy.com → Create an App → API (não o SDK que a GIPHY recomenda: o SDK é para aplicativos que mostram o seletor próprio da GIPHY; gif.mjs chama a API), 100 chamadas por hora, suficiente para uma edição. Sem ele: um GIF fornecido pelo usuário (media.mjs), ou uma imagem de reação gerada; diga isso.
  • GEMINI_API_KEY em .env.local: as ilustrações geradas e imagens de reação (picture.mjs, Nano Banana 2, cerca de $0,07 cada em 1K).
  • Google Chrome (ou Chromium, Brave, Edge) em /Applications: uma captura de tela de uma página PÚBLICA que o locutor nomeia (capture.mjs), quando o usuário não tem uma captura própria.

Onde as coisas vivem

Como o motor diz, e apenas desta forma: um diretório de trabalho por edição, workspace/projects/<slug>/, um slug que nenhum outro projeto tem; o arquivo finalizado workspace/videos/<slug>.mp4; nunca os arquivos de outro projeto, mesmo da mesma gravação; arquivos temporários no tmp/ do projeto, nunca em /tmp. O scripts/ da skill permanece somente leitura. As imagens de uma edição vivem em seu assets/media/.

O pipeline

0. Configure o diretório de trabalho

$K/init.sh workspace/projects/<slug> <source.mp4> workspace/videos/<slug>.mp4

O esqueleto do motor (project.json lido do arquivo, subs.config.json, cut.mjs), então o plan.mjs e edl.mjs desta skill (cada figura da linguagem, comentada, pronta para preencher), as chaves da linguagem em project.json (style: "scrapbook", accent, captionKeep), o rosto, e os sons, calibrados na voz desta fonte (voiceM, a mediana momentânea da voz, e sfxMasterDb 0: cada função é então definida em LU sob a voz, como ouvido). Execute cada comando posterior de dentro desse diretório.

0.2. Pergunte primeiro, em UMA PERGUNTA

Estes pertencem ao usuário e não podem ser adivinhados; agrupe-os em um AskUserQuestion:

  • A música. Uma base por padrão (a terceira revisão: « ça mériterait de mettre une musique de fond »): ofereça Hip Hop 02 primeiro (Mixkit, Lily J: o corte validado, o padrão do estilo; a licença Mixkit permite em um vídeo publicado), depois Convergence (a faixa principal dos outros estilos), o resto da prateleira (plugins/video/assets/music/, seu README), depois « Sem música ». Para escolher de ouvido, um quadro (os mesmos 12 s com cada faixa, todas no mesmo nível): node $K/music-board.mjs --to 12 mixkit-hip-hop-02-738.mp3@0 [email protected] … após uma construção (ela coloca a base do projeto de volta no final). Fica 15 LU abaixo da voz ($K/music.mjs, § A aparência). Diga uma vez que as faixas que não são Mixkit (Convergence, ridgeclub) podem bloquear a monetização do vídeo.
  • A cor da marca (project.json accent; wordColor para a palavra importante se deve diferir; o acento da Sua marca quando definida, workspace/brand/, veja plugins/video/references/brand-kit.md § Sua marca, definida uma vez): A palavra IMPORTANTE em Fraunces e a palavra da legenda sendo dita. Amarelo #FFD43B por padrão (da Pipecorn). Verifique na gravação: ela fica sobre cabelo, pele e paredes (na gravação de desenvolvimento, coral e laranja desapareceram no cabelo e rosto do locutor, o amarelo leu em todos os lugares). E os nomes que as legendas devem escrever como são (captionKeep: a marca, o produto, pessoas, « Station F »).
  • O material real: capturas de tela ou gravações de tela do que nomeiam (seu produto, um repositório, uma página), seus logotipos. Sem eles, páginas públicas são capturadas (capture.mjs); uma tela privada nunca é inventada.
  • O genérico Pipecorn: um BÔNUS de todo estilo, perguntado TODA VEZ, nunca ligado por padrão (plugins/video/references/pipecorn-generic.md): cerca de 6 s bem no final, Pipecorn, então seus valores substituindo um ao outro em um único slot, depois Pipecorn novamente, sem música. Não · Sim, com quais valores (1 a 4; node $E/generic.mjs --list; por padrão cobertura telefônica, taxa de conexão, pipeline).
  • Sua voz melhorada: um BÔNUS, perguntado TODA VEZ, nunca ligado por padrão (plugins/video/references/voice-clean.md): o isolador de voz ElevenLabs remove o eco da sala e o ruído da gravação. Não · Sim, melhore minha voz. Precisa do conector ElevenLabs: sem uma chave, diga em uma linha que ele existe (Settings › Connectors › Adicionar chave) e continue. Em caso afirmativo, antes do passo 1: node plugins/video/motion/voice.mjs clean <fonte>, então project.json › source é <…>-voice.<ext> (o mesmo comprimento, a imagem intacta).

Execute a partir da página GTM by Pipecorn, o resumo da primeira mensagem responde; não pergunte novamente.

1. Transcreva, palavra por palavra

$E/transcribe.sh --lang pt      # o idioma REALMENTE FALADO; nunca traduzido

words.json, no relógio da gravação CRUA. Se a gravação for um rush (a mesma frase tentada várias vezes), monte-a primeiro com rough-cut.mjs do motor (short-editor/SKILL.md § 0.7), depois transcreva a montagem. Em seguida, node $E/words.mjs (do motor): words-fixed.json, o início de cada palavra movido de um silêncio para a voz e seu fim real antes de uma pausa, as duvidosas listadas; words.mjs env|end|say para ler uma (short-editor/SKILL.md § 1). Nunca um script próprio para isso.

2. Corte cada pausa: os jump cuts

$K/py.sh tighten.py --dry-run    # o que cortaria
$K/py.sh tighten.py              # source/tight.mov; project.json, words.json, shots.json redirecionados
$K/py.sh tighten.py --keep 0.10 --min-pause 0.16    # os padrões, medidos na referência

Cada silêncio de 0,16 s ou mais é removido, até 0,10 s na junção (0,06 s após o último som, 0,04 s antes do próximo); o silêncio inicial e o final também. Na referência, nenhuma pausa restante é maior que 0,32 s, e uma junção vem aproximadamente a cada 2 a 3 s: o locutor nunca respira na tela. Cada junção é um jump cut: nenhum flash, nenhum whoosh o esconde; a câmera o marca alternando o quadro aberto / fechado NO corte (§ A aparência).

Onde a fala para é MEDIDO (um envelope de 10 ms, histerese em ambiente + 12 / ambiente + 5 dB), nunca lido a partir de sussurro. Os inícios do Whisper são verificados contra isso: um início dentro de um silêncio medido com um som suave abaixo dele (ambiente + 9 dB) interrompe o corte 50 ms antes; um início em tom de ambiente é sussurro sendo adiantado (estava, em 0,35 s, três vezes na gravação de desenvolvimento) e se move para onde a fala começa. Relata ambos.

Os trechos mantidos são escritos uma vez em source/tight.mov, em quadros inteiros (a imagem e a voz de cada trecho duram exatamente o mesmo: não ajustados, 13 junções uma vez colocaram os lábios dois quadros atrás da voz), na profundidade de bits da fonte com suas tags de cor (nunca uma regradação). Então, como o rough-cut.mjs --adopt do motor faz, project.json aponta para ele (source; a gravação permanece em rawSource), words.json é colocado em seu relógio (a transcrição da gravação permanece em words.raw.json), e shots.json lista os takes entre as junções. Não os cuts em tempo real do motor: um projeto com cortes não pode ser renderizado por fatias, e fatias são como um momento é visto em movimento. tighten.py sempre começa novamente da gravação, então executá-lo duas vezes é seguro; um corte que o locutor deseja (uma retomada, um tropeço) vai em manualCuts do project.json (segundos da gravação), então tighten.py novamente.

Uma mudança de CENA dentro da gravação (um take de teaser no final, outra sala) não está em shots.json: encontre-a onde a luz do quadro salta (ffmpeg … signalstats YAVG quadro a quadro) e forneça-a ao plano (SCENE): a câmera abre lá e o papel a varre.

3. Onde está o rosto

node $K/face.mjs      # assets/faces.json, 5 por segundo, na linha do tempo de SAÍDA

Apple Vision, através dos cortes. O plano o lê através da câmera (faces(P, camera(STEPS))): F.slot() é onde TODA polaroid do vídeo pousa (a linha central do quadro, 0,08 abaixo do centro do rosto mediano, 0,44-0,50: o meio da tela), F.faceLine() a linha do próprio rosto (seu centro mediano, 0,36-0,50) para as ideias-chave e frases de impacto escritas sobre o rosto, F.top(t) a altura acima da cabeça para as palavras-chave, F.around(t0, t1, n) pontos ao redor da cabeça, F.over(t0, t1) a caixa do rosto. Execute-o novamente após cada tighten.py.

4. Leia a transcrição e decida as imagens: a etapa de julgamento

Leia toda a gravação e dê a ela a densidade da referência: uma coisa nova na tela a cada 1-3 s (a referência: 50 figuras em 72,7 s; o corte de desenvolvimento: 49 em 47,1 s). Por frase, escolha a figura que a diz, de § A aparência:

  • o gancho (a primeira frase): o título nas três linhas da referência (uma linha branca; A palavra da promessa em cor com palavras brancas ao lado; uma linha no papel) e adesivos ao redor da cabeça se a frase lista ou implica papéis, ferramentas, uma equipe;
  • um sentimento, um custo, uma falha, um exagero, uma comparação: um GIF de reação real como polaroid (o corte validado: Pepe Silvia para « pesquisar milhares de plataformas », Key & Peele suando para « divulgação completa, não sou o melhor », Buddy the Elf ao telefone para « o que dizer em uma chamada », « Vamos nos preparar para a briga » para « versus »), sua legenda no queixo, quatro ou cinco em um short;
  • uma lista dita de passagem (« o bom, o mau, as falhas… ») e os apartes (um lugar, « uma série », « fique ligado »): adesivos, um por palavra (o papel NÃO está em toda palavra-chave: as legendas já dizem as palavras, « l'effet papier ».

...continua...

Individual skills in this repo

This repo contains 1 individual skill — each has its own dedicated page.

Habilidades Relacionadas