Boundaries before services
A modular monolith with real domain boundaries — enforced by the build, not by convention — is usually the cheaper place to start than a network of services. Split when the boundary has earned it.
About
I build and evolve backend systems: long-lived Ruby on Rails applications, version and dependency upgrades that ship in steps rather than as a rewrite, domain boundaries the build enforces, and integrations with the legacy systems those applications cannot leave behind. Ten years of backend work, most of it Rails in production. Since 2024 I have also built independent AI and agent tooling — some of it deployed as public services, some of it still research.
A modular monolith with real domain boundaries — enforced by the build, not by convention — is usually the cheaper place to start than a network of services. Split when the boundary has earned it.
Generated or hand-written, a change is only as good as the test that fails without it. I would rather record a reproducible result than a confident one.
A model's output is a proposal, not a result. I build agent and AI tooling around tests, independent verification and recorded evidence, so a change is accepted because it passed something rather than because a model said it did.
Keeping a long-lived Rails application upgradeable is continuous work: dependency hygiene, a suite that catches regressions, and CI that makes the change cheap to prove. Left alone, it becomes a rewrite.
Containers that are pinned, unprivileged and read-only; one public path in through a tunnel; logs that are bounded. The goal is that nothing about running it is interesting.
Newest first. The City Electrical Factors entry is one employer across a sequence of contracts and then a full-time role, written up by phase rather than as four separate appointments.
Took a career break for personal reasons and continued independent development on selected projects: deployed developer tools, AI and agent infrastructure, and experimental systems research.
Maintained and evolved the primary cef.co.uk system — first on contracts that upgraded it off long-unsupported Rails versions, then full time owning cross-cutting technical health and helping steer engineering practice toward TDD, CI/CD and clearer domain boundaries.
The upgrade path, written up on the blog →
Led and supported Ruby on Rails developers in a lean team, providing hands-on guidance, feedback and technical direction.
Maintained and extended the Rails platform and collaborated remotely with colleagues across functions.
Four roles across agencies and product companies, in Ruby and the web stacks of the time.
Available for senior backend and Rails engineering roles in the United Kingdom — remote or hybrid, permanent.