Senior mobile engineer · Tech lead

I ship mobile apps, and the agent workflows that help teams ship them.

Over ten years of commercial mobile work, native first and cross-platform when it pays, most recently leading mobile at Numan. Alongside that I run My Learning Apps, a solo studio with 20+ apps and more than 900,000 downloads. Before software, I spent twenty years in secondary education.

iOSAndroidFlutterReact NativeKotlin MultiplatformOn-device AIAgentic workflows
10+years shipping commercial apps
900k+downloads of my own apps
5 systemsone business risk fixed end to end, Django to mobile
10 daysfrom handover to new patients on the Foundayo launch
Commercial development

Shipping apps in teams

Mobile features owned from product discovery to production: native iOS and Android, shared Kotlin Multiplatform and Flutter code, and the services behind them.

May 2025 – now

Senior iOS Engineer / Tech Lead Manager · Numan

Swift · SwiftUI · Kotlin · KMP · Python/Django BFF
  • Lead proactive platform maintenance across iOS and Android, keeping the mobile platform fast, stable and easy to build on so teams across the business can do their best work on it.
  • Took a key coaching business risk from problem to fix end to end: worked with clinical operations and product stakeholders on the approach, then delivered coach-access throttling across the Python/Django monolith, the mobile BFF, the iOS and Android apps and operator tooling, giving clinical teams control of caseload.
  • Led the mobile slice of the Foundayo launch across iOS, Android, shared Kotlin Multiplatform models and the mobile API. It reached new patients ten days after engineering handover.
  • Led iOS delivery for GPhC weight and comorbidity verification, including in-app photo capture and resumable upload, the mitigation for the flow's highest-rated churn risk.
  • Ran referral experimentation end to end, with decision-grade analysis, raising referrals by about 10%.
  • Mentor engineers, run mobile architecture interviews and lead incident investigations.
Mar 2024 – May 2025

Lead Mobile Engineer · YourParkingSpace

iOS · Android · Flutter
  • Set technical direction across iOS, Android and Flutter while staying hands-on in production.
  • Led integration of a shared Flutter module into the established native apps.
  • Delivered Park and Go on the Uber Guest Ride API.
  • Shipped Live Activities, abandoned-cart notifications and Firebase Personalisation to lift conversion.
Dec 2022 – Mar 2024

Lead iOS Engineer · YourParkingSpace

SwiftUI · UIKit · Flutter modules · SPM
  • Led the migration from legacy UIKit to a modular SwiftUI architecture.
  • Led proactive stability and performance work, improving reliability and release confidence.
  • Moved mapping from Google Maps to MapKit, saving six figures a year.
  • Hired, mentored and line-managed the iOS team.
Aug 2021 – Dec 2022

Senior iOS Engineer · YourParkingSpace

SwiftUI · MVVM · Bitrise · Fastlane
  • Rebuilt a legacy UIKit app in SwiftUI and MVVM.
  • Set up CI/CD with Bitrise and Fastlane, XCTest automation and Sentry observability.
  • Integrated payments including Apple Pay, Stripe and PayPal.
Solo apps

My Learning Apps, my own studio since 2016

I founded My Learning Apps Ltd to build educational, accessibility, revision and productivity apps. I own the whole lifecycle: research, design, engineering in Swift, SwiftUI and React Native, release, analytics, marketing and support. Newer apps run AI on the device with Apple Foundation Models, so inference stays private and fast.

20+apps on the App Store
900k+downloads
2016founded

See all 20+ apps on the App Store

Four I'd point a developer at, each chosen for a different part of the stack:

Mark My Work = GCSE English

iOS · SwiftUI · Foundation Models

Scan a handwritten answer or paste a typed one and get structured exam feedback: the likely descriptor band and what it takes to reach the next one. Marking runs with Apple's on-device model, so students' work never leaves the phone and the app collects no data.

Showcases on-device AI

QRMAP

iOS · SwiftUI · MapKit

Save the QR codes you use again and again, like car park and shop codes, and reopen them from a map or a list. Risky links get a warning before they open.

Showcases location and maps

For Later

iOS · Swift

Save things to come back to and get a notification when it's time.

Showcases native iOS APIs

Pain Manager

iOS · React Native

A medication dose tracker for logging doses and keeping an eye on how much you've taken.

Showcases React Native
Code examples

Code, with the reasoning behind it

Small, real excerpts from my public repositories, with the problem each one solves and the decision that matters.

MapKitSearch

Location autocomplete for SwiftUI on top of MKLocalSearchCompleter, packaged as an @Observable model you bind straight to .searchable.

The interesting part is a race. Cancelling the completer is best effort, so a callback from a query the user has already cleared can arrive late and refill the list. The model guards against it, and keeps the Objective‑C delegate on the main actor without sending a non‑Sendable array across a boundary.

