Work

Built or being built. Status is honest.

14

2026

research repo

Intent and code

An empirical series on whether an author's why can be recovered from what the code does. You cannot read a purpose off code when several purposes fit it equally well. Checking a declared purpose beats guessing, but dies when the honest declaration already justifies the behaviour.

Python Statistics LLM APIs

active repo

Weave

A language for stating what must be true of a system, and a compiler that refuses to let you break it. Declare data, behavior, seams, and closures, and a deterministic checker proves on every keystroke that nothing reaches a sealed resource except through its gateway. Ships as a command-line compiler and a desktop IDE.

TypeScript Electron Compilers

active site

Skimmilk

A reading tool for dense academic papers. It clarifies jargon in place, contextualises citations so a reference is a claim you can weigh rather than a bracketed number, and reorganises the text for comprehension while keeping full access to the original.

TypeScript React FastAPI Electron LLM APIs

research repo

Does an injected date shift an LLM's preferences?

A pre-registered study of whether putting today's date in a system prompt shifts a model's answers on questions the date is irrelevant to. 39,200 generations. Mixed: irrelevant questions reach significance with tiny effects, and the bigger lever is date versus no date.

Python Statistics LLM APIs

research repo

Tension

An operator that deliberates across several cheap passes, stays silent while unsure, and decides for itself when to answer. Adaptive compute worked but is essentially PonderNet. The orthogonal-synthesis geometry is the one result both new and better, extrapolating well outside its training range.

Python PyTorch

research repo

AI image detector, one-class

A one-class detector trained only on real images, scoring how atypical an image is in feature space. The hypothesis was that it would generalise to unseen generators better than a discriminative classifier. It did not: the baseline won, including on the held-out generator. A negative result cleanly obtained, with a distributional explanation.

Python PyTorch Mahalanobis

research repo

AI image detector

A compact CNN classifying images as real or AI-generated, trained on Defactify across five generators, small enough at 1.7 MB to run on CPU. The part that matters is the holdout experiment: train with one generator withheld, then report per-generator recall, so the number is transfer rather than memorisation.

Python PyTorch CNNs

research repo

Neural quadrature

A small network that learns a quadrature rule from data, mapping a function and its bounds straight to the value of its integral. Fixed bounds are exactly linear, variable bounds genuinely nonlinear, and wide bounds break naive training until inputs and targets are log-compressed.

Python PyTorch SciPy

Pain point survey

A multi-page survey built around the group most surveys discard: the people who leave halfway. Every completed step upserts into Supabase against a session ID, and the final submit clears a partial flag, so an abandoned response is still a response. Turnstile and rate limiting are both optional.

Next.js TypeScript Supabase Zod

Shiplog

Turns commits, PRs, and issues into release notes people actually read. Reads real history from any public repository, throws away merge commits and dependency bumps, rewrites each change as a benefit rather than an echo of the commit subject, and groups it sensibly.

Next.js TypeScript BYOK LLM

2025

active repo

Synccl

A local-first secrets manager, on the premise that secrets belong next to the repository that uses them. Per-repo vaults, AEAD encryption bound at rest to the device through the TPM, Secure Enclave, or Linux keychain. Export is a portable file, passphrase or public-key encrypted.

Cryptography TPM Argon2id X25519

active repo

Luma Auth

An open-source OAuth2 and OIDC server: complete enough for a real application, small enough that you can read the authorization endpoint and know what it does. PKCE, refresh rotation, introspection, revocation, pushed authorization requests, passwordless flows, and a full consent UI.

ASP.NET Core OAuth2 OIDC PKCE Razor

shipped

Mole Simulator

An accessible game where the input device is the player, built on UCL's MotionInput and recognised for accessible gameplay with the National Autistic Society. Marching Cubes terrain with chunked SDF streaming and custom triplanar shaders. Gesture input constrains the terrain and the pacing far more than it constrains the input code.

Unity C# HLSL MotionInput

2023

archived repo

TaraOS

An experimental x86-64 operating system in C and NASM, from the first sector the BIOS loads to a shell prompt with nothing borrowed in between. Bootloader, 64-bit kernel, bitmap allocator, paging, task switching, drivers, interrupts. Every abstraction has to be built before you can use it.

C NASM x86-64