Finanças da casa
Uma aplicação de finanças para uma casa de duas pessoas: cada pessoa entra com o seu próprio acesso, as suas contas ficam privadas até as partilhar, e os grupos nunca se somam por engano.
- Função
- Único programador
- Ano
- 2026
- Resultado
- A casa vê lado a lado a conta conjunta, os gastos de cada pessoa e as poupanças, com as entradas de dinheiro identificadas e as transferências entre contas próprias fora dos gastos.
- Feito com
- Node 22, TypeScript, Vue 3, Vite, SQLite (node:sqlite), pdf.js, Open banking (PSD2), Vitest, pnpm workspace

Porque o fiz
O dinheiro estava espalhado por vários bancos e por mais de uma pessoa. As aplicações dos bancos mostram um banco de cada vez, e a maioria dos agregadores soma tudo num só número, o que esconde quem gastou o quê e conta como gasto uma transferência entre contas próprias.
O que faz
Grupos que nunca se somam por engano
Cada conta pertence a um grupo: a casa, cada pessoa, as poupanças e um grupo da empresa só de leitura. Os totais só somam dentro de um grupo. Os grupos ficam ao longo do topo, cada um com o número de movimentos ainda por classificar (um número, nunca um montante), e Hide amounts (esconder montantes) apaga todos os valores do ecrã.

Home
O saldo de hoje; o dinheiro que entrou, o que saiu e o que passou entre as nossas próprias contas, que não conta como nenhum dos dois; para onde foi o dinheiro, mês a mês; e um cartão Needs you (à sua espera) com movimentos por classificar, transferências por confirmar, consentimentos bancários a terminar, meses do e-Fatura em falta, cópias de segurança falhadas e lojas por confirmar.

Privado até ser partilhado
Cada pessoa é titular das suas contas. Um interruptor por conta, "Shared with the household" (partilhada com a casa), começa desligado, e só o titular o pode ligar. Até lá, a outra pessoa não vê nada dessa conta: nem o nome, nem o montante, nem sequer um sinal de que há mais. Uma transferência para uma conta privada aparece só como uma transferência para a outra pessoa. A conta conjunta é visível para as duas. Depois de uma conta ser partilhada, a outra pessoa pode vê-la e classificar os seus movimentos, mas ligar o banco, ler os movimentos e o interruptor ficam com o titular. O servidor verifica tudo isto em cada pedido; nunca é a página que decide o que alguém vê.

Classificar movimentos
A classificação corre por uma ordem fixa: primeiro as transferências entre as nossas próprias contas (nunca rendimento nem gasto), depois o dinheiro de ou para a empresa, depois as comissões bancárias, e por fim as regras de categoria por loja, texto ou conta. Cada associação é certa, proposta como uma pergunta de sim ou não, ou feita à mão, e uma resposta que alguém desfaz nunca volta a ser aplicada. Os nomes das lojas são limpos de prefixos de cartão, montantes e números de referência, para que uma só regra apanhe todas as visitas. Uma regra nova mostra o que faria antes de ser guardada: "classificaria 14 movimentos".

Que loja é esta?
As lojas desconhecidas são identificadas numa ida e volta que uma pessoa confere em cada passo. A aplicação exporta até 30 nomes de lojas encurtados, só de pagamentos com cartão e de débitos diretos; montantes, datas, contas e pessoas nunca saem. Uma skill do Claude procura cada uma na web e escreve um ficheiro de resultados, que a aplicação lê de volta com verificações estritas. Cada loja passa então a um cartão com o seu logótipo, uma marca de certo ou incerto, uma ligação para o Maps e os seus movimentos, pronto a aceitar, editar ou recusar.

Bancos e extratos
Cada pessoa liga os seus próprios bancos através de open banking (PSD2), só de leitura, com o seu próprio consentimento e a sua própria chave. A conta conjunta é ligada uma só vez, para nunca ser contada duas vezes. O consentimento dura até 180 dias, e a aplicação avisa duas semanas antes de terminar. Os movimentos são lidos uma vez por dia, ou a pedido com a pessoa presente. O histórico mais antigo vem dos extratos: exportações em CSV cujo saldo corrente tem de encadear linha a linha, e PDFs lidos num processo isolado, recusados por inteiro se a cadeia de saldos quebrar ou se o IBAN não for o desta conta.

