Skip to content

Expense Tracker

Track spending, split bills, settle up.

Personal and shared expenses in one place. Split a bill evenly or item by item, see who owes whom, and settle up. Or just photograph the bill and let AI fill in the form.

  • Web
  • API
  • Django
  • DRF
  • PostgreSQL
  • Celery
  • Redis
  • Docker
  • GitHub Actions
AI-assisted · hand rebuild in progressView source on GitHub ↗
Expense Tracker
22
build phases, each planned and logged
70/70
OWASP ASVS Level 1 requirements met (self-assessed)

What it does

Spending at a glance

Expenses by category, with a dashboard showing where the money goes.

Split any bill

Share a bill evenly, or line by line when everyone ordered something different.

Balances and settle-up

Always know who owes whom. Settling up stays correct even if two people do it at the same moment.

Scan a bill

Photograph a receipt and AI reads it into the form. Nothing is saved until you check it and press Save.

Exports and monthly digest

Get your expenses as a CSV by email, plus a monthly summary in your inbox.

Account security

Google sign-in, two-step sign-in with an authenticator app, at most two signed-in devices, and limits on login attempts.

Your data, your call

Each account sees only its own records, and you can delete your account and everything in it.

Ready for any frontend

Everything the web pages do is also available as a documented API, ready for a React or mobile app.

Under the hood, briefly

  • Correct under pressure. The database itself enforces that splits add up and data stays consistent, and settle-up locks the rows it touches so simultaneous requests can’t double-count.
  • Fast pages, proven by tests. Database queries are batched, and tests fail if a page starts making more queries than it should.
  • Background jobs handle exports, bill scanning and the monthly digest, and only start once the data they depend on is safely saved.
  • Production-like from day one. Docker Compose runs the web app, workers, scheduler, Redis and Postgres together with one command, and CI runs the full test suite on every push.

Built in 22 phases, with every decision and its rejected alternative written down, and walked line by line against the OWASP ASVS Level 1 security checklist. It was my reference project for learning Django properly, end to end.

Next project

Super Notes →