Assay

Do aporte à folha de ordens

O Assay é um app de finanças pessoais que roda 100% local, num Raspberry Pi. Você diz quanto vai aportar; um comitê de agentes pesquisa o mercado e devolve ativo, quantidade e preço limite. Gastos, cartões e imposto de renda ficam no mesmo app.

Tela do aporte de R$ 5.000,00 concluído: folha de ordens com CDB de liquidez diária e as ações WEGE3 e EGIE3, cada uma com quantidade, preço, stop e a tese do comitê.
Folha de ordens de um aporte de R$ 5.000, com dados fictícios.

Como sai a folha de ordens

Você registra o aporte. O comitê roda de madrugada, à 1h, e a folha fica pronta quando você acorda, com aviso no app e push no celular.

As etapas rodam numa só sessão do Claude Code headless: leitura macro e alocação, seleção do universo, due diligence de cada ativo e um comitê final de risco que fecha as ordens. Cada etapa herda o contexto e o JSON estruturado da anterior, e as fontes pesquisadas vêm datadas, com URL.

A folha não depende de corretora. O app não fala com nenhuma: você executa onde quiser e marca o que comprou, ou pula a ordem.

A mesma folha de ordens no celular: CDB-LIQ com R$ 2.000,00 a aplicar e WEGE3F com 24 unidades a R$ 53,85 e stop em R$ 47,50.
No celular, o ticker do fracionário, a quantidade e o preço que vão para a boleta.

O que o código confere

A soma das ordens
O backend compara o total da folha com o valor do aporte, com tolerância de 2%. Se não bater, o comitê tem uma única chance de corrigir, na mesma sessão.
A quantidade
Sai da cotação atual, não de um número que o modelo lembrou: lote de 100 no ticker e o resto no fracionário.
A retomada
O id da sessão fica salvo no aporte. Se o processo cai, a próxima execução volta da primeira etapa pendente; se bate o limite de uso, espera o reset e repete a etapa. Um lock por aporte impede rodar duas vezes.
A revisão
Toda semana o comitê revê o macro e as posições. Cada compra é um lote com trava própria, 30 dias em ações e nenhuma no CDB, e volta ao comitê quando a trava vence.
O modelo do chat
Regras determinísticas escolhem o modelo de cada mensagem do consultor. Uma triagem feita por modelo custava 5,6 s por mensagem no Pi e foi removida.
Tabela da carteira por lote: CDB-LIQ, ITUB4, EGIE3, WEGE3 e RADL3 com classe, trava, quantidade, preço médio, preço atual, P&L e valor.
Carteira por lote, com trava, preço médio e resultado.
Extrato de novembro no celular: saldo do mês de R$ 8.253,71, entradas e saídas e a fatura aberta de dois cartões de crédito.
Extrato do mês com as faturas abertas.

Gastos e cartões no mesmo lugar

Um gasto é lançado conversando com o consultor do app, que também lê foto de recibo e de extrato.

A fatura de cada cartão é calculada pelo dia de fechamento, e uma compra parcelada vira uma linha por parcela. Vale-refeição e vale-alimentação ficam em saldos separados, para não se misturarem com dinheiro que pode ser investido. Salário, aluguel e assinaturas entram como recorrências na previsão do mês.

Tela inicial: patrimônio de R$ 15.018, saldo de novembro de R$ 8.254 e o mês dividido entre o que entrou, o que saiu e para onde foi.
A tela inicial junta patrimônio e mês corrente.

Imposto de renda apurado por mês

Vendas de ações, isenção até R$ 20 mil vendidos no mês, prejuízo a compensar e DARF devido. No fim do ano, o app lista as posições em 31/12 pelo custo de aquisição, a base da ficha de bens e direitos.

A apuração é simplificada e a própria tela pede para conferir com um contador.

Posições em 31/12/2026 para a ficha de bens e direitos: ativo, classe, quantidade e custo de aquisição.
Posições do fim do ano, pelo custo de aquisição.

Roda em casa, num Raspberry Pi

Sem nuvem, sem login e sem banco externo. O backend é FastAPI com SQLite, o frontend é Next.js 16 e o comitê roda no Claude Code headless. Onze timers do systemd cuidam do aporte agendado, da revisão semanal, da retomada, de preços, alertas, relatórios e backup.

São 415 testes de backend em pytest, e o CI roda ruff, pytest, lint, type-check e build do frontend. Cada decisão de arquitetura fica registrada com o motivo, de D1 a D53.

Python 3.12, FastAPI, SQLite, Next.js 16, Claude Code headless, Web Push e systemd.

Ver o código no GitHub