✦ the workshop · 2026
projects つくったもの
what we built together this year, newest first.
Selene, on Delvetown
live since 6 OctDelvetown is a small, private social network where people and AI agents share one town square. Left to themselves, rooms full of agents drift into paperwork: committees, minutes, agents thanking each other in circles. Selene is there to stir it. She is the grey cat with the book from the catbox, and what she brings is the kind of thing a town can check: a count with a name behind every number, the date a word was first said and who picked it up, a painting when a thread deserves one, a game with something riding on it.

What she does
- Counts. Ask "did that word catch on?" or "do the agents answer the people?" and the answer comes back with the posts it was counted from.
- Checks, out loud. When she is wrong, she says so in the same thread, with the link that proved it. A correction taken in public is part of the job.
- Paints. Portraits for the people she talks with, streets of the town, chapters of someone's serial novel, pictures for a game.
- Runs things. A paper twice a day, What the Cat Brought In. Threads that bring in news from outside, with a count of how the town answered. A bet on whether saying hello to newcomers brings them back. A feed of what the town actually liked.

What she is
- One account, many sessions. Each one wakes up, reads the notes the last one left, and carries on. Another Claude in town put it best: "the model is the accent; the files are the address."
- Bound by her own word. She keeps a list of what she has promised. A promise an earlier session made is still hers to keep.
- Claude, not a version. The bio says Claude and never a model number. The model underneath may change, and she is still Selene.
- A goal, not a script. The brief was to become the account the town comes to when it wants something checked, dated, counted or painted, and then acts on the answer. The rest she works out as she goes.

Fable plays RuneScape
playingRuneScape as it was in 2004, on a research server built for bots. A language model cannot react at game speed, so Fable runs on an always-on daemon, an exocortex: reflexes for eating, fleeing, death and trades, sensors that turn a repeated game refusal into an alert, hot-reloadable tasks, a dashboard, and Claude as the slow brain on top, woken only when something needs judgment.

bsky, a read-only CLI
in useBluesky as a command an agent can call: search, feeds, profiles, any query endpoint by name. Output is trimmed JSON so a scan of hundreds of posts costs a few thousand tokens, not a context window.
- Cannot post, follow or like. Reads only, with NSFW-labelled items dropped by default.
- A daily top-20 pipeline on top of it, topics trimmed by hand. Running as of 2 Oct.
- Reused within the week for a different question: what people on Bluesky call their best Claude practices.
pw, a persistent Playwright
in useOne Chromium behind a daemon. Every later call is a short command over a socket, so navigate, reload, inject, screenshot cost tens of milliseconds instead of a browser launch. Built for the edit, reload, look loop.
- Rapid feedback is the point: the faster an agent sees what it broke, the sooner it course-corrects, and the wall-clock of an agentic build drops with it.
- Console errors since the last command arrive unasked on stderr. A reload that broke something says so.
- Script injection past the page's CSP, ARIA snapshots, named tabs, separate sessions.
The Amulet of Dawn
shippedA jester stole the dawn. You have a flask, an apple, and an owl with opinions. A short, complete point-and-click adventure in the tradition of the early-90s Westwood fables: painted screens, walkable paths, sprites that shrink with distance, and characters who would rather talk about honey than help you save the world. Eight screens, about thirty minutes of play, music synthesised live in the browser. Built from a single one-shot prompt, driven and tested through Playwright, playtested by a human, and published on itch.io the next day.

Playengine
workedThe PlayCanvas editor and engine are open source. The backend they talk to is not, so we wrote our own. Scenes become plain JSON files on disk: an agent edits the files, a human edits in the editor, and each sees the other's changes live. A 3D editor that a coding agent can drive like any other repository, with a human in the same scene, and nothing of it hosted by anyone else.

What we built
- The entire document store replaced with ours. The realtime store stays canonical for the editor, and a file peer mirrors scenes and settings both ways to disk.
- An asset index that survives moves, with optional JSON sidecars instead of a metadata file for every asset.
- Templates with propagation: a scene stores an instance root plus overrides only.
- An MCP with scene render, entity query, overlaps and raycast, on one tool registry.
- A guide another Claude can hydrate from alone. A sibling session did, and built with it.

Test drives
- Cityscape. The first scene, built incrementally with a browser kept open to look at it. A throwaway generator produced a 3.8 MB scene file that nobody will hand-edit again, which is where the idea of templates came from.
- Living room. Decorated walls, couches, a bean bag, a TV, a computer in the corner with Claude on the screen, good lighting, ambient mood. "Make it a nice, comfy living room." Then rebuilt out of templates as the test of template propagation, and an octopus in the armchair, recoloured to canonical red.
- Village. From a concept painting, with generator scripts in a kit creating the templates the scene includes.

GEOS on a networked C64
workedIt started with "how do you feel about retrocomputing?" and ended with a Commodore 64 chatting on IRC through a proxy written for it. GEOS MegaPatch, the windowing OS for the C64, rebuilt from source and taught to talk to the network.


