EX

ExpenseOwl

Minimal self-hosted expense tracker

Budgeting & Finance ★ 1.5k stars Easy setup MIT

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.

Similar budgeting & finance apps