Budget Board: a self-hosted replacement for Mint, in C# and React
A simple app for tracking monthly spending and working towards financial goals.
At a glance
- What is it?
- Budget Board is a self-hosted personal finance app for tracking monthly spending and working towards financial goals, with a C# server, a React client, PostgreSQL and a Docker Compose file that wires the whole thing together. It syncs accounts through providers like SimpleFIN and LunchFlow, trains a classifier on your own categorised transactions, and ships under AGPL-3.0.
- Who is it for?
- Budget Board suits someone who wants a Mint-style personal finance app on their own hardware, with their own account data in their own database, and who is comfortable running a container stack and configuring OIDC. It does not suit someone who wants a hosted service with no setup, and the AGPL-3.0 licence is the thing to read before you think about offering it to anyone else.
- Can I use it commercially?
- Yes, with strict conditions. AGPL-3.0 is a network copyleft licence: if people use a modified version over a network, for example as a hosted service, you must offer them its source code under the same licence.
- Is it still maintained?
- Yes. The repository received new commits within the last day.
- What is it written in?
- Mainly C#, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.
Editorial analysis
It exists because Mint was shut down
The reason for the project is stated in one line in the README, and it explains the whole shape of the thing. The author created the app to be a self-hosted alternative to the now-shut-down personal finance app Mint. That is the design brief: a personal finance application you run yourself, on your own data, with no service on the other end. The repository description calls it a simple app for tracking monthly spending and working towards financial goals, and the topics list gives the stack away, with asp-net, bank-account-sync, budgeting, money, personal-finance and reactjs. The primary language is C#, the client is React, and the site is at budgetboard.net, with the setup instructions in a wiki rather than in the README itself. The licence is AGPL-3.0, which is the first thing worth thinking about for anyone considering more than personal use.
Accounts, assets, transactions and budgets
The feature list is organised as four groups, and the first is the core of a personal finance app. Accounts and assets covers both your financial accounts, meaning checking, savings and credit cards, and your assets, meaning property and valuables, in one place. Transactions is about recording and categorising them so you can see your spending habits. Budgeting is about setting monthly budgets per category and tracking your spending against them. Financial goals sit alongside, letting you set and track progress towards saving for a house or paying off debt. The separation of accounts from assets is the part that distinguishes it from a bank-only app, since net worth is the number most people actually care about, and a credit card is treated as an account rather than folded into a balance somewhere. The trends charts are described as customisable and filterable by date range, account and category.
Sync providers, import, rules and a classifier
Getting data in is the part that decides whether the app is worth running, and there are four routes. Transaction CSV import handles bulk loading from files. Sync providers integrate with financial institutions through services like SimpleFIN and LunchFlow for automatic transaction and account balance syncing. Automatic rules update transactions based on criteria such as description, amount or date, which is the deterministic half of the automation. Auto-categorization trains a machine learning model on your own already categorised transactions to predict categories for new ones, which is the interesting half, since the training data is your own history rather than someone else's categories. The repository includes an example directory with a sample CSV, and the compose file exposes configuration for the automatic sync, including a switch to disable it and an interval in hours, so you decide how often the providers are polled.
The compose file is where the real configuration lives
The Compose file is unusually informative, because every knob the application has is a variable in it. The server runs from a published image on the container registry, tagged v3, and can also be built from the server directory in the repository. The database credentials are not optional, and the variable definitions are written so that a missing value produces a message telling you to use an env file:
POSTGRES_DATABASE: ${POSTGRES_DATABASE:?POSTGRES_DATABASE must be set; use --env-file compose.env}
POSTGRES_USER: ${POSTGRES_USER:?POSTGRES_USER must be set; use --env-file compose.env}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?POSTGRES_PASSWORD must be set; use --env-file compose.env}The rest of the environment block is the whole operational surface: the log level, the client address the server talks to, the HTTP port, the OIDC settings for issuer, client id and client secret, the email sender credentials and SMTP host and port, a switch to disable new user registration, a switch to disable local authentication, a switch to control whether the database is migrated automatically, a switch to disable the update check, and the sync interval in hours. The server waits for the database to report healthy before it starts, and the healthcheck curls an endpoint on port 8080. There is a compose.env file at the repository root for the values that must be set, and the double _ in the log level variable name is the ASP.NET Core convention for nested configuration.
Bring your own authentication, or use the local one with 2FA
The security story has two halves and you pick one. The application authenticates locally with two-factor authentication, or you bring your own provider with an OIDC login, and the OIDC settings are the ones in the Compose file, gated by an OIDC_ENABLED switch that defaults to false. There is a matching switch to disable local authentication, so a deployment can be configured for one path or the other, and a separate switch that stops new users registering themselves. That second one matters for a self-hosted service you expose to a family or a small group, since the default behaviour of letting anyone create an account on a personal finance instance is usually not what you want. The presence of an email sender configuration alongside the authentication settings suggests the application sends mail, most likely for the two-factor codes and for password resets, and the SMTP port defaults to 587.
Four languages, community translations, Weblate
The internationalisation support is described in more detail than most projects bother with. Selectable languages include English, German, French and Simplified Chinese, with community contributed translations, and dates and numbers are displayed according to the selected language and locale rather than a fixed format. The translation work is handled through Weblate, hosted at the project's own Weblate organisation, and no code is required to contribute, which lowers the barrier considerably for the kind of contributor who would not open a pull request against a C# and React codebase. The documentation lives in a separate repository, budget-board-docs, and the README asks for pull requests against that rather than against the application repository when the change is to docs. The repository also carries an AI-DISCLOSURE.md file, which tells you the project has a policy on AI generated contributions that is worth reading before you open a pull request.
How the project is developed and released
The CI setup is visible from the badges. A workflow named for building and publishing a Docker image for development runs on the repository, and the release badge points at GitHub releases, with the most recent tagged releases being v3.8.2, v3.8.1 and v3.8.0 in September 2026, all within about two weeks of each other. The image tag used by the Compose file tracks the major version, so a deployment on v3 receives patch updates without a configuration change, though the application also has its own update check that can be disabled with a switch. The tree is split into a client directory, a server directory, an example directory, an img directory for the screenshots, and the Compose files. The last push was on 2026-10-20, so the work is current, and the contributing guide in the repository root describes how to propose changes, with a separate issue template for bug reports and a discussions board for feature requests where the author says community interest drives prioritisation.
Editorial conclusion
Budget Board suits someone who wants a Mint-style personal finance app on their own hardware, with their own account data in their own database, and who is comfortable running a container stack and configuring OIDC. It does not suit someone who wants a hosted service with no setup, and the AGPL-3.0 licence is the thing to read before you think about offering it to anyone else. Before you deploy it, work out how you want to sync, because the provider integration and the automatic rules and machine learning categorisation all sit behind configuration you set rather than defaults, and read the compose.env file the error messages keep pointing at.
Frequently asked questions
What is Budget Board and why was it created?
It is a self-hosted personal finance app for tracking monthly spending and working towards financial goals, created by the author as a self-hosted alternative to the now-shut-down personal finance app Mint. It has a C# server, a React client and PostgreSQL.
How does Budget Board get my transactions into it?
Four ways: CSV import, sync providers such as SimpleFIN and LunchFlow for automatic transaction and balance syncing, automatic rules that update transactions based on criteria like description, amount or date, and auto-categorization that trains a machine learning model on your own categorised transactions.
How is Budget Board configured and deployed?
Through Docker Compose, with a server image from the project registry and a PostgreSQL service. The database name, user and password must be set in a compose.env file, and the environment block also configures logging, OIDC login, email sending, user registration switches, database migration, the update check and the sync interval.
Which languages does Budget Board support?
English, German, French and Simplified Chinese, with community contributed translations managed through Weblate and no code required to contribute. Dates and numbers are formatted according to the selected language and locale.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/teelur-budget-board)Was this useful?