A regra que define o produto
Na planilha, aporte parece saída e rendimento parece entrada. Contabilmente está certo e como relatório é desastroso: somar essas linhas ao fluxo de caixa infla receita e despesa ao mesmo tempo e destrói qualquer noção de quanto você gasta e poupa. Por isso toda linha cai em um de cinco baldes, e só dois alimentam o fluxo de caixa.
export type Bucket =
| "income" // feeds the cash flow, as money in
| "expense" // feeds the cash flow, as money out
| "invest_contrib" // a contribution is not spending
| "invest_withdraw" // a withdrawal is not income
| "invest_yield"; // a yield is not income eitherLê a sua planilha, não um formato novo
Cole o link de compartilhamento do OneDrive: o leitor converte em URL de download, adivinha a linha de cabeçalho e as colunas por palavra-chave, e mostra as primeiras linhas para você conferir. .xlsx, .csv e .tsv funcionam igual; o leitor de .xlsx é próprio, escrito sobre o fflate, então a única dependência de verdade é um descompactador de zip.
date description amount segment asset
04/09/2026 Mercado R$ 312,45 Mercado
05/09/2026 Aporte Tesouro (R$ 500,00) Investimento Tesouro Selic
10/09/2026 Salário R$ 8.400,00 Renda
# dd/mm/yyyy, "R$ 1.234,56" and parentheses-as-negative are read as they are.
# The filled "asset" column is the strongest signal that a row is an investment.Sem banco de dados, de propósito
Nada é importado e nada é armazenado: adicione uma linha na planilha, clique em atualizar, o painel muda. A busca tem cache de 60 segundos e guarda contra SSRF, e o único estado persistido é um arquivo de configuração local: link, aba, mapeamento de colunas e regras de classificação. Apague e o app volta ao estado inicial.
Cinco telas, e gráficos que não escapam da paleta
Painel do mês, tela de investimentos onde aporte e rendimento são o assunto e não ruído, tela de cartões, o extrato completo e filtrável (inclusive as linhas que o leitor não conseguiu interpretar) e a configuração. Os gráficos são SVG escrito à mão e nunca leem hexadecimal: toda cor vem de uma custom property, então tema claro e escuro não divergem e nenhum componente consegue fugir da paleta.
Quase nada funciona; o difícil é saber o quê. Pesquisa primeiro, e só dinheiro de testnet.