Expense Tracker — A Multi-Workspace Finance Manager Built with .NET Core

A .NET Core web application for managing personal and group finances. Supports multiple workspaces so each person can track their own incoming and outgoing transactions separately — built as an open-source side project.

My ambition project Expense Tracker 🤘My ambition project Expense Tracker 🤘
November 4, 2023

How it started

This one actually goes back to my college days. I built an early version of it as a project back then — nothing fancy, just a basic way to log transactions. But the idea always stuck with me and I kept thinking about what it could be if I actually built it properly.

The core problem I wanted to solve was pretty simple. Most finance apps treat everything as one big flat list. That's fine if you only have one thing to track, but as soon as you want to separate your personal spending from shared expenses, or keep a side project's budget completely isolated, it falls apart. I wanted something where each context had its own space — its own transactions, categories, and balance — without bleeding into each other.

That's where the idea of workspaces came from.

The stack

I went with .NET Core for the backend since I'm most comfortable with it and it's great for building structured REST APIs. PostgreSQL handles the data — it's open-source, reliable, and well suited for the kind of relational data a finance app deals with. The frontend at the moment is plain JavaScript and CSS, just enough to get the prototype working and usable.

The backend is built as an API from the start, so the frontend is fully decoupled. That was a deliberate call — when I eventually rebuild the UI properly (planning to use Vue.js), none of the backend logic needs to change.

What it does

The main feature is workspaces. You can create as many as you want — one for personal finances, one for shared household costs, one for a side project — and each one is completely separate. Transactions, categories, and balances in one workspace have no idea the others exist.

Within each workspace you can log income and expense entries, assign them to categories you define yourself, and mark things as recurring for bills or subscriptions that repeat every month. The summary view gives you a quick picture of where you stand — total in, total out, and a breakdown by category so you can see where your money is actually going.

User accounts are scoped so your data stays private to you. Each workspace belongs to the user who created it.

Where it's at

Right now it's a working prototype. The core flows — creating workspaces, logging transactions, viewing summaries — are all functional. What's still missing is data visualisation (charts and spending trends over time), budget limits with alerts, and a proper export option for reports. The UI also needs a full pass before I'd consider it production-ready.

It's one of those projects I keep coming back to when I have time. The plan is to eventually migrate the frontend to Vue.js, add charts, and publish a Docker image so anyone can self-host it easily.

What I'm learning from it

More than anything this project has been a good exercise in building something long-term. It's easy to keep a project clean when you're sprinting to ship it. It's a lot harder when you're returning to it in small sessions over months. So it's been a useful lesson in writing code that's readable and maintainable enough that future-me isn't completely lost when picking it back up.

The multi-tenant data model was also an interesting design challenge — making sure every query is properly scoped to a workspace so there's no chance of data leaking across them. Small detail but it matters a lot in a finance app.

Hopefully I'll have a proper v1 to show off soon. 🤘