Mikkel Manniche
Dansk English Deutsch

finance.mikkelmanniche.dk

Meine eigene Finanz-App. Sie holt Buchungen direkt von meinen zwei Banken über Open Banking und zeigt Budget, Sparen, Abonnements und Investments. Das Video ist mit Demodaten aufgenommen.

Next.js Turso Open Banking MCP
finance.mikkelmanniche.dkDemodaten

Warum ich sie gebaut habe

Fertige Budget-Apps zeigen eine Übersicht, aber man kann den Zahlen keine eigenen Fragen stellen oder die Logik anpassen, die entscheidet, was eine Buchung ist. Ich wollte Rohdaten in meiner eigenen Datenbank, eine Kategorisierung, die ich selbst anpassen kann, und eine Möglichkeit, Fragen zu den Zahlen zu stellen.

Was sie macht

Jeden Morgen synchronisiert ein Job die Konten, holt Wechsel- und Aktienkurse und behält im Blick, wann die Einwilligung der Bank zum Datenzugriff erneuert werden muss.

Der Job am Morgen7 Schritte · feste Reihenfolge

  1. Wechselkurse von der EZB zuerst, damit Euro-Buchungen sofort den Tageskurs bekommen
  2. Aktienkurse für alle Papiere im Bestand und auf der Watchlist
  3. Synchronisierung aller Konten neue Buchungen von beiden Banken, ohne Duplikate
  4. Einwilligungs-Hinweis Nachricht, bevor die MitID-Einwilligung für die Bank abläuft
  5. Alarme Doppelabbuchungen, ungewöhnlich hohe Beträge und Gebühren
  6. Monatsabschluss wenn eine Gehaltsperiode endet, wird sie einmal abgerechnet
  7. Wochen-Mail nur sonntags: die Wochenzahlen in fünf Zeilen

Schlägt ein Schritt fehl, laufen die anderen trotzdem. Nachrichten kommen als Push-Nachricht, sonst als Mail.

Es gibt ein Budget, Sparziele, die mit Konten und einem erwarteten Datum verknüpft sind, eine Renditekurve für Investments und eine Zahl dafür, was übrig bleibt, wenn Fixkosten und geplantes Sparen abgezogen sind. Mögliche Doppelabbuchungen und ungewöhnlich hohe Ausgaben kommen als Push-Nachricht aufs Handy, und jede Gehaltsperiode wird abgerechnet, sobald sie endet.

Kategorisierung

Die Kategorisierung folgt festen Regeln in einer bestimmten Reihenfolge:

1 Manuelle Korrekturgewinnt immer, wenn ich eine Buchung selbst korrigiert habe
2 Eigene Regelnwerden als Nächstes verwendet, wenn keine manuelle Korrektur vorliegt
3 Automatische Mustersind die letzte Option

Überweisungen zwischen meinen eigenen Konten werden erkannt, sodass sie nicht doppelt als Ausgaben zählen. Belege lassen sich als Foto hinzufügen.

Der Rohtext der Bank wird in einen echten Namen übersetzt — der Rohtext bleibt in den Details weiterhin sichtbar

Die Bank schreibt MCD 03942 LIME*KRSEL 33GO
  1. Kartenkauf und Terminalnummer werden entfernt: MCD 03942
  2. Kleinbuchstaben, Zeichen werden zu Leerzeichen: lime krsel 33go
  3. Erkannt unter bekannten Geschäften
Die App zeigt Lime

Frag deine Zahlen

Die Zahlen lassen sich in einem Chat in der App und über einen MCP-Server abfragen, sodass ein KI-Assistent anhand der echten Buchungen antwortet, statt zu raten.

Chat in der AppBeispiel

Habe ich zwei Buchungen vom selben Ort am selben Tag?

Ruft soeg_posteringer auf ·

Ja, einmal: zwei Fahrten mit Lime am selben Tag. Die Banktexte sind unterschiedlich, es handelt sich also um zwei echte Fahrten und nicht zweimal dieselbe Buchung.

Die Antwort basiert auf den Buchungen, die das Werkzeug gefunden hat.

Der Chat und der MCP-Server teilen sich dieselben 12 Werkzeuge:

  • maanedsoversigtMonatsübersicht
  • historikMonatshistorik
  • soeg_posteringerBuchungen suchen
  • saldiSalden
  • til_raadighedVerfügbar
  • budgetstatusBudgetstatus
  • abonnementerAbonnements
  • opsparingsmaalSparziele
  • personerPersonen
  • investeringerInvestments
  • kategorierKategorien
  • saet_kategoriKategorie setzen

Die Technik

Next.js und React mit einer SQLite-Datenbank bei Turso und Drizzle, um die Datenbankstruktur und den Code im Gleichschritt zu halten. Die Bankanbindung läuft über Enable Banking, einen zugelassenen Vermittler für Open-Banking-Zugriff. Das Layout baut auf Jakob Fiskers Komponentenbibliothek "Fisker Finance" auf.

Der Weg einer Buchung

  1. Die Bankzwei Banken, eigene Konten
  2. Enable BankingOpen Banking mit MitID-Einwilligung
  3. TursoSQLite + Drizzle
  4. Die AppNext.js + React, Chat und MCP

Gegen die echten Zahlen getestet

Die Berechnungen hinter Budget und Verbrauch gab es in zwei Fassungen, eine im Code und eine in der Datenbank. Als sie zu einer zusammengelegt wurden, lief das Ergebnis vor dem Livegang gegen die gesamte Datenbank. Alle Zahlen auf der Analyse- und der Budgetseite stimmten überein, bis auf fünf Buchungen in Höhe von null Kronen, die aus einer Zählung herausfielen.

Eine Geschwindigkeitsprüfung senkte die Zahl der Datenbankabfragen:

Datenbankabfragen auf der Startseite

46→46

Vorher
Jetzt

Datenbankabfragen auf der Analyseseite

61→61

Vorher
Jetzt

Die wichtigste Erkenntnis: Kategorisierung anhand des Freitexts der Banken braucht laufende Überprüfung gegen echte Daten. Mehrere Fehler zeigten sich erst, als die Zahlen systematisch durchgesehen wurden.

Schreiben Sie mir