Professional Summary
Lead Software Engineer with over 10 years of commercial experience building and maintaining complex web applications. Specialises in council portals and waste management systems with a focus on scalability, accessibility, and efficiency. Proven track record of leading engineering teams, improving public service platforms, managing client relationships, and delivering measurable results.
I am quick at picking up new technologies and pride myself on being a strong problem-solver. I naturally think outside the box, asking a wide range of thoughtful and effective questions to explore different angles and uncover potential solutions. This approach allows me to gather diverse ideas, test them, and communicate solutions clearly.
I stay up to date with the latest technologies and know how to use them safely and responsibly to drive innovation and growth.
Experience
Portal Engineer Lead
AMCS, LondonJan 2020 to Present
- Lead engineer for municipality waste management portals serving millions of users, and for commercial systems including TV dashboards
- Designed and implemented scalable architecture using Laravel and modern JavaScript frameworks
- On joining in 2020, took over the existing legacy portal code, worked out how it behaved and brought it onto Laravel, doing this for four years before AI coding tools became part of my workflow
- Spearheaded accessibility improvements and modernisation efforts
- Upgraded portal codebases to newer Laravel and PHP versions
- Designed the portals to hold no client data: every record is read from and written to the back-office platform through its APIs, so nothing personal is retained on the portal side
- Generated new ideas and initiatives to sell to clients, including moving projects toward a monthly subscription model
- Took charge of departmental financials from concept through implementation and deployment
- Collaborated with cross-functional teams to deliver new features and resolve legacy system bottlenecks
- Worked with the back-office platform's API product manager, raising and agreeing the API changes the council portals I built needed
- Built payment integrations with Windcave, Worldpay, Barclaycard, Pay360, Adelante, Capita, Stripe and PayPal
- Built multi-language (i18n) portals: a bilingual English and Welsh portal for a Welsh council, and French, German and Spanish language demos
- Mentored junior developers, improving team efficiency and code quality
- Led a developer directly for two years and took part in hiring for the team
- Set up Azure App Service for every portal and carried out their server upgrades
- Delivered every portal through CI/CD pipelines, so sites go live safely and quickly with no downtime, and built the GitHub Actions pipeline that builds and deploys one portal to Azure App Service
- The person the team turns to when a live system goes down, though DevOps is not my role
- Used Sentry for error tracking on live portals, and built in-house error handling into the admin panels of two client portals: log viewers, system health checks, dedicated log channels that tag every entry with the user and account, and audit trails of every admin change
- Built large automated test suites for client portals, including one with over 1,100 PHPUnit tests and an 88-test Playwright suite run against the test environment
- Tested portals at every level: faked external APIs, route-by-role access matrices, Dusk and Playwright browser tests, and k6 load-test journeys
- Built and maintain the team's Chrome extension, published on the Chrome Web Store, to make the team more efficient: nobody has to ask which server a site is on, and test forms fill in seconds. It has a dashboard of 19 portals with test and live links, environment overlays, test-form autofill and bulk ticket opening, migrated to Manifest V3 and refactored around a single portal config
- Gave every portal a super admin debug mode that shows debug information on the page itself, so internal testers can see what is happening behind the scenes while APIs and other features are being tested
- Took over two legacy ASP.NET MVC (C#) council waste sites after their original developers had moved on, and now maintain them: tracing live bugs through an unfamiliar codebase, removing retired features and shipping versioned releases
- Took a client enquiry all the way to a live service on my own: proposed a standalone API in place of a core product change, ran the scoping call, wrote the specification, estimated and quoted it, then built and deployed it
- That service is a serverless Node.js API on Azure Functions that serves collection calendars to a council's own website: SOAP integration with the back-office platform, strict input validation, key authentication, rate limiting per caller and per property, client-facing documentation and a 50-case test matrix
Laravel • JavaScript • jQuery • PHPUnit • Playwright • k6 • CI/CD • C# • ASP.NET MVC • Node.js • Payment Gateways • Chrome Extension • Azure Web Services
Web Application Developer
Ezekia, GodalmingJan 2017 to Jan 2020
- Joined Ezekia as a startup and maintained and enhanced its executive recruitment platform, built in Laravel
- Developed a Chrome extension to integrate LinkedIn with Ezekia, streamlining recruiter workflows
- Introduced new features that improved platform adoption and user satisfaction
- Designed the MySQL database structure for new platform features, and optimised slow queries
- Integrated the platform with Mailchimp so email campaigns could be sent from Ezekia, and stored images on AWS
Laravel • Vue.js • MySQL • Chrome Extension • Mailchimp • AWS • Jira
Education
Kingston University
BSc Computer Science, First Class Honours
2013 to 2016 | Graduated with 81% overall
Focus areas: Software Engineering, Databases, UX, Project Management
Personal
I'm passionate about arts and crafts, particularly laser engraving projects that combine precision with creativity. I embrace a DIY attitude towards anything broken, whether it's hardware, software, or systems, believing that with the right approach and resources, nearly everything can be fixed or improved. With YouTube tutorials and modern language models at our fingertips, there's no skill or problem that's truly beyond reach. When I'm not engineering solutions, you'll find me bouldering, diving, exploring sports, or working on various hobbies. I hold an advanced diving certificate, and I'm a former competitive powerlifter with years of competitive experience.
- Laser Engraving
- DIY Projects
- Bouldering
- Advanced Diver
- Former Powerlifter
- Sports
Notable Personal Projects
2026
- Built a retrieval-augmented generation (RAG) pipeline that answers visitors' questions about my experience and projects, integrated with a large language model through its official PHP SDK
- Wrote the retrieval step in PHP: the site's own CV and project content split into chunks per job and project, ranked with BM25 and synonym expansion, so every answer is grounded in real content and lists its sources
- Stored every conversation with downloadable transcripts for visitors, and reused saved answers for repeat questions so they cost no API credit
- Protected the API budget in layers: honeypot, minimum send time, a proof-of-work challenge, reCAPTCHA, per-visitor rate limits and a daily spending ceiling
- Added an admin view of chats, tokens used and estimated cost, with a test suite that fakes the AI model and a GitHub Actions check that signs in to the AI provider with Workload Identity Federation instead of an API key
Laravel 12 • PHP 8.3 • LLM API • RAG • BM25 • SQLite • GitHub Actions
2026 to Present
- Built and run the live home page for a 250+ member Old School RuneScape clan: roster, profiles, leaderboards, events and announcements
- Integrated Discord sign-in, forum single sign-on, and stats synced from Wise Old Man and TempleOSRS
- Designed 18 scheduled jobs, staggering the heaviest refresh across eight sections to stay under API rate limits
- Delivered an admin panel with roster management, ticket triage, a health dashboard and a browser-based test runner
- Covered the application with 787 automated tests, mocking every external service
- Deployed to the live server over SSH
Laravel 13 • PHP 8.3 • MongoDB • SQLite • Discord OAuth • Tailwind CSS 4
2026
- Built the British street card game as a live multiplayer web game: two to six players join from their phones with a five-letter code and no sign-up
- Wrote one C# rules engine shared by the ASP.NET Core server, which enforces every move, and the Blazor WebAssembly client, which highlights playable cards
- Ran games through a SignalR hub with in-memory rooms, sending each player only their own hand so nothing can be read from the browser
- Designed for phones: portrait layout, thumb-reach controls, automatic reconnection after the screen locks and a vibration on your turn
- Covered every rule with 54 xUnit tests, including integration tests that play games through the real hub
- Containerised the server with Docker on Render and served the client as static files from shared hosting
C# • .NET 10 • ASP.NET Core • SignalR • Blazor WebAssembly • xUnit • Docker
2026
- Turned a popular community Slayer spreadsheet into a web app that plans tasks for all eight Slayer masters, with live XP, GP and points rates
- Ported the workbook's formulas to PHP, including a small expression parser that evaluates the 357 formulas exported with the data
- Wrote a Python exporter that extracts 248 monster variants, 481 tasks and 232 prices from the workbook
- Proved the port with parity tests that compare the app's results against the spreadsheet's own across every monster and master
- Built saved setups with share links, JSON export and import, for anonymous visitors and accounts, with tests that keep each visitor's setups private
- Scheduled a daily refresh of loot values and item prices from the OSRS Wiki
Laravel 12 • Livewire • PHP • SQLite • Python
2026
- Built a Python and Django app that tracks what Wilderness Slayer tasks are worth, weighing loot prices against supply costs over time
- Wrote management commands that scrape 37 tasks, 86 monsters and over 4,000 drop table rows from the OSRS Wiki
- Stored hourly prices for over 4,700 Grand Exchange items, with history at hourly, six-hourly and daily resolutions
- Exported the data as JSON for a static Vue and Chart.js front end, so the public site runs no Python
- Deployed to shared hosting with a single SSH script and an hourly cron job that refreshes prices
Python • Django • SQLite • Vue 3 • Chart.js • REST APIs
2016 to 2018
- Designed and built a custom clan management system integrating Runescape, Discord, and forum member lists
- Automated membership management across platforms, ensuring consistency
- Integrated Discord to track activity, including voice chat usage and engagement metrics
- Implemented a Java bot to monitor in-game clan chat, capturing movement and logging damage per member
- Built dashboards to identify top performers, track attendance, and detect potential leaks of event locations
- Analysed 2 years of event data for performance insights and operational security
Java • PHP • APIs (Discord) • Database Management • Analytics
2015 to 2016
- Developed a comprehensive platform for managing powerlifting competitions and competitor results in pure PHP and SQL, with no framework
- Designed the MySQL database schema from scratch
- Aggregated inconsistent regional GBPF data (PDF, Excel, Word formats) into a unified, searchable MySQL database
- Built comparison tools to help athletes benchmark against others in their weight class
- Created a competition centre allowing event creation, execution, and automated publishing of results
- Delivered a system that streamlined data consistency and provided a potential replacement for fragmented processes
PHP • SQL • MySQL • Database Design
Awarded 80%+ grade (First Class standard)