Selected work

Three projects written up like design docs: the problem, the hard parts, and the tests that prove them.

PayLedgerLive demo

A double-entry payments API that stays correct when transfers race, requests are retried, and callers try wallets that aren't theirs.

Concurrency
SELECT … FOR UPDATE, locked in id order
Retries
Idempotency-Key claimed inside the transfer's transaction
Proof
Parallel-retry and 20-thread tests on real PostgreSQL
Stack
Python · FastAPI · PostgreSQL · Alembic
Read the case study about PayLedger
PayLedger transfer pathA transfer request locks both wallets in id order, writes two balancing ledger entries and commits once.POST /transfersidempotency_keyslock wallets ↑identries −100 / +100COMMIT
One transaction: lock, write both sides, commit.

Webhook InspectorLive demo

A public endpoint that captures any webhook sent to it and shows it live, and never tells the sender that something went wrong on its side.

Capture
Body streamed, capped at 1 MB, always answers 200
In prod
Cold-start crash and wrong client IP, found live and fixed
Proof
47 pytest · 7 Vitest · CI on every PR
Stack
FastAPI · PostgreSQL · React · TypeScript
Read the case study about Webhook Inspector
Webhook Inspector capture pathA webhook sender reaches Vercel's edge, then the capture route, which stores at most one megabyte per request in Postgres and always answers 200. The browser polls every two seconds.senderVercel edge/in/{bin} ≤1 MB200 OKPostgresUI · poll 2s
Capture first, fail quietly, never block the sender.

Taskboard APILive demo

A Trello-style API where two people can drag the same card at once, and a reused refresh token signs its owner out everywhere.

Ordering
Columns locked in UUID order; positions stay dense
Auth
Refresh rotation; reuse revokes every session
Proof
72 tests, 59 on real PostgreSQL (Testcontainers)
Stack
Java 21 · Spring Boot · PostgreSQL · Testcontainers
Read the case study about Taskboard API
Taskboard card move pathA move request passes the JWT filter, locks the source and target columns in UUID order, shifts positions, and commits. Non-members get 404.PATCH moveJWT filterlock cols ↑uuid404 if not membershift positionsCOMMIT
Lock in a fixed order; two moves never wait on each other.