Senior Software Engineer / UK

Harry
Higgins.

I build reliable, event-driven systems with TypeScript, Node.js and AWS.

Currently building a ferry booking platform.

See projects ↘
Geometric H on an offset black tile, with a fine cross-pattern backgroundGeometric H on an offset black tile, with a fine cross-pattern backgroundENGINEERING / ARCHITECTURE / DELIVERY

Professional work

Selected projects

Payments, content systems and automation at a ferry booking company, CGHero and Prezzybox.

Professional work

Passport hold collision

Why both booking sites rejected the same customer

Investigation

I traced a booking rejection to another site's passport hold, then explored what could change.

Read the passport hold story ↗

Professional work

Booking deposits

4 days

from scope reset to launch, ahead of the timetable release

Payments

Read the four-day delivery story ↗

Leading the deposits project+

The feature

Launch deposits for future sailings.

My role

Led a 3-person engineering project, reporting to the Head of Engineering and CEO.

Uptake

Customers chose deposits from release day, most of all in release week.

Professional work

SEO-content migration

2h → 5m

deployment window

Micro-frontends
Moving 2,000 pages per locale, across 47 locales+

The migration

Move a 2,000+ page SEO estate to micro-frontends and shorten deployments.

My role

Owned the architecture and implementation of the SEO-content migration to micro-frontends, from design through launch.

Deployment time

Migrated 2,000+ pages, cut deployment time from 2 hours to 5 minutes and limited the blast radius of changes.

Professional work

Operator outages

7.4s → 3.2s

slowest operator search calls

AWSLambda
Keeping bookings moving when a ferry operator goes down+

The problem

One large operator's system was unavailable on 17 of 21 days in April 2026. Customers waited for searches, got empty results and became stuck in the cart.

The fix

Made the existing circuit breaker faster and visible, set timeouts from real response data and served the last good answer from a cache.

Results

Slowest 5% of operator search calls cut from 7.4s to 3.2s. Answers in 0.14 seconds with the breaker open, and customers kept booking from cached sailings.

Read the full story ↗

Architecture

Sanity CMS integration

~13 seconds

Estimated from a Sanity update to the BFF's data store. Method below.

I designed the Sanity CMS ingestion integration within the ferry booking platform's event-driven architecture. It turns CMS webhooks into domain events, with each backend-for-frontend (BFF) keeping the data its micro-frontend needs.

EventBridgeKinesisDynamoDBQwik

Read the full deep dive ↗

Follow the content: architecture sequence+

About 13 seconds, estimated by adding per-stage median timings from a typical hour, from the Sanity update to the BFF's data store.

Publishing and consumer updates happen when content changes. Page requests read from the BFF's own data store.

Receive and store the change

SanityCallbackEvent storeWebhookStore event

Sanity sends create, update and delete webhooks to an API Gateway REST endpoint. The ESG callback Lambda stores received webhook events in DynamoDB for replayability.

Enrich and publish

DDB streamTrigger LambdaSanityStored changeFetch documentFull document↓ Publish to EventBridge → Kinesis

The DynamoDB stream invokes a separate trigger Lambda, which fetches the full document from Sanity and publishes domain events to EventBridge, then Kinesis.

Update each read model

KinesisBFF LambdaDynamoDBSubscribed eventRelevant data

Each BFF listener filters for the events it needs and keeps the relevant data in its own DynamoDB store.

Serve the page

Qwik MFEBFF APIDynamoDBFetch dataRead recordsRecordsPage data

The BFF API is exposed through API Gateway. Qwik renders on AWS Lambda, with client JavaScript where needed.

Read models for each frontend

Each backend-for-frontend subscribes to relevant events and keeps its own data for the micro-frontend it serves.

KinesisContent events
Port description
Heading
Breadcrumb
Ports list
Port search
Image gallery
FAQ
Sitemap

Each BFF builds its own view from the shared event stream.

Read through the BFF API

Qwik MFE requests data from the BFF API. The API queries DynamoDB, receives records and returns data to the MFE.

ESG webhook storage is separate from each BFF's read model.

CGHero / Professional work

Role-based access control

<100ms

permission-check latency

