Senior full stack software engineer with experience in the financial technology and hospitality industries, specialising in serverless, event-driven cloud systems built on AWS. I work primarily in TypeScript and C# .NET, with React on the frontend, and have a strong interest in observability, making sure complex distributed systems are well understood in production.
Outside of work, I'm an avid Manchester United fan and a regular at Old Trafford with a season ticket in the Stretford End. I've also recently got into running, and I aim to complete three 5k runs a week, although I can't say this target is always met... For over a year now I've been flying the virtual skies on the VATSIM network, something I've really enjoyed getting stuck into with its steep learning curve.
Graduate of the University of York (MEng), having studied Computer Science with Artificial Intelligence and a Year in Industry, and achieving a First Class Honours with Distinction.
WIP: High Altitude Ballooning — image placeholder
A project I'm building with my dad to launch a high altitude balloon to the stratosphere. Our own mini space program.

An interactive scatter plot tool for comparing Fantasy Premier League player stats, built to make transfer decisions less of a guessing game.
Having recently been promoted to Senior Software Engineer, my focus remains on the AI Phone Agent project and create a best in class phone ordering experience for our end users. There is still a rich roadmap ahead, with exciting new features in the pipeline aimed at improving agent conversion rates and overall customer satisfaction.
I joined the AI Phone Agent team as one of its founding members, alongside one other engineer and the company CTO. The team's mission was to build an AI-powered phone agent that could answer calls on behalf of Flipdish clients, take food orders from end users and submit them directly to the Flipdish backend. From a small founding team, the project grew into a fully structured engineering function.
Given such a small team, I had an outsized influence on the architectural and design decisions that shaped the system, which was built as an event-driven, serverless stack in TypeScript on AWS using Lambda, DynamoDB and EventBridge. A particularly interesting challenge was supporting complex menus with deeply nested, branching modifier structures. I designed a compact representation that conveyed the full range of options to the LLM without overloading it with context. I also implemented semantic search to improve the likelihood of the agent correctly matching a customer's spoken request to the right menu item.
Among other features I built was an SMS payment link flow, allowing customers who wished to pay by card to receive a secure link during the call and complete payment on their phone. I also had a big hand in building out the team's internal reporting and observability tooling which tracked call outcomes, order accuracy and agent behaviour. This was critical for providing the visibility needed to iterate quickly and surface where the agent was falling short.
Working in the Ecosystems and Payments team, I was responsible for client subscriptions, entitlements and payouts, client reporting and all 3rd party integrations.
Key projects included building a Stripe-backed subscriptions and entitlements system using an event-driven and serverless architecture written in TypeScript and deployed on AWS (Lambda, DynamoDB, EventBridge), a self-serve client signup and onboarding flow, and a range of 3rd party integrations covering order ingest, delivery providers and point of sale systems, all of which were written in C# and deployed as container apps in Azure.
My biggest deliverable in this role was leading the Google Business Profile Sync project from both an architecture and development perspective. The integration automatically pushed changes made in the Flipdish back office, such as opening hours, to each client's Google Business Profile, ensuring their presence on Google Search and Maps was always kept in sync without any manual effort.
After IHS Markit merged with S&P Global I formed a new subteam with another developer to create a self-service environment management tool in the SaaS platform. Using this tool, tenants on the platform could create, manage and delete environments for each software service they used.
I developed the backend functionality, a C# CQRS API and microservice following a Domain Driven Design architecture and Event Sourcing pattern. A database per tenant architecture was used and Entity Framework migrations managed schemas.
I also developed the first iteration of the micro frontend using React, which allowed users to perform CRUD operations on environments. As we were the first team to start building micro frontends I also wrote a shell for this microsite to sit within, which managed higher level concerns such as authentication and routing.
Working in the Platform Services team, I was responsible for developing a cloud platform that would house all of the company's SaaS applications. The outcome of the team was to provide a set of core microservices and infrastructure that could be used by product teams to deploy and integrate their applications.
One of the main features I contributed to was multi-tenant access, which allowed a user to belong to multiple tenants, selecting one at login time. This involved rearchitecting login functionality, ensuring a tenant could be selected and exposing this information in JWTs. I also worked on the frontend implementation of this which was powered by Razor.
After rejoining the company as a graduate, I formed part of the newly formed Dev Tooling Apps team, which was responsible for making devops related tools requested by other software teams to improve productivity. We produced what became known as the Dev Tooling App, which consisted of a C# backend and an Angular frontend, and was used daily by engineers across many teams.
I worked on many areas of the app. One such feature I developed was aggregating and displaying transient environment information, showing the deployed microservices, build history, CI/CD pipeline statuses and an integration with Grafana to view logs and traces. This screen also included a single-click environment tear down button, which would destroy all the cloud (AWS) resources related to the selected environment. I was also involved in writing a DORA metrics page, which pulled data from Jira and GitLab to provide a breakdown of the metrics per team.
I architected and developed a Microsoft Teams bot that serviced commands sent by developers, such as listing and destroying environments. The bot also became a mechanism of sending notifications to developers based on their user preferences. Service to bot communication was achieved using MassTransit over RabbitMQ.
The Dev Tooling App was deployed in its own EKS cluster and its environment provisioned by Terraform.
A 9-week internship in which I joined one of the Enterprise Data Management (EDM) software teams, tasked with extending and upgrading the web interface side of EDM. The work mainly involved translating JavaScript features written in an old framework into Angular TypeScript code. I also extended some of the C# APIs.
In addition to this we were given the time to work on our own project, where I developed a build monitor that displayed the status of CI/CD builds and pipelines, in the form of an Angular SPA. This integrated with TeamCity to pull build information.
A year-long industrial placement in the Defence Mission Systems (DMS) division of Thales. I was part of the Command and Control software team working on maintaining and upgrading the Mine Counter Measure Management System (MCUBE), a master control system for mine hunting naval ships.
The main area of MCUBE I was responsible for was the navigation and autopilot subsystems. This involved working closely with domain experts to ensure the safety critical navigation algorithms were implemented correctly. I travelled to Germany to carry out integration testing between the navigation systems I wrote and the rudder-propulsion system used by a particular client.
I also spent a large portion of the placement working on a messaging system, responsible for constructing and decoding standardised messages used to plan missions. I trained and handed over this work to an apprentice before the end of my placement.
A 5-week solo project in which I developed an app for the trampoline park, targeting both iOS and Android devices. Through the app users could log into the park's website, browse through ticket pricing and book sessions. As the main demographic of the park's customers were young children and teenagers, I decided to develop and embed a small arcade game into the app.