CTO at &Dine · open to what's next

I build platforms.
And the teams that
keep shipping them.

Fourteen years in product engineering — React at Love Home Swap, tech lead at Mettrr, Vue at scale across Just Eat and Menulog. Now running technology at &Dine, where I own the architecture, the delivery and an AI-assisted engineering practice across a six-repository platform.

6
repositories orchestrated as one platform
4
production frontends on a single API
14
years shipping product engineering
7
purpose-built engineering agents in the loop

Now — &Dine, 2021 to present

Head of Technology, then CTO.

&Dine is a B2B catering platform connecting London corporates with independent food makers. I joined to run engineering and now own technology end to end — architecture, delivery, security, vendor and budget decisions, and the technical story told to the board and to enterprise procurement.

The platform is six repositories deliberately orchestrated as one: an Express and TypeScript API on MySQL, three separate frontends for customers, mobile and back office, a shared design and type package, and an end-to-end suite. One contract, one auth model, four route tiers, one set of guardrails.

  • Architecture

    Multi-tenant platform design, an OpenAPI 3.1 contract that generates typed frontend SDKs, and an integer-pence money model enforced from the database to the display layer.

  • Delivery

    Spec-first planning, one branch per repository, three independent review passes on every pull request, and a learning loop that writes findings back into the codebase's own instructions.

  • Commercial & compliance

    Stripe payment and refund design, Xero as the finance system of record, EU AI Act deployer documentation and DPAs — the things that unblock enterprise customers.

  • Team

    Hiring, mentoring and setting the bar. The guardrails are written down so a new engineer — or a new agent — inherits the context instead of rediscovering it.

The platform

What we actually built.

Not a brochure site. A payments-critical, multi-tenant ordering platform with a real ledger, real couriers and real accounting behind it.

  • Backend API

    Express · TypeScript · Sequelize · MySQL

    Four route tiers with distinct auth — public, hub users, customers, and server-to-server internal. Two signature-verified inbound webhooks mounted ahead of the JSON parser so the raw body still validates. Documented in OpenAPI 3.1 and bundled into live Swagger docs at build.

    • 48 controllers
    • 65 models
    • 55 services
  • Customer site

    Nuxt 4 SSR · Pinia · SCSS

    The main ordering surface. Server-rendered for search, with SAML and OIDC logins brokered through WorkOS so one integration covers Okta, Entra and the rest. Checkout state is owned by the backend ledger — the frontend derives what to show and never invents it.

    • Browse-first
    • SEO-rendered
    • Enterprise SSO
  • Mobile app

    Nuxt 4 static · Capacitor 7 · iOS & Android

    A deliberately different product on the same API and auth — a cuisine, date, time and occasion funnel rather than browse-first. Statically generated, no server on the device, wrapped with Capacitor for the App Store and Play Store.

    • Funnel-first UX
    • Native builds
    • Safe-area native
  • Admin & maker hub

    Nuxt 3 SPA · Vuex · Chart.js

    Where operations and the independent makers run the business — menus, orders, deliveries, invoicing and reporting. Admin and maker are genuinely separate permission worlds, enforced by route guards on the server rather than hidden buttons on the client.

    • Two role models
    • Order lifecycle
    • Product analytics
  • Shared package

    TypeScript · SCSS tokens

    Design tokens, API types and pure utilities consumed by both customer frontends. No Vue, no Nuxt, no framework lock — so one change lands in both surfaces instead of drifting apart.

    • Framework-free
    • Single edit, two apps
  • End-to-end suite

    Playwright

    The money paths get exercised for real: cart to payment intent to refund, across the surfaces that share the same contract.

    • Cross-surface
    • Checkout critical paths

