30 de setembro de 2026·6 min de leitura
Meu agente agora grava o vídeo do que construiu
Programo pelo celular: o T3 Code comanda os agentes, eles rodam num devbox na Railway e eu recebo um "Done". Faltava ver a interface. O agentic-media-kit fecha esse ciclo: o agente grava o app, monta um Reel e me devolve um link que eu abro no celular.
Hoje boa parte do meu desenvolvimento acontece no celular. Abro o T3 Code, escrevo o que quero, e um agente - Claude Code ou Codex - começa a trabalhar num devbox na Railway. Eu vou fazer outra coisa. Quando ele termina, o T3 avisa no celular: "Done".
O "Done" diz o que mudou. Não mostra. E quando o trabalho é interface, o que importa é o que aparece na tela.
Este post é sobre o projeto que fez esse vídeo: o agentic-media-kit, open source, que deixa o agente mostrar o próprio trabalho.
O loop que roda no celular
O T3 Code é um app open source do Theo para conversar com agentes de código. Não é mais um modelo, é a interface: threads, diffs, um preview do app e a notificação quando o agente termina. É o meu controle remoto. Os agentes rodam num serviço sempre ligado na Railway, com os meus repositórios clonados. O notebook pode ficar fechado.
Para backend, esse loop funciona muito bem. Os testes passam, o diff é legível na tela do celular, eu aprovo ou peço ajuste. Para interface, ele quebrava sempre no mesmo ponto: toda feature terminava com "grava um vídeo rápido pra eu ver".
O agente até conseguia gravar. O que ele não tinha era um jeito de entregar esse vídeo para uma pessoa num celular. O arquivo ficava num diretório de um servidor que eu não ia abrir.
E havia um segundo pedido escondido no primeiro. Se a feature ficou boa, ela merece um post. A mesma gravação que serve para eu validar a tela serve para um Reel.
Capturar, montar, publicar
O kit faz isso em três etapas, e cada uma é uma pasta do repositório:
- Capturar. O agent-browser abre o app rodando numa viewport de celular, tira screenshots e grava em WebM um fluxo roteirizado. O agente olha as imagens antes de seguir. Isso já é validação: uma prova melhor do que "compilou".
- Montar. Um template em Remotion com props tipadas em zod gera o Reel em 9:16, o post de feed em 4:5, o quadrado e a capa. As capturas entram num mockup de celular com uma legenda por etapa, e o texto fica dentro das áreas seguras do Instagram, onde o nome de usuário e os botões não cobrem nada. O agente troca textos, cores e etapas via
--props, sem editar código. - Publicar. Um viewer em Express num único arquivo, sem JavaScript no cliente e sem banco: o bucket é o banco, e um projeto é só um prefixo. O vídeo toca a partir de URLs pré-assinadas do bucket S3 e nunca passa pela aplicação. Uma segunda URL força o download, que é o que permite salvar no celular e postar. Pessoas entram com senha. Agentes fazem upload com um bearer token.
No terminal do devbox, o caminho inteiro é este:
scripts/capture-flow.sh http://localhost:3000 apps/studio/public/captures mobile
npx remotion render Tour-Reel out/tour.mp4 --props=./tour.json
scripts/webm-to-mp4.sh out/tour.mp4 out/tour-ig.mp4
scripts/upload.sh meu-app out/tour-ig.mp4 out/cover.png
# -> https://<viewer>/p/meu-app
Mas eu não digito isso. O kit vem com uma skill do Claude Code que roda o pipeline. Do T3, no celular, escrevo "faz um Reel do novo onboarding", e alguns minutos depois a resposta é um link. Abro, assisto, toco em Baixar.
O T3 também tem preview próprio com ferramentas de gravação, e o kit documenta esse caminho como alternativa de captura. A divisão que tenho usado: explorar no preview do T3, vendo ao vivo, e depois congelar o fluxo num script capture-flow.sh, que roda sem tela no devbox e pode ser regravado a cada mudança de interface.
O vídeo de lançamento foi feito pelo kit
Não fazia sentido anunciar uma ferramenta de vídeo com um vídeo editado à mão. O lançamento passou pelo mesmo pipeline que o kit entrega para o agente. Um script gravou o viewer público numa viewport de iPhone 14: a galeria, o toque no projeto, o Reel tocando, a rolagem até o botão de download. Uma composição em Remotion montou quatro cenas: o gancho, um terminal renderizado em React repassando os comandos reais, a gravação do viewer dentro de um celular e o convite final. O resultado foi normalizado e publicado no viewer de demonstração.
É recursivo de propósito: a imagem dentro do celular, no vídeo, é o viewer tocando uma versão anterior desse mesmo Reel.
O que quebrou no caminho
A parte mais útil de construir isso foram os erros, porque nenhum deles aparece como erro.
- Capa em branco que "renderizou com sucesso". No Remotion, uma imagem estática renderiza o frame 0, e no frame 0 toda animação com
spring()ainda vale zero. O título existe, só está invisível. A correção foi um hookuseEnter()que devolve o estado final quando a composição é estática. A regra que ficou: o agente sempre abre a imagem gerada antes de dizer que terminou. - A Railway ignorou o
railway.json. O bloco de deploy, com healthcheck e política de restart, não foi aplicado, e o serviço subiu sem healthcheck nenhum. Configurei direto no serviço:/healthz. railway redeploynão redeploya o que você acha. Ele reexecuta o snapshot do deploy anterior e não pega as configurações novas. O comando certo érailway redeploy --from-source.- O H.264 do Remotion sai em
yuvj420p. É o formato de faixa completa, que a maioria dos players aceita mas nem todo upload aceita. O kit reencoda parayuv420pcomfaststart, que põe os metadados no início do arquivo para o preview começar antes de o download terminar. - Segurança num repositório público. Preferi tornar o erro impossível a contar com cuidado. O repositório não tem nenhuma credencial da Railway. Não há ambientes de pull request, então um PR de fora não sobe nada com acesso a segredos. A galeria de demonstração é pública e somente leitura (
PUBLIC_READ), mas escrever exige o token. E tudo o que está num bucket público é público, então captura com dado privado nunca vai para lá.
Para quem serve
Para quem roda agentes longe da própria máquina e quer ver a interface, não um resumo dela. E, principalmente, para fundador de SaaS que entrega sozinho ou com um time pequeno: cada feature vira evidência e conteúdo com o mesmo esforço. As mesmas imagens que provam que a tela funciona servem para um PR. Faça o upload para um projeto pr-123 e coloque o link na descrição.
Duas ressalvas honestas. O Remotion tem licença própria: é gratuito para indivíduos e times pequenos, mas empresas acima do limite precisam de licença comercial. E captura de app real pode conter dado real. Por isso o viewer pede senha por padrão, e o modo público é uma escolha explícita.
Experimente
O código é MIT. Ele renderiza de primeira, com uma interface de demonstração gerada, então dá para ver o resultado antes de apontar para o seu app:
git clone https://github.com/rwspatin/agentic-media-kit && cd agentic-media-kit
npm install
cd apps/studio && npx remotion render Tour-Reel out/tour.mp4
Repositório, guias de captura, specs do Instagram e deploy na Railway: https://github.com/rwspatin/agentic-media-kit. A demo pública está em media-viewer-production-dfcc.up.railway.app/p/launch.
Se usar, me conte onde quebrou. Issues e PRs são bem-vindos, e o feedback de quem tem um loop parecido com o meu é o que mais me interessa.
- Renan
Leitura relacionada
O bucket é o banco: um app de 430 linhas que eu não precisei manter
O media-viewer existe para eu assistir e baixar no celular os vídeos que meus agentes geram. Ele tem um arquivo, cinco dependências, nenhum banco e nenhum JavaScript no cliente. Este post explica cada decisão e o que eu abri mão para tomá-la.
O processo que está no código, não o que está na cabeça
Criei uma skill que lê o código de uma aplicação e reconstrói seus processos de negócio em BPMN validado. No caminho, abri um PR no Mermaid, descobri que outra pessoa estava mais adiantada e escolhi colaborar em vez de competir.
Eficiência sistêmica: software deveria ser tão sólido quanto um contrato bem redigido
A tese que orienta meu trabalho: tratar sistemas como contratos - antecipando modos de falha, eliminando ambiguidade e removendo fricção no nível certo, não no mais barato.