03 — Projects
Things I built, and why.
Platform and developer-experience work: tooling that removes friction, automation that is safe to re-run, and AI systems with a gate in front of every risky step.
This work is internal to the studios I have worked at, so I describe the outcome, the problem and the design decisions rather than proprietary detail. Happy to go deeper in conversation.
Unblocking a 56,000-Workspace Version Control Migration
Outcome: Cut audit time for 56,000+ workspaces from hours to seconds, giving migration teams a fresh list during the same conversation. The tool became a routine workspace hygiene check.
Migration hand-offs depended on a slow, quickly outdated list of workspaces: the source-control checkouts used by developers, artists and build machines.
- Removed repeated work: moved expensive operations out of the per-workspace path so they run once per audit.
- Kept the batch useful: isolated individual record failures so one bad workspace cannot abort the run.
- Verified the speed-up: inspected the AI-assisted refactor, ran it against the real workspace estate and measured the runtime.
A Self-Serve Support Platform, End to End
Outcome: Expanded one tool's answer coverage from 10 to 31 entries and made support outcomes measurable. Intake records whether documentation resolved a request, alongside priority and tool ownership; the low-code assistant is running in shadow mode without posting.
Repeated questions interrupted engineers, while free-form requests made prioritisation and documentation effectiveness hard to track. I connected intake, curated answers and a grounded assistant.
- Documentation before escalation: offer relevant answers before creating a ticket, record both resolutions and escalations, and route highest-severity requests for human review.
- Answers drawn from actual support: grew the shared corpus from 46 to 76 entries using nine channels. Retrieval checks returned the right document first for 16 of 16 real phrasings.
- Control cost and uncertainty: deterministic answers and cached replies avoid model calls; source citations, tool-identity checks, spend caps and a kill switch constrain the assistant. Unknown tools escalate to a human.
- Validation and rollout: 323 automated tests and offline replay support staged rollout. A smaller low-code version lets colleagues edit the workflow; shadow runs inform its confidence threshold.
Measure Before You BuyBuild-vs-buy
Outcome: Withdrew a separate platform purchase request after less than a day of measurement and used existing infrastructure. At measured demand, owning two environments would cost roughly 50 times more per question than shared tenancy.
The proposed automation platform charged both monthly rent and per execution. I checked actual support demand before committing to a separate instance.
- Costed real usage: channel history showed roughly a dozen genuine questions a month in the busiest channel; fixed fees represented about 98% of the projected bill.
- Targeted the largest cost: compared polling with event-driven triggers that avoid idle runs. Model usage cost around eight times less than the platform's per-run fee.
- Reused available capacity: checked the existing platform's dashboards and tenancy options, then iterated locally in containers pinned to its version.
Self-Hosted CI PlatformProof of concept
Outcome: Built a reproducible CI proof of concept without requesting new infrastructure, giving the team a working system to evaluate. Production rollout remains subject to approval.
The team needed an alternative to an ageing shared CI system, with maintenance cost as the main objection. I scoped the proposal to the team's own products.
- Rebuild from an empty state: declare jobs and configuration as code, with enterprise-managed secrets and separate staging and production paths.
- Fit the workload: account for Windows agents that require domain identity, and assign source-dependent jobs to CI while keeping editable chat workflows on the workflow platform.
- Validation: all 16 checks pass from a wiped state, making the prototype repeatable for reviewers. These checks establish readiness for evaluation, not production deployment.
Shared Integration Workstation Fleet
Outcome: Provisioned the first shared machine with 19 workspaces verified clean and a shared toolset checked in place. Repeatable setup replaces machine-specific manual configuration; one interactive first-run step and the second machine remain.
A legacy integration script ran on individually configured machines, making inconsistent results difficult to reproduce.
- Use the real conventions: inspected 43 existing workspaces before writing idempotent provisioning. Re-running leaves matching configuration unchanged; syncing stays with the integration script.
- Give users consistent tools: install the shared kit for all users, skip missing shortcut targets, and verify installed file counts and versions by script.
- Respect security boundaries: use managed secrets and dry-run installation, route transfers through an authorised workstation, and leave the tray application's first launch to a person.
Documentation as a Reviewed Pipeline
Outcome: Published a reviewed runbook with separate paths for users and administrators. Publish guards now block malformed documents and missing or unexpected figure references before they reach readers.
Manual wiki edits let a critical administration runbook drift and sent mistakes straight to readers. I moved authoring and publishing into a reviewable pipeline.
- Review changes like code: generate the wiki page from source files and publish through a standard-library Python tool that defaults to dry run.
- Validate before publishing: tested all three guards against deliberately corrupted input, covering document structure and preservation of the 23 figures.
- Make guidance easier to follow: separate first-time user instructions from administration tasks and give readers one clear route for help.
How I work
Deterministic before model
If a rule can answer it, a rule answers it. A model call is a cost and a risk, so it needs to earn its place.
Dry run by default
Anything that writes, posts or deploys starts in report-only mode. Writing is an explicit flag someone has to type.
Idempotent, so a re-run is boring
Running it twice does nothing the second time. That is what makes automation safe to hand to someone else.
A gate between every stage
Shadow, then narrow, then wide — never coupled. Plus a kill switch, because the useful question is how it stops.
Design from live data
Read what the system actually does before writing the tool. Most of the good decisions above came from that step.
Escalate instead of guessing
An honest "a human should look at this" beats a confident wrong answer, especially in a support channel.