shadcn-compatible component registry.
ink, paper, hairlines — no shadows.
docs · registry.json · design system (skills)
we ship UI as static JSON. install components with the shadcn CLI — same workflow, different defaults.
50+ components. Space Mono headings, Space Grotesk body, 0.5px borders, zero box shadows. tokens live in app/globals.css; rules in AGENTS.md.
add the registry to components.json:
"registries": {
"@muffled": "https://ui.muffled.studio/r/{name}.json"
}pull @muffled/theme first, then components. use the @muffled/<name> namespace on the CLI — registry manifests declare namespaced registryDependencies (e.g. @muffled/surface, not bare surface), so the resolver stays on ui.muffled.studio instead of ui.shadcn.com.
bunx shadcn@latest add @muffled/theme
bunx shadcn@latest add @muffled/button
bunx shadcn@latest add @muffled/theme-providertheme ships Space Grotesk and Space Mono via @fontsource imports in CSS (not registry:font / Google provider — that breaks Tailwind v4 consumers on shadcn add). the CLI adds @fontsource-variable/space-grotesk and @fontsource/space-mono with the theme. Vite (and other non-Next) apps must keep those packages in package.json if you merge theme CSS into src/index.css; Next apps same unless you wire fonts another way.
full catalog: ui.muffled.studio
bun install
bun run dev # docs site
bun run storybook # component stories
bun run build # registry + next build
bun run test:visual # playwright snapshots- source in
registry/ui - register in
registry.json bun run build:registry- stories in
stories/ - docs route in
app/(docs)/components/[slug]/page.tsx - visual + build checks
match Storybook stories and the rules in AGENTS.md.
All skills: muffled.skills
# this repo
bunx skills add muffled-studio/muffled.skills --skill muffled-ui-maintainer --skill muffled-studio-design -a cursor -a claude-code -y
# consumer app
bunx skills add muffled-studio/muffled.skills --skill muffled-ui --skill muffled-studio-design -a cursor -a claude-code -y