SaldoCerto
App Flutter de finanças pessoais a partir do salário: orçamento por categoria, despesas, contas fixas e metas. Offline-first, sobre Supabase com RLS, e com um assistente de IA que nunca vê os seus números.

// Visão geral
Um app Flutter que organiza a vida financeira a partir do salário: a renda do mês é distribuída em categorias de orçamento, despesas e contas fixas são registradas, e um painel com gráficos mostra quanto ainda sobra — o saldo certo.
// O desafio
Controle financeiro falha em dois lugares. O primeiro é a hora da despesa: no mercado ou no ônibus, sem sinal, o app que depende de rede simplesmente não registra. O segundo é a privacidade: um assistente de IA que lê as suas finanças é uma pergunta de confiança antes de ser uma funcionalidade.
// Restrições
Registrar a despesa onde ela acontece, inclusive sem sinal, e nenhum número financeiro pode chegar a um modelo de IA.
// Decisões de engenharia
Offline-first
- Escolha
- espelho SQLite dos dados do Supabase e uma fila de mutações (outbox) por onde passam todos os repositórios.
- Por quê
- a despesa é registrada onde não há sinal — no mercado, no ônibus.
- Trade-off
- mais complexidade de sincronização, em troca de o app nunca recusar um registro.
IA sem dado financeiro
- Escolha
- o modelo só interpreta a pergunta; o cálculo roda em funções do Postgres, sob RLS, e a resposta é montada em código.
- Por quê
- um assistente que lê suas finanças é uma pergunta de confiança antes de ser uma funcionalidade.
- Trade-off
- o assistente só responde o que as funções do banco sabem calcular.
// A solução
Offline-first de verdade: um espelho SQLite dos dados do Supabase e uma fila de mutações (outbox) por onde passam todos os repositórios — a escrita feita sem rede entra na fila e é reaplicada quando a conexão volta. No servidor, Postgres com RLS em todas as tabelas. O assistente usa LLMs só para entender a pergunta, numa cascata gratuita com fallback (Groq → OpenRouter → roteador por palavra-chave); o cálculo é feito por funções no Postgres, sob RLS, e a resposta é montada em código. Nenhum número financeiro sai para um modelo.
// Arquitetura
Meu papel
Desenvolvedor único — produto, arquitetura (Riverpod + go_router, mais de 20 módulos de funcionalidade), banco (42 migrations no Supabase), testes e pipeline de release.
Tecnologias
// Telas





// Resultado e evidências
Versão 1.40, com releases automatizadas pelo Release Please. 88 arquivos e mais de 550 casos de teste, incluindo E2E do app inteiro rodando em emulador no CI. O código é privado.
- casos de teste
- 550+
- incluindo E2E do app em emulador no CI
- migrations no Supabase
- 42
- módulos de funcionalidade
- 20+