Mobile engineer and solution architect

I build native apps, and the agent-first process that ships them.

Fifteen years shipping iOS and Android, from agency work at Mubaloo to building a clinical app used daily in around 20 NHS trusts, plus the real-time voice capture behind an ambient AI product. For the last year I've been building Kanora, a music platform across seven Apple and Android surfaces, mostly with AI agents, and turning the method behind it into Gatehouse.

Featured · one year · seven surfaces

Kanora

A self-hosted music platform for people who own their music.

The Mac rips, records and keeps the library; iPhone, iPad, Apple Watch, CarPlay, Apple TV and Android play it, with no account and no cloud. More than 2,700 commits and 3,600 tests on the Apple side alone.

  • The Mac is the server: an embedded SwiftNIO API with an OpenAPI contract, discovered over Bonjour
  • Native CD ripping over IOKit, line-in recording and a Swift port of MiniDisc NetMD
  • Apple Watch music that plays without the phone, plus CarPlay and Apple TV
  • A native Kotlin and Compose Android client, built in two weeks with the same process
Kanora on Mac, Apple TV, iPad, iPhone and Apple Watch

Process · Gatehouse

Agents do most of the typing. The gates stay human.

Building Kanora with agents taught me that the code is rarely what goes wrong at scale; the record is. I built a delivery loop with human gates, fresh-context reviewers and honest verification, and I'm now extracting it into Gatehouse, a toolkit for building large software estates with AI agents, consistently.

  1. Spec
  2. Gate
  3. Plan
  4. Gate
  5. Implement
  6. Review
  7. QA
  8. Merge

An author never reviews its own work

Reviewers are separate agents spawned with fresh context, and each writes a verdict file I read at the gate.

Verification that cannot fake a green

The gate builds, tests and launches the app, prints executed counts, and treats zero tests run as a failure.

The record keeps itself

Every change has a shortcode, a spec, a plan and a report, so any session, human or agent, can pick it up cold.

changes QA sent back in a measured week

4 of 14

changes QA sent back in a measured week

empty repo to a gated, reviewed commit with Gatehouse v0.1

< 6 min

empty repo to a gated, reviewed commit with Gatehouse v0.1

to a native Kotlin Android client, with the same loop from day one

2 weeks

to a native Kotlin Android client, with the same loop from day one

Voice AI in production · Healthcare

Recording, transcribing and never losing a word

In my current role I designed and built both halves of an ambient AI clinical documentation product, which records outpatient consultations, transcribes them live and drafts the clinical letter. Patient audio, so it had to be encrypted end to end and could never drop or reorder a slice.

Front end · Vue 3, Web Audio, Azure Speech SDK

The whole voice experience

  • Ambient consultation recording, live transcription that tells speakers apart, and dictation with spoken commands for writing letters
  • A lossless pipeline: MediaRecorder slices, encrypted in the browser, buffered in IndexedDB, uploaded through an ordered queue that retries with backoff
  • Phone and video consultations by mixing system audio with the microphone in the Web Audio API
  • A state-machine setup wizard with mic check, live level meter, custom clinical vocabulary and patient consent before anything records

Backend · .NET 8, Azure, SQL Server

An encrypted audio capture service

  • Multi-tenant service built from scratch: 5-second slices checked for order and assembled in Azure Blob append blobs
  • End-to-end encryption for patient audio, AES-256-GCM per slice with keys wrapped by a certificate held in Key Vault
  • A token broker so browsers transcribe in real time without ever holding cloud credentials
  • Versioned APIs with idempotent deletes, recovery of abandoned recordings, audit logging, ADRs and a runbook

Experience

Shipping mobile for real users since 2010

  1. 2016 – now

    Healthcare software

    Senior iOS Developer, then Lead Front End Developer and acting Development Manager

    Built the iOS app for an NHS clinical communication platform from the ground up on a mature Azure-backed service, now used inside around 20 NHS trusts with 8,000 to 10,000 active sessions a day. Took on Android when it needed an owner, and automated distribution with Fastlane and GitHub CI. Most recently, the encrypted audio capture and real-time voice front end for an ambient AI documentation product.

  2. 2015 – 2016

    Healthcare start-up

    Head of Mobile

    Joined a clinical communication start-up to rebuild its mobile app, and set the mobile roadmap with the product owner and CEO.

  3. 2010 – 2015

    Mubaloo

    Web developer to iOS Team Lead to Head of Technology

    A Bristol app agency, in the years when shipping meant iOS, Android, BlackBerry and Nokia. I led a team of nine native iOS developers and later set technical direction, for clients including Bang & Olufsen, Aviva, Allianz, DHL, UBS and the NHS.