SpiceDBZanzibar
Implementing the permissions model+

The bottleneck

Permission checks took more than a second for power users.

Implementation

Implemented role-based access control using SpiceDB, based on Google's Zanzibar model.

Latency

Reduced permission-check latency from more than 1 second to less than 100 milliseconds.

Prezzybox / Professional work

Basket recommendations

~£25k

additional revenue reported in Nov–Dec 2021

Recommendations API
Adding recommendations to the basket+

Where recommendations fit

Make relevant recommendations while customers were already adding something to their basket.

Implementation

I researched how other retailers handled cross-selling, then integrated a third-party recommendations service into the add-to-cart confirmation and basket.

Reported sales

In November and December 2021, the recommendation lists were reported to have driven over 2,000 additional unit sales and roughly £25,000 in additional revenue.

Historical Prezzybox add-to-cart confirmation with a People Also Bought recommendation carousel.
Prezzybox interface, 2021.
Personalised Celebrations tub with Congrats Anna across the lid in chocolate-brand lettering.
Personalised Celebrations tub. Photo: Caroline Abbott.
The Celebrations lettering in each chocolate-brand font.
Mocking up the lettering, one letter at a time.
Prezzybox / Professional work

Personalised Celebrations artwork

Automated artwork for an exclusive personalised product.

Artwork automation
Generating the print artwork+

From customer name to PSD

I built a script that turned customer names into personalised Celebrations artwork, placing each letter in the right chocolate-brand font and producing PSD files for printing.

The missing Q

When I discovered the Bounty font had no Q, I worked with Mars's marketing team to resolve it.

Making the product practical

Automating the artwork made the exclusive product practical at a volume manual production couldn't support.

Prezzybox / Operations & automation

Daily SEO checks

A daily SEO check that didn't need someone to remember to run it.

30–60 min estimated time saved per day

DockerS3AWS LambdaSlack
Daily Docker crawl↓Reports uploaded to S3↓Put event triggers Lambda↓Summary + attachment in Slack
How it worked+

I containerised a daily Screaming Frog crawl of prezzybox.com. Reports went to S3, where a put event triggered a Lambda function to parse the results and send a summary and report attachment to Slack.

Why it mattered

It replaced a repetitive manual check, with an estimated half-hour to an hour saved each day, and surfaced SEO issues such as accidental no-index changes.

Example Slack report from the automated Screaming Frog crawl, showing SEO checks and a CSV attachment.
Historical example output.
Also at Prezzybox: migrating without a big-bang release+

Starting in April 2021, I worked on a progressive AngularJS-to-Vue migration. A small team needed to keep shipping, so we moved product pages, categories, the homepage and search in stages rather than replacing the whole storefront at once.

The trade-off

We deferred checkout ahead of Christmas rather than rush a high-risk change into peak trading.

Away from work

About me

I studied pharmacy, found my way into SEO, and started writing tools for the marketing team. That became a move into software engineering.

More about me →

Experience

Experience

Jan 2024 - Present

Senior Software Engineer

AFerry

Event-driven systems, deposit payments and micro-frontends.

Also: resilient integrations, Grafana dashboards and A/B testing. Search result selection improved by +2.55pp UK / +4.87pp FR.

Aug 2022 - Jan 2024

Full-Stack Developer

CGHero

Access control, real-time messaging, Laravel 10 and multi-item quoting. WebSocket messaging increased messages sent by 30%.

Aug 2017 - Aug 2022

Product Lead & Software Engineer

Prezzybox.com

Progressive AngularJS-to-Vue migration, personalised-product automation, recommendation modules and daily SEO-audit tooling.

Toolkit

Stack

I currently use Qwik on the frontend, with previous work in Vue and Nuxt.

Backend

  • TypeScript
  • Node.js
  • PHP / Laravel

AWS

  • Lambda
  • EventBridge
  • CDK

Architecture

  • Event-driven
  • Micro-frontends
  • BFF pattern

Frontend

  • Qwik
  • Vue.js 3 / Nuxt

Tooling

  • Grafana
  • Docker
Education / 2014 - 2016

Aston University · Diploma of Higher Education in Pharmacy