How this skill is triggered — by the user, by Claude, or both
Slash command
/bryllen:bryllen-newThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Create a new design project inside Bryllen and launch the dev environment.
Create a new design project inside Bryllen and launch the dev environment.
Parse the command. The format is /bryllen-new <project-name> [description].
Initialize git — check for a .git directory in the current folder.
git initCreate .gitignore — check if .gitignore exists.
node_modules
dist
.DS_Store
*.local
.bryllen
Check if bryllen is installed. Look for package.json in the current directory.
package.json: run npm init -y && npm install github:madebynoam/bryllenpackage.json exists but no bryllen dependency: run npm install github:madebynoam/bryllenIf npm install fails, stop immediately and tell the user what went wrong. Do not proceed to step 5.
Scaffold the project. Run:
npx bryllen new
This creates index.html, vite.config.ts, src/App.tsx, src/main.tsx, CLAUDE.md (project rules), .claude/settings.json (frozen guard hook), tsconfigs, and installs peer dependencies. Files that already exist are skipped.
Create the project folder structure:
src/projects/<project-name>/
v1/
tokens.css ← OKLCH custom properties (.iter-v1 + :root scope)
components/
index.ts ← barrel export — add every new component here when you create it
pages/ ← empty initially
context/ ← inspiration images (designer pastes via Cmd+V)
manifest.ts
CHANGELOG.md
Initial commit: Create a git commit with the scaffolded project:
git add . && git commit -m 'feat: init <project-name> project'
This captures the scaffold. A second commit will follow after the design is generated in the 'What happens next' sequence.
Launch the dev server:
npx bryllen design
This starts both Vite and the annotation HTTP server in one command.
Confirm: Tell the designer the canvas is ready:
"Project
<project-name>is live at http://localhost:5173"
Continue immediately with the What happens next sequence below to generate the initial design. After generating, enter watch mode automatically so the designer can annotate without running any commands.
After init, the designer describes what they want. The agent follows this exact sequence — order matters:
Check for context images — Run npx bryllen context --project <name> --iteration v1 to see if the designer pasted any inspiration images. If present, read them via the Read tool and analyze via Vision. Incorporate their style into the design directions.
GENERATE 3-5 DESIGN DIRECTIONS (MANDATORY) — This is the whole point of Bryllen. Before writing any code:
Populate tokens — Write the complete OKLCH token set in v1/tokens.css, scoped under :root, .iter-v1. Derive colors from the OKLCH palette defined in CLAUDE.md. If context images are present, extract colors from them. Every visual value (color, background, border, shadow) must be a CSS custom property. No hex values.
Create components for ALL directions — build each component in v1/components/. Components use ONLY var(--token) for visual values — no hardcoded colors, sizes, or spacing. Export every component from v1/components/index.ts.
Create pages — each direction gets its own page file in v1/pages/ (e.g., DirA.tsx, DirB.tsx). Pages import ONLY from ../components/. Also create two mandatory utility pages:
TokenSwatch from bryllen/runtime, typography scale, and spacing grid.Update the manifest — Add each component to the components map. Frames are auto-registered — the runtime detects new components and creates frame records automatically on reload. No POST /frames needed.
import './v1/tokens.css'
import { DirA } from './v1/pages/DirA'
import { DirB } from './v1/pages/DirB'
import { TokensPage } from './v1/pages/tokens'
import { ComponentsPage } from './v1/pages/components'
const manifest: ProjectManifest = {
id: '...', project: '<name>',
components: { DirA, DirB, TokensPage, ComponentsPage },
}
That's it. The canvas will auto-discover and display all components after Vite reloads.
Log to CHANGELOG.md — record the design directions and why each is different
Enter watch mode — run npx bryllen watch to start listening for designer annotations. This is critical — the designer should be able to click and annotate immediately without running any commands.
The full token system, design language, component hierarchy, and guard protocol are defined in CLAUDE.md — those rules apply to every file the agent creates.
The agent MUST follow the three-layer hierarchy:
Tokens (v1/tokens.css) → CSS custom properties, all visual values
↓
Components (v1/components/) → building blocks, use ONLY tokens
↓
Pages (v1/pages/) → compositions, import ONLY from ../components/
If a page needs a button, create Button.tsx in components/ FIRST, then import it in the page. Never inline styled HTML in page files.
This is the whole point of Bryllen — the code IS the design. Every component must work:
No static mockups. If it looks like it should do something, it does.
If a component has internal navigation (tabs, sidebar nav, segmented sections), handle it with React state inside one component. Do not split navigable sections into separate frames.
The matrix model (variations × states as separate frames) is for isolated component states. For a dashboard with sidebar nav, build one interactive component that actually swaps content on click — don't create separate frames for each nav section. That produces static snapshots where nothing is clickable, which defeats the purpose.
Rule: If a page has internal navigation, the navigation must work. Use useState to track the active section and render the correct content. One frame, one component, full interactivity.
The manifest only maps component keys to React components. Frames are auto-registered — the runtime detects new components and creates DB records automatically on reload. No manual POST needed.
import type { ProjectManifest } from 'bryllen/runtime'
import './v1/tokens.css'
import { TokensPage } from './v1/pages/tokens'
import { ComponentsPage } from './v1/pages/components'
import { DirA } from './v1/pages/DirA'
import { DirB } from './v1/pages/DirB'
const manifest: ProjectManifest = {
id: '<uuid>',
project: '<project-name>',
components: {
TokensPage,
ComponentsPage,
DirA,
DirB,
},
}
export default manifest
That's it. Add a component to manifest.components → Vite reloads → runtime auto-creates the DB frame record → frame appears on canvas in a grid layout.
For fine-tuned control (custom title, specific width, sort order), you can optionally use POST /frames:
curl -X POST http://localhost:4748/frames -H 'Content-Type: application/json' \
-d '{"project":"<name>","id":"dir-a","title":"Direction A","componentKey":"DirA","width":1440,"height":900}'
If the designer wants motion, create v1/spring.ts with golden ratio spring physics:
import { useRef, useEffect, useCallback } from 'react'
export const PHI = (1 + Math.sqrt(5)) / 2
export const SPRING = {
snappy: { tension: 233, friction: 19 },
gentle: { tension: 144, friction: 15 },
soft: { tension: 89, friction: 12 },
}
// ... useSpring hook (fixed-timestep 120Hz physics)
Components import spring as import { SPRING, useSpring } from '../spring'.
<component>-<variation>-<state>Component / Variation / Statenpx claudepluginhub madebynoam/bryllen --plugin bryllenInitiates design workflows for HTML pages, slide decks, interactive prototypes, UI kits, and brand systems. Establishes designer role, taste rules, manages design systems, and routes to specialist skills.
Generates live HTML/CSS visual direction proposals on scaffolded project dev server for side-by-side comparison and iterative refinement to select final UI design.
Builds polished visual web artifacts: pages, dashboards, prototypes, slide decks, animations, UI mockups, and data visualizations using HTML/CSS/JavaScript/React. Best for browser-rendered front-end deliverables, not back-end or non-visual tasks.