// the find
Tanq16/ExpenseOwl
Extremely simple, self-hosted expense tracker with a beautiful UI.
ExpenseOwl is a single-user, self-hosted expense tracker written in Go with a plain HTML, CSS, and JavaScript frontend, shipped as one binary or a Docker image. It is for homelab users who want a monthly view of spending by category and nothing else: no accounts, no budgets, and everything is entered by hand or imported from CSV.
The pie chart earns its place. Clicking a category drops it from the breakdown without touching the data, so you can look at the month without Rent drowning everything else. The storage layer sits behind an interface with JSON as the default and Postgres as a real option, which matters if you already back up a Postgres instance. CSV import is forgiving: it matches column names case-insensitively, accepts any source file with name, category, amount, and date, and exports carry IDs so reimporting the same file skips rows you already have.
There is no authentication at all, and the compose example publishes the port on all interfaces, so anyone who can reach the host sees every transaction. The README tells you to put Authelia or a reverse proxy in front of it, which is the right advice, but it is the step most people will skip. Import sleeps 10 ms per record by design, which the README puts at about ten seconds per thousand rows, so a few years of exports takes minutes. Currency is a display symbol and separator setting rather than a per-transaction value, so a second currency or a shared household will need a workaround. The last push was 18 October 2025, nearly a year before this review, so expect slow maintenance.