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.
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.
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.
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.
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.
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.
July 2014 - November 2014 Full-stack Software Engineer
SaaS, .NET, C#, WCF, Backbone, Silverlight, Integration
Full Stack Engineer
.NET, C#, ASP.NET Web API, WPF, Silverlight, Cassandra, MVVM
Partner/Director
C#, XNA, Game Design, Game Programming
Tao-Tech
November 2009 - September 2010Software Development Consultant
.NET, C#, Syspro ERP, Joomla
Fusion Software
March 2007 - October 2009Software Developer
VB6, VB.NET, C#, .NET, ERP, MS SQL, CRM
University of Johannesburg
2002 - 2005Bachelors of Science - Bsc IT
Computer Science, Informatics, Maths, Business Management, Electrotechnics