Poupanças e património
Os certificados de aforro são avaliados lote a lote, todos os dias, com o motor do Aforro Tracker e as taxas públicas. Depósitos, fundos e ações são mantidos à mão, com uma taxa e um vencimento. O património líquido mostra um valor por grupo, cada um com o seu gráfico. O interruptor Show total (mostrar total) está desligado por omissão e volta a desligar-se em cada visita.

e-Fatura, pagamentos recorrentes e relatórios
Os meses do e-Fatura de cada pessoa aparecem como obtidos, desatualizados ou em falta, com uma contagem decrescente até ao prazo anual, e cada pessoa decide se partilha os seus. Os pagamentos feitos três vezes com um intervalo regular passam a recorrentes, com o que vence nas próximas quatro semanas e o que subiu. Os relatórios mantêm separados os gastos, o rendimento real e o dinheiro que entrou vindo das nossas próprias contas.

Como funciona
- Feita leve
- Um só processo Node sem framework web, um só ficheiro SQLite através do SQLite que vem com o Node, montantes em cêntimos inteiros, e uma versão que é um único ficheiro empacotado. Foi feita para correr com muito pouca memória.
- Início de sessão e proteção
- O início de sessão é uma página de início de sessão único com uma chave de acesso (passkey) para cada pessoa. A aplicação faz corresponder cada sessão iniciada a uma pessoa e recusa as que não conhece. Uma política de segurança de conteúdo estrita, limites de pedidos, tamanhos máximos por rota e um contentor só de leitura.
- Segredos e consentimento
- As chaves dos bancos são ficheiros fora da base de dados e ficam de fora das cópias de segurança, para que uma cópia restaurada nunca consiga chegar a um banco. Nunca pede nem guarda a palavra-passe de um banco ou do Portal das Finanças. Tudo o que comunica com o exterior (bancos, logótipos, taxas dos certificados, Atta Star) fica atrás de um único interruptor "online".
- Atta Star
- Lê dois valores do Atta Star através de uma única ponte só de leitura: as faturas da empresa pagas com um cartão pessoal e o saldo corrente com a empresa. A resposta fica em memória durante cinco minutos e nunca é guardada; se o Atta Star não responder, o cartão diz isso em vez de mostrar um valor antigo. Um pagamento com cartão que corresponda pode ser marcado como "da empresa, pago por si", o que o tira dos gastos da casa.
- Aforro Tracker
- O ficheiro de cópia de segurança do Aforro Tracker, simples ou cifrado, é carregado e avaliado com o seu motor. O motor é copiado por inteiro e verificado por hash, por isso uma edição à mão faz falhar a build.
Como foi feito e testado
- Testes
- Cerca de 3000 testes, todos com valores inventados. Os testes das rotas arrancam um servidor HTTP real contra uma base de dados em memória, com substitutos para o banco, os extratos em PDF e o Atta Star. Cada rota tem um teste que garante que não volta nada da conta privada de outra pessoa, e um teste verifica que nenhuma consulta soma dinheiro de dois grupos.
- Versões
- Um push com tudo verde constrói um arquivo da versão e o seu checksum. O job que corre o código do repositório não pode publicar, e o job que publica não corre nada desse código. Cópias de segurança todas as noites, um espelho e um ensaio de restauro.
Como o Atta ajudou
- Partiu do Atta Star, com uma cópia única do seu código de dinheiro e uma página da wiki partilhada sobre o que esse projeto aprendeu com bancos, extratos e faturas.
- Dois críticos revêm cada alteração que toque em dinheiro ou dados, porque ficou provado que um só crítico pode encontrar um defeito numa revisão e falhá-lo na seguinte.
- O desenho da interface foi escolhido pelo conselho: revisores em mais de um modelo a dar nota de 0 a 10 às propostas.
- Os extratos reais ficam no meu computador. Os testes usam só valores inventados, e a verificação antes de cada commit recusa NIF e IBAN fora dos ficheiros de teste.