Take a scheme. Deploy it your way.
Pick a ready-made scheme. Connect your AI and let it deploy the scheme, or use the package and do it yourself. Either way you get a whole working design system, and every piece carries the product reason behind it.


Connect your AI
Connect your AI through MCP. It runs the same CLI to deploy the scheme, and keeps every answer and reason, so it builds the way the system would.
"Deploy the Dense data scheme in this project."
Use the package yourself
The CLI, like shadcn/ui. One command copies the scheme’s components and tokens into your repo. You own the code. It is the same engine the MCP uses.
open-ds init dense-data
What you get · a fully fledged design system
The answer map
Every question, its answer and its because. The source the rest is built from.
- scheme.json
- AGENTS.md
Tokens
Generated from the answers. Primitive, semantic and component API tiers, light and dark.
- Style Dictionary
- DTCG JSON
- CSS variables
- Tailwind theme
- content.json
Components
Built on the component API keys. Every variant exists because an answer made it.
- shadcn registry
- React
- Radix
Storybook
Every component in every scheme, brand and mode.
- stories
- scheme switch
- mode switch
Docs
The design system’s own docs, generated from its answers: reasons, voice, a page per scope, components, themes.
- Docusaurus
- init --docs
- llms.txt
Checks
The harness checks every layer against the instructions and the specs.
- harness
- JSON Schema
- token resolve
The AI layer · optimized for agents
Your agent gets the reasons, not just the values.
Tokens tell an agent what to use. A scheme tells it why, so it can build a new screen the way the system would, and explain itself. Every scheme ships an MCP server and agent files.
MCP tools
- list_schemes()
- the schemes and what each is for
- get_scheme(id, part)
- one scheme, or one part of it
- get_answer(id, question)
- every option, this scheme’s answer and its because
- why(id, question | key)
- trace a value back to its question and reason
- when_to_use(id, situation)
- what to use, what not, and why
- compare_schemes(a, b)
- the same questions, side by side
- get_inventory(id)
- the components it carries, and why
- what_moves(id, question)
- what follows from one answer
- plan_create(id, dir)
- the command that takes the whole system
- plan_init(id) · plan_add(component)
- the commands for an existing app
An agent, asking why
AgentWhy does Dense data have two densities?
why()spacing.count → Two, because tasks.q1 scan and compare. A second, denser size serves tables and toolbars.
AgentBuilding a delete dialog. What does it say?
when_to_use()Name the exact object and the consequence. Example: “Dismiss 3 alerts? This cannot be undone.”
Also ships:AGENTS.mdllms.txtClaude skill