David Purkiss

Senior Software Engineer

Edinburgh, UK Indefinite Leave to Remain — no sponsorship required

Also machine-readable:MarkdownJSONTOON

I've been building software since 2007, and one pattern has held: I build the capability that isn't there yet, then own it as it turns into the thing everything else depends on. Most of that has been where correctness is expensive — payments, ledgers, tax, systems that have to reconcile — and lately the opposite problem too: ingesting and matching messy data at volume. A first decade spent largely in the front-end, the years since moving back through full-stack into backend and platform engineering, and now into the agent infrastructure my teams work inside.

  • TypeScript
  • Node
  • PostgreSQL
  • Redis
  • Elasticsearch
  • Directus
  • Supabase
  • GraphQL
  • Event-driven architecture
  • Distributed systems
  • Stripe
  • Sage Intacct
  • MCP & agent tooling
  • React
  • React Native
  • Vue
  • Nuxt
  • SvelteKit
  • Docker
  • Kubernetes
  • AWS
  • CI/CD
  • Python
  • C# / .NET
  • Web3
  1. HENI

    August 2022 - Present

    Senior Software Engineer

    TypeScript, Node, Postgres, Directus, Elasticsearch, Redis, Kubernetes, Stripe, Sage Intacct

    HENI sells artworks, books and merchandise, mostly through drops — an artist releases a body of work and it goes on sale at a fixed moment. When I joined there was no way to take a payment at all. I designed the order system and the Stripe integration it started from, and almost four years on I'm still the commerce backend's largest contributor, owning the data model, the money paths and the deployment substrate. Since 2023 I've split my time with ArtEye, our art-market data platform, which is deliberately the opposite problem: commerce is correctness where mistakes are irreversible, ArtEye is ingesting and matching messy data at volume.

    • Grew that first checkout into the system the business runs on. It now reaches finance and accounts, warehousing and logistics, customer care, sales operations and drop allocations, with Stripe, Sage Intacct, HubSpot and Easyship behind it.
    • Over 100 drops have gone out on the platform, for artists including Damien Hirst, David Hockney, Peter Doig and Brian Clarke, and for Ed Sheeran and Jack White. I built and run the release process behind them. Automating the data import and the migration between environments, and pulling what had been per-drop decisions into configuration, took a drop from three or four hours to put live down to about thirty minutes.
    • Built the internal application 15 to 20 people across four teams operate in: sales raise orders directly, warehousing sees what is paid and ready to ship, and customer care can change addresses, contact details and line items, or refund through Stripe, without an engineer in the loop.
    • Own the platform's financial correctness end to end, from checkout through to the ledger — invoicing, credit notes, cross-border VAT, AR reconciliation and deferred-revenue recognition into Sage Intacct. What finance needs is to trace any order to a booked transaction and be told when one doesn't reconcile, so I built the tooling that continuously verifies payments against ledger records, with the remediation paths to close what it finds. The data model is designed for that — an event-sourced order lifecycle, and transaction tables mirroring the accounting ledger — so reconciliation falls out of the schema rather than being bolted on afterwards.
    • The second platform is ArtEye, our art-market data system, and it is deliberately the opposite problem: artworks, artists, auctions, exhibitions and galleries, collected from scrapes, dealer feeds, PDFs and gallery visits, then matched, normalised and served. I designed the split it is built on — two services with separate databases, so noisy high-churn ingestion never touches the read side — and the activity-centred model the market data hangs off.
    • Built the pipeline over it: entity resolution against existing artists and organisations, and the orchestration that lets ML stages run at ingestion volume — OCR, image embeddings, AI tagging and vision-based cropping. Search is Elasticsearch, and reindexing it is zero-downtime and zero-loss: a versioned index builds while incoming updates collect on a paused secondary queue, then aliases switch atomically and the backlog drains.
    • Made AI operational for the team rather than incidental: an MCP tool server exposing the production ERP to agents, agent access across Postgres, production logs and job queues, and an agent-oriented documentation system both repositories run on.
    • Laid the foundations the team works to — CI/CD, code review, the release process, the architecture — and I'm who people bring designs to, including on work I'm not part of. A fair amount of the job is removing blockers so everyone else can keep moving.
  2. Truepill

    November 2021 - July 2022

    Senior Software Engineer

    React, TypeScript, NestJS, GCP, RabbitMQ, Kubernetes, Netlify, Contentful, CircleCI

    Eight months on a platform team for the Optum Store, a high-traffic US pharmacy e-commerce site selling prescription medication, over-the-counter products and virtual care. React and TypeScript at the front, NestJS services behind it, running on GCP and Kubernetes.

  3. Skyscanner

    September 2019 - October 2021

    Senior Software Engineer

    React, Redux, Java, Python, AWS, Apache Druid, Apache Spark, Experimentation

    Skyscanner is where I saw what a startup looks like once it has scaled, and where I got my appetite for data back. I worked mostly on Travel Insights, a partner-facing analytics product for airlines, airports and destination marketing organisations: a small number of customers, each of whom cared a great deal about the answer.

    • Owned and delivered the initial release of Travel Insights Vision, our visual analytics product, over six months. A React and Node front-end onto data served by Apache Druid and Apache Spark.
    • Took on a large share of my team's roughly 30 services when they were inherited from another squad during a re-organisation, learned them quickly and became the team's go-to for technical and domain questions. I then moved deliberately into a support role, helping others deliver, once it was clear I was becoming a knowledge silo.
    • Built and migrated the flights and hotels checkout flows onto a new payment abstraction layer, a Java service fronting Braintree, ramping from a trickle to 100% of traffic through experiments over a few weeks. The booking flow it sat in was handling in the region of 100,000 bookings a month.
    • Took over optimisation and maintenance of the Apache Druid cluster the product's queries ran against.
    • Led the redesign of the Partner Portal's most-used page, introducing Redux for state management and bringing team members who hadn't used it up to speed.

    A team of seven owned all of the above. Alongside it I picked up Python properly for the first time, along with a good deal of AWS — Lambda, EMR, ECS, S3, IAM, CloudFormation — with infrastructure as code used across every service.

  4. The Sun Exchange

    December 2017 - August 2019

    Senior Full-stack Engineer

    NodeJS, TypeScript, GraphQL, Vue, Docker, PostgreSQL, AWS, Blockchain

    I joined The Sun Exchange to take charge of the front-end and ended up owning a good deal more. The business crowdfunded solar cells on a blockchain: buyers own individual cells in a school or factory's array and get paid for the power those cells generate.

    • Led front-end development of the company's ICO. We started building our own solution three weeks before launch, in parallel with a supplier we had stopped believing could deliver, and launched on ours. It raised in the low millions of dollars.
    • Architected and built the rewrite of thesunexchange.com in Vue, backed by GraphQL and a headless CMS, once the ICO had proved the stack.
    • Refactored the existing React and Next front-end into reusable components and onto a proper CSS framework, which is what made the fully automated crowdfunding rewrite possible.
    • Built integrations across the stack — Stripe, Paygate, HubSpot, GraphCMS, S3 — through 20 to 40 solar crowdfunding rounds, each drawing a few thousand participants.
  5. Forgood

    November 2016 - November 2017

    Technical Lead

    .NET, C#, Cosmos DB, Aurelia, Azure, Team leadership

    Taking over a platform that was being built by an outsourced development house, with no in-house team to take it over, was the hardest job I have had. I hired and ran a team of four while keeping business-critical delivery going.

    • Cut hosting costs by 70% by moving the data layer off a self-hosted Couchbase VM onto Azure Cosmos DB. Before Couchbase 4.5 there was no ad-hoc query support, so application code pulled whole collections into memory and filtered them there; even once N1QL landed, common queries needed an explicit index to perform. Between that and shedding the IaaS, the move was the obvious call.
    • Rebuilt the buggy ASP.NET MVC front-end in Aurelia, converting MVC controllers to Web API as I went, and addressed the load-time and SEO problems that surfaced after the first release.
    • Recruited and managed the team of four that took the platform in-house.
  6. Blue Nickel Solutions

    December 2014 - November 2016

    Lead Software Engineer

    .NET, C#, Akka.NET, MongoDB, Distributed computing

    A distributed computation engine and data store for the mineral processing and manufacturing industry, built to compete with Gensym's G2, Wonderware and GE's product suite. We folded several existing products into a new one built from the ground up on Aurelia, ASP.NET Web API, Akka.NET and MongoDB, with a microservice back-end. I managed a team of two and supported the rest of the business across its other products.

  7. Flowgear

    July 2014 - November 2014

    Full-stack Software Engineer

    SaaS, .NET, C#, WCF, Backbone, Silverlight, Integration

  8. Blue Nickel Solutions

    October 2010 - June 2014

    Full Stack Engineer

    .NET, C#, ASP.NET Web API, WPF, Silverlight, Cassandra, MVVM

  9. AD Game Programming Courses

    January 2010 - June 2013

    Partner/Director

    C#, XNA, Game Design, Game Programming

  10. Tao-Tech

    November 2009 - September 2010

    Software Development Consultant

    .NET, C#, Syspro ERP, Joomla

  11. Fusion Software

    March 2007 - October 2009

    Software Developer

    VB6, VB.NET, C#, .NET, ERP, MS SQL, CRM

  12. University of Johannesburg

    2002 - 2005

    Bachelors of Science - Bsc IT

    Computer Science, Informatics, Maths, Business Management, Electrotechnics

