Side Projects
A selection of recent work.
Highlights
4 imagesDMARC Aggregate Report Viewer
Drop in DMARC aggregate reports and see who sends mail as your domain, and whether it passes SPF and DKIM. Reads
.xml,.xml.gzand.zipfiles, and.msgmails with a report attached. Everything runs in your browser, and nothing is uploaded.
4 imagesZPL Renderer
Render Zebra ZPL label code to vector PDF, SVG or PNG, without a printer and without an online service. Covers more than 20 barcode types, stored formats, graphics and the printer fonts, and a
zplcommand for the terminal.
4 imagesFlat Combat
A top-down arena shooter for the browser. Walls block the line of sight, so you only see an enemy that stands in your light. Classes, ranks, killstreaks and online matches on an authoritative server, with bots that fill the empty slots. No game engine and no runtime dependencies.
3 imagesDuso
A personal points app. Complete your own bounties to earn points, then spend them on your own rewards. A mobile-first PWA with activity heatmaps and a full history, and a Filament admin panel behind it.
More projects
3 imagesSolitease
A browser version of the Danish card game drille-kabale, “tease solitaire”. Two or more players race to empty their own pile onto shared foundations, while they sabotage each other by stacking cards onto the other piles. Multiplayer is peer-to-peer over WebRTC, and practice mode plays against bots, also offline.
3 images30
A push-your-luck dice game for two or more players. Everyone starts with 30 lives, and the last player alive wins. Play on one device with friends or bots, or on a device each over a peer-to-peer connection, joined with a room code or a QR code. A score keeper tracks the lives when you play with real dice.
2 imagesBIND Zone-file Differ
Compare two BIND zone files and see which records changed. It resolves
$ORIGINand$TTL, and turns TTLs such as1hinto seconds, so only real changes show up. Unified or split view, and it all runs in your browser.

2 imagesSecret Santa
My family draws names every Christmas, so each of us buys one gift instead of many. This tool does the draw: add the names and get one link per person. Each link reveals only who that person gives a gift to. The pairing is stored in the link itself, so there is no server and no sign-up.