Case study
Money Tracker
Expenses across currencies for nomads and expats. Every expense keeps the exchange rate of its day.
- Role
- Design, frontend, backend
- Stack
- Next.js · Turso · Drizzle · PWA
The problem
Living as a nomad means spending in one currency, earning in another and thinking in a third. Most expense trackers convert everything at today's rate, so last month's totals change every time the market moves. The goal was a tracker whose numbers stay true to the day the money was spent.
What I built
- Installable PWA, designed mobile-first at 375 px for daily use on the phone.
- Totals in any base currency, with per-account tabs and monthly and daily views.
- Automatic sync from Bybit, CSV import with a Wise preset, and import from a screenshot shared straight from the phone.
- Cash account with withdrawals and exchanges, transfers between accounts, and reminders with a calendar feed.
- An optional chat assistant that answers questions about your own data with your own AI key.
Key decisions
Every expense keeps its own exchange rate
Each transaction stores a snapshot of the rates at the moment it is saved, and every total is computed from those snapshots. Changing the base currency or a new day of rates never rewrites the past.
Currency-aware money
Rounding and formatting follow each currency's official decimals: zero for VND or JPY, two for USD. Dates are stored as plain calendar days, so changing timezone never moves an expense to another day.
Imports that never duplicate
Every imported row carries a stable source id, and the database enforces one row per user, source and id. Re-importing the same CSV or re-running a sync is always safe.