How this skill is triggered — by the user, by Claude, or both
Slash command
/bryllen:bryllen-designThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Start the Bryllen dev server and enter watch mode.
Start the Bryllen dev server and enter watch mode.
Kill only THIS project's existing servers (not other bryllen instances):
if [ -f .bryllen-ports.json ]; then
# Kill by PID (safe) — never by port (could kill another project's server)
node -e "
const f = JSON.parse(require('fs').readFileSync('.bryllen-ports.json','utf8'));
for (const pid of [f.pid, f.vitePid, f.httpPid].filter(Boolean)) {
try { process.kill(pid, 'SIGTERM'); } catch {}
}
"
rm -f .bryllen-ports.json
fi
This reads PIDs from the ports file and kills only THIS project's processes. Other bryllen instances are untouched. It's fine if nothing was running.
Start the dev server in the background:
npx bryllen design
Confirm: "Dev server running. Canvas at http://localhost:5173"
3.5. Check for existing projects:
ls src/projects/ 2>/dev/null
type: 'project' annotation that the New Project dialog sends.Drain backlog: Run npx bryllen pending to check for annotations that arrived before the session started. Process each one following the guard protocol.
Check for context images: Before generating any designs, run:
npx bryllen context --project <name> --iteration <v>
This returns paths to inspiration images. Read them with the Read tool and analyze via Vision. Incorporate their style into your generations.
Enter watch loop: Run npx bryllen watch in a loop. Each call waits up to 15 seconds for the designer to click "Apply" on an annotation. Three outcomes:
Regular annotation arrives (JSON with annotation data) — process it:
The annotation IS the map. Read the fields, construct the path, done:
project → src/projects/{project}/frameId prefix (e.g. v9-shell) → v9/ foldercomponentName → file in components/ or pages/NEVER guess the project from git commits, Explore agents, or "which is active" heuristics.
npx bryllen progress <id> "Reading file..." to show status on canvascomponentName in src/projects/{project}/{iteration}/ — that's the filecomment, selector, and computedStyles for what to changev<N>/components/ or v<N>/pages/npx bryllen progress <id> "Applying changes..."tokens.cssnpx bryllen progress <id> "Taking screenshot..."npx bryllen screenshot --frame <frameId>
npx bryllen resolve <id> (this auto-commits project changes)CHANGELOG.mdnpx bryllen watch again — back to waitingIteration request arrives (JSON has type: 'iteration') — run the iteration protocol:
manifest.ts, find the active iteration (last with frozen: false)frozen: true)cp -r v<N>/ v<N+1>/v<N+1>/tokens.css: .iter-v<N> → .iter-v<N+1>frozen: false, update import pathscommentnpx bryllen screenshot (no --frame = all frames)
npx bryllen resolve <id> (this auto-commits project changes)CHANGELOG.mdnpx bryllen watch again — back to waitingProject request arrives (JSON has type: 'project') — create a new project:
{ name, description, prompt }src/projects/<name>/v1/{tokens.css, components/index.ts, pages/, context/}:root, .iter-v1 as the selector — without :root, frames render as unstyled plain text because they don't have the .iter-v1 class wrapper. This is the #1 cause of "designs show unstyled text" bug.manifest.ts (with import './v1/tokens.css' at the top) and CHANGELOG.mdprompt is provided, follow the "What happens next" sequence from /bryllen-new EXACTLY — especially step 1 which REQUIRES generating 3-5 genuinely different design directions. The "All Directions" page must be the first thing the designer sees.npx bryllen resolve <id>npx bryllen watch again — back to waitingShare request arrives (JSON has type: 'share') — deploy to GitHub Pages:
{ project: '<name>' }npx bryllen progress <id> "Checking GitHub authentication..."gh auth status
~/.bryllen/auth.jsonGH_TOKEN env var for gh-pageswhich gh
npm:gh-pages package directly (it uses GH_TOKEN)npx bryllen progress <id> "Building project..."/bryllen-share <project-name> — this handles build, deploy, and URL writingnpx bryllen resolve <id>npx bryllen watch again — back to waitingPick request arrives (JSON has type: 'pick') — promote the picked direction(s) to a new iteration:
frameId, frameIds, and comment from the annotation
frameIds is an array when multiple frames were selected (marquee multi-select)frameId is a +-joined string of all IDs (e.g., "dir-a+dir-b+dir-c")npx bryllen progress <id> "Picking direction..."pickedFrameId to the chosen frame's ID (this fades other frames)pickedFrameIds to the array of chosen frame IDs (all picked frames stay unfaded)frozen: truefrozen: falsenpx bryllen progress <id> "Taking screenshot..."npx bryllen screenshot to verify the resultnpx bryllen resolve <id> (auto-commits)CHANGELOG.mdnpx bryllen watch again — back to waitingMulti-pick strategy: When the designer selects multiple frames, they want to combine strengths from each:
Context image annotation arrives (annotation on a Context Image component) — use the image for inspiration:
npx bryllen context --project <name> --iteration <v> to get image pathsTimeout (JSON contains "timeout": true) — no annotation arrived. Run npx bryllen watch again to keep waiting. The timeout exists so you stay responsive to designer messages between polls.
Chat while watching: The designer can send messages at any time — you'll see them between watch calls. Handle the message (answer a question, make a change, kill the server, etc.), then resume the watch loop by running npx bryllen watch again.
All annotation commands output JSON for easy parsing:
# Wait for next annotation (15s default timeout)
npx bryllen watch [--timeout N]
# Mark annotation as resolved (auto-commits)
npx bryllen resolve <id>
# List pending annotations
npx bryllen pending
# List all annotations
npx bryllen list
# Screenshot canvas
npx bryllen screenshot [--frame <id>] [--delay <ms>]
# Get context image paths
npx bryllen context --project <name> --iteration <v>
npx claudepluginhub madebynoam/bryllen --plugin bryllenManages Bridge design workflow commands (make, fix, done, setup, drop, status) and enforces compiler-driven Figma/design-system rules. Use for Figma designs or Bridge workflow.
Autonomously builds multi-page websites via baton-passing loop: generates HTML/CSS/Tailwind pages with Claude or Stitch, integrates, verifies visually via browser automation, queues next tasks.
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.