Fans stream and vote on unreleased tracks, so artists decide releases on real listener data instead of guesswork. Two surfaces over one data model — a PHP web application for artists and listeners, and a NestJS API serving the companion mobile clients. Audio is served from S3 rather than the application server; scheduled jobs drive pre-save and release campaigns with per-campaign open and click tracking.
Every system I've worked on, and what I actually did to it.
Tagged built from scratch orinherited system, because the two are different kinds of work and most portfolios only show one.
All projects
6 systemsOneCare Healthcare Platform
Inherited systemHIPAAEncounters, insurance claims, CPT coding and invoicing, with an AI pipeline turning clinical paperwork into structured summaries. The interesting work was migration under load: file storage moved to pre-signed S3 uploads so large clinical files never transit the app server, queued work moved onto SQS, sessions and cache taken off the filesystem — all while clinicians kept using it.
OBS Platform
Inherited system40+ instancesMulti-tenant CRM and order management running across forty-plus client instances. Tenant isolation across every service, permission models granular down to single operations, consignment flows with timers and automatic invoicing, and inventory that propagates on settlement. Also the unglamorous half: order-total desync and invoice timezone defects, found in production.
Tradexa
In developmentBuilt from scratchCustomers submit jobs with photographs; technicians are ranked by distance from their base postcode. Business rules live in domain actions rather than in controllers, so the admin portal and the mobile API can’t drift. Quotation revisions are new versioned rows, never overwrites — the pricing history stays auditable. Money in pence throughout. Live technician location broadcasts over WebSockets only while a job is en route.
Book-a-Table
In developmentBuilt from scratchRetrieval-augmented answers stay inside the tenant boundary via pgvector. Stripe Connect routes payouts per tenant rather than through a central account, queues run under Horizon, and EU/UK data residency was designed in from the first migration rather than retrofitted when a customer asks for it.
VoyceAdmins
Inherited systemAI IVR BuilderAn operator describes in plain language what should happen when someone calls, and the system generates the IVR structure through OpenAI APIs for review before it goes live. A task that previously needed a technician became something the business owner does in two minutes.