Pular para o conteúdo
Voltar

SaldoCerto

Projeto pessoalPapel: Desenvolvedor únicoFlutterRiverpodSupabaseSQLite

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.

SaldoCerto

// 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

Diagrama da arquitetura offline-first do SaldoCerto. A interface Flutter (Riverpod e go_router) fala só com os repositórios. Cada repositório lê do espelho SQLite local e grava numa fila de mutações (outbox); quando a conexão volta, a fila é reaplicada no Supabase, um Postgres com RLS em todas as tabelas. À parte, o assistente: um LLM, numa cascata Groq, OpenRouter e roteador por palavra-chave, só interpreta a pergunta; o cálculo roda em funções do Postgres sob RLS, e a resposta é montada em código — nenhum número financeiro vai para o modelo.

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

FlutterDartRiverpodgo_routerSupabasePostgreSQLSQLiteFirebase CrashlyticsGitHub Actions

// Telas

Painel com o saldo seguro do dia, o saldo disponível e a projeção do mês
Lançamentos do mês agrupados por dia, com categoria, data e valor
Orçamento por categoria, com o gasto comparado ao limite do mês
Metas de economia com progresso, prazo e quanto guardar por mês
Tema escuro: gráfico de rosca dos gastos por categoria e orçamentos do mês

// 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+

Gostou deste tipo de trabalho?