Stack
Swift 6, Observation, MapKit
Runs on
iOS 17, macOS 14, visionOS 1
Source
dsmailes/MapKitSearch
@MainActor
@Observable
public final class MapKitSearchModel: MapKitSearchProtocol {

    public var autoCompleteResults: [MKLocalSearchCompletion] = []

    public var searchTerm: String = "" {
        didSet {
            guard searchTerm != oldValue else { return }
            autoComplete()
        }
    }

    func apply(results: [MKLocalSearchCompletion]) {
        // `MKLocalSearchCompleter.cancel()` is best effort. A callback from a
        // query that was just cleared must not repopulate the suggestions.
        guard !searchTerm.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty else { return }
        autoCompleteResults = results
        lastError = nil
    }
}
Sources/MapKitSearch/MapKitSearchModel.swift (trimmed)

AppDesignSystem and Swift Challenges

AppDesignSystem is a SwiftUI package of semantic tokens, layout primitives and accessible components, with a React Native sibling that mirrors the same theme model.

Swift Challenges is 76 interview-style exercises with Swift Testing suites and reference solutions, including a concurrency set on actors, reentrancy, Sendable and cancellation.

@main
struct DemoApp: App {
    var body: some Scene {
        WindowGroup {
            ThemeProvider(theme: .editorial()) {
                ContentView()
            }
        }
    }
}
AppDesignSystem: one theme provider, semantic tokens everywhere below it
AI workflows

Making coding agents dependable

I ship AI features to production, and I build the tooling that lets engineers use agents without losing rigour: tickets, roles, independent review and fresh test evidence before anything is accepted.

In production

Coaching AI experiment · Numan

  • Delivered a production coaching AI experiment across the Home, Care and Treatment areas, with per-user API overrides for safe testing, analytics, a feature-flag rollout and a clean retirement afterwards.
With teams

AI-first engineering · Numan

  • Introduced agentic delivery with Pi, Claude Code and multi-agent workflows.
  • Deployed an internal skills marketplace, wrote company-wide Claude skills, and coached product colleagues to use AI safely and on their own.
plan→implement→independent review→test→accept

shepherd

A portable workflow pack for teams of coding agents across harnesses, with a ticket board and one explicit process from plan to acceptance.

Repository

dev-team

Role prompts for Architect, Designer, Executor, Reviewer and Tester, plus ticket templates, durable project memory and a static ticket dashboard.

Repository

skill-issue

DevCleaner for AI agents: audits the skills, plugins, MCP configs and caches agents leave on a Mac, with a terminal UI to clear them. On Homebrew.

Repository

relay

A Herdr plugin that passes one change between Claude Code, Codex and OpenCode like a baton: one plans, the next implements, the next reviews, so no tool ever reviews its own work. It commits once every step is approved.

Repository

pop-culture-agent

A prompt-only add-on that gives agent progress updates a little personality, without getting in the way of the technical content.

popcultureagent.com · Repository

skills marketplace

Agent skills for adaptive codebase quizzes, guided tech-test coaching, cross-platform mobile translation and safe iOS demo seeding. Built to speed delivery without deskilling engineers.

Repository
Prior career

Twenty years in secondary education

Before software I trained as a secondary English and Mathematics teacher and became a senior leader. It's where my educational apps come from, and why mentoring and coaching people through new tools is a big part of how I lead.

2000 – 2021

Education leadership · Secondary schools

  • Senior leader with more than 20 years' experience leading departments, mentoring staff and improving teaching outcomes.
1999 – 2000

Education · Queen Mary University of London, Durham University

  • BA (Hons) English, 2:1, Queen Mary University of London (1999).
  • PGCE Secondary English and Mathematics, Durham University (2000).
CV

The short version

Senior mobile engineer and technical lead with 10+ years of commercial mobile experience across iOS, Android and cross-platform, specialising in Swift, SwiftUI and polished consumer products. AI-first: shipping AI-powered features, building on-device AI apps and designing agentic engineering workflows. Based in South Shields, working remotely across the UK.

Mobile

  • Swift, SwiftUI, UIKit
  • Kotlin, Kotlin Multiplatform
  • Dart, Flutter, React Native
  • TCA, MVVM, modular SPM

AI and ML

  • Apple Foundation Models
  • On-device LLMs, Core ML
  • Claude Code, Codex, Pi
  • MCP, prompt and skill design

Delivery

  • Python, Django, REST, OAuth
  • XCTest, Bitrise, Fastlane
  • Sentry, accessibility, performance
  • Amplitude, Statsig, Eppo
Download CV (PDF) LinkedIn GitHub