- Full-stack
- Payments
Ledgerline
Invoicing and payment chasing for freelancers who were running their business out of a spreadsheet and a bank app.
Full-stack engineer · Remote
I build web products end to end — and write down how they work.
Taking on one new build for Q3.
The map
Shipped work, half-finished experiments, teaching material, and the tools behind all of it. Each section stands on its own.
Case studies with the problem, the constraints, and the decision table — including what each choice cost.
5 case studies02Experiments and interactive demos. Contrast maths, easing curves, rate limiters you can hammer.
5 experiments03Structured tracks that go in order. Production Next.js, Postgres for app developers, and auth.
12 lessons04One idea each, with the code and the gotcha. Copy the snippet and get on with your day.
20 tips05Longer arguments about practice — money code, rewrites, and what a portfolio is actually for.
5 essays06Every tool I use with one line on why it beat the obvious alternative. Plus a short resource list.
Uses & toolboxSelected work
Every case study names the option I rejected and what the choice cost. That part is the point.
Invoicing and payment chasing for freelancers who were running their business out of a spreadsheet and a bank app.
A shared support inbox where four agents can work the same queue without stepping on each other, colliding on replies, or refreshing to find out what changed.
A storefront that took nine seconds to become interactive on the phones its customers actually owned. No rewrite — the existing app, made fast.
Learn
3 tracks, 12 lessons, roughly 2 hours. Each lesson states its outcomes up front and ends with something to actually do.
The App Router, explained by what it does at runtime.
Enough database to stop your ORM from embarrassing you.
Sessions, cookies, tokens — and the defaults that quietly leak.
Tips
One idea per entry, with the snippet and the gotcha that bites you.
Grouping an array by a key was the single most common reason to reach for `reduce`. It is now built in, in both object and Map fla…
You rarely need a queue broker for modest job volumes. `FOR UPDATE SKIP LOCKED` lets many workers pull disjoint batches from the s…
A `fetch` with no timeout can hang until the OS gives up, which on some platforms is measured in minutes. One static method gives …
Styling a parent based on its children used to require JavaScript or a class toggle. `:has()` does it in CSS, and it works on sibl…
Writing
Longer pieces about how the work actually goes.
Every rule you relax elsewhere — approximate is fine, retry it, we can backfill later — becomes a support ticket when the numbers are currency.
The instinct to start over is usually a reaction to not understanding the current system. That feeling goes away. The two quarters do not come back.
A decision record that only lists the upside is marketing. The useful half is the part where you say what you gave up.