Commercial · Product · Engineering
I led business development, sales, strategy and product in senior roles across disruptive digital businesses — spanning startups, publicly quoted and private lottery groups, and boutique City insurtech and trading firms.
For the last three years, I’ve been building software full-time. Mostly software built around AI — agents, automated pipelines, document processing, generative media, and the products and infrastructure around them. Frontend to infrastructure. End to end.
The combination is the point. I think commercially as well as technically — value, cost, constraints and outcomes are part of the engineering problem, not something handed down with the specification. Then I build the system end to end.
Weeks, not quarters.
Each started with the problem, not the technology. Work out what needs to happen, design the system around it, then build the thing end to end.
Two were commissioned by clients and are live with real users. The others started with problems I identified myself. Client references available on request.
A platform owning the whole path from ad click to sold treatment — landing pages, enquiry, qualification call, booking, sale — handing off to the practice management system at the moment someone becomes a patient. No medical record ever lives in it.
The funnel, end to end
The platform

This platform handles patient data, so every screenshot is a demo environment. All names, figures and campaigns are synthetic.
Next.js 16 / React 19 / TypeScript / Tailwind v4, statically exported. GCP-native: Firestore, Auth and Cloud Functions in europe-west2, with a role-based rule set doing the multi-tenancy — admin, clinician and qualifier see different things. Resend for transactional email with RFC-5545 calendar invites. Google Ads API for the cost side. Twelve Firestore collections, every record carrying an orgId, because multi-tenancy here is a filter and never a reshape.
A cross-org partner API (/v1) exposes clinic offerings with live availability and server-to-server booking, so an aggregator can search across providers. A visits lane captures the top of the funnel without PII, giving the reporting a denominator it never had. Every lead carries an append-only timeline, so corrections are further entries rather than rewrites. The reporting epoch is derived from when pages actually went live — a React component has no birthday.
A platform-wide redaction mode obscures patient-identifying data at source, which is what makes demonstrating the system possible at all without exposing a single real record.
Currently migrating to its own infrastructure and a fully multi-tenant architecture — one deployment serving many providers, resolved per request rather than per build.
Documents in, certified documents out — tables, boxes, fonts and layout preserved — reviewed in a translation workbench built from the ground up, with a certified translator approving every segment before it's issued.
The platform
Built GCP-native throughout: a Python / Flask service on Cloud Run, Cloud Functions in TypeScript, Firestore, Auth and Storage, and Document AI for the PDF route. Translation providers sit behind one interface and are swappable config rather than architecture, so the model in use is a decision rather than a dependency. Next.js frontend.
The complex DOCX pipeline rebuilds the .docx from only the files present in the original, base64-preserving binary assets. Box detection reads table coordinates from the XML so semantic fields map 1:1 through translation, which is what lets a form come back with its fields still attached to their labels.
The two-version approach means every job produces a structurally-perfect XLIFF and a raw reference translation. Lex diffs them at several levels — wording, consistency across the document, and integrity of names, numbers and codes — then applies or flags. Both versions and every action are retained, which certification requires and which makes the whole corpus available for improving the system.
An estate agent's listing URL goes in; a narrated, captioned, branded property film comes out. No editor, no photographer, no timeline — and zero input from the agent, because it works entirely from assets they've already published.
The output it produces
The platform

Enhancement, bounded — declutter
Three tiers with a strict membrane: a Next.js front end that verifies identity and holds no secrets, Cloud Functions owning every judgement — prompts, schemas, decisions — and a Python service on Cloud Run owning the muscle: Playwright, FFmpeg, numpy. Stages advance as a chain of documents rather than a pipeline of calls, each watching for a transition into its trigger status and writing a different one, so no stage can re-fire itself. A render exceeds the 540-second function cap, so the render service owns its own terminal status and writes it back.
zod is the spine: one schema gives inferred TS types, a model-facing JSON Schema constraint, and runtime validation — drift eliminated at both ends. Invariants live in the schema rather than the docs, and job-config defaults are typed as a full Record, so adding a new film format is a compile error until someone declares its voice, music bed and graphics.
The enhancement pipeline plans per photo rather than from a fixed menu of surfaces, so it works from what's actually in the room instead of a list of nouns it was seeded with. Verification is a separate call that sees both images and is asked one question only: has the structure changed. Judging the improvement and policing the boundary are deliberately different jobs.
Disocclusion was solved by eye, not by metric. Worst-case stretch of one source pixel: none 17.7×, blur the depth map 4.4×, dilate-then-blur 5.4×. The middle option scores best and looks worse — a symmetric blur spreads the depth edge into the object, so chairs carry a gradient and bend as they move. The metric improved and the picture got worse.
Every finished edit is reviewed twice — a deterministic rig of measured thresholds, and a model asked the one thing code can't judge: does this work as a sequence. Neither sees the other's findings, neither is applied to anything, both are stored beside the film. Earned restraint: an earlier stage silently downgraded the signature camera move on every clip for weeks and nobody noticed, because a downgraded move is still a valid move.
Trains clinicians against patients who lie, hide things, exaggerate or push their own agenda — while the clinical ground truth they have to reach stays exactly fixed.
The pipeline runs off a Firestore trigger, not a frontend call — saving a context fires the whole chain, with guards against infinite loops (draft variants only, context must have actually changed, not already processing).
Trait definitions are pure data, the rolls are seeded, and the output is a structured set of instructions. I've since extended this to deterministically alter the patient's underlying intent, not just their surface presentation — a deeper layer of reproducible control over the same fixed ground truth.
Stack: GCP throughout — Firestore, Cloud Functions and triggers — with a Next.js frontend using reactive onSnapshot updates, and the model confined to the two enrichment calls. Validation and compatibility logic live entirely in deterministic TypeScript.
A few of the others — the same orchestration engineering pointed at lighter domains. Two of them live and running unattended.
A prompt becomes a complete fighter; a league decides outcomes by logic, not a coin-flip; and a daily highlight broadcast assembles itself from numerous AI services with nobody in the loop.
One prompt becomes a finished music video — lyrics, song, synchronised visuals, final render — through a route-based pipeline orchestrating a shifting roster of media models.
A platform letting a small business run its operations through one conversation.
Stack & capabilities
Claude Code inside VS Code, with ChatGPT alongside — that combination is how everything above gets built. The rest is what the problems needed.
Background
I led B2B business development at a Frankfurt-listed lottery group, building insured-lottery products for operators, sports clubs and media companies. I co-developed an insurtech platform with predictive pricing and real-time risk management for the lottery and gaming markets. I founded the UK's first online + TV bingo platform — video and audio generated and simulcast to live television in real time — and earlier co-founded a graduate recruitment business that exited to Hot Group PLC.
P&Ls, my own companies, deals with real money behind them, and products launched into regulated markets where getting it wrong is a legal problem rather than a bug report.
The conventional route is engineering first, commercial understanding later. Mine ran the other way — twenty years of commercial and product experience, then engineering. Until very recently, that route barely existed. AI-assisted development changed that.
Where I fit
I'm interested in roles where the problem isn't already neatly specified — where understanding the business, deciding what should be built and actually delivering it are part of the same job.
The title matters less to me than the shape of the work: give me a difficult problem, enough ownership to solve it properly, and responsibility for getting the solution into the real world.
Get in touch
If the problem is difficult and nobody has written the specification yet, that's the work I want.
Based in Spain · UK & Europe · on-site, hybrid or remote