Visão geral
O difícil de um app de finanças não é a tela, é o dado que chega dos bancos. Cada banco exporta de um jeito: OFX antigo em SGML (que nenhum leitor de XML abre), arquivo em Windows-1252, valor com vírgula, CSV com "Histórico" numa conta e "Lançamento" na outra. O Fluxo lê tudo isso com código próprio e transforma num painel simples: quanto entrou, quanto saiu, pra onde foi e quanto sobrou.
Nada sai do computador de quem usa. Não tem servidor, nem banco remoto, nem cadastro.
Como funciona
Importar: um tokenizador próprio lê OFX 1.x (SGML) e 2.x (XML) com o mesmo código. O CSV descobre o separador, acha as colunas pelo nome e aceita valor numa coluna só ou em crédito e débito. Linha ruim vira aviso com o número da linha, e o resto entra.
Não duplicar: cada lançamento ganha uma chave estável. No OFX é o id do próprio banco. No CSV, que não tem id, dois cafés de R$ 5,00 no mesmo dia são duas compras reais com dados idênticos, então a chave numera a ocorrência dentro do arquivo. Reimportar o mesmo extrato não muda nada.
Aprender: corrigiu a categoria de "COMPRA CARTAO 1234 IFOOD *RESTAURANTE 05/09"? O app tira o
nome do estabelecimento, cria a regra ifood restaurante e aplica nos outros lançamentos. O que
você escolheu na mão nunca muda sozinho.
Limites e metas: o limite por categoria avisa pelo ritmo do mês, antes de estourar. A meta de economia calcula quanto guardar por mês, arredondando pra cima no centavo pra fechar no prazo.
Testes
74 testes automatizados cobrindo os formatos de extrato, a importação sem duplicar, o aprendizado de regras, os relatórios e a geometria dos gráficos. O app também foi testado no navegador de verdade, em celular e desktop. Esse teste achou um problema que o teste de unidade não pegaria: com o navegador em inglês, o valor aparecia como "BRL6,300.00". Agora real e mês são formatados à mão, iguais em qualquer navegador.
Stack
C# 12, .NET 8, Blazor WebAssembly, System.Text.Json com geração em tempo de compilação, xUnit. Gráficos em SVG desenhados à mão, sem biblioteca.