Work towards a 1:1 reimplementation of Frontier: Elite II (DOS, 1993) in Rust and wgpu, native and in the
browser. The original game runs inside the port on its own 386 runtime, and gets replaced routine by routine, each one
checked against the original. The AdLib music driver is already ported and plays the original music sample for sample,
and there’s a viewer for every picture, song and 3D model in the game files.
My Open Source work
Built with AI
Teskooano, in 2025, was my first big project built with AI. Everything here since then I've built working with AI coding agents.
Reverse engineering
Frontier: Elite II reimplementation
GameFrame
A framework for reverse engineering games with AI agents. The playbook is a set of skills and agents that run inside your coding agent (Claude Code, Codex, Cursor), one for each step of the method. The toolkit is a set of tested tools built around Ghidra, the Unicorn emulator and DOSBox-X, and it checks every result against the original game.
It grew out of Un-Banished, and the same method is being used on Frontier: Elite II.
Un-Banished
A new engine for Banished, the city builder from Shining Rock Software, written
in Rust. The original only runs on Windows; this runs on Windows, macOS, Linux and in the browser through WebAssembly.
It has none of the original’s code or assets, it reads the data files from your own copy of the game.
The goal is to match the original exactly. The same seed gives the same map, and saves from the original load without changes. It also adds a few things the original never had, like multiplayer and a mod browser for Nexus Mods.
Apps and experiments
Teskooano
A 3D N-Body simulation engine that simulates real physics and gives you multiple views of it in real time. It has collision detection, orbital mechanics using a Verlet integrator, and generates unique star systems from a seed string. Rendering is Three.js and the state is managed with RxJS.
The name comes from Gurdjieff’s Beelzebub’s Tales to His Grandson, where a Teskooano is the telescope in Beelzebub’s observatory on Mars.
Before AI
Everything from before that, written by hand.
Apps and experiments
Stochastic Parrot
Polly the Stochastic Parrot, a psychedelic cosmic parrot that feeds from the entropy of the universe. More simply, a Mastodon bot that sent an empty prompt to the GPT-4 API and tooted whatever came back, along with Dall-E images, ElevenLabs audio and polls. It ran as a GitHub Action on the hour.
You could say it was repeating back the hallucinations of the language model.
WebSerial.app
WebSerial.app is a Svelte application that allows browsers to communicate with hardware devices
over USB or Bluetooth serial connections.
Elite: Dangerous Immersion Toolkit
A tool that integrated with the game Elite: Dangerous to read its game log and use the data to control Philips Hue
lights. For example when entering a star system, it would adjust the colour of the lights to match the stars warm or
cool light temperature, or when overheating it would indicate by flashing the lights red.
Libraries and components
Humorous Web Components
Adding some humour back to the web. <web-sarcasm> and <web-satire> are Lit web components that
mark up your text, with a tooltip in case anyone misses the point.
Formula
Formula is a library for creating dynamic, reactive forms. Take any HTML form and Formula handles the reactive bindings
with your input elements, using attribute-based validation, the
Constraint Validation API and ARIA. Wrap a
form in <formula-form> or use the library directly. It’s the first library in
Web Helpers, and is built with Vanilla JS and
nanostores.
It started life in 2021 as Svelte Formula, a zero-configuration reactive forms library for Svelte.
RxJS Ninja
A set of NPM modules that contain Operators and Observables for any project using RxJS that give you more controls over your data - with filtering, querying and modifying data, and providing extra utilites for side effects and working with different types of streams.
ngx-editorjs
An Angular component for EditorJS allowing it to be used in Angular projects. This came with
an architecture to allow the importing of EditorJS plugins
Posts about it
Music Markup Web Components
An experiment with Web Components and StencilJS to create components that could be used to create musical instruments in the browser.
Tools
The Obsidian Garden
Both a guide to creating your own knowledge system and a knowledge system itself, designed to be used with Obsidian.
npm-lint
An attempt at writing a linting tool for the npm package.json file to reduce the security risks posed by npx and
other tools used in scripts and dependencies.
Takeoff
Takeoff is a toolkit for rapid development using Docker, allowing you to prototype web applications using a command line tool and simple blueprint that speed up development of full-stack applications.