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.
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
- Valutakurser fra ECB først, så euro-posteringer får dagens kurs med det samme
- Aktiekurser for alle papirer i beholdning og på watchlist
- Synk af alle konti nye posteringer fra begge banker, uden dubletter
- Samtykke-varsel besked, før MitID-samtykket til banken udløber
- Alarmer dobbelttræk, usædvanligt store beløb og gebyrer
- Månedsafslutning når en lønperiode er slut, gøres den op én gang
- 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:
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
- Kortkøb og terminalnummer fjernes:
MCD 03942 - Små bogstaver, tegn bliver til mellemrum:
lime krsel 33go - Genkendt blandt kendte butikker
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.
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
- Bankento banker, egne konti
- Enable Bankingopen banking med MitID-samtykke
- TursoSQLite + Drizzle
- 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
Databaseopslag på analysesiden
61→61
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.