loading
one moment
loading
one moment
Brought in to cover a month of leave. Still running it.
200+ paying customers
~$270k billed a month
in production since june 2026
two engineers
Client work through Wednesday. The client stays unnamed, so there are no screenshots here, only what I was handed and what it runs at.
what they
trusted me with
The money path, the releases, and the production database.
plan migrations
moved every eligible monthly and annual customer onto modular pricing, live in stripe. each account got a dry run first, and the batch had a rollback path.
releases
i promote to main and write the release notes the founder reads. one release carried 57 pull requests across eight product areas.
production data
migrations and edge functions reach production through me, checked against the live schema rather than the one in the repo.
the support queue
customer reports come straight to me, and go back with a root cause, a fix, and when it ships.
what i
built
scriptwriting agents
a pipeline that plans a script's spine, drafts from it, and ties every figure to a cited source.
ai video editor
a render path on remotion and aws lambda, with a browser-side re-encode that took frozen frames to zero.
billing
modular pricing, sales proposals with their own checkout, ach for large contracts, and pause, refund, and credit flows.
social analytics
a time series over five networks, recorded on a schedule because the provider only reports lifetime counters.
teams
seat permissions enforced in the database, log-in-as for admins, and an audit trail of every action taken on someone's behalf.
ci
an overhaul to node 24, tests on changed files only, and zero type errors.
how i
work on it
Renders came out warmer than the upload. I measured each stage instead of guessing, and found seven separate defects.
The last one was the frame format: capturing PNG instead of JPEG made the colour exact, at 21% more render time and 27% more render cost. The client heard those numbers before it shipped, not after.
Analytics went the other way. Halfway in, the design turned out to store the same lifetime counter again and again, with no usable time series. I closed the open pull requests, wrote down the decision, and started over from it.