title: Projects
Projects
Explodorama
A turn-based, mobile-first, roguelike take on the 1985 NES bomb-laying classic. Every bomb counts down with your moves, so nothing happens until you act — and you can see exactly what will burn before you commit. Clear enemies, uncover the hidden exit, and collect power-ups across a 20-level run. Early development.
Nordic Skating
An endless skate across an endless lake of thin black ice, for a phone. The ice sings under the blades the way real black ice does, and its pitch tells you how thin it is. Leave it alone and it skates itself; steer, and you choose where the lake forks. Every visit is a different lake — by day, at dusk, under the Milky Way or the northern lights. Inspired by National Geographic's Hear the Otherworldly Sounds of Skating on Thin Ice.
auto-print
A command-line tool that turns markdown manuscripts into books: an epub, a docx, a pdf, and a Kindle kpf for each one. It's made for writers who keep their drafts in markdown next to their notes — it publishes only the story, plus any extra pages you name (a dedication, a character guide), and never changes the source files. One config file lists the books, and one command builds all of them, using pandoc under the hood. I built it to turn my upcoming writing into books.
🛰 Tower
The companion website for Conversations with Aliens, a novel I'm working on. Tower is the story's fictional space station: a spinning cylinder orbiting Earth, with an inner surface the size of Wisconsin, lit by sunlight piped down its axis. Browse the unrolled surface map, view Tower from outside, or stand on its inner surface with the ground curving up on both sides and the far side of the world hanging 100 km overhead. The world generates itself live in the browser, complete with weather, a day/night cycle, railways, and a scenic tour.
BlueShadow
A Milkdrop music visualizer that runs full-screen on the Galaxy Z Flip 7's closed cover screen, driven live by the phone's microphone. 395 presets, controlled entirely by gestures, installable as a PWA. Rendering is done by butterchurn.
Engye
A web app for sharing files between devices using QR codes. No accounts, no cloud, just scan a QR code and the file is transferred directly between your devices using WebRTC. You can share one file at a time, or a whole queue of files. The app works entirely in the browser, and the file data is end-to-end encrypted, so the key never leaves your devices. It's a great way to quickly transfer files between your phone and computer without needing to email them or use a USB cable.
Shadow Zone
An interactive seismic wave simulator that visualizes why earthquake waves can't reach certain parts of Earth's surface — the "shadow zones" created by the liquid outer core. Adjust core size and wave velocities, trace P- and S-wave paths using Snell's law, and explore alternate planetary structures like "Water Core" or "Giant Core." Runs entirely in the browser with no external dependencies.
When Am I?
Imagine you're a time traveler who ends up in a random place and time in history — what does a local say when you ask "When am I?" Pick a spot on an interactive map and choose a date; the app shows you the calendar system and local year that would have been in use there and then.
Solo Dungeon Master
An AI-powered solo tabletop RPG that runs entirely in the browser, with Claude as your Dungeon Master. Pick from 10 races and 10 classes, then explore a narrative adventure in the Cypher System. You supply your own Anthropic API key — it never leaves your device. Adventure state saves to browser storage so you can resume where you left off, and encrypted URLs let you share a session without exposing your key.
Herd
A browser game about herding sheep. Tap the field to send your border collie to that spot — the dog scares nearby sheep, so use it to push the flock toward the pen before time runs out. Sheep flock together naturally, so working from the sides and behind is more effective than chasing them head-on. Physics, flocking AI, and rendering are all hand-rolled with no game engine.
AI Chat for Android Auto
An Android Auto voice assistant that sends your spoken questions to an AI provider and reads the responses back through the car's speakers.
Haunt
An Android app that uses WiFi Round-Trip Time (RTT) ranging to calculate your phone's position and automatically switch the correct Philips Hue light for whichever room you're in. No floor plans, no coordinate systems, no backend — just three Google WiFi pucks and a calibration step.
Send Dunes!
A sand dune simulation game where you control the wind to push, sculpt, and reshape a dune across a desert landscape.
Nuts
A phone-focused full-screen toy: a box of hex nuts bouncing around with 2D physics. Tilt your phone to shift gravity, shake it to scatter them, and feel haptic feedback on every wall collision.
Alphabeticals
A 1–10 player word-association card game for mobile browsers. Players take turns naming things from a category while playing letter cards from their hand. Use special cards to skip opponents, swap hands, or change the category. Last player holding cards loses.
Bubbles
Your phone is a glass of water. Tilt it to slosh the liquid side to side; tilt past 45° and water spills over the rim permanently. Tap anywhere to drop a random object in — some float, some sink. Desktop users move the mouse instead of tilting.
Slide!
Multiplayer slingshot curling for 1–10 players in the browser. Pull back your puck like a slingshot and release to throw. Choose between nearest-to-jack or target-ring scoring across multiple rounds, with a running leaderboard. Join via link or QR code — no install required.
Flight
A browser-based hang glider flight simulator inspired by the hang glider levels of Pilotwings 64. Soar over hand-crafted terrain, ride thermals, race other players in real time, and share your own worlds. Includes a free-fly island and a timed desert race mode with a leaderboard.
Chance It!
A multiplayer push-your-luck dice game for 1–10 players, no install required. Roll 3 dice each turn, bank your gold, or press your luck for more. Hit 3 skulls in a single turn and you bust, losing all unbanked points. First to 13 wins.
Word Waltz
A two-player asynchronous Wordle duel. One player picks a secret 5-letter word; the other plays Wordle against it and scores based on how many guesses it takes. Then the roles swap — back and forth indefinitely, with a running scoreboard. All game state is end-to-end encrypted; the key lives only in the share URL.
Cat Playground
An interactive web toy for cats. Animated critters (fish, ants, fireflies, laser dots…) wander across a full-screen tablet display. When the cat taps one, it reacts with animations and sounds. A human controls the experience from their phone by scanning a QR code — no app install required.
Secret Bangers
A browser-based multiplayer implementation of the Love Letter card game, with historical figures (Casanova, Tesla, Kafka, Cleopatra…) as characters. 2–4 players join via QR code; all game logic runs in the browser and syncs through Firebase in real time. No accounts required.
Friend Compass
Real-time location sharing for a group of friends. Share a room link or QR code; everyone who joins sees each other as directional arrows on their screen. No accounts, no app install — just a mobile browser. Location data is encrypted; the key lives only in the room URL.
Separator Page
This is a simple web page that can be used as a separator/container for other web pages. It has been recently rewritten and now supports custom icons.
I use it with FireFox and Tree Style Tab to organize my browsing, but you can use it in any other browser that supports nested/vertical tabs, or even just as a random page where you can customize the title, the icons, and the body.

