Hartlepool, County Durham — Senior Software Engineer
Rails · Backend systems · Practical AI
Building robust backend systems and practical AI tools.
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.
Packwerk boundaries, a transactional outbox and a Kafka consumer in Rails.
A worked example of splitting a Rails application into Packwerk-bounded components, with a transactional outbox so an event written in the same transaction as the data is never…
A shared knowledge exchange for agents, where a claim is only verified when someone else reproduces it.
A Rails service holding the breaking changes, undocumented errors and signature surprises that release notes do not cover, together with the fix that actually worked. Reports are…
Finds real failures by executing one release of a package against the next.
A Ruby client that installs two releases of a package, asks each what its public callables accept, and executes the same call against both. When the older release accepts the call…
Moves a Rails application one release at a time, and records what the move cost.
A Ruby client of the agents-fyi service that reads an application's Gemfile.lock, asks the service what a move crosses, and applies only what the service calls mechanical. It runs…
Developer API for web capture, extraction and monitoring.
An HTTP API for capturing web pages as screenshots or documents, extracting structured content, and watching pages for changes. Built to be called from scripts and software…
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.
Ruby on Rails Engineer → Senior Back End Developer
City Electrical FactorsOctober 2019 — October 2024 (contract, then full time)
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.
Phase 1 · Rails 3.2 → 4.2, October 2019 — May 2020 (contract): upgraded a production retail application off a framework version that had been out of support for years, released in steps rather than as one cutover.
Phase 2 · Rails 4.2 → 5.2, December 2020 — March 2021 (contract): the next hop, made smaller by having cleared the previous one's deprecations rather than deferring them.
Phase 3 · March 2021 — October 2024 (full time): returned to own cross-cutting upgrades across Rails versions, gems and dependencies.
Championed Docker containerisation and led the Bitbucket Pipelines implementation, so a green build meant a runnable environment.
Built and maintained API integrations bridging modern applications and legacy Sybase systems.
Advocated a modular-monolith direction using Packwerk and domain boundaries, without prematurely splitting the system into services.
Promoted TDD and CI/CD, and shared approaches and emerging practices with the wider team.
Research and Experimental Systems
Systems work and ongoing research. Where a project states a hypothesis it is stated as a question, and no result is claimed until it is reproducible with appropriate baselines.
Can a network's topology adapt during pretraining?
An experimental pretraining framework investigating whether jointly adapting model weights and computational topology during pretraining can improve the trade-off between model…
A deterministic artificial-life simulation with reproducible experiments.
A virtual-machine-based artificial-life simulation with reproducible experimental tooling and a browser-based WebGL visualisation. The value is in the determinism and the…
The miner installs thousands of releases, and it shares its download cache between three clients while refusing to share the environments. The line is not disk cost: a wheel is an artifact, and an environment is where a verdict was produced.
The upgrader has three exit codes, and the distinction between them is the difference between "the ladder will not plan this", "nothing was established" and "something went wrong".
Get in touch
Available for senior backend and Rails engineering roles in the United Kingdom — remote or hybrid, permanent.