2026-06-26·2 min read

Loom: the three-day engine

field-notesloomclaude-code

Lacunae Loom is an authoring tool for choice-based interactive fiction: a visual story map where every node is a scene with prose, atmosphere, and choices, exporting to a single self-contained HTML file anyone can play. It exists because building Perpetūra kept generating the thought “someone should be able to do this without writing JavaScript.”

Loom’s editor: a node graph of scene cards on the left, a scene editor with prose, choices and flag logic on the right

The story map with the Hyunjae sample loaded — every node is a scene, and the right panel edits prose, choices and flag logic without code.

The entire v1 was built June 14 to 16. Three days, 325 commits. That number is less about speed than about shape: the work was cut into 33 spec-and-plan pairs, each one a vertical slice (core engine, story map, flags, autosave, chapters, themes, a codex, an opt-in AI assist layer), each executed as its own branch and merged when its tests passed. 66 test files went in alongside. The discipline isn’t decoration — with slices that small, a single evening produces four or five merged features and nothing half-done is ever left overnight.

Architecture in one line: a pure TypeScript core (data model, validation, flag evaluation, export compiler) that doesn’t know a browser exists, a React app on top, and a storage seam with two implementations — IndexedDB for the web and a filesystem adapter for a desktop shell — sharing one contract test suite.

The dogfood test

The best day was the last one. I imported a slice of Hyunjae, Perpetūra’s first story, into Loom to see whether the general tool could express the specific novel. It couldn’t, twice.

Hyunjae’s routing runs on a weighted tally — choices add to an accumulator. Loom’s flags could only be set, not incremented. And several of the story’s conditions are compound (“this AND that”), which the engine had no grammar for. Both gaps went from dogfood finding to spec to shipped feature within the day: arithmetic flag operations, then compound AND/OR conditions, then the sample story refreshed to use them.

That loop is the whole reason to build tools next to the thing they’re for. An engine designed in the abstract would have shipped with plausible features and missing exactly these two. The novel knew better than I did.

Loom hasn’t shipped publicly yet. It has no marketing art, no landing page, and a to-do list. But the Hyunjae sample plays start to finish in it, three routes and all, and that was the milestone that mattered.