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 systems

PickMyNextSingle

LiveBuilt from scratch
Role
Sole developer
Surfaces
PHP web app · NestJS API · iOS & Android clients

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.

NestJSTypeScriptTypeORMMySQLSocket.IOAWS S3AWS SESSendGridAPNsSwaggerCore PHPStripe

OneCare Healthcare Platform

Inherited systemHIPAA
Role
Team Lead, backend architecture
Constraint
Live clinical platform handling PHI — no downtime available

Encounters, 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.

Laravel 10PHP 8.1MySQLAWS S3AWS SQSAnthropic Claude APIeBizChargeQuickBooksSpatie PermissionDomPDF

OBS Platform

Inherited system40+ instances
Role
Solo technical lead
Shape
Six repositories — two front ends, two services, a share-link portal

Multi-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.

ReactNext.jsNode.jsExpressPostgreSQLMySQLQuickBooks Online API

Tradexa

In developmentBuilt from scratch
Role
Backend architecture & API contract
Replaces
A WhatsApp group used to dispatch trade jobs

Customers 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.

Laravel 12PHP 8.2MySQLRedisLaravel ReverbFilament 4SanctumStripeDomPDFPest

Book-a-Table

In developmentBuilt from scratch
Role
Architecture & build
Shape
Multi-tenant widget restaurants embed on their own sites

Retrieval-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.

Laravel 13PHP 8.3PostgreSQLpgvectorRedisLaravel HorizonInertia.jsReact 19TypeScriptStripe ConnectSentry

VoyceAdmins

Inherited systemAI IVR Builder
Role
Built the AI IVR Builder module
Before
Call flows were drawn node by node, by a technician

An 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.

CodeIgniterCore PHPOpenAI APIMySQL