Lead engineer • 2020 to present
Resident self-service for UK local authorities
Self-service waste portals for multiple UK councils, each a Laravel application integrated with the back-office waste management platform over its API. Together they serve millions of residents.
Lead engineer • Client portal
Over 1,100 PHPUnit tests and 88 Playwright tests
An account portal where a council's business customers manage their sites, contacts, orders and documents. The Playwright suite drives a real browser against the test environment in phases: one saved login, read-only checks in parallel, then write and session tests in series, with anything that creates real data kept behind an opt-in flag.
Lead engineer • Client portal
Tested at every level, from unit to load
Subcontractors browse and bid on available work, submit completed jobs with photos, and manage pricing, documents and users across four roles. Over 500 PHPUnit tests fake every external API call and assert on call counts and payload shapes, backed by a route-by-role access matrix, Dusk browser tests, Playwright end-to-end checks and k6 load-test journeys.
Internal tool • 2022 to present
A Chrome extension my team uses every day
Built to make the team more efficient: nobody has to ask me which server a site is on any more, and test forms fill in seconds. Published on the Chrome Web Store and now at version 2.5. A popup lists 19 portals with their test and live links, versions and hosting details. On the portals themselves it labels which environment you are in, autofills test forms and payment pages, and remembers the properties you have looked up. On the service desk it opens a whole list of tickets in background tabs with one click. I moved it to Manifest V3 and refactored it so adding a portal is one config entry.
Maintainer • 2025 to present
Picking up someone else's codebase
Two public waste sites for councils, both written in C# on ASP.NET MVC by developers who had since moved on. I took them over and keep them running: tracing a live bug on one where requests were being logged against the wrong property and patching it in a shared base controller, removing retired features, and shipping versioned releases through the existing build pipelines.
Sole owner • 2025 to 2026
From a client's question to a live service, handled end to end
It started as a question: could a council's website show residents a full year of collection dates? The existing integration only returned the last and next collection, so new subscribers had to be loaded by hand and often missed their first one. Rather than wait for a change to the core product, I proposed a standalone API and took it the whole way. I ran the scoping call with the client, the council and their web supplier, wrote the specification with example requests and responses, broke the work into an itemised estimate, and quoted both the build and the monthly running cost.
Lead engineer • Client portal
Client staff change the portal without a developer
A super-admin area built into a customer portal so the client's own staff can run it themselves. They switch tabs and services on or off globally or per customer, schedule bilingual banners aimed at everyone, one customer type or named accounts, edit translations, manage help videos, and export settings from one environment to import into another. Every change lands in an audit trail with before and after values, alongside a system health page, a log viewer and a test runner that streams results in the browser. Its switches are a ceiling, not a floor: off removes a feature for everyone, on still leaves the role checks in place.
Internal tool • 2026
A dashboard for my team's workload
Syncs open tickets and their quotes from the company service desk into a local dashboard, then tracks approved, issued and used days per ticket, separates recurring and pre-sales work, and exports a categorised PDF report.