Nexfi
Die Schlagzeile ist immer, was noch verfügbar ist.
271
Anforderungen
65
Invarianten
10
Zustandsautomaten
98.9%
Zeilenabdeckung
Warum es existiert
Monarch, Mobills, YOLO — die ernstzunehmenden Werkzeuge für private Finanzen verlangen alle eine monatliche Gebühr dafür, dass man auf das eigene Geld schauen darf. Das dreht die Reihenfolge um. Finanzielle Freiheit darf mit der gewöhnlichen anfangen: Nexfi auf einer Maschine im eigenen Haus betreiben, oder für die Bequemlichkeit zahlen, es fertig und laufend zu bekommen. Beide Türen stehen offen, und die selbst gehostete ist nicht die beschnittene Version.
Die andere Hälfte ist der Umfang. Ausgaben, Kreditkarten, Investitionen, Spartöpfe, Vermögen und die Kennzahlen darüber, an einem Ort — denn ein Finanzleben, das auf vier Apps verteilt ist, ist nicht geordnet, sondern nur abgelegt.
Das Problem
Finanz-Apps schreien einem entgegen, was man ausgegeben hat, verwandeln Sparen in Serien und Abzeichen, rechnen Währungen stillschweigend um und halten die eigene Historie fest, sobald man aufhört zu zahlen.
Nexfi kehrt jeden dieser Punkte als bindendes Prinzip um, nicht als Vorliebe: die Zahl auf dem Bildschirm ist das, was übrig ist, es gibt keine Serien, keine Umrechnung ohne Auftrag, und ein abgelaufener Plan wird schreibgeschützt statt gesperrt.
Architektur
Ausschlaggebend war nicht die Sprachpräferenz, sondern wie viele bewegliche Teile jemand betreiben muss, der selbst hostet. Das Ziel waren zwei Container, alles Weitere folgte daraus.
Django und DRF liefern eine mit Vite gebaute React-SPA als statische Dateien aus, in Produktion läuft also kein Node-Prozess. Eine Codebasis deckt drei Topologien ab: ein einzelner Container auf SQLite, klein genug für einen Raspberry Pi, das übliche Zwei-Container-Self-Hosting mit PostgreSQL, und ein Cloud-Deployment, dessen Zusätze Adapter-Austausche sind statt anderer Code.
Die Domänenschicht importiert nichts aus Django.
Entscheidungen, die eine Erklärung verdienen
- 01
Geld wird als BIGINT in kleinsten Einheiten mit CHAR(3)-Währung gespeichert, nicht als DECIMAL. SQLites NUMERIC-Affinität fällt stillschweigend auf Float zurück, was eine Kerninvariante unsichtbar verletzt hätte — der Fehler wären Rundungsdifferenzen gewesen, die niemand hätte zurückverfolgen können.
- 02
PostgreSQL Row-Level Security wurde von der primären Mandantentrennung zur optionalen Härtung zurückgestuft. Sie funktioniert, ist aber PostgreSQL-exklusiv, und das widerspricht einem datenbankunabhängigen Versprechen. Die CI fährt die vollständige Suite gegen PostgreSQL, MySQL und SQLite.
- 03
Der Mandanten-Anker ist bedingungslos, obwohl Haushalts-Funktionen optional sind. Mandantenfähigkeit nachzurüsten gehört zu den teuersten Migrationen überhaupt; einen Einladungs-Flow nachzurüsten ist ein Feature.
- 04
Lizenziert unter AGPL-3.0 mit CLA, denn Abschnitt 13 ist es, der den Betrieb eines modifizierten Forks als Dienst mit einer Verpflichtung verbindet. Die Cloud verkauft Hosting, Marktdaten und EU-Compliance — Dinge mit Grenzkosten — niemals Funktionen.
- 05
Open Core wurde geprüft und ausdrücklich verworfen. Die Feature-Flag-Architektur macht es technisch trivial, und genau darin liegt die Versuchung.
Stack
Stand
Weitgehend gebaut und nicht veröffentlicht: die Spezifikation ist vollständig, Domäne und Geld-Kern liegen deutlich über ihren Schwellwerten, und die ersten drei Meilensteine sind geschlossen. Eine öffentliche Version zum Ausprobieren gibt es noch nicht.