I'm a developer and love to build innovative software solutions, that meet your business needs. My favourite work is creating simple solutions for complex problems, working in an agile environment; refining, improving code, and learning new technologies.
My favourite language is JavaScript/TypeScript, I have the most experience with it and love the flexibility that a multi-paradigm language provides. As per the JS ecosystem, I'm a big fan of React, Next.js, and NodeJS on the server. I love learning about new technologies and how they can provide real business solutions. As such I have been learning Rust when I get some spare time, and out of my own interest I've been playing around with Flutter too.
Currently I am a Cloud Engineer at Rapha, and work building AWS infrastructure for our backend services. I love cycling and love working for such a great brand in the industry.
I leverage modern AI tools to help me build better software faster. I don't know if AI will replace software engineers but I am always learning to use it to improve the software I deliver.
In my spare time you'll find me travelling with my wife, road cycling, mountain biking or playing my guitar.
Experience
Rapha - from September 2025 to Current
Cloud Engineer (Backend)
Centralised Customer Identity & User Service:
- -Decoupled the platform from email-based IDs by building a central identity service using immutable UUIDv7 keys.
- -Created DynamoDB identity and connection tables mapping users across Auth0, Commerce Layer, NewStore, Bloomreach, CometChat, and Postgres.
- -Built a two-stage Step Functions email update workflow: dual-email verification (old + new) for security/GDPR, followed by parallel sync across 6 downstream systems.
- -Engineered resilient failure handling with SQS dead-letter queues, EventBridge redrive pipes, and partial retries for failed downstream syncs.
- -Provided IAM-secured admin overrides for internal support and event-driven signup handlers to auto-provision users across third-party APIs.
- -Ran rate-limited, idempotent backfill scripts across the full customer base to populate identity mappings from existing systems.
TypeScript
Node.js
AWS
DynamoDB
Step Functions
EventBridge
SQS
AppSync
Terraform
Nx
Jest
Grafana
GitLab
AI-Powered Email Triage, Security & Workflow Automation:
- -Addressed severe operational risk across Supply Chain, Retail, and Finance teams where critical supplier blockers, invoices, and urgent actions were buried under vendor noise, automated pings, and targeted phishing/spam.
- -Conducted cross-department discovery proving keyword filters were brittle; architected an AI classification pipeline combining malicious phishing/spam detection with a layered rule hierarchy (Personal Profile > Team Rule Pack > General Rules).
- -Engineered strict zero-trust input boundaries: email content is treated as untrusted external text with LLM tool-calling disabled during classification to eliminate prompt-injection and data-exfiltration attack vectors.
- -Hardened data privacy and compliance: OAuth refresh tokens and user profiles are Fernet-encrypted at rest in Firestore; classification records retain zero email body content and automatically purge after 30 days via native TTL policies.
- -Built an enterprise self-service onboarding portal on Google Cloud Platform with Google Workspace OAuth, Cloud Identity group policy enforcement, and automated Gmail label provisioning.
- -Containerized (Docker) and deployed an autonomous processing engine on Cloud Run (Vertex AI Gemini Flash) that labels incoming threads (Reply, Action, Read, Noise), auto-archives non-actionable noise, and delivers daily action digests.
- -Exposed conversational FastMCP tools for Claude and Gemini Enterprise, allowing verified team members to query blockers, explain verdicts, correct misclassifications, and mute noise senders via natural language.
Python
GCP
Cloud Run
Vertex AI
Gemini Flash
FastMCP
Firestore
Gmail API
Phishing & Spam Detection
OAuth 2.0 / OIDC
Fernet Encryption
Prompt-Injection Defense
TailwindCSS
GitLab CI/CD
Docker
Integration with US based warehouse:
- -Two integrations with US based warehouse providers was required to streamline the US order process.
- -Integrated our order flow with their API, using API gateway, SQS and Lambda Functions deployed via Terraform and Serverless.
- -Live orders switched over seamlessly allowing continued operations and reporting.
- -Effective commuication with US warehouse and the team as a whole was key to a smooth deployment
- -Setup of Grafana Dashboards and alerts, for observability and monitoring.
NodeJs
Terraform
NX
AWS
S3
SQS
EventBridge
Serverless
TypeScript
Jest
Graphana
GitLab
Maintenance or migration of older code and bugfixes:
- -BAU bug fixing and maintenance of code. Updated repos to use newer technologies such as ESBuild to replace Webpack when bundling Typescript Lambdas (faster builds/smaller bundles).
- -Updating and adding tests, to ensure code quality and stability.
- -Updating Node versions and ensuring deployment pipelines continue to succeed.
NodeJs
Terraform
NX
AWS
S3
SQS
EventBridge
Serverless
TypeScript
Jest
Graphana
GitLab
Groundsure - from July 2022 to September 2025
Full stack software engineer
New admin system:
- -Replacing legacy admin system with new React application, allowing for better UI/UX for groundsure staff, more functionality, with an easier to maintain and update codebase.
- -Order management for customer services much quicker and easier, faster response times leading to better service generating more sales through retention of customers.
- -We incorporated developer tools to monitor errors in our report generation allowing for better observability of our systems, using NewRelic and AWS queues as part of this.
- -Updated our orders API and pricing model, whilst still supporting some legacy XML orders for customers who have not yet migrated to the new system.
React
StyledComponents
NodeJs
Express
MongoDB
AWS
Serverless
NewRelic
TypeScript
Replacing x2 legacy ordering systems:
- -The business had a need to replace the outdated ordering systems which were written in Java, C# and used SQL Server. The legacy codebase had become unmaintainable having been written by a 3rd party and become outdated. We had to reverse engineer aspects to understand some business logic needed.
- -Re-built the ordering platforms using React, Next.js, Express, MongoDB deployed to AWS. Which created a much more modern, user friendly UX/UI and improved the overall performance of the system.
- -Our reports require drawing on maps, so we built our own mapping library using MapLibre GL and built out our own custom drawing tools for this (such as an auto-fill drawing tool).
- -We also incorporated hundreds of layers for our customers to apply to the map and analyse, such has Flood risks, Radon levels, and many more.
React
Next.js
Tailwind Css
Express
MongoDB
AWS
MapLibreGl
Zustand
TypeScript
New interactive online product - Groundsure Explorer:
- -Building new interactive map, displaying over 50 historic map layers from our in-house records and tile servers. Previously we only provided actual pdfs of the historic maps.
- -Customers can now view their historic maps online to interrogate their sites for potential historic risks.
- -Added the ability to add annotations (Points, Polygons and Labels) to the map which have their own notes and tags.
- -Hundreds of data layers can be applied to the map to allow for location analysis, provided again by our own tile servers.
- -Built back end routes to support this functionality, using Express and MongoDB, so users can save their changes.
React
Next.js
Express
Mongo
AWS
MapLibreGl
Tailwind Css
SST
TypeScript
Turf.js
New report for Australian market:
- -Building a new report which we launched in Australia, highlighting risks regarding property and land purchases.
- -Puppeteer was used on the server for the report generation on the server, hosted on AWS backend, SQS for queueing and processing, and S3 for storage.
React
Next.js
Puppeteer
PostgresSql
Express
Mongo
AWS
MapLibreGl
TypeScript
Ordnance Survey Mapping Product:
- -Bringing a specialist product we sold in house. External contractor was producing these for us but at a high cost and limited control.
- -Helped adjust and integrate with the Python API built by the GIS team to provide to scale mapping.
- -Setup the deployment to AWS lambda and SQS queue architecture to produce maps saved to S3 and send messages to process the report.
- -Created a to scale report template which used the images produced to pdf build reports to the design spec and deliver to customers.
- -Setup a report preview with React to provide a faster and better developer experience.
React
Python
Tailwind Css
NodeJs
AWS
SQS
S3
Serverless
NewRelic
TypeScript
Maintaining our BAU report generation system:
- -Updating our Ruby based report generation system which is hosted on AWS using docker containers.
- -Ruby PrawnPdf used for PDF generation, with SQS used heavily for queueing and processing.
- -I have taken the opportunity to work on this a number of times to broaden my coding knowledge and experience as well as supporting the business.
Ruby
PrawnPdf
Docker
PostgresSql
AWS
IT Career Switch - from Aug 2021 to Jun 2022
Coding Traineeship – Full Stack Software Developer
Course:
- -During the Traineeship I had to demonstrate a very competent level of the following: HTML5, CSS3, JavaScript, PHP, SQL, Python, Java, C#, GitHub, and more.
- -Passed the Microsoft MTA: Introduction to Programming Using HTML and CSS exam.
- -We incorporated developer tools to monitor errors in our report generation allowing for better observability of our systems, using NewRelic and AWS queues as part of this.
- -Updated our orders API and pricing model, whilst still supporting some legacy XML orders for customers who have not yet migrated to the new system.
HTML
CSS
JavaScript
PHP
SQL
Python
Java
C#
Final project 1 - Gazetteer map application:
- -Creating a “Gazetteer” web app using LAMP stack, using LeafletJs which allowed users to click on countries to find information such as population, currency etc. using API calls to provide this data from a range of sources.
- -Provided multiple other sources of information such as country capital weather, top 5 news articles, and more.
- -I'm a big fan of Formula 1 so I also used the a Formula 1 API (Ergast) to highlight all the races on for the current year and provide other information about these.
LeafletJs
JavaScript
Bootstrap
FTP
PHP
CSS
jQuery
Final project 2 - Company Directory:
- -A user requirements document was needed to be prepared which was checked for sign off, before developing a “mobile first” full stack REST application.
- -Frontend built to add, edit, delete, search and filter company personnel.
- -Backend built to support the above CRUD operations using PHP, MySQL, and a REST API.
- -Rules implemented to ensure delete operations were safe (eg. Employee cannot be deleted if belong to department).
- -Validations implemented on the frontend and backend to ensure data is entered correctly and stored securely.
JavaScript
HTML
CSS
SQL
PHP
LAMP
Bootstrap Css
jQuery
Other projects
Whistle Image
Creator
- -I built this to learn Rust and WebAssembly, and ended up fascinated by image compression and how it actually works.
- -A private, browser-based image converter for AVIF and WebP — conversion runs entirely in the browser, so images are never uploaded to a server.
- -Built with Next.js, React, TypeScript and Tailwind CSS.
- -Rust compiled to WebAssembly runs the conversion in a web worker, keeping the UI responsive.
- -Deployed to AWS with SST, using CloudFront and Route 53 with a custom domain.
- -Staging and preview deployments are password-gated and no-index; the public production stage serves the live site.
NextJs
React
TypeScript
Tailwind CSS
Rust
WebAssembly
AWS
SST
CloudFront
Studio Sunlight
Software Engineer
- -Much like this website. Setup github workflow for continuous deployment of website to cheap Hostinger Shared hosting.
- -Custom domain name and SSL certificate provided by Hostinger.
- -NextJs used for frontend, with Typescript and Tailwind CSS for styling - compiled into a static website.
- -Very minimal reliance on external Libraries - all custom code for Modals, Image Carousel, and form validation etc. to reduce maintenance burden, provide more control and flexibility.
- -PHP mailer used to send emails from the website contact form to custom email address.
- -Built a Rust Image processing CLI tool to convert .png images to .AVIF format for faster loading on the website (10x times smaller but still great quality).
- -I used AI tools to help me with SEO optimisation, incorporating a sitemap.xml, robots.txt file and meta tags for each page.
NextJs
Hostinger
TypeScript
Jest
GitHub Actions
PHP
Tailwind CSS
AVIF
AI Tools
SEO Optimisation
Other