Projects
Small things I've built. A few are useful; most exist for their own sake.
Play these in your browser
Small games in C, Rust, Elm and Haskell. Five are compiled to WebAssembly and playable here. They share a design brief from an old README: everything is pushable, and optimise for OMG WOW moments.
▶ Recursive Sokoban
C · raylib · wasmBoxes contain whole levels. Push one, step inside, solve the puzzle within, climb back out. Nests up to 16 deep.
▶ Functional Sokoban
C · raylib · wasmPush value boxes through function boxes - +1, *2,
NEG, INV. Later levels quietly teach you currying.
▶ Paint Machine
C · raylib · wasmA small Zachtronics-ish factory: emitters feed colorers, cloners, portals and fans to paint bands onto a canvas. Play, step, rewind.
▶ Slime & Teleports
C · raylib · wasmSlime trails make things slide and refuse to stop. Recursive slime, coloured teleport pairs, and a lighting system I did not need to add.
▶ Worm Division
C · raylib · wasmA worm divides, and the clones replay your input history with relative orientation. Automation by accident. Now also has time machines.
These five grew out of one 685-commit repo that got away from me. In the history there's a level called09_true_infinite.txt, a05_curry.lvltitled "Currying: Make +5 Function", and a commit that just says "Put OMG TESTING level at the top". Themainbranch is mostly a segfault diary, including three separate reverts of a time machine.
Polyhedra playground
Lifted wholesale from my intuition project and embedded here to run: a from-scratch general Conway engine, nothing hard-coded per solid.
◆ Polyhedra playground
typescript · webglPick a Platonic seed, stack sixteen operators - truncate, snub, gyro,
stellate - and drag to spin. Stellation is cells of the face-plane
arrangement, on true star faces: stellate the dodecahedron, then
a, and out falls the dodecadodecahedron.
chip8
C · wasm port pending
A CHIP-8 emulator with a portable core and 36 real ROMs bundled - PONG, TETRIS, INVADERS among them. It currently runs in a terminal; a browser port is planned.
Things that are alive on the internet
- t8r8r - "fulfilling your potato-rating needs." An ELO ranking system. For potatoes. Commits include "Add cringey /about page" and "Make potatoes more boring". The joke is the product.
- shortstories.lol - short stories from language models I fine-tuned on my own laptop back in the Llama 2 days. They're not good, and I nearly cooked the MacBook making them. The domain's since lapsed; I might self-host the survivors.
- intuition - about 62 single-diagram maths proofs you can drag around and poke, plus a playground for Conway-operator polyhedra.
- classiccult - a zero-backend site listing classic and cult films across a handful of London cinemas. A GitHub Action scrapes the listings once a day into a static JSON file. To get past one cinema's Cloudflare I piggyback a stranger's residential-Pi open-data project. Nothing to host, nothing to pay for.
- choosetwo - trilemmas as SVG triangles: pick any two. CAP theorem, Zooko's triangle, Epicurus, and one for Career / Family / Hobbies. "Life is short; make a conscious decision how to spend it."
The ones that only have a gif
Terminal and GUI games with no browser versions. There are gifs.
- snake-hs - Snake, in Haskell, with
brickandvty. There is a gif. - pong-rs - Pong in Rust and ncurses. The README promises an "Unbeatably intelligent AI". It is not.
- hah - a small Rust arcade game with a GUI, and an
example.gifto prove it.
The meta bits
- super-simple-static-site-generator - "150 lines of fabulous shell script." It ran this site for years; I'm slowly replacing it, which feels a bit ungrateful. One commit reads "this script has somehow grown 😱".
- Codeschool-Video-Downloader - quietly my most-starred repo (46 ⭐), pull requests from strangers and all. It downloads videos from a service that no longer exists. Timing is everything.
- tesco_rb - a Ruby gem wrapping the Tesco API. Commit log bookend: "Published Gem! :grinning:". Proof I once finished one.
The websites before this one
This is at least the sixth version of my personal site. Each rebuild fixed a problem the previous rebuild had caused. All of them are restored and browsable in the museum. In chronological order:
- 2014 - a Rails app on Heroku. jQuery, Isotope, ScrollMagic, a Google Map, a scrolling timeline, a contact form - one homepage carrying the full weight of a web framework. The commit that added my bio is titled "Wrote some text about me. Pretty mental." The bio itself began: "Hola. This is my wonderful, inspiring, groovy, egotistical, funky site." Browse it.
- 2014 - a Jekyll blog on the Lanyon theme, at wmmc.github.io. Vim mappings, Unix permissions, DNS. Also where the CV obsession started, with a post titled "My CV... in Pure Ruby". Browse it.
- 2020 - an org-mode static site. Disqus comments, some analytics, and - per the commit log - "only adding a bloody NYAN CAT". A later commit clarifies that "Rocket ships are ESPECIALLY important to me". Browse it.
- 2021 - ssssg, the 150-line shell script above, which I wrote from scratch and then moved the whole site onto. Notable commits: "Add MIT license ¯\_(ツ)_/¯", "Some styling - I have no idea what I'm doing", and, as the final commit, "this script has somehow grown 😱". Browse it.
- 2024 - Dockerised nginx, because obviously.
- now - hand-written HTML, the thing I was avoiding in 2014. Give it eighteen months.
Running alongside all of this, for ten years, was my CV. It went: pure Ruby → org-mode → pandoc PDF → JSON Resume → "try using pure HTML as a markdown file" → "Revert 'try using pure HTML as a markdown file'" → org-mode as an intermediate format → and finally, in 2024, the last commit: "Use Google Docs instead of anything fancy."
The early stuff (2014)
My first code, from 2014, left up on purpose.
- My-First-Big-Program - scrapes sites to build Google Ads
campaigns. Contains the comment
### SCRAPE THE SITE. OMG. TOTES AWESOMEand error messages picked at random from["It's not your fault.", "Stop being stupid.", ...].sample. - Sir-Archibalds-Twitter-Account - "Aristocrat, Philanthropist & Spelling Nazi." A bot that replied to tweets mentioning "manors" as an appalled toff: "Anything less than 800 acres is pitiful."
- Wordsearch and Crossword - puzzle generators.
Learning in public, with receipts
Books I worked through - including the ones I gave up on.
- writing-an-interpreter-in-go - roughly a third through the Monkey language. "Repl/main done - CHAPTER ONE DONE!!!!"
- crafting-compilers - a Lox interpreter, abandoned with impeccable timing at the "number literals" section.
- ziglings - about 80% done in one week of July 2023. "comptime is lit 🔥", "ZIGLING RUSH".
- advent-of-code - Elixir. Exactly one day attempted. "no interesting sizes though."