---
title: "Rodando este projeto no dia a dia dentro do Claude Code · Blog"
description: "Como é, na prática, rodar o video-to-text no dia a dia dentro do Claude Code: os prompts, os subprocessos, por que o CLAUDE.md é load-bearing e onde os subagents compensam."
source: "https://adhenawer.net/blog/claude-code-daily-workflow.html"
lang: pt-BR
---

Este projeto — um site estático de transcrições de podcasts e vídeos traduzidas para português brasileiro — era operado a partir do WhatsApp. Um agente de terceiros (OpenCode, depois um fork custom do Hermes) recebia uma URL, reaproveitava o token da minha assinatura Anthropic, rodava o pipeline e dava push no GitHub. Isso deixou de funcionar quando a Anthropic bloqueou o reuso de token de assinatura em agentes de terceiros. Justo: o token é para o cliente oficial.

Então tudo migrou para o Claude Code, o CLI oficial de terminal. No fim das contas, foi um upgrade, não um downgrade. O que vem a seguir é como "rodar o repo" virou na prática — os prompts, as chamadas de subprocesso e os poucos pontos em que ainda preciso dirigir.

## O setup

Não tem setup, e esse é justamente o ponto.

```
cd ~/code/video-to-text
claude
```

O CLI inicia, lê o `CLAUDE.md` na raiz do repo, e essa é a sessão. Sem gateway de WhatsApp, sem fila, sem daemon. O arquivo de memória do projeto tem ~300 linhas: estrutura de pastas, o comando do pipeline, convenções de slug, o template do card em `docs/index.html`, a regra de atualização do sitemap, a exigência de TDD. O Claude Code trata tudo isso como verdade fundamental em cada turno.

## Uma execução típica

Uma sessão normal para adicionar um artigo é uma frase minha e cerca de dois minutos de tool calls.

> **Eu:** adiciona artigo de `https://youtu.be/abc123`, título "Obsidian + Claude Code", subtítulo "Eduardo Mendes".

O que o Claude Code faz em seguida, sem eu pedir:

1. Executa `python3 src/fetch_transcript.py 'https://youtu.be/abc123' --text-only --timestamps > /tmp/transcript_abc123.txt` e confere o exit code.
 2. Lê `/tmp/transcript_abc123.txt` para o contexto.
 3. Traduz para PT-BR, organizando o texto em seções temáticas no formato `================` / `NOME DA SEÇÃO` que o `build_html.py` espera. Filler words, propagandas e marcadores `[music]` são descartados.
 4. Grava o resultado em `/tmp/abc123_pt.txt`.
 5. Roda o `build_html.py` com os argumentos posicionais certos para produzir `docs/leituras/obsidian-claude-code.html`.
 6. Edita o `docs/index.html` para inserir um novo `<a class="card">` e a linha correspondente `showProgress('reading_abc123_', 'p-abc123')` no script do rodapé.
 7. Adiciona uma entrada `<url>` no `sitemap.xml` com o `lastmod` de hoje.
 8. Acrescenta uma entrada no `llms.txt`.
 9. Dá `git add` nos cinco arquivos tocados, faz o commit seguindo a convenção `feat: adiciona artigo — <Título>` e dá push.

As partes que realmente precisam de mim são a tradução em si (gosto, não mecânica) e pegar quando um vídeo do YouTube não tem legendas — nesse caso redireciono para o provider do Twitter/X ou peço que puxe o áudio via `yt-dlp` e rode o `mlx-whisper` localmente.

## Por que o CLAUDE.md é load-bearing

Sem o arquivo de memória, o Claude Code ainda acertaria o passo 1 e então começaria a inventar. O formato do slug iria desviar (`obsidian_claude_code` vs `obsidian-claude-code`). O HTML do card ganharia um nome de classe novo. O sitemap seria esquecido. Os commits sairiam em inglês em vez da convenção `feat: adiciona artigo — Título`.

O arquivo não é documentação para humanos. É um prompt. Toda regra ali existe porque o agent errou uma vez e eu anotei o fix. Entradas representativas:

```
Slugs: kebab-case PT-BR sem acentos → como-construi-sistema-suporte-cliente-ia.html
Traduções .txt: ficam em /tmp, não commitadas
Commits: feat: adiciona artigo — Título / fix: ... / style: ...
```

O teste de "load-bearing" é simples: se eu apagar uma linha do `CLAUDE.md`, a próxima execução quebra? Para a maior parte do arquivo, sim. Esse é o sinal de que está fazendo trabalho real e não só parecendo documentação.

## Subagents para refactors grandes

O fluxo de um artigo só cabe em um context window. O backfill não coube.

Em dado momento quis adicionar versões em inglês de 19 artigos existentes. Fazer isso em série significava carregar 19 transcrições, 19 traduções e 19 gerações de HTML dentro de uma mesma conversa. O contexto principal ia estourar lá pelo artigo 6 e a qualidade cairia no restante.

A solução foi a ferramenta Task — o primitivo de subagent do Claude Code. Um único prompt:

> **Eu:** Para cada artigo em português em `docs/leituras/`, dispare um subagent para produzir a versão em inglês em `docs/readings/<slug>.html`. Cada subagent deve ler seu único arquivo-fonte, traduzir, rodar o `build_html.py` e retornar o caminho de saída. Rode até 4 em paralelo.

Cada subagent recebe um context window novo, faz um artigo, devolve um resumo curto e encerra. A conversa principal vê apenas os resumos — dezenove linhas de "gravei `docs/readings/x.html`" em vez de dezenove traduções inteiras. O mesmo padrão vale quando peço uma auditoria em todos os artigos atrás de links quebrados ou JSON-LD faltando.

O Plan mode entra em cena para qualquer coisa que mexa em código compartilhado: adicionar um novo provider em `src/providers/`, mudar os tokens de tema do CSS, reestruturar o layout dos testes. `/plan`, leio o plano, rebato em dois ou três pontos e aprovo. É mais lento do que deixar começar imediatamente e bem mais rápido do que desfazer um refactor ruim.

## Lições aprendidas

**Referencie, não cole.** No começo eu colava a transcrição no chat. Isso come o context window e produz traduções piores do que simplesmente dizer "lê `/tmp/transcript_abc123.txt`". O agent é melhor em puxar de disco do que em parsear um paredão de texto citado.

**Nomeie o arquivo, não o comportamento.** "Adiciona o card" é ambíguo. "Edita o `docs/index.html` para adicionar um novo card seguindo o padrão da última entrada" não é. O shorthand `@docs/index.html` crava o alvo.

**Revise em um novo turno.** Quando quero uma checagem de sanidade, abro uma mensagem nova: "revisa o HTML que você acabou de gerar atrás de tags `og:` faltando". O modelo critica o próprio output muito melhor quando não está defendendo ele no mesmo turno.

**Não é mágica.** O Claude Code interpreta errado URLs do YouTube com query string no final mais ou menos uma vez por semana. Já inventou flags inexistentes para o `yt-dlp`. De vez em quando faz stage de um arquivo que eu não queria no commit, e é por isso que leio cada `git status` antes de aprovar o commit. O fluxo é rápido porque o agent é rápido, não porque o agent é infalível.

O que mudou ao sair do gateway de WhatsApp foi que o feedback loop encolheu de minutos para segundos. Vejo cada tool call. Posso interromper. Posso perguntar "por que você escolheu esse slug?" e receber uma resposta. O pipeline não ficou mais simples; a superfície que eu vejo ficou honesta.

Repo: [github.com/adhenawer/video-to-text](https://github.com/adhenawer/video-to-text).