Work

Built to run unattended. Still running.

A few pieces of work that show the range. Some are anonymised at the client's request; the detail is real.

software · internal tooling · 2026

Monitoring and management for a fleet of client websites

Situation

Dozens of small-business websites across several servers, each needing updates, backups and someone to notice when it went down. Checking them by hand didn't scale, and the off-the-shelf tools either cost per site or wanted a login to every one of them.

What we built

A small agent on each site that reports in on a heartbeat, and a central service that collects the reports, runs backups, pushes updates and optimises media. Push-based, so a site that goes quiet is itself the alert. Built in Go with a Postgres store, and used every day on our own hosting.

Outcome

One screen for the whole estate. Outages and failed backups are known about before the client notices. New sites join by installing a plugin. It's the tooling we'd have bought if anyone sold it.

go · postgres · php · wordpress
infrastructure · platform · 2026

Rebuilding a multi-site hosting platform after a compromise

Situation

Our own platform. Several live client sites sharing one server. A managed database upgrade exposed a fault, and investigating it turned up rogue plugins and admin users on more than one site. Everything had to stay online while it was dealt with.

What we built

Containment first: quarantine, rotated credentials and salts across every site. Then a new platform built properly. Ubuntu, Caddy, a separate PHP-FPM pool and system user per site, managed MySQL, no root over SSH, and push-based monitoring from every site into our central service. Sites were migrated one at a time.

Outcome

Each site is now isolated from the others, so a compromise stays a one-site problem. Monitoring reports in continuously and silence is treated as an alert. No client noticed the move.

ubuntu · caddy · php-fpm · mysql · go
integration · logistics · ongoing

Connecting a 3PL's customers to its warehouse system

Situation

A UK third-party logistics operator with many customers, each wanting to send orders and receive confirmations in their own format over their own channel. The warehouse system spoke one language. Every new customer was a mini project, and every change was a risk.

What we built

A middleware layer sitting between the customers and the WMS. Orders, stock, despatch confirmations and documents come in over SFTP, REST and EDI, are mapped and validated against a per-customer configuration, logged, and passed on. Rejections go back to the source with a reason. Onboarding a new customer is a mapping, not a release.

Outcome

In production for years, handling the operator's daily order flow unattended. Customer connections are added as routine work. When something fails, the log says what and why within seconds.

php · mysql · sftp · rest · edi

Want the detail on any of these?

We're happy to talk through how something was built, what went wrong along the way, and what we'd do differently. Ask.

Start a conversation