Most trackers drown the one job you came for.
Expense apps love to sprawl — budgets, categories, recurring rules, charts three levels deep — and somewhere in there the actual task, "write down what I spent and see the total," gets buried. This project is a reaction to that: strip the tracker back to the loop that matters and make that loop feel instant.
It's also a clean MERN exercise — React, Express, MongoDB, wired end to end — where the discipline is doing the fundamentals well rather than piling on features.
A total that lags by a refresh isn't real-time — it's just late.
The whole spec, honestly.
Full CRUD, no ceremony.
Add, edit, delete, and list expenses — the complete lifecycle, exposed through clean Express routes over a Mongoose model.
Analytics that update live.
The total recomputes the moment an expense changes, so the number on screen is never stale.
Persist properly.
Everything lives in MongoDB, so the data survives a refresh and the app is real rather than a session toy.
Four layers, cleanly separated.
A React form and list talk to an Express API organised into routes, controllers, and a Mongoose model, with MongoDB underneath and a small analytics component deriving the totals.
Splitting the backend into config, controllers, models, and routes is overkill for an app this size — on purpose. It's the shape a larger service would take, practised where the stakes are low.
Keeping the UI and the total in sync.
The one bit of real state discipline is making sure the list and the analytics never disagree. Delete an expense and the total has to drop in the same beat — no manual refresh, no stale figure lingering. Getting that single source of truth right, so both the list and the total read the same data, is the difference between "feels instant" and "feels broken."
Everything else was resisting temptation: no category system, no charts library, no auth — because each of those would have blurred the one loop the app exists to nail.
Legible over clever.
Tailwind keeps the surface plain and readable — a form, a list, a total — with the theme adjustable in one config file. There's nothing to learn and nothing in the way, which for a personal expense tracker is exactly the point.
Three things, next time.
Add categories — carefully.
A single grouping dimension would unlock genuinely useful breakdowns without reopening the feature-creep floodgates.
Introduce accounts.
User auth would turn a single-user demo into something a second person could actually use for their own spend.
One honest chart.
A spend-over-time line — just one — would add insight the running total can't, while keeping the interface calm.