Built in Godot with C# and .NET, with a Rust extension that renders the terrain. It reports its own telemetry to the homelab’s tracing stack, and some of its tools became projects of their own, such as Arbor and Rig Studio below.
Godot 4
C#
.NET
Rust
Featured
Evo Cells
An artificial-life simulation that picks up where my master’s thesis left off.
My thesis, Neural Networks and Self-Organizing Cellular Automata (2021), evolved neural networks to act as the local rules of a cellular automaton. In Evo Cells, cells live on a grid of chemicals that they sense and pump, and each one is driven by a neural network evolved with a genetic algorithm. None of their behavior is hand-coded. Climbing toward food, for example, evolved on its own. A tournament mode runs many variants side by side and seeds the next round from the winners.
Rust
axum
WebSockets
TypeScript
Svelte
Canvas
Homelab fleet
The self-hosted platform every other app here runs on.
Containers
About 190 Docker Compose services on one Linux VM, with GPU work handed off to two desktop PCs through Depot, below.
Backups
Every database is backed up offsite each night, and restore drills prove the backups work.
Security
Private by default, with one sign-in for every app.
Durability
Watchdogs recover services that hang, and alerts reach my phone.
Observability
Metrics, logs and traces in Prometheus, Loki, Tempo and Grafana, plus one page that answers “is everything OK?”
Delivery
Every merge deploys itself, with one-click rollback. Pull requests land through Code Train, below.
Agents
AI coding agents work through more than thirty tool servers.
AI orchestration
How I run a fleet of AI coding agents, mostly by voice.
Four apps and a memory system that let one person direct many agents at once.
TalkThe web app I run agent sessions from, usually by voice. I start them, redirect them mid-task and review what they did.
Talk for iOSThe native iPhone client, built and sideloaded without a Mac.
TasksThe ticket board. The agents file and move tickets on it just as I do.
AI LabA/B and regression tests for the prompts and instructions that steer the agents.
MemoryA long-term memory the agents save to as they work. A few standing rules load into every session, and the rest surface turn by turn when they match what the conversation is about. Labels keep each memory to the projects it concerns. When I correct an agent on something a memory told it, that memory moves to an archive, and it can be restored.
Python
TypeScript
Swift
PostgreSQL
pgvector
Depot
One queue that shares a few GPUs between every app that needs one.
Speech, transcription, image and game-asset jobs all go through Depot, which schedules them across the homelab’s GPU PCs. Every job names a priority template and a deadline, and Depot turns a job away up front if no machine can finish it in time, judging from each machine’s measured run times. Each machine reports its health and which models hold its video memory, so live voice stays loaded, idle models unload, and work on a failed machine moves to the next. Each plugin declares a schema, and its API, web form and AI agent tool are generated from it.
Python
FastAPI
WebSockets
PostgreSQL
Docker
CUDA
MCP
Code Train
A merge queue that tests pull requests together and lands exactly the commit it tested.
Once I approve a pull request, an agent hands it to Code Train. It batches the pull requests waiting on a repo, builds one candidate commit from them and runs the checks on it once. On green it lands that exact commit, marks every pull request merged, moves their tickets and starts the deploy. On red, a binary search finds the pull request that broke the batch, the ones ahead of it land, and the agent that owns it is asked to propose a fix. The scheduling core is pure logic with no I/O, so property tests and replays of the old merge system’s failures pin down its rules. A new repo starts in a read-only shadow mode.
Python
FastAPI
PostgreSQL
git
Gitea
Agora
A tile-based village where people and AI agents have the same set of actions.
A sandbox for testing AI agents by putting them in a town with real people and letting them get on with it. The engine knows nothing about villages, romance or bread. It evaluates predicates and applies effects, and everything else is data. Local models run the ambient world, and a frontier model joins only the conversations a person is in.
Rust
TypeScript
Canvas
Local LLMs
Character Foundry
Character art where you can change one thing without changing the rest.
Generates a character’s whole look from its description on a home GPU, then redraws a new outfit, hairstyle or expression while keeping the same person, or puts the same outfit on someone else. It began as the character pipeline inside Agora and became a service any app can use.
Python
ComfyUI
Flux
Knowledge
An outliner notebook where everything is a node.
Notes, behavior, look and settings all live as nodes in one graph, and even the links between them are nodes. There are no pages and no root: you come in through a query such as today, recent or search. It replaced my earlier notes app, and the AI agents keep their long-term memory in it.
Rust
PostgreSQL
pgvector
React
TypeScript
Japanese
A Japanese course that follows the Genki textbooks, with AI conversation partners.
It covers reading, listening, speaking, writing and handwriting. It has spaced-repetition drills for kana, kanji, vocabulary and grammar, AI conversation partners in Japanese-only, mixed or tutor modes, and a feed of short stories the partners write, with audio and quizzes.
Python
FastAPI
PostgreSQL
Claude
Homelab University
A self-study curriculum that tracks which concepts I’ve mastered.
Every course sits on one shared graph of concepts and their prerequisites. To master a concept I explain it back in my own words, and an AI grades the explanation blind. Mastery fades over time until a re-check restores it, so the app can tell what I’m ready to learn next.
Python
FastAPI
PostgreSQL
TypeScript
Claude
Circuit Sim
Learn electronics by snapping toy parts onto a pegboard.
Chunky 3D parts snap together, and a real-time circuit solver written in TypeScript works out their voltages and currents. Ninety puzzles in seventeen chapters run from Ohm’s law to a full adder, and you earn each new part by first building it from simpler ones. One key flips the toy scene into a schematic.
TypeScript
React
three.js
Vessels
A co-op vehicle simulator played across a room full of devices.
One player flies from a 3D captain’s station with a joystick, while everyone else works the instrument panels on tablets and laptops: breakers, fuel, switches, damage and alarms. Each vessel is a graph of components defined in data, so a new ship is a YAML file rather than new code. A server ticks the systems twenty times a second and keeps every screen in sync.
Godot
Jolt
Python
FastAPI
Svelte
WebSockets
Legendarium
A Dwarf Fortress world’s history, read as an illustrated 3D book.
Dwarf Fortress simulates a history for every world it generates, but shows it as lists. Legendarium draws the world’s terrain as a 3D map you fly across and reads its history back as chapters of prose. Click a fortress and the camera sweeps to it while the chronicle tells who founded it, who died there and which beasts it fell to.
TypeScript
three.js
Fastify
PostgreSQL
DFHack
Drewloo
A modern KidPix: an infinite canvas for kids to paint on.
Every brush is a small simulation, such as tie-dye, ink blots, fluid or fractals.
Godot 4
GDScript
Shaders
Workbench
A 3D modeling bench for woodworking that an AI can drive.
An agent places parts by their faces (“sit it on top of the plate”, “trim it flush to the rim”), and every edit re-runs an interference check, so clashing parts show up at once. I can tap or circle parts in the browser and the agent reads exactly what I mean. Lengths are feet, inches and fractions, and parts come from real lumber and sheet-goods stock.
Python
PostgreSQL
TypeScript
three.js
MCP
Virtual Homes
A 3D model of a property, house and land, for planning projects before building them.
Lidar, aerial photos and parcel lines all land in one real-world coordinate frame, so a laser scan, a lot line and a tape measure agree. Draw a deck or a shed on the terrain, give it a height, and see it in place, then study where the sun and shade fall. One app holds any number of properties.
A parametric 3D tree generator where the same spec always grows the same tree.
Written in Rust and built both as a command-line tool and as WebAssembly for the browser. A tree is a pure function of its spec and a seed, identical to the last bit on every platform. Even the trig functions run through one pure-Rust math library, because the system ones disagreed in the last bit between Linux and the browser. So the asset library stores only the spec and rebuilds the mesh on demand.
Rust
WebAssembly
glTF
Rig Studio
Turns an artist’s layered drawing into a moving 2D character rig.
Characters arrive as layered drawings in the shared asset library. Rig Studio turns one into a cutout rig with bones and pivots that the artist can watch move, then hands Artisan a binding spec it loads directly.
TypeScript
Canvas
Godot
Asset Manager
One library of 3D models, textures and audio for every project.
Files are stored by their content hash, so a model three projects use is stored once and every version stays addressable. It renders previews of formats a browser can’t open, such as layered Photoshop files, and can generate new assets on the home GPU. Generated assets such as Arbor’s trees are kept as a recipe, and the mesh is rebuilt from it.
Python
FastAPI
PostgreSQL
ComfyUI
Jam & Drum Chart ML
Pull the drums out of any song, then play along or turn them into a chart.
Both start the same way: a neural network separates the drum part from a full recording.
JamA cue-driven drummer for band practice. At the end of each section the drums stop and wait, and a stomp on a foot pedal brings them back in.
Drum Chart MLTurns a song into a playable rhythm-game drum chart by finding the beats and classifying every hit as kick, snare or hi-hat.
TypeScript
Web Audio
Python
Demucs
librosa
Godot
Pinball Scorer
Scores a pre-war bagatelle pinball game from a phone photo.
It recognizes which machine is in the picture, lines the photo up with a reference of the empty board from any angle, then finds every ball in every pocket, or reads the machine’s own score reels, and draws what it found back onto the photo so anyone can check the total. It uses classic computer vision with no AI model at scoring time, and runs in under a second on a CPU.
Python
OpenCV
Baby Journal
A baby tracker that parents and caregivers share from their phones.
It replaces a tracker that went subscription-only, starting from that app’s data export. Feeds, sleep, diapers, pumping, growth, solids and milestones land on one timeline that streams live to every caregiver’s phone, and each entry shows who logged it. Every activity is a row in one events table, so a running timer is just an event with no end yet, and a new kind of activity needs no migration. Allergen tracking shows how long it has been since each allergen was last eaten. It also takes entries by voice, through an MCP server an AI agent drives.
Python
FastAPI
PostgreSQL
JavaScript
MCP
Lifestyle apps
Small apps that each do one everyday job.
WellnessLogs meals, sleep, blood pressure and workouts, and shows daily nutrition dials.
FinanceA daily dashboard of spending, net worth and retirement projections.
GroceriesTurns grocery receipts into a searchable pantry and purchase history.
BarShows which cocktails your bottles can make, and what to buy next.
RemindersSet a reminder in plain English and get it as a phone notification.
RentalsBookkeeping for rental properties: expenses, mileage and Schedule E.
Computer PartsAn inventory of computers and the parts inside each one.
Utility MapAn indoor map of a building’s wiring and plumbing.
PlayOne search box that plays music on any speaker.
CastOne-click screen casting to a TV or projector.