NestTube

Shipped on iOS. A parent-controlled replacement for YouTube: you whitelist the channels, kids request new ones for approval, and per-category time limits replace a single screen-time cap. Videos play through a private proxy, so no ads and no tracking. Built end to end — app, Supabase backend, subscriptions and release.

React Native, Expo, TypeScript, Supabase, RevenueCat, Sentry, NativeWind

nesttube.app

host-solo

A self-hosted application platform for a single VPS. Multi-environment deploys with network isolation, automatic Let's Encrypt certificates through Traefik, DNS record management and S3-compatible backups. Published to PyPI, and it runs my own production — the Directus backend behind Artilly deploys through it.

Python, Docker, Traefik, Let's Encrypt, DNS, S3

github.com

davidpurkiss.info

This CV. All content in one JSON file behind a Zod schema, with a local editing studio, a PDF exporter, and Markdown, JSON and TOON exports for anything reading it programmatically.

Nuxt 4, Vue 3, TypeScript, Zod, Playwright

davidpurkiss.info

Artilly Studio

My wife's art studio in Edinburgh, running classes for children. I built and maintain the site, including class bookings, payments and the invoicing behind them.

SvelteKit, Tailwind, Directus, Stripe, Brevo, Vercel

artilly.co.uk
  • Family
  • Piano
  • Learning Italian
  • Entrepreneurship