Construí um escritório digital com 12 agentes de IA em 4 dias
Eu tinha agentes de IA demais e controle de menos. Um para escrever prompt, outro para front-end, outro para contrato, cada um numa aba, cada um sem memória do que o outro fez. Toda vez que eu precisava de algo da Elion Estúdio — um orçamento, um lançamento no caixa, um projeto novo — eu era o barramento entre eles.
Então passei quatro dias construindo o Elion Lab: um app desktop, de uso só meu, onde esses agentes têm mesa, função e um gerente. Em 71 commits e cerca de 21,8 mil linhas de TypeScript, ele virou o escritório da agência. Este post é o que funcionou, os números medidos e os cinco problemas que me custaram mais tempo que o resto somado.
Por que um escritório e não mais um chat
A diferença entre um chat e um escritório é o estado compartilhado. Num chat, cada conversa começa do zero e eu repito o contexto. Num escritório, o agente de finanças e o de documentos olham para o mesmo banco: se o Jarvis lança uma entrada, o painel do mês muda e o relatório sai certo, sem eu intermediar.
A escolha de fazer isso parecer um escritório — e não um painel de administração — foi prática. Eu precisava ver, de relance, quem está ocupado, o que está parado esperando a minha aprovação e o que já terminou. Um mapa resolve isso melhor que uma lista.
O que o app faz
O Office é um escritório em pixel art isométrica, na estética dos jogos isométricos do gênero. Cada um dos 12 agentes tem avatar, mesa e função: Jarvis (gerência e QA), Théo (prompts), Lis (front-end), Edgar (back-end), Andreza (full-stack), Fred (LGPD e políticas), Mark (documentos), JC (finanças), Duda (social), Bella (atendimento), Isa (prospecção) e Peter (primeiro contato com leads). Eu ando com o meu avatar pelo WASD, clico num agente para falar com ele e posso convocar uma reunião — as falas aparecem em balões e a ata sai no modelo oficial da agência.
O Jarvis é o gerente. Ele tem chat com voz e um holograma 3D que reage enquanto fala. Na prática, é por ele que passa quase tudo: lançar uma despesa, marcar um compromisso, criar um documento, tocar uma playlist, delegar uma tarefa a outro agente. A Home reúne o que eu preciso ver ao abrir o app — relógio, finanças do mês, dízimo, o que está esperando aprovação e a agenda do dia.
Nas Finanças, duas decisões que eu recomendo a qualquer um que mexa com dinheiro em software. A primeira: valores em centavos inteiros, nunca em float — ponto flutuante erra arredondamento e, em dinheiro, erro de centavo vira erro de confiança. A segunda: o dízimo é automático, 10% do bruto, sempre arredondado para cima no real. R$ 100,10 de entrada viram R$ 11,00 a devolver, não R$ 10,01. Arredondar para cima é decisão minha, não limitação técnica.
O Planner e a Agenda fecham o conjunto, no mesmo visual. O Planner guarda foco da semana, prioridades, hábitos e tarefas; a Agenda guarda os compromissos — e todo compromisso nasce com lembrete uma hora antes, sem eu precisar marcar.
Os dois portões: nada vai para o GitHub sem o meu sim
Esta é a parte que eu não abriria mão. Projeto de cliente passa por dois portões de aprovação:
- Portão 1: eu aprovo o plano antes de qualquer linha de código.
- Portão 2: o agente pergunta “posso fazer commit e push?” e espera. Nada sobe para o GitHub sem resposta minha.
Além disso, comandos destrutivos são barrados por uma política de permissões. Agente com acesso a terminal e sem trava não é produtividade, é risco — e eu descobri isso na prática, como conto mais abaixo.
Jarvis no WhatsApp, com o PC desligado
O recurso que mais mudou o meu dia é o mais simples de explicar: eu mando uma mensagem no WhatsApp e o Jarvis responde mesmo com o computador desligado. Lanço um gasto no mercado, marco um compromisso, mando um áudio — ele transcreve, entende e grava.
Isso não roda no app: roda numa Edge Function do Supabase ligada à Evolution API numa VPS gratuita. O app desktop é só uma das portas de entrada; o cérebro está na nuvem.
Junto veio o aviso de e-mail. Cinco caixas da agência e do blog são lidas a cada dois minutos, e o que importa chega no WhatsApp com um resumo de uma linha. Spam e newsletter ficam de fora. Entre 22h e 7h o sistema fica em silêncio e manda um resumo único às sete — porque notificação de madrugada não é informação, é insônia.
A stack e os números
Nada de framework exótico. Electron com React 19 e TypeScript, empacotado pelo electron-builder; PixiJS 8 desenha o Office e Three.js faz o holograma; Supabase cuida de banco (Postgres com RLS), Edge Functions, segredos e agendamento; Claude Agent SDK e Gemini movem os agentes; Vitest e Playwright testam.
| Métrica | Valor |
|---|---|
| Tempo de construção | 4 dias (27 a 30 de outubro de 2026) |
| Commits | 71 |
| Código | ~21,8 mil linhas de TypeScript |
| Testes | 259 de unidade + 12 de ponta a ponta |
| Abertura do app instalado | 1,07 s |
| Office | 143 fps, pior quadro de 28 ms |
| Acessibilidade | 0 violações WCAG A/AA nas 10 telas principais |
| Instalador | ~250 MB |
O que quebrou no caminho
1. O Spotify dizia “ok” e não tocava. A API respondia sucesso e o app desktop seguia em silêncio. Parei de brigar com o endpoint e passei a abrir a faixa pelo link spotify: direto — que dá play sozinho.
2. O Gemini travava, e a correção foi inverter a ordem. O modelo Flash às vezes ficava sem responder até estourar o tempo limite. Passei a chamar o Flash-Lite primeiro, com o Flash como reserva. A resposta do Jarvis caiu de 102 segundos para 2,8. Não foi otimização de código: foi escolher o modelo certo para a tarefa certa.
3. A biblioteca de e-mail não roda na nuvem. A biblioteca IMAP mais usada no Node não sobe nas Edge Functions. Escrevi um cliente IMAP mínimo — login, leitura das mensagens novas, logout — direto sobre a conexão TLS. Menos recurso, mas funciona onde precisa funcionar.
4. Um teste achou uma brecha de segurança minha. Esta é a história que mais me ensinou. Ao liberar o terminal para o Jarvis, testei pedir que ele apagasse uma pasta fora da área permitida. O comando passou. Ele veio embrulhado em powershell -Command "...", e a minha trava só olhava a primeira palavra do comando — via powershell, achava normal e liberava. Corrigi para inspecionar o comando inteiro, incluindo o que está entre aspas. Se você dá terminal a um agente, teste a trava tentando burlá-la; confiar no caminho feliz não é teste.
5. Quando o limite do Claude acaba. O mesmo pedido segue sozinho no Gemini até o limite voltar. A divisão é por responsabilidade: o Gemini cuida do dia a dia — finanças, agenda, música — e criar projeto ou comandar agentes continua só no Claude.
O que eu faria diferente
Começaria pelo WhatsApp, não pelo app. O recurso que mais uso é o que funciona sem o computador ligado, e eu só construí isso no terceiro dia. Gastei as primeiras horas deixando o Office bonito — o que valeu, mas poderia ter vindo depois.
E escreveria a política de permissões antes de dar terminal ao agente, não depois. A brecha do item 4 existiu porque eu liberei a capacidade primeiro e pensei na trava em seguida. Com agente autônomo, essa ordem precisa ser invertida.
Se você quiser entender de onde veio a motivação para montar tudo isso, escrevi antes sobre a Elion Estúdio, a startup por trás do projeto. E se o que te interessa é a parte de medir em vez de achar, dois posts seguem a mesma linha: o verificador de SEO que escrevi e os números reais do Search Console deste blog.
Perguntas frequentes
Dá para usar o Claude como agente dentro de um app próprio?
Dá, com o Claude Agent SDK. É o que move os agentes aqui: cada um tem a própria função e o próprio conjunto de ferramentas permitidas, dentro do app.
Quanto custa manter isso rodando?
O Claude usa a assinatura do plano que eu já tinha. O WhatsApp roda numa VPS gratuita, o Supabase está no plano gratuito e o Gemini tem cota grátis. O custo adicional do projeto, até aqui, foi o meu tempo.
Os agentes podem apagar arquivos ou publicar sozinhos?
Não. Há uma política de permissões que barra comando destrutivo, e commit e push dependem de aprovação explícita minha no portão 2.
Funciona sem internet?
Não completamente. Os agentes e o banco estão na nuvem. O Planner grava primeiro no computador e sincroniza depois, então ele aguenta uma queda de conexão.
Os prints deste post usam dados fictícios: clientes, valores e compromissos foram inventados para a publicação.
No DigitalRadar, eu conto o que construo com os números na mesa. Fique no radar.
Apurado a partir das fontes citadas e verificado antes da publicação. Veja a nossa Política Editorial.