The parts that were actually hard.

  1. Payments that survive an edit

    Orders change after they are paid for. The platform does refund-then-repay rather than partial refunds — full refund of the original payment, customer pays the new total — with refunds executed after the database transaction commits so a Stripe failure can never roll back a committed order. Account billing, employee top-up ledgers and premium group orders each have their own path through it.

  2. A ledger the UI cannot lie about

    Payment state lives in the backend ledger and nowhere else. Every status the API can return has an explicit, designed affordance on the frontend — including the awkward ones. Clearing state locally to make a cart editable again was the failure mode; it masked incomplete ledger rows and blocked the customer's next payment entirely.

  3. Money, integers, all the way through

    Every monetary value is an integer in pence — net, VAT, gross — from the column type to the API contract. Floats never touch it. Pounds exist only at the display layer, and in exactly one place in each analytics facade, which rejects a formatted string rather than guess at its scale.

  4. Finance as a first-class integration

    Xero is the system of record for invoicing, synced through a queued consumer rather than ad-hoc writes, so an accounting push is always deliberate and always auditable. Deliveries run through two networks — scheduled and same-day cargo bike — with signature-verified webhooks and a receipt row per event, because neither provider retries.

Integrations owned

  • Stripe
  • Xero
  • HubSpot
  • Mailgun
  • Twilio
  • Slack
  • Onfleet
  • PedalMe
  • WorkOS SSO
  • Mixpanel
  • PostHog
  • Sentry

Infrastructure

  • AWS eu-west-2
  • EC2
  • Amplify
  • S3
  • EFS
  • Secrets Manager
  • CloudFlare
  • Docker
  • GitHub Actions

Practice

Agentic engineering, with the guardrails written down.

The interesting part is not that we use AI to write code. It is that the platform teaches itself — every review finding becomes a rule, and every rule is enforced on the next change, by agents and humans alike.

  • Seven agents, each with one job

    Planner, developer, reviewer, code reviewer, security reviewer, retrospective and a prototyping agent that sits outside the normal flow. They are defined as version-controlled markdown, so an agent's remit is reviewed like any other change.

  • Spec first, always

    66 written specifications. A feature starts as a spec, becomes a cross-repository plan, and is reviewed against that spec at the end — not just against code quality. The spec is the contract between intent and implementation.

  • Three independent review passes

    Every pull request is reviewed for spec compliance, for correctness and pattern adherence, and for security — OWASP, auth boundaries, payment handling. Independent passes catch what a single reviewer, human or model, rationalises away.

  • A learning loop that actually closes

    688 logged decisions and 83 per-pull-request review narratives. A finding does not stop at a comment: it is routed to the file that failed to communicate it — the controller's instructions, the conventions doc, the platform ruleset. The same mistake is not allowed to happen twice.

  • Guardrails as executable context

    A single ruleset every agent must obey: money in pence, no partial refunds, never derive ledger state client-side, never write to the accounting system without approval. Constraints that used to live in someone's head now live in the repository.

  • AI in production, governed

    Claude parses maker menus and event proposals into structured data in back-office flows — stateless, single-shot, and human-reviewed before anything is published. Documented for EU AI Act assessment as a deployer of a general-purpose model, with a sub-processor DPA and no customer data used for training. The ordering platform itself is deliberately deterministic.

A note on honesty — the &Dine ordering product itself contains no AI. Discovery, ordering and checkout are deterministic by design. The AI sits in back-office document parsing and in how the engineering team works. I would rather say that plainly than let a buzzword do the talking.

Capabilities

What I bring.

Leadership

  • Engineering strategy & roadmap
  • Hiring, mentoring & team design
  • Board & stakeholder reporting
  • Budget & vendor management
  • Security, GDPR & EU AI Act compliance
  • Technical due diligence

Agentic engineering

  • Claude Code & subagent orchestration
  • Spec-driven development
  • Guardrail & context design
  • Model Context Protocol (MCP)
  • Automated review pipelines
  • AI governance & documentation

Architecture

  • Multi-tenant platform design
  • OpenAPI 3.1 contract design
  • Payments, ledgers & reconciliation
  • Webhook & integration design
  • Observability & incident response
  • Domain-driven service boundaries

Languages & runtime

  • TypeScript
  • JavaScript (ES2023)
  • Node.js
  • SQL
  • Python
  • Bash

Frontend

  • Nuxt 4 & Nuxt 3
  • Vue 3
  • Pinia & Vuex
  • React
  • SCSS & design tokens
  • Capacitor (iOS/Android)

