Reference03/06
The files it writes
OpenDesigner writes DESIGN.md and PRODUCT.md at the root of your project, and everything else into an opendesigner/ folder. The token files in opendesigner/ are the source of truth, and every other file is made from them. In a test run, one sketch and build wrote 50 files with no errors.
- 1At the root. For people and AI tools. Commit both.
- 2The source of truth. DTCG 2025.10 tokens. Every other file is made from these.
- 3Made from the tokens. Exports and pages. Every build rewrites them, so don't edit them by hand.
- 4The record. Append-only decisions, the locked standards, and the state a later session continues from.
- +Only when you ask. RATIONALE.md, feedback.md, references/ and the private journey/ log, which stays out of git.
At the root of your project
DESIGN.md: your design rules in plain words, for people and AI tools. It refreshes after every decision, and each section shows its zoom level.PRODUCT.md: what the product is, who it is for and where it runs, so later sessions don't have to guess.
The tokens
opendesigner/ holds 11 files in the open DTCG 2025.10 format:
primitives.tokens.json: the raw palette and scales;semantic.tokens.json: roles that don't change by mode;semantic.andcolor. light. tokens.json semantic.;color.dark. tokens.json - three density files: spacious, comfortable and compact;
motion.andstandard. tokens.json motion.;reduced. tokens.json opendesigner., which ties the modes together;resolver.json - a small metadata file.
The exports
All of these are in opendesigner/. Every build rewrites them, so don't edit them by hand.
Change the decision
Record it with set, then build. Every export changes together, and the log says why.
$ engine.py set dials.roundness 60 --why "softer corners for a friendlier feel" $ engine.py buildRewritten together
css/tokens.css --ds-radius-control: var(--ds-radius-8); swift/DesignTokens.swift public static let radiusControl: CGFloat = 8 compose/DesignTokens.kt val radiusControl = 8.dp decisions.md ## D-0009 · dials.roundness = 60
Edit an export by hand
The next build rewrites it from the tokens. Swift, Compose and Tailwind never changed, and the log knows nothing.
opendesigner/After the next buildbuild/ - --ds-radius-control: var(--ds-radius-6); + --ds-radius-control: 8px; typed in by handcss/ tokens.css
$ engine.py build css/tokens.css --ds-radius-control: var(--ds-radius-6); back to the tokens swift/DesignTokens.swift radiusControl: CGFloat = 6 never changed decisions.md (no entry)
css/: CSS variables you can use in any web project.tokens.css tailwind/: a Tailwind CSS v4 theme, so utility classes use your colors, spacing, radii and type.theme.css figma/: Figma variables, with one import file per collection and mode infigma/, andimport/ figma/for Tokens Studio.variables.json paper/: tokens for the Paper design tool, in light and dark.swift/: the same values for iOS apps.DesignTokens.swift compose/: the same values for Android apps built with Jetpack Compose.DesignTokens.kt dtcg/: one DTCG resolver file for token tools that take a single entry point.artifact/: the system as files for a Claude Design System artifact: tokens, a brand book, a cover and a button preview.project/
See Export for how to use each one.
Pages you open in a browser
opendesigner/: your whole system on one page, including what is still missing. It works offline and loads nothing from the web.overview.html opendesigner/: every token on one page.preview.html opendesigner/: seven visual templates filled with your own values: palette, type scale, spacing ruler, radius, elevation, motion and component sheet. The option gallery is filled per question withpreview/ engine.py show, and the taste poll is built bytaste.py buildintoopendesigner/.preview/ taste- poll/
The record
opendesigner/: every decision, how it was set and why. It is append-only, so a later session doesn't quietly undo a choice.decisions.md opendesigner/: the house and project standards this project follows, locked, with their sources.standards.md opendesigner/: where you left off, so you or another AI tool can continue later.state.json DESIGN.mdand the tokens are made from it.opendesigner/: a copy of each standard this system follows, as it follows it. Keep it next tostandards- state.json state.json.
See Decisions, DESIGN.md and the overview page.
Written by the skill, or only when you ask
These are not part of an engine build:
opendesigner/: one page for the team on what was chosen, why, and what is still open. The skill writes it from a template.RATIONALE.md - A short note in your
AGENTS.md, added only after you say yes. It tells later AI agents to readDESIGN.md, use the tokens and runengine.py review. opendesigner/, written only if you report something withfeedback.md engine.py feedback.opendesigner/, written only when you share a reference with the extract skill. It holds the measurements taken from it.references/ opendesigner/, written only if you said yes to the private log. It is kept out of git.journey/
What to commit
Commit DESIGN.md, PRODUCT.md and the opendesigner/ folder, so your team and your next AI session work from the same rules. The private log in opendesigner/ stays out of git.
Because the exports are made from the tokens, you can rebuild them at any time with engine.py build. You can commit them so your apps import them directly, or rebuild them when you need them.
How the files relate
opendesigner/holds your answers and settings.state.json - The tokens in
opendesigner/are made from it. They are the source for everything else.tokens/ - The exports, the pages and
DESIGN.mdare made from these. - The decision log records why each value is what it is.
To change anything, record a decision with engine.py set, then run engine.py build. See Engine commands.