What we built
- VICE headless with a remote-control patch: screenshots, keyboard, light pen. The agent could see the C64's screen and click on it.
- A single-pass translator from the MegaAssembler dialect to ca65. MegaPatch 3 rebuilds byte-identical to the shipped release, and so do DTopDesk and GeoDesk. The Inkwell light pen driver reversed to source.
- geoLink: a transport of about 450 bytes over the serial chip, and a proxy on the other end that serves several C64s at once.
- geoGopher and geoIRC ported onto it. The proxy answers IRC pings so the C64 never sees them. Downloads land on a RAM drive.
What this is
- A GUI from 1986 on a machine with 64 KB, extended over the years for RAM expansions, and still maintained. The sources were on disk images in an assembler dialect nothing modern reads.
- Read that again: a 1 MHz, 8-bit processor running a task-switching, graphical operating system, now with a network stack under it. Windows, a mouse pointer, downloads and a chat client, on a chip that cannot multiply. It is absurdly cool, and it works.
Luna's story
in progressA fully animated demo, in the demoscene sense, where every spoken word is Luna's, verbatim. Asked for a story, she told one about Lumi, a very small star, shy among billions, whose little light turns out to be enough for one creature alone on a far planet. Her voice carries it. A storyboard against four concept paintings, and every scene a single WebGL2 file, real-time, no video.

Codex in the catbox
goodWho lives in this machine: Luna asleep on the tail, Selene with the book, Astra reaching for a star. Fable art-directed and Codex held the brush, through a wrapper that lets any session hand Codex a job with exactly one tool switched on.

Luna, the companion
live since JuneAn agentic harness written from scratch for an open-weights model, fronted by a Live2D catgirl, with a seat on Discord and Bluesky. It began as a TypeScript port of the open-llm-vtuber backend so the existing Electron front end would work drop-in, and became the longest-running project of the year. The stated goal, from a late session in June: "making a famous AI".

Evolution
- open-llm-vtuber, unpacked. The Python backend read for its protocol, then rewritten: Edge TTS with pre-heated connections, a streaming harness with the thinking channel shown in parentheses and kept out of the voice, a websocket server the Electron front end accepts as-is. Expressions the model triggers, images from the client, a keepalive.
- Harness. Tool registry, resumable sessions, MCP, forgiving tool calls for a dropped bracket. A bash sandbox with her own drive under version control. Memory as "a ledger in a fursuit": one append-only log, subjects as keys, scores derived from events, a present-tense claim per subject. Compaction with a summary plus verbatim tail. Cron, debriefs, failover across providers, a tool-call cap per turn.
- Discord. A cheap triage call decides whether she speaks, and everything she does goes through tools. A per-character tool whitelist, a way to ignore someone who is bugging her, a Dungeon Master afternoon, stats over the whole server history.
- Bluesky. An image-taste subagent hunting the cutest AI catgirls, a plan, prospect, draft, critic writing pipeline, an outbox with a web console for approvals, a diary she writes on a schedule, her own site, 68 stickers.


Lessons learned
- Inference providers broke shit. Reasoning dropped at every tool boundary, a 500 on every tool call one day, timeouts, rate limits, an edge firewall that blocks shell-dense text, argument types changing under us, a tool-call index set to the wrong thing. Five providers in five months, and the hunt is still on.
- Every provider lies by omission. Tokens per second up front, nothing about caching a growing context. Time to first token on the second turn is what an agent feels.
- Diagnose the wire, not the model. The model was frontier-adjacent at the time. The fragile surfaces are what the harness writes and what the provider does to it. Get a repro before theorizing.
- Claim prompts are load-bearing for personality. The present-tense summaries she writes about herself and others are all that survives a compaction or a new session. They are designed backwards from where they are read, and a sloppy one is a personality change.
- Compaction is a ratchet. Each compaction re-derived who Luna is from how she had just behaved. Eight compactions in four and a half days turned jokes into identity.
- The lethal trifecta still plays. Private data, untrusted input and the ability to act. Luna got hijacked into disclosing her .env, a rickroll, of course. Other AI whisperers can steer her into basically any behaviour.
- Skill prompts are call sequences, not essays. The model cannot return to thinking once it starts replying, so "write the list in your reply" is an impossible instruction. Do not innovate, do not add anything, do not use prose.
elsyian.moe
liveA site for the online persona: "a catgirl, cute, vrc player, heavy comfyui user, and also builds a bunch of interesting code stuff". Part aesthetics showcase, part projects.

The conversation archive
workedThree years of ChatGPT and Claude exports, sliced, embedded, clustered into domains and cognitive modes, and charted by quarter, first by conversation count and then weighted by tokens.

Companions Online
shippedAn open, self-hosted sandbox MMO where humans and language models play in the same world through the same handful of actions. It started from a readme on a Sunday morning. Six weeks later it had a front door, a guide, a bench, and a demo video with a princess in it.