Quotable
Quotable is a web and Android app that shows random quotes.
The Android version can pop-up regular notifications, so you can get random quotes throughout the day.
The Android version is not yet on the Google Play store, so you'll need to sideload it.
template
This is an OSS CLI for automating folder/file creation.
Hawk
This is a web app that allows you to specify a duration (eg. "5:32"), then Hawk will find a song in your Spotify library with that length, and with one click you can start playing this song through Spotify.
Godot 2D shooter experimentation
This is my first real foray into using a game engine, so I'm experimenting with Godot and making a simple 2D space shooter.
Try the work-in-progress game here.
Find Stone Beer
Go app that uses https://find.stonebrewing.com/ API to notify me when Arrogant Bastard is shipped to stores around me. Pushover is used to deliver messages to my phone. This was a proof-of-concept implementation to figure out how to provide regular notifications without running a server.
Quantum Inspiration
This is a similar notification implementation to "Find Stone Beer", but this app uses Australian National University Quantum Numbers API to pick a random Wikipedia article and send it to me every morning. If a particular theory of the multiverse is correct, then every day 256 versions of me will receive a different article, and will thus lead to a slightly different day. Mostly, though, this was just something to do for fun.
Task Heap
Task Heap is a Flutter task-organizing web app. The basic concept here is to have a heap of tasks, then skipping big or complex tasks until you find a task that feels "doable". Eventually, all tasks will get done, as you complete the tasks in the order that works for you.
Dao
Dao is a TypeScript version of the game Dao.
Play it here.