ExpenseOwl
Minimal self-hosted expense tracker
ExpenseOwl is a simple, lightweight self-hosted expense tracking application written in Go. It focuses on quick expense entry, category breakdowns, and clean visual reports.
Key features
- Minimal expense logging
- Category pie charts
- JSON-backed storage
- Single-binary deployment
Pros & cons
Strengths
- Extremely lightweight
- Fast and simple
Trade-offs
- Very minimal feature set
- Single-user only
ExpenseOwl replaces
Last reviewed Sep 13, 2026 · 807 words
ExpenseOwl does one thing: you type an amount, pick a category, and it draws a pie chart of where the month went. No bank sync, no budgets, no envelopes, no accounts, no multi-user. It is a single Go binary, needs 64 MB, and stores every expense in one JSON file you can open in a text editor. That is either exactly what you wanted after bouncing off Firefly III three times, or it is uselessly thin, and you will know which within the first paragraph.
Logging, not budgeting
The distinction matters because the finance category is mostly budgeting tools, and ExpenseOwl is not one. There is no concept of income, no "amount remaining", no goals. You record spend as it happens, ideally from your phone since the interface is a PWA that installs to a home screen, and the app gives you back a category breakdown for the month, a table of entries you can edit or delete, and a way to page back through previous months. Recurring expenses can be set up so rent and subscriptions appear without typing. That is the feature list, and the catalogue's "very minimal feature set" con is not a criticism the author would dispute; it is the design.
Who this fits: people whose budgeting failure mode is not lack of a tool but lack of entry. If you have never lasted a month in a full budgeting app because the friction of reconciling accounts killed the habit, a 3-tap entry with a chart is the thing that might stick. It also fits a specific tracking job, such as a renovation, a trip, or a shared cost pool you want to eyeball, where a full ledger is overkill.
The JSON file is the whole backup plan
Everything lives in a data directory as JSON: the expenses, the categories, the currency setting. Back it up by copying the file. Inspect it with jq. Migrate away from it with 20 lines of Python. This is the most defensible design choice in the project, and it is why "no-database" and "single-binary" are the tags that matter. It is also why it is single-user: the file is the truth and there is no locking or per-user separation on top of it. Put it behind an authenticating proxy if it faces the internet, because the app itself has no login; a bare public port is a public list of what you spent.
CSV export exists for pulling the data into a spreadsheet, and the JSON is structured plainly enough that I have not needed it.
Three lines to run it
services:
expenseowl:
image: tanq16/expenseowl:main
ports:
- "8080:8080"
volumes:
- ./data:/app/data
restart: unless-stopped
That is the complete deployment. There is also a plain binary for people who do not want a container; drop it on any Linux box and it listens on 8080. Memory in use sits far below the 64 MB minimum in the catalogue, which makes it a good candidate for the tiny always-on box, a Pi, or as a sidecar on a VPS that already runs Caddy. Front it with Caddy's basic auth or your SSO proxy, and add the URL to your phone.
The project's own GitHub page is its website, which tells you its scale: one maintainer, a focused scope, and issues that get answered. Language detection on GitHub shows it as HTML because the front end is a large embedded single page; the server is Go.
When to graduate, and to what
You outgrow ExpenseOwl the day you want to see income against spend, track balances across accounts, share the ledger with a partner, or import bank statements. At that point the choice is Actual Budget for envelope-style budgeting with a real sync model and imports, or Firefly III for double-entry bookkeeping and the most complete feature set in the finance category. Neither of them is worse at logging expenses than ExpenseOwl; they are simply heavier, and heavier is the thing you were avoiding. The migration is a script that reads the JSON and writes a CSV in the target's import format.
What I'd do
If I wanted a spending habit rather than a budget, I would run ExpenseOwl on the smallest box I had, behind Caddy with basic auth, and add it to my phone's home screen the same day. I would back up the JSON with the rest of the box and revisit after 3 months: if the habit stuck and I wanted more, move to Actual Budget with the CSV; if it did not, nothing was lost but a 64 MB container. For anyone who already keeps a working budget elsewhere, this is not an addition worth making.
Compare ExpenseOwl
16 head-to-head comparisons.
- ExpenseOwl vs Maybe
- ExpenseOwl vs Actual Budget
- ExpenseOwl vs Firefly III
- ExpenseOwl vs Sure
- ExpenseOwl vs Cashew Self-Host
- ExpenseOwl vs Paisa
- ExpenseOwl vs Money Manager Ex
- ExpenseOwl vs Kresus
- ExpenseOwl vs Budget Zero
- ExpenseOwl vs BudgetBee
- ExpenseOwl vs MoneyWallet
- ExpenseOwl vs Beancount Import
- ExpenseOwl vs MyFin
- ExpenseOwl vs Buckets
- ExpenseOwl vs Budgetwarrior
- ExpenseOwl vs Costflow
Similar budgeting & finance apps
Maybe
Budgeting & FinanceOpen-source personal finance and wealth app
Replaces Mint, Personal Capital
HyperSwitch
Budgeting & FinancePayment switch to make payments fast, reliable and affordable
Actual Budget
Budgeting & FinanceLocal-first envelope budgeting app
Replaces YNAB, Mint
Firefly III
Budgeting & FinanceSelf-hosted personal finance manager
Replaces Mint, YNAB
Lago
Budgeting & FinanceOpen-source billing and metering API
Replaces Stripe Billing, Chargebee
Akaunting
Budgeting & FinanceFree open-source accounting software online
Replaces QuickBooks, Xero