2 min read
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
- 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 →