Så byggde jag appen Privatekonomi
– från idé till komplett privatekonomi-app i .NET
Jag har länge velat ha ett verktyg som ger mig verklig kontroll över min privatekonomi – något som är snabbt, privat, körs lokalt eller i mitt eget moln och samtidigt är roligt att använda. Det blev startskottet för Privatekonomi: en Blazor Server-applikation med .NET 9, MudBlazor och .NET Aspire som orkestrerar alla tjänster. I den här bloggposten berättar jag hur jag byggde systemet på 1,5 vecka med GitHub copilot, vilka designval jag gjort och visar en massa skärmbilder.
Repo: https://github.com/pownas/Privatekonomi
Varför jag byggde Privatekonomi
- Jag ville ha 100% kontroll över min data (lokal-first, enkelt att backa upp/exportera).
- Svenska banker, skattesystem och vardagsflöden kräver svensk kontext och funktionalitet.
- De flesta appar är antingen för enkla, för låsta eller för krångliga att anpassa.
Målet blev en komplett budget- och ekonomiplattform där jag kan:
- Importera transaktioner (CSV eller automatiskt via PSD2-API)
- Kategorisera smart (regler, split-kategorisering, förslag)
- Hantera investeringar, lån, balansräkning och nettoförmögenhet
- Samarbeta inom hushållet (gemensamma budgetar, barnkonton, veckopeng)
- Köra den var jag vill (lokalt, NAS, Raspberry Pi, server) med flexibel lagring
Teknisk stack i korthet
- Frontend: Blazor Server + MudBlazor
- Backend: ASP.NET Core Web API
- Orkestrering: .NET Aspire (telemetri, service discovery, dashboard)
- Data: EF Core med stöd för InMemory, SQLite, SQL Server samt JsonFile (backup/portabilitet)
- Tester: Playwright för end-to-end
- Språk: C# (.NET 9)
Arkitektur med .NET Aspire
Jag valde .NET Aspire för att:
- Starta hela lösningen med en enda
dotnet run - Få telemetri (logs, traces, metrics) utan extra friktion
- Enklare service discovery mellan Web och API
- Bättre utvecklarupplevelse i vardagen
AppHost startar webben och API:t, kopplar samman dem och visar allt i Aspire Dashboard. Det ger snabb feedback-loop vid utveckling och felsökning.
Data- och lagringsstrategi
Från början använde jag EF Core InMemory för att snabbt iterera UX och flöden. När datamodellen stabiliserades lade jag till:
- SQLite (standard för produktion, enkelt, portabelt)
- SQL Server (för större installationer)
- JsonFile (backup/export och portabilitet)
Allt styrs via appsettings.json, så jag kan byta lagringsmotor utan att röra koden.
Viktiga funktioner jag byggt
- Användarautentisering och isolerad data per användare
- Dashboard med översikt, kategoridiagram och tidsserier
- Transaktioner med split-kategorisering, regler och förslag
- Budgetar: planerat vs utfall
- Investeringar: Avanza-import, automatisk kursuppdatering
- Lån och amorteringsöversikt
- Sparmål och gemensamma sparmål med inbjudningar och roller
- Löneutveckling över hela karriären
- Export per år (JSON/CSV), fullständig backup/export
- Automatisk bankimport via PSD2-API (Swedbank, Avanza, ICA Banken)
- Dark mode och tillgänglighet (WCAG 2.1 AA)
Skärmbilder från appen
Nedan är ett urval av skärmbilder från appen (light/dark där det passar):
-
Dashboard (ljust läge)

-
Dashboard (mörkt läge)

-
Transaktioner med sök/filter och kategorichips

-
Budgetar: plan vs utfall

-
Kategorier med färgkodning och hierarki

-
Importflöde (CSV)

-
Investeringar (översikt och avkastning)

-
Nettoförmögenhet över tid

-
Balansräkning

-
Lån och amortering

-
Sparmål

-
Löneutveckling

Automatisering och importflöden
Jag började med CSV-import (ICA-banken och Swedbank) för att validera datamodellen och UI. Sen byggde jag automatisk bankimport via PSD2-API med OAuth2 och BankID-flöden. För investeringar finns Avanza-import med dubbletthantering via ISIN.
- CSV-import hjälper vid historisk data eller när bank-API inte är tillgängligt.
- PSD2 ger realtidsdata och minimerar manuellt jobb.
- Export per år (JSON/CSV) gör att jag kan arkivera och analysera extern.
UI/UX och tillgänglighet
MudBlazor gav mig ett snabbt, enhetligt och snyggt UI med:
- Dark mode med systempreferens
- Tillgänglighet enligt WCAG 2.1 AA
- Tydliga fokusindikatorer och tangentbordsnavigation
- Färgkontraster testade för både ljust och mörkt läge
Testning
Jag använder Playwright för E2E-tester. Applikationen seedas automatiskt med ca 50 realistiska transaktioner (svenska exempel) vid utveckling. Testerna verifierar att listor, format, filter och interaktioner fungerar i UI:t.
Exempel på flöde:
cd tests/playwright
npm install
npx playwright install chromium
npm test
Körning och utvecklarupplevelse
För snabbstart i Codespaces eller lokalt använder jag startskript som:
- Installerar Aspire-workload vid behov
- Startar alla tjänster och öppnar Aspire Dashboard
- Sätter upp en dev-miljö med testdata
Manuellt:
# Orkestrera allt med Aspire
cd src/Privatekonomi.AppHost
dotnet run
# Endast webben
cd src/Privatekonomi.Web
dotnet run
Lärdomar
- Börja med InMemory för snabb UX/flow-iteration; lägg till persistens när modellen stabiliserats.
- .NET Aspire är en game-changer för utvecklarupplevelsen i multi-tjänsteprojekt.
- Bygg kategori- och regelmotor tidigt – det påverkar nästan allt i en ekonomiapp.
- Satsa på export/backup från dag 1 för trygghet och portabilitet.
- Sätt upp realistiska, lokala testdata – det gör UI-beslut och tester bättre.
Nästa steg
- CI/CD med GitHub Actions
- Flytta standardpersistens till SQL Server/SQLite i fler miljöer
- Enhetstester och mer täckning
- ML-förbättringar av automatisk kategorisering
- GUI för bankkopplingar och mer visualiseringar
- Mobilanpassning och ev. companion-app
Länkar
- Repo: https://github.com/pownas/Privatekonomi
- Dokumentation och guider (lagring, PSD2, import/export, Aspire, m.m.) finns i repo:t under
docs/ochwiki/.
Tack för att du läste! Hoppas att Privatekonomi kan inspirera eller hjälpa fler att få bättre koll på sin ekonomi – på sina egna villkor.