Skip to content
Projects

Things I've designed and shipped.

Each write-up focuses on the reasoning — the problem, the architecture, what was actually measured, and what the thing honestly is not.

0 bytes2026

Agent Egress Proxy — a fail-closed perimeter for outbound AI traffic

Every request an agent sends to a model vendor is redacted, metered and logged before a single byte leaves the machine.

RustAxumPII redactionBudget enforcement
Read case study
Deny by default2026

Grit — a policy gateway for MCP tool calls

A tool with no declared policy is denied, never defaulted. Every path is resolved before it is checked. Anything that may write is snapshotted first.

RustMCPPolicy isolationPath containment
Read case study
8 strategies2026

ADLC — adversarial verification judged by the filesystem, not the agent

Generate hostile variants of a tool call, snapshot before and after, and judge the diff against a declared expectation. Never read what the tool said happened.

RustAdversarial testingMCPState diffing
Read case study
1002026

PreviewProof: see your link the way the internet sees it

Paste a URL and see the Google, X, LinkedIn, Slack and WhatsApp previews it really produces, fetched the way the bots do, with a fix for each problem.

TypeScriptReact 19TanStack StartCloudflare Workers
Read case study
4 gates2026

Agent OS — the control plane that decides whether an agent may act

Not an agent. The thing that decides whether one may act, which runtime runs it, what it may spend, and when it must stop and ask a human.

PythonControl planeHuman-in-the-loopBudget posture
Read case study
Only what's new2026

News Brief

My own rebuild of Google's spoken news briefing: short bulletins I choose, stitched on Google Cloud into one brief that skips what I've already played.

PythonCloud RunffmpegText-to-speech
Read case study
≈ £02026

This site — a self-hosted portfolio with a real pipeline

Next.js, GSAP, a WebGL aurora and route changes that never wait on an animation — built accessibility-first and deployed on the same Coolify box as everything else.

Next.jsTypeScriptGSAPWebGL
Read case study

Also building

Smaller tools, mostly built for my own work with Claude Code and other agentic coding assistants. No case studies below — just what each one is, and where the code lives when the source is public.

CI Runner Router

When GitHub's free Actions minutes run out, private CI jobs move to single-use runners on Google Cloud Build's free tier, under a cap counted per second. It is designed to fall through to the next provider that still has free minutes as more are added, keeping jobs that hold secrets on Google's or GitHub's machines. In use since October.

Built for Tankster AI; source private.

MCP Front Door

An owner-only OAuth front door on Cloudflare Workers that connects my own MCP servers to Claude as custom connectors, with per-server signed tokens and passkey approval for the most destructive actions, such as deleting a project or writing to my Oracle Cloud account.

Built for Tankster AI; source private.

Hosted MCP Products (in development)

Not launched yet. A metering and billing layer for hosted MCP servers on Cloudflare Workers, tested end to end against stubs, and a TypeScript port of an MCP-server readiness scanner (46 checks, tested against the Python original).

Built for Tankster AI; source private.

Design System (in development)

OKLCH design tokens in the W3C DTCG format with automated WCAG 2.2 contrast checks, and React components on Base UI whose Storybook stories pass axe in five display modes, including high contrast and forced colours. Not yet released.

Built for Tankster AI; source private.

Codebase-Intelligence MCP Server

Hybrid retrieval for Claude Code: keyword search fused with vector similarity via Reciprocal Rank Fusion, reindexed incrementally from the git history.

Semantic Code-Search MCP Server

Extended an open-source Rust MCP server with the resources, prompts, progress and cancellation surfaces it was missing — roughly doubling the codebase.

Jank-Detection MCP Server

Watches web animations like a human tester and flags jank, stuttering and visual artefacts using AI vision.

MCP Orchestration & Tooling

An orchestration platform for running multiple MCP servers together, plus a persistent Java language-server daemon that gives Claude Code instant reconnects instead of a cold restart per session.

jdtls-claude-daemonThe orchestration platform's source is private for now.

OpenAI-Compatible API Proxy

Adapts the Augment Code SDK behind an OpenAI-compatible API, containerised and deployed.