Why I built it
Most of my professional work has been on the front end of client sites — HubSpot and WordPress builds where the backend is someone else's system. Ledger exists to close that gap: a real product where I own the data model, the auth, the API, and the UI, deployed the way a small team would actually run it.
What it does
Ledger is a personal finance tracker. Users sign up, log in, and track income and expenses over time. It's intentionally scoped like a real product rather than a tutorial clone — the goal was to build the boring, correct version of auth and data handling that production apps actually need.
How it's built
- API: Node.js and Express, with routes for authentication and transaction CRUD
- Auth: JWT-based sessions, passwords hashed with bcrypt, protected routes via middleware
- Database: PostgreSQL, with a users table and a transactions table tied to it by foreign key
- Frontend: React, built with Vite
- Infra: Dockerized, so the whole stack spins up the same way on any machine
Where it stands
Phase 1 — the auth system end to end — is complete and tested. Phase 2, transaction CRUD, is underway: the create route is built and verified in Postman, with the rest of the CRUD surface and the React UI for it in progress.
What it demonstrates
This project is where I've done the most real engineering growth outside of client work — designing a schema, reasoning about auth flow instead of just consuming one, and making the same architectural decisions a small backend team would make on day one.