ls ~/things-i-did-with-llms

Things I did with LLMs

Over the last few months I've been building things with LLM coding agents — from a DOS written in assembly to emulators, self-hosted infrastructure, and some sillier experiments. Here are the highlights. Everything is on GitHub.

LainDOS booting to a shell and launching the Monkey Island demo

laindos

A single-tasking DOS written from scratch in real-mode x86 assembly. Implements the INT 21h API, MZ executable loading, FAT12/16, CD-ROM via ISO-9660, a shell with batch files, and a mouse driver — enough to boot period games like the Monkey Island demo with no per-title hacks. Comes with unusually extensive documentation — annotated source, a boot-path walkthrough, the whole INT 21h surface — plus long-form bug case studies ("The Share-Bits Handle Leak", "The Sign-Extended Segment") that cover the hunt, the dead ends, and the fix. The docs site runs it live in your browser via v86.

x86 asmNASMQEMUFAT12/16v86
The Game Boy emulator running Tetris

gameboy

A from-scratch Game Boy emulator in TypeScript with one goal: boot and play Tetris in the browser — and it got there in about one hour, from first prompt to Tetris booting, written by GLM-5.2, an open-weights model. It grew a full SM83 CPU, PPU, and APU along the way — CPU validated against Blargg's cpu_instrs, PPU pixel-perfect on the dmg-acid2 and cgb-acid2 test ROMs. That's it running real Tetris above.

TypeScriptViteWeb AudioemulationGLM-5.2
Xenoblade Chronicles 2 before/after sharpness comparison

xc2 sharpness patches

Xenoblade Chronicles 2 is blurry in Switch emulators at any internal resolution: the game composites its 720p scene into a 1080p framebuffer, baking a 1.5× bilinear smear into every frame. A two-instruction ARM64 exefs patch makes the scene render at 1080p (plus an engine config that kills TMAA and half-res buffers) — fine-detail energy measured by Laplacian variance goes up ~8×. Above: stock on the left, patched on the right.

ARM64exefs pchtxtLayeredFSSwitch emulation
imgsearch library view with semantic search controls

imgsearch

Local-first semantic image search. Point it at your pictures and search them by text or by similar image — multimodal embeddings (Qwen3-VL via llama.cpp) stored in SQLite with vector search, optional Gemma-powered annotation, and nothing ever leaves your machine.

GoSQLite vectorsllama.cppSvelte
Kapsel watch page with player and up-next queue

kapsel

A small self-hosted video archive: save online videos with yt-dlp, browse and full-text search them in a clean web UI, and actually watch them — playback progress, captions, channel subscriptions, timeline previews, and TubeArchivist import included.

GoSQLite FTSSvelteyt-dlp
Eosrift landing page — your infrastructure, your tunnels

eosrift

A self-hosted tunnel service with ngrok-like ergonomics: HTTP, TCP, and TLS tunnels, authtokens, reserved subdomains, and a local request inspector with replay at localhost:4040. Single static Go binaries, Caddy for wildcard TLS, Docker-first deploys.

GoCaddyDockernetworking
neon-selfhost console dashboard

neon-selfhost

A control plane and web console for running open-source Neon (Postgres with branchable timelines) on your own hardware. Branch-first workflow: create, reset, and publish database branches, point-in-time restore by timestamp, and a branch-scoped SQL editor — built for safe upgrade rehearsals and rollback drills.

GoNeonPostgreSQLDocker Compose
A fediverse thread rendered as a Microsoft Comic Chat strip

fedichat

Paste a Pleroma or Mastodon thread URL and get it back as a Microsoft Comic Chat strip — speakers cast as the original 1996 Jim Woodring characters, with panel composition, emotion analysis, and balloon layout following the algorithms from the SIGGRAPH '96 Comic Chat paper.

JavaScriptCanvas/SVGfediverseSIGGRAPH '96
Cuyo 2.1.0 main menu running in the browser

cuyo port

The classic GNU puzzle game Cuyo 2.1.0, brought to modern systems: a native macOS app bundle and a full WebAssembly port via Emscripten, module music and all, deployed straight to GitHub Pages so you can play it in the browser.

C++EmscriptenSDLWASM