Todos os projetos

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
Finanças da casa, o ecrã inicial de uma pessoa: o saldo, as entradas e saídas, os últimos movimentos e as contas, tudo fictício.
Captura com dados fictícios.

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

  1. 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ã.

    Ilustração: cinco grupos lado a lado (a casa, cada pessoa, as poupanças e um grupo da empresa trancado), com sinais de mais riscados entre eles.
  2. 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.

    O ecrã inicial da casa: saldo de hoje, entradas e saídas, o dinheiro passado entre as contas das duas pessoas, os últimos movimentos, o que está à espera delas e para onde foi o dinheiro. Pessoas e valores fictícios.
  3. 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ê.

    As contas de uma pessoa em cartões, uma aberta em Who sees it: partilhada com a casa, com o interruptor para a partilhar. Bancos fictícios.
  4. 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".

    Uma regra nova para uma loja, com a pré-visualização dos movimentos que arquivaria antes de ser guardada, ao lado da lista de regras. Lojas fictícias.
  5. 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.

    Shops to confirm: quatro lojas identificadas pela pesquisa, cada uma com o site, a morada, a marca de certeza e Accept, Edit ou Refuse. Lojas fictícias.
  6. 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.

    Os movimentos de uma pessoa, com uma transferência para a poupança aberta: a aplicação viu o mesmo valor chegar a outra conta e pergunta se é sua. Dados fictícios.
  7. 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.

    Património: um gráfico por grupo, cada um na sua escala, com Show total desligado. Valores fictícios.
  8. 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.

    Pagamentos recorrentes: custos fixos por mês, o que vence em breve e o que subiu. Dados fictícios.

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.