AGArthur Gueler
← Projetos

Finanças pessoais com ledger, Open Finance e IA

Valentina Finance

Monorepo TypeScript com API, SDK, web e app mobile sobre um núcleo financeiro determinístico em partidas dobradas, com dados via Open Finance e uma assistente de IA que só age pelo SDK.

01 Open Finance contas · cartões (Pluggy) 02 Notificações leitura no Android 03 Deduplicação conciliação de fontes 04 Ledger partidas dobradas · faturas 05 Valentina (IA) observações · chat 06 App + Web disponível · limite semanal
  1. 01 Open Financecontas · cartões (Pluggy)
  2. 02 Notificaçõesleitura no Android
  3. 03 Deduplicaçãoconciliação de fontes
  4. 04 Ledgerpartidas dobradas · faturas
  5. 05 Valentina (IA)observações · chat
  6. 06 App + Webdisponível · limite semanal

Fluxo simplificado da arquitetura.

Problema

Apps de finanças tratam tudo como lista de transações. Não entendem ciclo de fatura, parcelas futuras, cartão adicional, repasses familiares nem transferências entre contas PF e PJ, e o saldo mostrado não responde à pergunta real: quanto ainda posso gastar?

Solução

  • Monorepo TypeScript: Finance API (/api/v1), Finance SDK compartilhado, web em React, app mobile em React Native/Expo com atualização OTA via EAS e um adapter para o agente de IA (OpenClaw).
  • Finance Core determinístico: ledger de partidas dobradas em que toda transação fecha em débito e crédito, dinheiro como decimal NUMERIC(18,2), Unit of Work e comandos de domínio.
  • Cartões com ciclos e faturas, parcelamento (a despesa é reconhecida uma vez e as parcelas organizam a exigibilidade), pagamentos totais ou parciais, refunds e compromissos futuros.
  • Dados automáticos via Open Finance (Pluggy) e leitura de notificações bancárias no Android; a home mostra “disponível até a fatura”, “a pagar” e o limite da semana.
  • Valentina, a assistente de IA: observações de gasto e chat com histórico, pelo app e pelo WhatsApp.

Destaques técnicos

  • Idempotência por Idempotency-Key e correções por estorno/void: nenhum lançamento sofre hard delete.
  • Importação OFX com staging imutável, deduplicação por FITID/fingerprint, matching determinístico e fila de revisão; parsing fora do event loop e com limites.
  • JWT curto em memória e refresh token opaco HttpOnly rotacionado; a identidade nunca vem do body da requisição.
  • O agente de IA só age via SDK com JWT delegado de curta duração e nunca escreve direto no banco.
  • PostgreSQL e API sem exposição direta: Docker Compose e publicação por Cloudflare Tunnel.
  • Decisões de arquitetura registradas em ADRs.

Resultado

Em uso diário real por mim e pela minha família, com dados bancários sincronizados automaticamente.