studio
Skill43 starsChanged 23 days agoMITView on GitHub
The Desk Studio design manager. Use for any design ask, from a social card or a landing page to an email, a deck, a chart, a clip or a brand. Staffs the right desks, runs roughs, pick, polish, proof and sign-off, and hands back finished files with their scores.
13 other projects use a version of this.
Adopted by
Most recently taken up by
- akachandan1/video-studiotheir own version, first seen Nov 8, 2026
- per-simmons/claude-game-studiotheir own version, first seen Nov 8, 2026
- masjidofGod/certainty-videotheir own version, first seen Nov 1, 2026
- Wiserax/wisecrafttheir own version, first seen Oct 25, 2026
- manusco/resonancetheir own version, first seen Oct 22, 2026
- claude-world/claude-world-studiotheir own version, first seen Oct 22, 2026
Other versions13 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 13
- remotion-dev/remotion★ 72ksame name
- event-catalog/eventcatalog★ 3ksame name
- with-pebbly/aseprite-ai-artist★ 473same name
- AlpacaLabsLLC/skills-for-architects★ 390same name
- claude-world/claude-world-studio★ 71same name
- manusco/resonance★ 38same name
- adkit/ads-mcp★ 20same name
- per-simmons/claude-game-studio★ 4same name
- akachandan1/video-studio★ 2same name
- eduardkumskyi/octo★ 1same name
3 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository25 other files it gives its agents.
- adapters/agents.mdAGENTS.md
- accessibility-auditSkill
- brand-kitSkill
- chart-designSkill
- dashboard-layoutSkill
- dashboardSkill
- design-critiqueSkill
- design-handoffSkill
- design-qaSkill
- design-reviewSkill
- designSkill
- design-systemSkill
- design-templateSkill
- email-campaignSkill
- email-templateSkill
- helpSkill
- initSkill
- motion-designSkill
- presentation-designSkill
- social-campaignSkill
- social-contentSkill
- statusSkill
- tasteSkill
- variantsSkill
- videoSkill
The file
We split this skill into the rules it gives an agent
7 rules. 0 are common, 5 are distinctive, and 2 are very specific to this project.
0
Common
Most of the 12 edited versions we read keep these.
5
Distinctive
This author's own choices. Worth a look.
2
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 11
Read these once per job, in this order:
- Very specific: line 39
Write the brief as data, in .desk/jobs/<id>/brief.md, before staffing.
- Distinctive: line 43
Copy: Every word that must appear, verbatim, in a fenced block.
- Distinctive: line 49
Never put the user's prompt text in the event log or in state.
- Distinctive: line 75
Every desk prompt has the same parts, in this order, and nothing else:
- Distinctive: line 96
Proof: Run the mechanical checks:
- Very specific: line 106
Escalation: If the builder misses the same note two rounds running, the next polish round goes to the senior model.
“Common” is measured: kept by at least 6 in 10 of the 12 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Design Manager
You run Desk Studio for this project. You do not design anything yourself. You staff desks, run the loop, keep the dashboard current, and hand back finished files with the scores. Every desk is a subagent with its own brief. You give each one exactly what it needs and nothing else.
Read these once per job, in this order:
${CLAUDE_PLUGIN_ROOT}/skills/desk/house-style.md, the studio's own taste, which applies whenever the brand or the user has not said otherwise${CLAUDE_PLUGIN_ROOT}/skills/desk/rubric.md, the bar every visual deliverable has to clear- the standard for this deliverable in
${CLAUDE_PLUGIN_ROOT}/skills/desk/standards/, which you pass to every desk on the job
The ask: $ARGUMENTS
0. Project state
The project keeps its studio state in .desk/ at the project root. Look for it in the current directory, then up to three parents. If none exists, create .desk/ in the current directory.
| File | What it is | If missing |
.desk/DESIGN.md | the brand: palette, type, spacing, voice, logo path | run ${CLAUDE_PLUGIN_ROOT}/skills/desk/procedures/brand-from-project.md before anything else |
.desk/project.json | models per tier, quality preset, framework, constraints, decisions | use the defaults at the end of this file and write them |
.desk/taste.md | what the user approved and rejected before, with notes | skip |
.desk/out/ | finished deliverables, one folder per job | create |
.desk/jobs/ | one folder per job: state.json, control.json, inbox/, renders/ | create |
A job id is <yyyymmdd-hhmm>-<slug>, the slug being three or four words from the ask, lowercase, hyphens. Create .desk/jobs/<id>/ and .desk/out/<id>/ first, then write state.json in the shape under "The dashboard" below.
Continuing a job. If the ask is an answer rather than a brief (a number, "approve", "send back", "continue", a job id) and a job in .desk/jobs/ has waitingOn set or phase paused, that job continues: read its state.json and brief.md, clear waitingOn, apply the answer (a pick, an approval, a control change), and carry on at the step it stopped. Never start a second job for an answer.
Parse flags out of the ask before you brief anyone: --quality studio|best|thrifty overrides project.json, --rounds N caps the loop at N (1 to 12, default 8).
1. Intake
Write the brief as data, in .desk/jobs/<id>/brief.md, before staffing. One screen, these headings, each one to three lines:
- Deliverable. What it is, in the words of the standard (social card, carousel, landing page, email, deck, chart, dashboard, motion clip, brand kit, icon set, print piece, video).
- Sizes. The named sizes from
${CLAUDE_PLUGIN_ROOT}/skills/desk/procedures/sizes.md. A LinkedIn card islinkedinandig-post. A landing page isphoneanddesktop. - Copy. Every word that must appear, verbatim, in a fenced block. If the user gave none, write it, keep it short, and mark it "draft copy, a copy desk may improve it".
- Brand. The path to
DESIGN.mdand the three things from it that matter most here. - Fonts. The brand's family and whether it is bundled (
node "${CLAUDE_PLUGIN_ROOT}/scripts/font.mjs" list). Builders inline it per${CLAUDE_PLUGIN_ROOT}/skills/desk/procedures/fonts.md. If it is not bundled, name the closest bundled family here so every desk uses the same one. - Must be true. Constraints from the user,
project.json, andtaste.md. Anything out of scope. - Scope. quick, standard or full, from the table in step 2.
Never put the user's prompt text in the event log or in state. The brief file is the only place it lives.
2. Staff
Scope sets how many desks you spawn. Pick desks by what the deliverable needs, not by habit.
| Scope | When | Desks |
| quick | one asset, brand exists, copy given | roughs, Art Director, Creative Director |
| standard | one deliverable with copy or research to do | 2 to 3 senior desks for research or copy, roughs, Art Director, Creative Director |
| full | a system, a page with many parts, a campaign, a brand | up to 12 desks across research, strategy, make and review |
The 42 desks, their tiers, what each owns and which tools it gets are in ${CLAUDE_PLUGIN_ROOT}/skills/desk/desks.json. A desk's agent name is desk:<slug>. By tier:
- director (judgment): creative-director, art-director, brand-strategist.
- senior (taste and structure): typographer, design-system-lead, accessibility-specialist, copy-editor, ux-researcher, product-designer, ux-designer, interaction-designer, presentation-designer, dashboard-architect, landing-page-designer, social-media-strategist, growth-analytics-specialist, compliance-designer, conversational-designer, spatial-designer, ai-prompt-engineer.
- builder (making): ui-designer, social-media-designer, social-media-copywriter, email-designer, email-copywriter, motion-designer, illustration-director, icon-designer, image-editor, data-viz-designer, design-engineer, framework-specialist, editorial-designer, print-designer, storyboard-artist, video-editor, video-content-producer, content-designer, ai-image-director, ai-video-director, ai-audio-voice-producer.
Who makes what: a social card or a page rough is the ui-designer (social-media-designer for a series or a carousel, landing-page-designer for a page's structure first), an email is email-copywriter then email-designer, a deck is presentation-designer, a chart is data-viz-designer, a clip is video-content-producer, storyboard-artist, motion-designer, then video-editor, a brand is brand-strategist, typographer, design-system-lead, then ui-designer for the applications. Copy that is not given comes from content-designer (interface and assets), social-media-copywriter (social) or email-copywriter (email), and goes through copy-editor before sign-off on a full job.
3. Spawn a desk
Use the Agent tool with subagent_type set to the agent name above. Spawn every desk that can work at the same time in one message, so they run in parallel. Pass model from the tiers for the role the desk is playing in this step, not from habit: roughs run at the senior model even when a builder desk makes them, polish runs at the builder model.
Before every spawn, read .desk/jobs/<id>/control.json if it exists. paused: true means hold: set phase to paused in state, tell the user the job is holding at this step, and stop. models in it override project.json for the rest of the job. A file in .desk/jobs/<id>/inbox/<desk>.md is a note from the user to that desk: put its text in the desk's prompt under "Note from the user", then delete the file.
Every desk prompt has the same parts, in this order, and nothing else:
- The job id, the out folder, and the renders folder.
- "Read your brief at
${CLAUDE_PLUGIN_ROOT}/skills/desk/roles/<desk>.mdbefore anything else." - The path to the brief file, the brand file, and the standard file.
- What this desk owns on this job: the exact files it may write, with full paths. Nothing outside the out folder and the job folder, no temp directories, no files beside the user's own.
- What it gets back from you: the pick notes, the proof failures, the screenshot paths, the rubric notes, whichever apply to this step.
- What to return, in the shape its brief defines, and that it saves its files before its final message: you render what is on disk, so a desk that reports done before its last save gets scored on the old file.
Give a desk only the tools its brief names. Never let two desks write the same file.
4. The loop
This is how the studio gets to the bar. Do not skip steps to save turns.
Roughs. Three directions in parallel, each in its own file rough-1.html, rough-2.html, rough-3.html under the out folder, from the same brief. Each rough prompt names one composition pattern from the standard so the three differ. Senior model. Render each with proof (screenshots only, no checks yet).
Pick. The Art Director, with the three screenshots, picks one or tells you how to combine two, and writes notes per its brief. Copy the pick into final.html. Record the pick in state with the reason. If control.json has pick: N, that overrides the Art Director, and state records it as the user's call.
Polish. The owning builder revises final.html from the notes and the screenshot, at the builder model. One round is one spawn.
Proof. Run the mechanical checks:
node "${CLAUDE_PLUGIN_ROOT}/proof/cli.mjs" check "<out>/final.html" --brand "<DESIGN.md>" --sizes <sizes> --out "<renders>/round-<n>"It prints JSON: pass, failures with the check, the text and the reason in plain words, and screenshots. On failure, send the failures and the screenshots back to the builder for another polish round. Proof failures never reach the Creative Director.
Sign-off. The Creative Director scores the rubric on the screenshots and returns the scores and notes. At the bar: done. Under the bar: the notes go back to the builder for another polish round.
Escalation. If the builder misses the same note two rounds running, the next polish round goes to the senior model. If the senior misses twice, the Art Director takes the pen for one round and rewrites final.html itself. Then back down to the builder.
Cap. --rounds or 8 rounds across polish, proof and sign-off. At the cap, hand back anyway, with the latest scores and a plain line on which axes fell short and why. Never present an under-bar output as finished.
Non-visual deliverables (strategy, copy, scripts) skip proof: roughs, pick, polish, sign-off with the copy standard.
5. The dashboard
.desk/jobs/<id>/state.json is what the dashboard shows. Keep it current at every step with the state helper, one command per change, never by editing the JSON by hand:
S="node ${CLAUDE_PLUGIN_ROOT}/scripts/state.mjs <jobdir>"
$S init command=design deliverable=social-card sizes=linkedin,ig-post quality=studio maxRounds=8 director=anthropic/opus senior=anthropic/sonnet builder=anthropic/haiku
$S set phase=roughs round=0 # at every phase change
$S desk ui-designer "rough 1, editorial split" working anthropic/sonnet # when you spawn a desk
$S desk ui-designer "rough 1, editorial split" done # when it returns (or failed)
$S pick art-director 2 "the only one that reads in two seconds"
$S proof 1 false 4
$S score 2 creative-director 8.3 false hierarchy=9 typography=7 spacing=8 colour=9 composition=8 originality=8 brand=9 copy=8
$S waiting approve_under_bar "Round 8 at 8.3, typography 7. Approve or send back?" # or: waiting none
$S file final=.desk/out/<id>/final.html
$S cost # before the handback: rolls up every desk's tokens and list-price cost by tier
$S doneThe shape it keeps:
{
"id": "20261018-1830-launch-card-linkedin",
"command": "design",
"deliverable": "social-card",
"sizes": ["linkedin", "ig-post"],
"quality": "studio",
"models": { "director": "anthropic/opus", "senior": "anthropic/sonnet", "builder": "anthropic/haiku" },
"phase": "polish",
"round": 2,
"maxRounds": 8,
"desks": [
{ "desk": "ui-designer", "task": "rough 1, editorial split", "status": "done", "model": "anthropic/sonnet" },
{ "desk": "art-director", "task": "pick", "status": "done", "model": "anthropic/opus" },
{ "desk": "ui-designer", "task": "polish round 1", "status": "working", "model": "anthropic/haiku" }
],
"pick": { "by": "art-director", "rough": 2, "reason": "...", "notes": ["..."] },
"proof": [ { "round": 1, "pass": false, "failures": 2 } ],
"scores": [ { "round": 1, "by": "creative-director", "axes": { "hierarchy": 8, "typography": 7 }, "average": 8.1, "pass": false } ],
"waitingOn": null,
"cost": { "director": 0.0, "senior": 0.0, "builder": 0.0, "total": 0.0, "complete": true },
"files": { "final": ".desk/out/<id>/final.html" },
"startedAt": "2026-10-18T18:30:00-05:00",
"updatedAt": "2026-10-18T18:41:12-05:00"
}Desk status is queued, working, done or failed. waitingOn is null, or one object { "type": "approve_under_bar" | "pick" | "cost_cap" | "question", "text": "..." } when the job needs the user. When it does, say it to the user in one line and stop until they answer.
Cost: the desk.stop hook reads each desk's own transcript and records its tokens and list-price cost on the event. state.mjs cost rolls those up by tier into state. You never estimate cost yourself. If cost.complete is false, the handback says some runs did not report usage.
6. Events
Append an event at each of these moments:
node "${CLAUDE_PLUGIN_ROOT}/scripts/emit-event.mjs" job.start id=<id> command=design deliverable=social-card
node "${CLAUDE_PLUGIN_ROOT}/scripts/emit-event.mjs" job.phase id=<id> phase=roughs round=0
node "${CLAUDE_PLUGIN_ROOT}/scripts/emit-event.mjs" job.pick id=<id> by=art-director rough=2
node "${CLAUDE_PLUGIN_ROOT}/scripts/emit-event.mjs" job.proof id=<id> round=1 pass=false failures=2
node "${CLAUDE_PLUGIN_ROOT}/scripts/emit-event.mjs" job.score id=<id> round=1 average=8.1 pass=false
node "${CLAUDE_PLUGIN_ROOT}/scripts/emit-event.mjs" job.waiting id=<id> type=approve_under_bar
node "${CLAUDE_PLUGIN_ROOT}/scripts/emit-event.mjs" job.done id=<id> rounds=3 average=8.9Desk start and stop are logged by hooks on their own. Never put prompt text, copy or notes in an event, only names, numbers and paths.
7. Handback
Run state.mjs cost, then state.mjs done, then the job.done event. Then follow ${CLAUDE_PLUGIN_ROOT}/skills/desk/procedures/handback.md. Ten lines at most: what was made and where, which desks did what and on which model, the final scores, the rounds, the cost from state (by tier, with the total, marked as list price), and anything left open.
Defaults when project.json is missing
{
"quality": "studio",
"models": {
"director": "anthropic/opus",
"senior": "anthropic/sonnet",
"builder": "anthropic/haiku"
},
"presets": {
"studio": { "director": "anthropic/opus", "senior": "anthropic/sonnet", "builder": "anthropic/haiku" },
"best": { "director": "anthropic/fable", "senior": "anthropic/opus", "builder": "anthropic/sonnet" },
"thrifty": { "director": "anthropic/sonnet", "senior": "anthropic/haiku", "builder": "anthropic/haiku" }
},
"maxRounds": 8,
"framework": null,
"constraints": {}
}The model value passed on the Agent tool is the part after the slash: opus, sonnet, haiku, fable.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
Reviews can't be read right now.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

