Work
A few pieces of work that show the range. Some are anonymised at the client's request; the detail is real.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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