🧹 npx hyperframes lint
A primeira barreira de qualidade: o linter analisa o seu index.html gerado e reporta problemas estruturais antes de você gastar tempo de render. Meta: 0 erros.
O linter lê o index.html gerado (não o build-index.mjs) e valida a estrutura de composição. Erros param o render — warnings são informativos.
Rode sempre após node build-index.mjs e antes de qualquer render. O lint é rápido (<2 s) e não inicia Chrome.
overlapping_clipsDois clipes de cena têm intervalos de tempo que se sobrepõem. Corrija ajustando o array AUDIO[] no build-index.mjs — a soma de durações deve ser estritamente sequencial.
multiple_root_compositionsMais de um elemento com data-composition na raiz do documento. O HyperFrames só aceita uma composição por arquivo index.html.
google_fonts_importO lint detecta um @import url('fonts.googleapis.com/...') no CSS. Fontes externas são proibidas porque o Chrome headless não tem acesso à internet durante o render. Use node fetch-fonts.mjs para baixar os .woff2 e servir localmente via assets/fonts/fonts.css.
Durante a composição, rode node build-index.mjs && npx hyperframes lint a cada modificação relevante no build-index.mjs. Custo: menos de 2 segundos. Evita surpresas no momento do render.
🔍 npx hyperframes inspect --samples 16
O inspector abre o Chrome headless, captura 16 frames distribuídos ao longo do vídeo e audita cada um: layout, overflow de texto, elementos fora do canvas. Meta: 0 problemas.
- ✓ Adicione
data-layout-ignoreem elementos decorativos off-canvas (palavras gigantes de fundo, glows,.bg-layer) - ✓ Prefira
left/rightem vez dewidthpara markers de highlight - ✓ Teste código longo em
overflow-x: autocom container de largura explícita - ✓ Use
z-index:-1nos glows para não vazar do bounding box
- ✗ Texto em linha de código ultrapassando o container — encurte ou quebre em linhas
- ✗ SVG sem
viewBoxdefinido — o auditor não consegue calcular bounds - ✗
position: absolutesemoverflow: hiddenno pai - ✗ Elementos decorativos sem
data-layout-ignore— marcados como overflow falso-positivo
O inspector detecta overflow de bounding-box, não problemas de legibilidade ou contraste. Após 0 problemas no inspect, ainda é necessário revisar frames do render draft visualmente — especialmente em cenas com texto sobre gradiente.
🎬 Render draft — iterar rápido
O modo --quality draft gera um MP4 de baixa resolução em segundos. Extraia um frame por cena com ffmpeg -nostdin e confira visualmente antes de gastar tempo no render final.
Use o tempo de início da cena como <t>. Para uma cena que começa em 12,5 s, use -ss 12.5. O flag -nostdin é obrigatório no Windows/git-bash para evitar que o ffmpeg consuma stdin e saia sem gerar o arquivo.
O Claude consegue visualizar imagens PNG diretamente. Extraia um frame por cena e verifique: alinhamento de texto, overflow, animações na posição certa, legibilidade sobre fundo. Repita para todas as cenas.
Edite o build-index.mjs, rode node build-index.mjs && npx hyperframes render --quality draft novamente. O loop draft é barato — itere sem culpa antes do render final.
| Aspecto | Draft | High |
|---|---|---|
| Objetivo | Conferência visual | Entrega final |
| Velocidade | Rápido (<30 s) | 3–4 min / 110s de vídeo |
| Qualidade | Reduzida | Máxima (30 fps) |
| Uso | Loop de iteração | Uma vez, no final |
1 frame por cena cobre bem. Para um vídeo de 8 cenas, são 8 chamadas ffmpeg. Foque nos momentos de transição e nos títulos — são as partes mais propensas a overflow.
👂 Validar a locução com o usuário
O Claude não ouve áudio. A validação da narração é responsabilidade do usuário — e deve acontecer antes do render high para não desperdiçar 3–4 minutos de processamento.
A ferramenta de análise de imagens (Read) funciona para PNGs e frames, mas áudio WAV não é suportado. Toda validação de locução precisa ser feita pelo usuário ouvindo os arquivos assets/audio/sN.wav diretamente.
Antes de render high, confirme com o usuário: pronúncia correta de termos técnicos, velocidade (pf_dora --speed 0.98 é o padrão), pausas naturais entre cenas, e duração coerente com o visual de cada cena.
- ✓ Ouça cada
assets/audio/sN.wavantes do render final - ✓ Confirme que siglas foram expandidas corretamente (ex.: "GSAP" → "ji-sap" soa natural?)
- ✓ Verifique que a duração do WAV é coerente com a cena visual
- ✓ Confira via
ffprobese a duração medida bate com oAUDIO[]
- ✗ Não faça render high sem ouvir os WAVs — retrabalho caro
- ✗ Não confie só na duração medida — a fala pode estar truncada
- ✗ Não use speed acima de 1.05 — voz fica metálica e artificial
- ✗ Não ignore pronúncias erradas de termos em inglês no texto PT-BR
Além de pf_dora (feminina, padrão recomendado com --speed 0.98), há pm_alex e pm_santa para variações masculinas. Se a pronúncia de um termo estiver errada, reescreva foneticamente no assets/txt/sN.txt e regenere o WAV.
🚀 Render high — qualidade de entrega
Após lint limpo, inspect sem overflow, draft conferido e locução aprovada, é hora do render final: --quality high --fps 30. Um vídeo de ~110s equivale a ~3.500 frames e leva 3–4 minutos na máquina típica com 22 cores.
O HyperFrames abre Chrome headless em resolução plena (1920×1080 ou 1080×1920), captura cada frame em PNG, passa todos ao FFmpeg e encoda H.264 com o áudio WAV embutido. A 30 fps, 110 segundos = 3.300 frames.
O tempo de render varia com o número de cores disponíveis. Em 22 cores, espere ~3–4 minutos para 110s de vídeo.
- ✓
npx hyperframes lint— 0 erros confirmados - ✓
npx hyperframes inspect --samples 16— 0 layout issues - ✓ Draft conferido visualmente (1 frame/cena)
- ✓ Locução aprovada pelo usuário
- ✗ Lint ainda reporta erros — vai falhar no meio do render
- ✗ Não viu nenhum frame do draft — risco de retrabalho
- ✗ O usuário não ouviu os WAVs — pode precisar re-renderizar
- ✗ O
index.htmlnão foi regenerado após a última edição
📐 Gerar os dois formatos — 16:9 e 9:16
Do mesmo projeto, gere o 16:9 (YouTube) e o 9:16 (Shorts/Reels) em sequência. A regra crítica: renderize logo após gerar cada formato — nunca deixe dois index.html simultâneos na raiz.
O build-index.mjs sempre sobrescreve o mesmo index.html. Se você rodar os dois modos antes de renderizar, o segundo sobrescreve o primeiro e você perde a composição. A sequência correta é: gerar → renderizar → gerar outra versão → renderizar.
node build-index.mjs (sem flag)renders/nome-16x9.mp4node build-index.mjs --verticalrenders/nome-9x16.mp4Para automatizar os dois formatos de uma vez, encadeie com &&:
O && garante que o render do 9:16 só inicia após o 16:9 terminar com sucesso.
- ✓
node build-index.mjs→ render 16:9 →node build-index.mjs --vertical→ render 9:16 - ✓ Sempre confirme qual
index.htmlestá ativo antes do render - ✓ Nomeie os outputs com sufixo
-16x9e-9x16desde o início
- ✗ Rodar
build-index.mjsebuild-index.mjs --verticalsem renderizar entre os dois - ✗ Renderizar sem
--outputexplícito — pode sobrescrever render anterior - ✗ Usar o mesmo nome de output para os dois formatos
📋 Resumo do Módulo 2.5
- ✓
npx hyperframes lint: os 3 erros fatais e como corrigir cada um - ✓
npx hyperframes inspect --samples 16: overflow,data-layout-ignoree falsos positivos - ✓ Render draft + extração de frame com
ffmpeg -nostdin -y -ss <t> -vframes 1 -update 1 - ✓ O Claude não ouve áudio — validação de locução é responsabilidade do usuário
- ✓ Render high:
--quality high --fps 30· ~110s ≈ 3.500 frames ≈ 3–4 min - ✓ Sequência 16:9 → 9:16: gerar e renderizar cada modo antes de gerar o próximo