ReferenceThe design/ folder⌄
The design/ folder
Everything spool draws lives in one folder in your repo, design/. Frames are ordinary TSX files, so Git tracks them like the rest of your code.
What lives where
- frames/<name>/frame.tsx
- The frame: a file that default-exports one React component.
- frames/<name>/frame.json
- Its size and place on the canvas.
- frames/<page>/<name>/
- A frame on a page. Pages hold pages, to any depth.
- ../../..
- Components more than one frame uses.
- ../../../../tokens.css
- The project's tokens, for every frame without a theme of its own.
- ../../../../transitions.css
- How the player moves between frames, in plain CSS.
- ../../../../scenarios/*.json
- Named seeds for the state a session starts from.
- ../../../../assets
- Images and fonts more than one frame uses.
- ../../../../thumbnail.*
- The project's picture on Home.
Names
A frame is named by its path under frames/: checkout on the root page, shop/checkout on the page shop. That full name is how links, commands and addresses reach it. A variant is a sibling with a -- suffix, such as checkout--empty: a complete frame of its own, filed beside the one it varies. Deleting a frame is deleting its folder.
Pages
A folder under frames/ without a frame.tsx is a page, and each page is its own canvas. Rename or move frames and pages on the canvas, and spool rewrites every link that named them. A move made outside spool leaves those links for you: spool flows marks them missing.
frame.json
The one file both hands write. The agent writes the size, { "w": 1440, "h": 900 }, and spool adds x and y beside the page's other frames. A frame with no size is 1440 by 900. Your drags and resizes rewrite it after that.
spool's own files
canvas.json and .spool/ belong to spool, and nothing else writes them. spool init also leaves AGENTS.md and CLAUDE.md in design/, pointing your agent at spool skill.