Work
SUMAC (11 years, 2 → 25+ clients, acquired)
A mentoring platform for UK higher education. I joined a team handling a 2-client, student-built internal tool and helped grow it to 25+ university clients - around 14,000 members and hundreds of institutional admins by the end. The migration was strangler fig: porting chunks of procedural PHP into Laravel while keeping the live system running. Eventually we rewrote the whole thing from scratch. Laravel, Vue, Livewire on the frontend.
What did the platform actually do? It matched mentors with mentees (Python algorithm, its own Docker container), gave them realtime websocket chat, handled hundreds of thousands of records, and was mobile-friendly throughout. Multi-tenancy across 25+ institutions with isolated data. REST APIs with sync and async flows. Queue-driven architecture. CI/CD via GitHub Actions with 85%+ test coverage (PHPUnit, then Pest), PHPStan/Larastan running in the pipeline. The main production environment ran on a single heavily-optimised VPS. I also built out a full US infrastructure - app servers, database servers, queue server, worker server, firewalls, load balancers - all containerised. Monitored via Sentry and OhDear.
Almost zero unplanned downtime across the platform's entire lifetime. Small team - 1 to 3 engineers depending on the period. High trust, low turnover. Acquired in 2024.
MedAscend (5 months, MVP → first customer, £150k funding)
Healthcare AI startup. Sole technical resource. Took the platform from an MVP to first paying customer in under 5 months.
What needed building? Multi-tenancy for isolated client data. OAuth2 SSO and RBAC so the platform could plug into institutional identity providers. AI training scenarios via OpenAI and Google, with Langfuse handling observability - per-call cost, latency, failure rates, all visible in production. Latency managed via frontier models and sensible TTS settings. Testing pipelines with isolated domains, automated quality checks via CI.
I supported two live conference demos on-call (hundreds of attendees each), keeping things stable while the founders were in the room pitching. The company landed £150k in seed funding off the back of the technical work.
Due North Creatives (10,000+ records, fully automated)
Property sector client needed 10,000+ records ingested with associated media. The existing process? Manual. Eating staff time, producing errors. I built automated ingestion pipelines via a WordPress plugin, offloaded media to Cloudflare R2 with CDN delivery, got operational cost down to almost nothing. Zero manual intervention for ongoing ingestion now. The relationship continues - I handle feasibility studies, architecture decisions, and delivery beyond their in-house expertise.
Bidh (real-time voice AI, edge-deployed)
I wanted to practise spoken Scottish Gaelic but there's nobody to (badly) speak to at 10pm on a Tuesday. So I'm building a voice-driven AI tutor.
Real-time audio pipeline: speech capture, transcription, LLM reasoning, voice synthesis back. Two modes - immersive (everything in Gaelic) and tutor (catches errors, explains grammar in English, demonstrates the correct form, drills you with fresh examples). Maps to standard language levels, A1 through B2. Edge-deployed on Cloudflare Workers with Durable Objects for session persistence, Hono for routing, HTMX on the frontend.
The interesting problems? Accuracy - getting Gaelic transcription right. A trained model from the University of Edinburgh mostly solved that. And latency - orchestrating transcription → LLM → synthesis fast enough that conversation doesn't feel dead. Still early stage, but I've been able to hold actual conversations in it.
Farthings (multi-source finance ingestion, Laravel 13)
Personal finance app on Laravel 13. Pulls feeds from my bank, Tesco credit card, online shopping, in-person receipts from Asda, Lidl, and Sainsbury's. Normalises everything into a unified model for spending insights via inference and some AI assistance.
The hardest part in creating this app was the ingestion. Every source has a different format, different cadence, different granularity. Getting data to flow through the app in a way that actually allows me to draw inferences is an interesting problem to solve.
Infrastructure (~10 services, 100% uptime)
I run my own VPS on Akamai where I use Nginx Proxy Manager to sit in front of the apps and services I use. It's currently sitting at ten containers covering everything from standard databases through Umami analytics; isolated services providing me with the software I need, including a Syncthing setup allowing me to sync my Obsidian vault/s across devices. Data ownership and guardianship is important! Besides running a VPS, I also use Cloudflare Workers and AWS, picking the service best suited to the task I'm tackling.