Voltar aos trabalhos
Em desenvolvimento
Repositório privado

Nexfi

O número em destaque é sempre o que ainda está disponível.

271

requisitos

65

invariantes

10

máquinas de estado

98.9%

cobertura de linhas

Por que existe

Monarch, Mobills, YOLO — as ferramentas sérias de finanças pessoais cobram uma mensalidade pelo privilégio de você olhar o seu próprio dinheiro. Isso inverte a ordem das coisas. Liberdade financeira pode começar pela liberdade comum: rodar o Nexfi numa máquina na sua própria casa, ou pagar pela conveniência de recebê-lo pronto e no ar. As duas portas estão abertas, e a do self-host não é a versão capada.

A outra metade é o escopo. Despesas, cartões de crédito, investimentos, caixinhas, patrimônio e as métricas sobre tudo isso, em um lugar só — porque uma vida financeira dividida em quatro aplicativos não está organizada, está apenas arquivada.

O problema

Apps de finanças gritam o quanto você gastou, transformam poupar em sequências e medalhas, convertem moedas em silêncio e prendem seu histórico no instante em que você para de pagar.

O Nexfi inverte cada um desses pontos como princípio vinculante, não como preferência: o número na tela é o que resta, não existem sequências, nenhuma conversão acontece sem ser pedida, e um plano vencido vira somente leitura em vez de bloquear o acesso.

Arquitetura

A restrição decisiva não foi preferência de linguagem — foi quantas peças móveis alguém que hospeda por conta própria precisa manter no ar. A meta eram dois containers, e todo o resto decorreu disso.

Django e DRF servem uma SPA React construída com Vite como arquivos estáticos, então não há processo Node em produção. Uma base de código cobre três topologias: um único container em SQLite, pequeno o bastante para um Raspberry Pi, o self-host padrão de dois containers com PostgreSQL, e um deploy em nuvem cujos acréscimos são trocas de adaptador, não código diferente.

A camada de domínio não importa nada do Django.

Decisões que merecem explicação

  1. 01

    Dinheiro é armazenado como BIGINT em unidades mínimas com moeda em CHAR(3), não como DECIMAL. A afinidade NUMERIC do SQLite degrada silenciosamente para float, o que violaria uma invariante central de forma invisível — a falha seriam erros de arredondamento que ninguém conseguiria rastrear.

  2. 02

    O row-level security do PostgreSQL foi rebaixado de mecanismo primário de isolamento para reforço opcional. Funciona, mas é exclusivo do PostgreSQL, e isso contradiz uma promessa de independência de banco. A CI roda a suíte completa contra PostgreSQL, MySQL e SQLite.

  3. 03

    A âncora de tenancy é incondicional mesmo com as funções de núcleo familiar sendo opcionais. Adicionar multi-tenancy depois é uma das migrações mais caras que existem; adicionar um fluxo de convite depois é só uma funcionalidade.

  4. 04

    Licenciado sob AGPL-3.0 com CLA, porque é a seção 13 que faz rodar um fork modificado como serviço carregar uma obrigação. A nuvem vende hospedagem, dados de mercado e conformidade com a UE — coisas com custo marginal — nunca funcionalidades.

  5. 05

    Open core foi considerado e explicitamente rejeitado. A arquitetura de feature flags torna isso tecnicamente trivial, e é precisamente aí que mora a tentação.

Stack

Django
React
Vite
PostgreSQL
Docker

Situação

Substancialmente construído e não lançado: o conjunto de especificações está completo, o domínio e o núcleo monetário estão bem acima dos pisos de cobertura, e os três primeiros marcos estão fechados. Ainda não há versão pública para experimentar.