
“We tell ugly apart from expensive.”
Technical leadership for four years: from a crashing server to four re-platformings with zero downtime
A US marketing platform for truck-service businesses. We took over a product that kept crashing on non-scaling hosting and led it through four re-platformings — and no user ever saw a page that didn't work.
A US marketplace for truck services. We took over a product that kept crashing on hosting that could not scale, with holes that let SQL injection through, and ran it for four years through four re-platformings — PHP to Node.js and NestJS, jQuery to React and Next.js, native Android to Expo, a single server to ECS. In that time no user ever saw a page that didn’t work.
For the first two years we rewrote nothing. We stabilized what was there: AWS, a WAF, email onto SQS, images onto S3, indexes on the twenty slowest queries. Revenue could not wait for a rebuild to finish. MySQL stayed the only fixed point through all four phases, and the old Android apps kept running until traffic from them fell to zero.
The outcome: Lighthouse performance from 60 to 90+, SEO from 30 to 90+, the twenty slowest queries 90% faster — on a platform that lives off organic search.
The problem
The constraint
What we did
Stabilize what makes the money first
Two months: move to AWS, email to SQS, images to S3, a WAF in front, legacy holes closed. The twenty slowest queries sped up through indexing — not a line rewritten up front.
Queries 90% fasterRebuild with zero downtime — both systems live side by side
PHP replaced by Node.js, then NestJS with TypeScript; React web app, Next.js site, Expo apps, ECS autoscaling. Triggers on the old database forwarded changes to the new one; the old apps ran until traffic hit zero.
Rollback: seconds, via CloudFrontOne design system for web and mobile
Our own UI library: 200+ components in a monorepo, shared between the React web app and the Expo apps — primitives and forms common, only side effects separated.
Web and mobile can’t drift apartAI built into the process, standards in CI
Engineering rules checked by the pre-commit hook and CI: no any, components under 200 lines, typed API calls. Claude Code in daily use — tests are no longer written by hand.
Team about 50% faster
Two months of rescue: move to AWS (email to SQS, images to S3, a WAF in front), security holes closed, the twenty slowest queries made 90% faster through indexing — not a line rewritten up front.
The result
This was an ad platform whose customers arrive from search.
What we’d do differently
We would measure from day one. We have Lighthouse scores and query times, but no number for posting a listing before and after — and that is the flow an advertiser actually feels. Two stopwatch runs in the first week would have given us the best number in this portfolio.
We would also retire the old Android apps sooner. Waiting for traffic to fall to zero was the right call for users, but it kept two client apps on the same API for two years.
- Node.js
- NestJS
- TypeScript
- React
- Next.js
- Expo
- styled-components
- MySQL
- AWS: ECS, S3, SQS, RDS, CloudFront, WAF
- Claude Code