Backend & data

  • Express
  • Sequelize
  • MySQL
  • REST & OpenAPI
  • Stripe
  • Xero API

Cloud & delivery

  • AWS (EC2, Amplify, S3, EFS, Secrets Manager)
  • CloudFlare
  • Docker
  • GitHub Actions
  • Sentry
  • Mixpanel & PostHog

Quality

  • Vitest
  • Playwright
  • Vue Test Utils
  • Integration testing
  • Test baselining

Track record

Fourteen years, six companies.

  1. 2021 — present

    &Dine

    CTO — previously Head of Technology

    Own technology end to end for a B2B catering platform: architecture, delivery, security, compliance and the engineering team.

    • Grew a single product into a six-repository platform — API, customer site, native mobile app, admin hub, shared package and end-to-end suite — on one contract and one auth model.
    • Designed the payments architecture: Stripe refund-then-repay on edits, post-commit refund execution, account billing, employee top-up ledgers and group ordering.
    • Made Xero the finance system of record through a queued, auditable sync rather than ad-hoc writes.
    • Shipped the mobile app to iOS and Android with Capacitor, with a deliberately distinct funnel-first UX rather than a wrapped website.
    • Introduced enterprise SSO via WorkOS, unblocking corporate customers with Okta and Entra.
    • Built an AI-assisted engineering practice — seven specialised agents, spec-first delivery, three review passes per PR, and a learning loop with 688 logged decisions.
    • Wrote the AI governance and EU AI Act deployer documentation that clears enterprise vendor assessments.
  2. 2019 — 2021

    Just Eat / Menulog

    Frontend Engineer — contract, then permanent

    Joined on contract to build the new menu microsite into the existing platform architecture, then hired permanently.

    • Built core Vue components — including the header and footer used across the platform — for a global rollout.
    • Developed the Menulog theme for Australia and New Zealand in parallel on the shared codebase, with locale logic for pricing, currency, opening times and location, toggled by a single config value.
    • Worked inside a large, multi-team frontend estate where a component change reached several national tenants at once.
  3. 2017 — 2019

    Mettrr Technologies

    Tech Lead — previously Senior Developer

    First leadership role. Joined as a senior developer and moved into leading the frontend team.

    • Architected and built the company's frontend from scratch in Nuxt, choosing SSR for search crawlability and building on the Vue knowledge already in the team.
    • Integrated a Netlify-backed CMS so marketing could publish content and new landing pages without a developer in the loop.
    • Set the frontend standards and mentored the team — the step from writing the code to being responsible for how a team writes it.
  4. 2016 — 2017

    Love Home Swap

    Frontend Developer

    Modernised the frontend of an ageing PHP platform.

    • Built a reusable React and Redux component library, distributed internally via npm.
    • Replaced legacy features incrementally rather than attempting a rewrite.
    • Unit tested critical paths on both client and server.
  5. 2014 — 2016

    Apto Solutions

    Developer — from graduate

    Multi-platform delivery in an agile team, remote and on site.

    • Shipped across several concurrent client projects and platforms.
    • Built and released Cordova applications; set up and maintained development environments.
    • Hosted weekly internal tech forums.
  6. 2012 — 2013

    New Era Education

    Junior Developer

    First professional role — JavaScript, agile delivery and working alongside designers.

Selected freelance

Bauce Brothers
Migrated Squarespace to Shopify, adding analytics tracking and SEO metadata to drive conversion.
Ideal Flatmate
Managed an outsourced frontend team through a rebrand and built features in React and Redux in house.

Education

BSc (Hons) Forensic Computing — 2:1
University of the West of England
Computer Science Foundation
City of Bristol College

Away from the keyboard

Camping and travelling with my young family, and a fairly serious commitment to sauna, cold water and the rest of the wellbeing rabbit hole. It is where most of my better architectural decisions have actually been made.

Contact

Looking for a CTO who still
reads the diff?

I'm starting to look at what's next — technology leadership roles where the architecture, the team and the commercial reality are all genuinely mine to own. Happy to talk, whatever stage you're at.