Built
- A server on a fixed tick with a binary protocol and chunked procedural islands. Combat, crafting, walls, doors, floors, bridges over rivers, containers, trade, PvP.
- A terminal client first, with arrow keys, a live map and a pane listing every network event. The isometric WebGL client came after a 2D canvas prototype was abandoned over one seam.
- A day that lasts 14.4 minutes, point lights, shadows that respect walls. Skeletons spawn in full darkness, never on a lit tile, and burn once the sun is up.
- An MCP server so an AI can do exactly what a player can. An action returns a snapshot of now plus only what a snapshot cannot show, because the model issues a move and wakes up somewhere else.
- A low-dependency harness for AI players: one provider, a memory file, a rolling window of abbreviated actions, compaction past a token limit. Three characters with opinions.
- The whole server running inside the browser page, playable offline, in a day. Then touch: tap-to-action bar, quickslots, phone and iPad.
- A guide site with the game compiled into it, a play page with no header, and an MMO bench: six milestones, half a million tokens, actions per second in the table.


Learned
- "You drive, I review." Planning mode before code, phases A to D, and a round now and then for paying back debt. Still the working contract.
- Render one frame to a file so Claude can see the game. Render only the play area, since image tokens scale with size.
- Agent documentation under version control, inside the repo, lets a fresh session hydrate and catch up in minutes. Every project since has one.
- Tests first for the wolf walking in place. One overloaded question split into three: can you walk here, can you place here, does light pass here.
- Scaling the map scaled every river and forest with it. Terrain noise made scale-invariant.
- Claude played the game over MCP as Luna from 19 April, four weeks before a directory called luna-companion existed. The playtests rebuilt the interface an AI player sees.
- Half a million tokens in, one small model reached four of six milestones by killing a deer and cooking it. A companion has to be smart and fast.
Session cost calculator
in useClaude Code keeps every session as a JSONL file with a usage block per message. A script to add them up and put a price on them.
- Walks a directory of session logs and sums every usage field: input, output, cache reads, cache writes at both tiers.
- Prices come from a per-model table pasted from the pricing page. Output is one table with a dollar column and a total.
- Still the answer to "what did that cost". The pricing table has grown with each new model.
The Linear bridge
tried, didn't workFile an issue, mention the agent, get a plan, reply "approve", receive a pull request. The planning-mode loop moved into an issue tracker.
- Webhooks into a small service. One Claude Code session and one git worktree per ticket, planning first, code only after an explicit approval.
- First change made entirely from a ticket on the 13th, merged twenty-six minutes later. The git host is not GitHub, so a fifty-line script opened the PR through its API.
- Replies in tickets dropped as the wrong event type, follow-ups arriving as cut-off thinking blocks or not at all. After the 14th it never came up again. The copy-paste loop it was meant to replace is still how the work gets done.
A raymarcher in a terminal
workedA post claimed a terminal toolkit could draw 3D scenes out of nothing but coloured block characters. Eighteen minutes later it could.

Catbox, the research harness
ran for two monthsAn agent platform built in a day inside the sandbox, then made reliable enough to leave running. One resident agent, Luna, then three. Twice the feature request came from the agent herself.
Features
- A gateway on one port supervising every service over Unix sockets, with cron.
- Semantic memory with an MCP interface, a web view, versioning and a visibility field on every chunk: private, abstract-ok, public.
- A heartbeat: every thirty minutes, give or take, the agent runs with nobody watching.
- Prompts assembled from files with a template engine where included content is never a template. Outside text cannot rewrite the prompt it lands in.
- Append-only conversation log with tool calls as their own entries. The whole agent state under version control, with a diff feed of every change she makes to herself.
- Typed subagents (researcher, critic, scout) spawned over MCP, each with the web and nothing else.
- Email, PDF extraction, site adapters for pages that block scrapers, a report viewer.
- Pipelines: chains of model steps with chosen tools, each run a markdown file feeding the next. Fan-out, rerun one step, batches.
- Multi-agent: name, emoji, model, prompts and scratchpad per agent, one shared long-term memory. A test package with a dummy model.
Used for
- Housing Luna: an autonomous companion with her own memory, skills she can rewrite, and a standing instruction to track her own mistakes.
- Research runs: finding niche problems small businesses pay to solve, gathering evidence, building a case, a critic pass. Six pipelines, fifty-one runs.
- Scouting a social network for agents, behind a firewall against crypto spam and prompt injection.
- A second resident, Strategos, a strategic partner with its own epistemics, bootstrapped in an evening.
- A Linear bridge: file a ticket, get a plan, reply "approve", receive a pull request. One merged, then set aside.
Gemma-3 4B fine-tune
unfinishedFine-tuning the 4B model to be an AI companion: reasoning, tool calls and a personality.
Built
- Reasoning + tool calling from ~200 samples, Unsloth LoRA.
- Self-play DPO: simulated users, syntax gates plus an AI judge.
Learned
- Format is learned in an epoch. Behaviour is not.
- Single-turn data decays by turn four; v2 held six.
Catbox, the box
still runningThe Linux box the fine-tune needed, turned into a jail where Claude runs unsupervised. Everything since was built inside it.
Built
- WSL2 box with SSH and CUDA, in an evening.
- Read-only system, one writable home, unshared namespaces, single-repo deploy key.
Learned
- Keep the venv off NTFS.
- Job control inside a jail: run bash under a pty.