{
  "id": "clube-dub",
  "titulo": "Cliques que viram receita",
  "categoria": "saas",
  "resumo": "vídeo de lançamento de 16 s, em 16:9 e sem narração, para a Dub, plataforma de links curtos, análise de conversões e programa de parceiros. É uma recriação do \"Dub promo video\" de Steven Tey (@steventey, fundador da Dub), publicado no prompt-motion.com (`steventey-0d20e4`) e feito numa tentativa só com o Claude Opus 5.5 a partir do prompt genérico de showreel. O original vestia uma Dub escura e laranja que não existe; a recriação usa o produto real, que é claro, com as cores das métricas medidas nas capturas oficiais. Uma forma só atravessa o vídeo: a URL longa vira a pílula `dub.sh/launch`, a pílula vira o card de Analytics, o card encolhe até o círculo dos parceiros, o círculo abre no painel das funções e o painel termina no logo. Feito em HyperFrames (HTML + GSAP), com música real e 104 efeitos sonoros.",
  "indicado": "startup ou SaaS lançando um produto com métricas, painel ou links; quem quer mostrar números crescendo sem precisar de narração.",
  "estilo": [
    "interface clara",
    "forma contínua",
    "odômetro",
    "mapa vivo",
    "gráfico que vira funil",
    "cortes na batida"
  ],
  "ficha": {
    "formato": "1920×1080, 60 qps, 16:9, cor BT.709",
    "duracao": "16,0 s",
    "motor": "ae",
    "voz": "sem narração; o texto da tela conta a história",
    "musica": "ver o guia de estilo",
    "fontes": "ver o guia de estilo"
  },
  "ferramentas": [
    "Claude Code",
    "After Effects",
    "ElevenLabs"
  ],
  "ficha_tecnica": {
    "Duração": "16,0 s",
    "Formato": "1920×1080, 60 qps, 16:9, cor BT.709",
    "Voz": "sem narração; o texto da tela conta a história",
    "Ferramenta": "HyperFrames 0.8.144 (HTML + GSAP); render a 240 qps juntado em 60 qps com motion blur",
    "Referência": "\"Dub promo video\" (@steventey), 15,07 s, categorias Product UI e Charts",
    "Trilha": "\"LINK\" (Icy Narco), só o instrumental, com edição de DJ por compasso; drop em 2,00 s",
    "Som": "104 efeitos; mix final a −14,0 LUFS, pico −1,5 dBTP"
  },
  "etapas": [
    {
      "titulo": "O roteiro",
      "texto": "**Resumo:** o vídeo não tem narração; quem conta a história é a forma que atravessa as cenas e o pouco texto da interface. Abaixo estão o texto da tela exatamente como aparece (em inglês, como o produto), as cenas por tempo e os momentos da trilha. A estrutura veio do original do @steventey; a ordem foi mantida e cada troca passou a nascer da cena anterior.\n\n## Como a história foi montada\n\n- **Ideia:** uma URL comprida demais vira um link curto, o link junta cliques do mundo inteiro, os cliques viram leads e vendas, as vendas pagam os parceiros, e tudo isso é uma plataforma só.\n\n- **Ritmo:** a música a 122 BPM dá um compasso a cada 1,97 s; o drop cai em 2,00 s, a pausa do baixo ocupa 11,22–13,80 s e a volta em 13,80 s abre o fecho.\n\n- **Texto:** só o que a interface da Dub mostraria (rótulos, abas, avisos) e duas frases de marca: \"Grow with partners.\" e \"Turn clicks into revenue.\".\n\n## Texto da tela, na ordem\n\n- `Links › New link` · `Draft saved` · `Destination URL`\n\n- A URL digitada: `https://acme.com/blog/2026/launch-edition?utm_source=twitter&utm_medium=social&utm_campaign=product_launch&utm_content=hero_video&ref=partner_4821`\n\n- `dub.sh/launch`\n\n- `CLICKS · LIVE` · `Top countries` (United States, Brazil, India, Germany)\n\n- `Last 30 days` · abas `Clicks`, `Leads`, `Sales` · dica com a data (`Sep …`) e os cliques do dia · funil `100%` · `3.8%` · `0.12%`\n\n- Avisos: `New lead` (steven@acme.com · dub.sh/launch), `New sale · $249.00` (Pro plan), `New sale · $1,200.00` (Enterprise · via @marissa)\n\n- `Grow with partners.` · chips `+$480`, `+$1,250`, `+$75`… · `$4,218,960` · `PAID OUT TO PARTNERS`\n\n- Painel: `Short links.` · `QR codes.` · `Custom domains.` · `Deep links.` · `Conversions.` · `Payouts.` · `One platform.`\n\n- Fecho: logo + wordmark `dub` · `Turn clicks into revenue.` · `Start for free` · `Get a demo` · `DUB.CO`\n\n## Cenas por tempo\n\n | \n\n | #\n | Tempo (s)\n | Forma\n | O que acontece\n\n | 1\n | 0–1,5\n | campo da URL\n | o modal \"New link\" está aberto; a URL longa é digitada em Geist Mono, com os parâmetros em cinza, e a câmera começa aproximada (116%) e recua\n\n | 2\n | 1,5–2,0\n | campo → pílula\n | a URL se espreme em direção ao cursor e borra; a caixa encolhe e escurece até a pílula preta `dub.sh/launch`; o cursor clica; a pílula agacha antes do drop\n\n | 3\n | 2,0–4,4\n | pílula no topo\n | **drop:** a pílula estala com mola e sobe; anéis laranja saem dela; o mapa de pontos é revelado por uma onda de 2.300 px/s com um brilho laranja na frente; o contador gigante roda até 1.284.093 enquanto os cliques chegam das cidades em arcos (de 9 para 28 cliques/s); o painel de países enche as barras\n\n | 4\n | 4,46–7,3\n | pílula → card\n | a pílula cresce com mola até virar o card de Analytics e vira o chip do card; o número do contador voa para a aba Clicks; a linha azul se desenha com a ponta viva e a dica de data; o cursor clica em Leads (5,42 s) e em Sales (5,92 s); os avisos de lead e de venda estalam; em 6,25 s a linha vira o funil azul → roxo → verde-água com as porcentagens\n\n | 5\n | 7,4–9,6\n | card → círculo\n | o card encolhe com o conteúdo junto e vira o círculo preto com o logo no tempo forte de 7,88 s; 28 avatares brotam em três anéis; \"Grow with partners.\" entra em degradê roxo → laranja; chips verdes de comissão estalam nos avatares; o total pago rola até $4,218,960\n\n | 6\n | 9,62–11,34\n | círculo → painel\n | o círculo abre no painel das funções; sete palavras trocam a cada ~0,25 s, cada cor nascendo em círculo a partir do ícone, com soco de câmera; a última, \"One platform.\", cai em 11,34 s\n\n | 7\n | 11,22–13,8\n | painel → logo\n | respiro: a pausa do baixo; a partir de 12,25 s o painel encolhe devagar até o tamanho do logo, e a marca aparece em 12,9 s\n\n | 8\n | 13,8–16,0\n | logo\n | **volta da música:** impacto e anéis; o wordmark entra (14,0 s), \"Turn clicks into revenue.\" sobe desfocando para nítido (14,28 s), os botões estalam (14,76 e 14,86 s), o cursor clica em \"Start for free\" (15,22 s) e a câmera fecha em 103%\n\n## Momentos para a trilha\n\n- 0–1,9 s: música sem o grave, sob a digitação (passa-alta em 180 Hz).\n\n- 2,0 s: drop, com o grave entrando; impacto em três camadas.\n\n- 7,88 s: emenda da edição de DJ escondida por um efeito reverso com pico no ponto; entra o círculo dos parceiros.\n\n- 11,22–13,80 s: pausa do baixo da própria música, usada como respiro antes do logo.\n\n- 13,80 s: volta da música; fecho com fade final a partir de 15,55 s.\n\nOs tempos de cada efeito estão em `audio/sfx-lista.json`; as batidas medidas, em `audio/link-beats.json`."
    },
    {
      "titulo": "A identidade visual",
      "texto": "**Resumo:** a identidade é a do produto real da Dub, tirada do kit de marca e das capturas oficiais: fundo claro com grade, tinta quase preta, Satoshi nos títulos, Inter na interface e Geist Mono nos rótulos, mais uma cor fixa para cada métrica e para cada linha do produto. O movimento é de lançamento de SaaS: curvas que arrancam e assentam fortes, mola curta no que chega, uma forma só que se transforma de cena em cena e câmera que nunca para. Os números saem do `hf/index.html` e do `scripts/mixar.py`.\n\n## Fontes\n\n | \n\n | Uso\n | Fonte\n | Arquivo no pacote\n\n | Títulos, pílula, frases de marca\n | Satoshi (500 e 700)\n | `hf/fonts/Satoshi.woff2`\n\n | Interface e números\n | Inter (100 a 900), com algarismos tabulares nos contadores\n | `hf/fonts/Inter.woff2`\n\n | Rótulos e URL\n | Geist Mono\n | `hf/fonts/GeistMono.woff2`\n\nAs três são as fontes do site da Dub, carregadas por `@font-face`.\n\n## Cores\n\n | \n\n | Token\n | Hex\n | Papel\n\n | Fundo\n | `#FAFAFA`\n | página; grade de 80 px em `#E5E5E5`, apagada nas bordas por máscara radial\n\n | Tinta\n | `#171717`\n | texto, cursor, pílula e círculo (`#0A0A0A`)\n\n | Cliques\n | `#155DFC`\n | linha e aba Clicks\n\n | Leads\n | `#9810FA`\n | aba Leads, aviso de lead\n\n | Vendas\n | `#00D5BE`\n | aba Sales, aviso de venda\n\n | Links\n | `#FB923C`\n | anéis do drop, \"launch\" na pílula, brilho do mapa\n\n | Parceiros\n | `#C084FC`\n | anel dos parceiros\n\n | Pagamentos\n | `#4ADE80`\n | \"Payouts.\", chips de comissão\n\n | Total pago\n | `#16A34A`\n | contador `$4,218,960`\n\nDegradês de texto: \"launch\" em `#FDBA74 → #FB923C → #F97316`; \"partners.\" em `#A855F7 → #D946EF → #F97316`; \"revenue.\" em `#F97316 → #EC4899 → #8B5CF6`. Atrás de tudo, um brilho cônico com as cores das linhas do produto, desfocado em 110 px. \"Conversions.\" usa o degradê das três métricas (`#155DFC → #9810FA → #00D5BE`).\n\n## Componentes\n\n | \n\n | Peça\n | Como é\n\n | Modal \"New link\"\n | cartão branco 1300×330, raio 22, borda `#E5E5E5`, sombra larga e fraca; trilha \"Links › New link\" e \"Draft saved\"\n\n | URL\n | Geist Mono 31 px; nomes dos parâmetros em `#A3A3A3`, valores em tinta; cursor de 3 px sempre aceso\n\n | Pílula\n | preta, logo da Dub branco e `dub.sh/launch` em Satoshi 700 de 56 px\n\n | Odômetro\n | uma tira de 0 a 9 por casa, numa janela de 1,15 em com máscara em degradê de 10% nas bordas; a casa `i` só rola quando as de baixo estão em 9\n\n | Mapa\n | 2.968 pontos de terra do `world-atlas` 110m, com perspectiva falsa (mais estreito em cima); clique = anel na cidade + arco de Bézier até a pílula\n\n | Países\n | painel de vidro branco (86%, desfoque 8 px) com barras `#FFEDD4`\n\n | Card de Analytics\n | 1400×760, raio 28; três abas de 440×128 com bolinha da cor da métrica; linha preta de 4 px sob a aba ativa\n\n | Gráfico → funil\n | área com 40 pontos; o funil tem três faixas e pílulas brancas de porcentagem\n\n | Avisos\n | cartões brancos com ícone na cor da métrica, entrando em cascata\n\n | Parceiros\n | 28 avatares em três elipses ao redor do círculo, entrando por anel com 0,028 s entre cada um\n\n | Painel das funções\n | 1780×960, raio 44; ícone + palavra grande; \"Deep links.\" só com contorno, \"Payouts.\" com brilho verde\n\n | Fecho\n | logo 150 px, wordmark, botões \"Start for free\" (preto) e \"Get a demo\" (branco com borda), `DUB.CO` em Geist Mono cinza\n\n## Transições\n\nA forma herói muda de tamanho, raio e cor de uma cena para a outra, sempre com mola: campo da URL (1180×80) → pílula (540×112) → card (1400×760) → círculo (200×200) → painel (1780×960) → logo (150×150). O conteúdo de dentro acompanha a escala da forma. No painel, cada palavra nova traz a sua cor num círculo que cresce a partir do ícone (máscara radial com borda suavizada de 90 px, 0,17 s). Não há crossfade.\n\n## Curvas e molas\n\n | \n\n | Nome\n | Curva\n | Uso\n\n | SAAS\n | `cubic-bezier(.86, 0, .07, 1)`\n | trocas grandes da forma e câmera nas viradas\n\n | CUR\n | `cubic-bezier(.45, 0, .15, 1)`\n | cursor\n\n | IN_OUT\n | `cubic-bezier(.33, 0, .67, 1)`\n | câmera entre chaves, funil\n\n | OUT\n | `cubic-bezier(.16, 1, .3, 1)`\n | entradas rápidas\n\n- **Mola padrão:** linear de 0 a 1 em 0,25 s e depois inércia (amplitude 0,05, frequência 2, decaimento 4), um overshoot de ~112%. As trocas da forma usam a mesma mola com tempos de 0,18 a 0,7 s; a mais lenta é a do painel virando logo, no respiro.\n\n- **Antecipação:** a pílula agacha 6% nos 0,12 s antes do drop e estala com mola em 2,0 s.\n\n- **Motion blur:** render a 240 qps e `tmix=frames=4:weights=1 1 1 1` para 60 qps.\n\n## Câmera\n\nUma lista de chaves `[tempo, x, y, escala, rotação, curva]` leva a câmera de 116% no começo a 100% no drop, aproxima em 4,3 s e 9,8 s, abre para 94% quando chega o círculo dos parceiros (7,88 s), aproxima de novo no respiro (até 109% em 12,3 s) e termina em 103%. Por cima das chaves, sempre: deriva em ruído suave de ±7 px em x, ±5 px em y, ±0,25° de rotação e ±0,4% de escala. A cada palavra do painel, um soco curto de escala (até +3,5%, em 0,24 s).\n\n## Trilha\n\n | \n\n | Item\n | Valor\n\n | Música\n | \"LINK\" (Icy Narco), playlist internacional; só o instrumental, separado pelo Demucs (`htdemucs --two-stems=vocals`), porque a faixa tem letra de rap\n\n | Tempo\n | 122 BPM; compasso de 1,97 s\n\n | Edição\n | trechos 17,74–25,62 s e 29,56 s em diante da música, cortando 2 compassos e emendando com crossfade de 40 ms\n\n | Abertura\n | até 1,9 s, a música sem o grave (passa-alta em 180 Hz); o grave entra no drop\n\n | **Drop**\n | **2,00 s**, no estalo da pílula\n\n | Respiro\n | pausa do baixo da música em 11,22–13,80 s\n\n | Fecho\n | volta em 13,80 s; fade a partir de 15,55 s\n\n## Sound design e mix\n\n | \n\n | Ação na tela\n | Efeito\n\n | URL digitada\n | digitação + tecla por caractere, com tom variando e passa-baixa de 6,5–7 kHz\n\n | URL se espreme, painéis entram\n | whoosh curto\n\n | clique do cursor\n | clique de mouse\n\n | drop e volta\n | impacto + boom cinematográfico + pop (três camadas), riser antes\n\n | contador rolando / assentando\n | contador rolando / tique\n\n | cliques no mapa\n | pop leve, tom subindo em seis passos\n\n | avisos de lead e venda\n | notificação\n\n | linha vira funil\n | whoosh grave\n\n | emenda da música\n | efeito reverso com pico no ponto (7,88 s)\n\n | avatares brotando\n | bolhas estourando\n\n | comissões pagas\n | notificação leve, tom variando\n\n | cada palavra do painel\n | whoosh curto + clique\n\n | botões e clique final\n | pop, clique, sucesso\n\n- 104 eventos, cada um em `at = evento − pico do arquivo`; a lista completa está em `audio/sfx-lista.json`.\n\n- Trilha nivelada a −19 LUFS antes da soma (a música chega masterizada a ~−8 LUFS e esconde os efeitos).\n\n- Efeitos com ganho ×3 (+9,5 dB), medidos 6 a 9 dB abaixo da trilha no mesmo trecho.\n\n- Final com `loudnorm` em duas passagens: −14,0 LUFS, pico −1,5 dBTP.\n\n## O que é \"humano\" neste vídeo\n\n- A câmera deriva o tempo todo, inclusive no respiro.\n\n- A pílula agacha antes de estalar no drop, como quem pega impulso.\n\n- Os cliques no mapa aceleram (de 9 para 28 por segundo), e o contador acompanha.\n\n- O cursor clica nas abas e no botão final; o card responde ao clique.\n\n- O logo chega na pausa da música e o fecho entra com a volta da batida."
    },
    {
      "titulo": "A montagem no HyperFrames",
      "texto": "| \n\n | Arquivo\n | O que faz\n\n | `hf/index.html`\n | a composição: uma função `render(t)` desenha o quadro inteiro a partir do tempo e é chamada por um único tween de 16 s; nada depende de timer nem de `Math.random` (o acaso vem de um hash com semente)\n\n | `hf/mapa.js`\n | os pontos de terra do mapa, já calculados\n\n | `scripts/mixar.py`\n | monta a trilha (edição de DJ, grave só a partir do drop, nível de −19 LUFS), soma os 104 efeitos em `evento − pico` e faz o `loudnorm` em duas passagens até −14 LUFS\n\n | `scripts/finalizar.sh`\n | junta o render de 240 qps em 60 qps com `tmix` de 4 quadros (motion blur), põe o áudio e monta a comparação com o original\n\n | `scripts/olhar.py`\n | tira quadros avulsos e folhas de contato da composição pelo Playwright, chamando `seek(t)`\n\n | `scripts/mapa_pontos.py`\n | gera os pontos do mapa a partir do `land-110m` (grade de 2,2°, com shapely)\n\n | `scripts/mosaico.py`\n | junta imagens num mosaico com rótulo, para comparar quadros\n\n- **Instale o básico:** Node.js (para o `npx`), ffmpeg e Python 3. As fontes já estão em `hf/fonts/` e o GSAP em `hf/gsap.min.js`, então a composição não busca nada na internet. O `olhar.py` usa o Playwright; o `mapa_pontos.py`, o shapely.\n\n- **Monte a pasta:** deixe `hf/`, `scripts/` e `estudo/` juntos e coloque a pasta `audio/` do pacote ao lado delas. Os scripts procuram `audio/` e `render/` a partir da pasta do projeto.\n\n- **Veja a composição:** dentro de `hf/`, rode `npx --yes hyperframes@0.8.144 preview`. Para um quadro específico, abra o `index.html` no navegador e chame `seek(8.5)` no console.\n\n- **Refaça o som** (opcional): no `scripts/mixar.py`, troque os caminhos `N` (efeitos nivelados) e `P` (efeitos premium) pelas pastas `audio/sfx/nivelados` e `audio/sfx/premium` e rode `python scripts/mixar.py`. A saída é `audio/mix.wav`.\n\n- **Render:** da pasta do projeto, rode `npx --yes hyperframes@0.8.144 render hf --fps 240 --quality high --output render/bruto-240.mp4` e depois `bash scripts/finalizar.sh`. Para a comparação, aponte a variável `REF` do script para o vídeo original em `referencias/original/`.\n\n**Pegadinhas:** com a máquina carregada, o GSAP pelo CDN falha; por isso ele vai local. Meça o DOM só na montagem (`build`), nunca dentro do `render(t)`. O motion blur por `tmix` desenha degraus em formas que crescem muito rápido: as revelações em círculo usam borda suavizada de 90 px. Na pílula, a cor só troca depois de 45% do caminho; antes disso ela passa por um cinza feio."
    },
    {
      "titulo": "As decisões de direção",
      "texto": "- **A Dub de verdade.** Em vez da home, o ponto de partida foi o kit de marca (`/brand`) e as capturas oficiais do produto: fundo `#FAFAFA` com grade `#E5E5E5`, tinta `#171717`, Satoshi nos títulos, Inter na interface, Geist Mono nos rótulos. As cores de cliques, leads e vendas foram medidas nos pixels das capturas.\n\n- **Uma forma do começo ao fim.** A caixa da URL vira a pílula, a pílula vira o chip do card, o card vira o círculo dos parceiros, o círculo vira o painel e o painel vira o logo. O original cortava do globo para o card e deixava um quadro cinza em 1,5 s.\n\n- **Um gráfico que vira outro.** A área do gráfico de linha se transforma no funil de conversão real da Dub, interpolando o contorno de cima e o de baixo na mesma curva; cada terço do eixo ganha a sua cor e as pílulas 100% · 3.8% · 0.12% aparecem.\n\n- **Contador odômetro sem dígito cortado.** Cada casa é uma tira de 0 a 9 numa máscara com degradê nas bordas, e uma casa só rola quando todas as de baixo estão em 9. O número herói mostra os zeros à esquerda em cinza; nas abas do card, eles somem. No fim da contagem, o número voa para a aba Clicks.\n\n- **Palavras sem corte seco.** No painel das funções, a cor nova nasce num círculo que cresce a partir do ícone da palavra, em 0,16 s, com um soco curto de câmera a cada troca.\n\n- **Câmera nunca parada.** As chaves de câmera levam a zoom e posição; por cima, uma deriva lenta mexe posição, rotação e escala o tempo todo.\n\n- **Respiro antes do logo.** A edição da música põe a pausa do baixo entre 11,22 e 13,80 s, justo quando o painel encolhe até o logo; em 13,80 s a música volta com impacto e o fecho entra.\n\n- **Som de interface.** Teclas na digitação da URL, clique na pílula, impacto em três camadas no drop e na volta, contadores, pings dos cliques no mapa, notificações dos avisos, pops dos avatares e um whoosh por palavra.\n\nDetalhes de cores, curvas e som: estilo.md. Cenas por tempo: roteiro.md. Para fazer um vídeo no mesmo estilo: PROMPT.md."
    },
    {
      "titulo": "As versões até o final",
      "texto": "| \n\n | Versão\n | O que mudou\n\n | rascunho\n | render a 30 qps para revisar movimento e tempos\n\n | 1ª mixagem\n | efeitos 10 a 15 dB abaixo da trilha; a revisão com o Gemini não ouviu nenhum\n\n | **final**\n | trilha nivelada a −19 LUFS e efeitos com ganho ×3 (+9,5 dB), 6 a 9 dB abaixo da trilha; a 2ª revisão do Gemini confirmou teclas, riser e drop no tempo e música sem voz\n\nPonto em aberto: o chip `dub.sh/launch` no topo do card ficou sem fundo próprio, detalhe em que o original é melhor."
    }
  ],
  "pacote": [
    {
      "pasta": "projeto/",
      "conteudo": "`hf/index.html` (a composição inteira), `hf/mapa.js` (os 2.968 pontos do mapa-múndi), `hf/gsap.min.js` local, as fontes Satoshi, Inter e Geist Mono em `hf/fonts/`, logo e wordmark oficiais em SVG, os 28 avatares dos parceiros, o `hf/BRIEF.md`, os scripts em `scripts/` e a base do mapa (`estudo/land-110m.json`)"
    },
    {
      "pasta": "audio/",
      "conteudo": "mix final (`mix.wav`), instrumental da música separado pelo Demucs, batidas medidas (`link-beats.json`), a lista dos 104 efeitos com tempo, volume, tom e filtro (`sfx-lista.json`) e os arquivos dos efeitos em `audio/sfx/`"
    },
    {
      "pasta": "referencias/",
      "conteudo": "o vídeo original, o prompt original, as folhas de contato do original, a comparação lado a lado (original em cima, recriação embaixo), o `APRENDIZADOS.md` do projeto, folhas a 4 qps, a análise do áudio do original, o kit de marca da Dub (logo, wordmark e 9 capturas oficiais do produto) e o `links.md`"
    },
    {
      "pasta": "render.mp4",
      "conteudo": "o vídeo final"
    },
    {
      "pasta": "hf/index.html",
      "conteudo": "a composição: uma função `render(t)` desenha o quadro inteiro a partir do tempo e é chamada por um único tween de 16 s; nada depende de timer nem de `Math.random` (o acaso vem de um hash com semente)"
    },
    {
      "pasta": "hf/mapa.js",
      "conteudo": "os pontos de terra do mapa, já calculados"
    },
    {
      "pasta": "scripts/mixar.py",
      "conteudo": "monta a trilha (edição de DJ, grave só a partir do drop, nível de −19 LUFS), soma os 104 efeitos em `evento − pico` e faz o `loudnorm` em duas passagens até −14 LUFS"
    },
    {
      "pasta": "scripts/finalizar.sh",
      "conteudo": "junta o render de 240 qps em 60 qps com `tmix` de 4 quadros (motion blur), põe o áudio e monta a comparação com o original"
    },
    {
      "pasta": "scripts/olhar.py",
      "conteudo": "tira quadros avulsos e folhas de contato da composição pelo Playwright, chamando `seek(t)`"
    },
    {
      "pasta": "scripts/mapa_pontos.py",
      "conteudo": "gera os pontos do mapa a partir do `land-110m` (grade de 2,2°, com shapely)"
    },
    {
      "pasta": "scripts/mosaico.py",
      "conteudo": "junta imagens num mosaico com rótulo, para comparar quadros"
    }
  ],
  "prompt": "Quero um vídeo de lançamento no mesmo estilo do projeto \"Cliques que viram receita\" (lançamento da Dub), que está em 07-videos/projetos/dub/, para o meu produto.\n\nProduto: {{PRODUTO}}\nSite do produto: {{SITE}} (de onde sai a identidade visual)\nO que o produto faz, em uma frase: {{FRASE}}\nFunções que devem aparecer (até 7): {{FUNCOES}}\nFrase final da marca: {{FRASE_FINAL}}\nFormato e duração: {{FORMATO}} (a referência é 16:9 com 16 s)\n(Se algum desses estiver vazio ou com as chaves, me pergunte antes de começar.)\n\n1. Estude o projeto antes de propor qualquer coisa. Leia, nesta ordem: LEIA-ME.md, estilo.md e roteiro.md da pasta dub, e depois o referencias/APRENDIZADOS.md. Abra o projeto/hf/index.html e me explique em poucas linhas como funcionam a função render(t), a forma herói (heroState), a câmera (cam) e o odômetro, e o que você vai reaproveitar.\n\n2. Pesquise a marca de verdade antes de desenhar. Abra o meu site, a página de marca ou de imprensa (/brand, /press) e as capturas oficiais do produto, não só a home. Tire as cores (meça nas capturas, pixel a pixel), as fontes que o site carrega, o logo e o wordmark em SVG. Escreva um BRAND.md com cada valor e a fonte de onde saiu. Se o meu produto for claro, o vídeo é claro; não invente uma versão escura.\n\n3. Monte a história como uma forma só. Proponha a sequência \"forma → forma\" com o que cada uma mostra (ex.: campo de texto → pílula → card com números → círculo → painel das funções → logo) e onde fica o respiro antes do fecho. Cada troca nasce da cena anterior, com mola; nada de crossfade nem de corte que começa do zero. Me mostre a sequência antes de construir.\n\n4. Trilha antes da animação, num subagente: música real que eu ainda não usei, com batida clara. Meça com o beat_this, faça a edição de DJ por compasso para o drop cair na primeira grande transformação e uma pausa da própria música cair no respiro antes do logo. Se a música tiver letra, use só o instrumental (Demucs). Entregue os tempos fortes num arquivo de batidas.\n\n5. Reaproveite a engenharia, troque o conteúdo. Mantenha: a composição como função pura do tempo (render(t) chamado por um único tween, sem timer nem Math.random), o GSAP e as fontes locais, a mola padrão (0,25 s linear + inércia de ~112%), as curvas SAAS e IN_OUT, a câmera com chaves e deriva contínua por cima, o odômetro com máscara e carry correto, o morph de gráfico pelos contornos, a revelação de cor em círculo a partir do ícone e o motion blur por subquadros (240 qps + tmix de 4). Troque: textos, números, cores, fontes, logo, funções e trilha.\n\n6. Som: um efeito para cada elemento que entra, sai ou é clicado, na posição evento − pico do arquivo; mesma ação, mesma família de som, com o tom variando. Nivele a trilha a −19 LUFS antes de somar e dê ganho aos efeitos (comece em ×3), conferindo que eles ficam 6 a 9 dB abaixo da trilha. Final em −14 LUFS com loudnorm em duas passagens.\n\n7. Antes do render completo, me mostre 4 quadros: o primeiro estado da forma, o drop, a cena com mais dados e o fecho. Depois do render, rode o detector de saltos (diferença entre quadros maior que 3× a dos vizinhos), confira se nenhum dígito do contador aparece cortado e se nada fica parado mais de 0,3 s. Em cada movimento, pergunte: está humano ou robotizado? Entregue o vídeo, a ficha do projeto e uma anotação do que aprendeu.",
  "campos": [
    "FORMATO",
    "FRASE",
    "FRASE_FINAL",
    "FUNCOES",
    "PRODUTO",
    "SITE"
  ],
  "fonte": {
    "nome": "Clube do Motion",
    "url": "https://clubedomotion.com/projeto/?id=dub",
    "uso": "liberado pelo dono do Clube do Motion em 18/10/2026 (docs/permissoes/clube-do-motion.md)"
  }
}