Mikkel Manniche
Dansk English Deutsch

finance.mikkelmanniche.dk

Min egen økonomi-app. Den henter posteringer direkte fra mine to banker via open banking og viser budget, opsparing, abonnementer og investeringer. Videoen er optaget med demodata.

Next.js Turso Open banking MCP
finance.mikkelmanniche.dkDemodata

Hvorfor jeg byggede den

Færdige budget-apps viser et overblik, men man kan ikke selv stille spørgsmål til tallene eller rette den logik, der afgør, hvad en postering er. Jeg ville have rådata i min egen database, en kategorisering jeg selv kan justere, og en måde at spørge ind til tallene på.

Hvad den gør

Hver morgen synkroniserer et job kontiene, henter valuta- og aktiekurser og holder styr på, hvornår bankens samtykke til dataadgang skal fornys.

Jobbet om morgenen7 trin · fast rækkefølge

  1. Valutakurser fra ECB først, så euro-posteringer får dagens kurs med det samme
  2. Aktiekurser for alle papirer i beholdning og på watchlist
  3. Synk af alle konti nye posteringer fra begge banker, uden dubletter
  4. Samtykke-varsel besked, før MitID-samtykket til banken udløber
  5. Alarmer dobbelttræk, usædvanligt store beløb og gebyrer
  6. Månedsafslutning når en lønperiode er slut, gøres den op én gang
  7. Ugemail kun om søndagen: ugens tal i fem linjer

Fejler ét trin, kører de andre alligevel. Beskeder kommer som push-besked, ellers som mail.

Der er budget, opsparingsmål koblet til konti med en forventet dato, en afkastkurve for investeringer og et tal for, hvad der er til rådighed, når faste udgifter og aftalt opsparing er trukket fra. Muligt dobbelttræk og usædvanligt store udgifter kommer som push-besked på telefonen, og hver lønperiode bliver gjort op, når den er slut.

Kategorisering

Kategoriseringen følger faste regler i en bestemt rækkefølge:

1 Manuel rettelsevinder altid, hvis jeg selv har rettet en postering
2 Egne reglerbruges dernæst, hvis ingen manuel rettelse findes
3 Automatiske mønstreer sidste udvej

Overførsler mellem mine egne konti bliver genkendt, så de ikke tæller som udgifter to gange. Kvitteringer kan tilføjes som foto.

Bankens rå tekst bliver oversat til et rigtigt navn — den rå tekst kan stadig ses i detaljerne

Banken skriver MCD 03942 LIME*KRSEL 33GO
  1. Kortkøb og terminalnummer fjernes: MCD 03942
  2. Små bogstaver, tegn bliver til mellemrum: lime krsel 33go
  3. Genkendt blandt kendte butikker
Appen viser Lime

Spørg dine tal

Tallene kan man spørge ind til i en chat i appen og via en MCP-server, så en AI-assistent svarer ud fra de rigtige posteringer i stedet for at gætte.

Chat i appenEksempel

Har jeg to posteringer fra samme sted på samme dag?

Kalder soeg_posteringer ·

Ja, én gang: to ture med Lime samme dag. Bankens tekster er forskellige, så det er to rigtige ture og ikke den samme postering to gange.

Svaret bygger på de posteringer, værktøjet fandt.

Chatten og MCP-serveren deler de samme 12 værktøjer:

  • maanedsoversigtMånedsoversigt
  • historikMånedshistorik
  • soeg_posteringerSøg posteringer
  • saldiSaldi
  • til_raadighedTil rådighed
  • budgetstatusBudgetstatus
  • abonnementerAbonnementer
  • opsparingsmaalOpsparingsmål
  • personerPersoner
  • investeringerInvesteringer
  • kategorierKategorier
  • saet_kategoriSæt kategori

Teknikken

Next.js og React med en SQLite-database hos Turso og Drizzle til at holde databasens struktur og koden i takt. Bankforbindelsen går gennem Enable Banking, en godkendt formidler af open banking-adgang. Layoutet bygger videre på Jakob Fiskers komponentbibliotek "Fisker Finance".

Vejen for en postering

  1. Bankento banker, egne konti
  2. Enable Bankingopen banking med MitID-samtykke
  3. TursoSQLite + Drizzle
  4. AppenNext.js + React, chat og MCP

Afprøvet mod de rigtige tal

Regnestykkerne bag budget og forbrug fandtes i to udgaver, én i koden og én i databasen. Da de blev lagt sammen til én, blev resultatet kørt mod hele databasen, før ændringen gik live. Alle tal på analyse- og budgetsiden stemte, bortset fra fem posteringer på nul kroner, der faldt ud af en optælling.

En gennemgang af hastigheden fik antallet af databaseopslag ned:

Databaseopslag på forsiden

46→46

Før
Nu

Databaseopslag på analysesiden

61→61

Før
Nu

Den vigtigste lære: kategorisering ud fra bankernes fritekst kræver løbende efterprøvning mod rigtige data. Flere fejl viste sig først, da tallene blev gennemgået systematisk.

Skriv til mig