Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Throwaway HTML mockups: 2-3 design variants to compare.
.claude/skills/nousresearch-sketch/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-11 | ✗→✓ | ▲ Improved | 71% | 0% |
| case-01 | ✗→✓ | ▲ Improved | -52% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 235% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 57% | 0% |
| case-19 | ✗→✓ | ▲ Improved | 127% | 0% |
Use this skill when the user wants to see a design direction before committing to one — exploring a UI/UX idea as disposable HTML mockups. The point is to generate 2-3 interactive variants so the user can compare visual directions side-by-side, not to produce shippable code.
Load this when the user says things like "sketch this screen", "show me what X could look like", "compare layout A vs B", "give me 2-3 takes on this UI", "let me see some variants", "mockup this before I build".
claude-design or build it properlyclaude-designexcalidraw, architecture-diagramIf gsd-sketch shows up as a sibling skill (installed via npx get-shit-done-cc --hermes), you can use gsd-sketch for the fuller workflow: persistent .planning/sketches/ with MANIFEST, frontier mode analysis, consistency audits across past sketches, and integration with the rest of GSD. This skill is the lightweight standalone version — one-off sketching without the state machinery.
> Note: The upstream GSD project (gsd-build/get-shit-done) is archived / no longer maintained on GitHub. The npm package (get-shit-done-cc) still installs, but treat it as an archived community project — this standalone sketch skill is the maintained path and needs nothing extra.
intake → variants → head-to-head → pick winner (or iterate)Before generating variants, get three things — one question at a time, not all at once:
Reflect each answer briefly before the next question. If the user already gave you all three upfront, skip straight to variants.
Produce 2-3 variants in one go. Each variant is a complete, standalone HTML file. Don't describe variants — build them. The point is comparison.
Each variant should take a different design stance, not different pixel values. Three good variant axes:
Pick one axis and pull apart from it. Two variants that differ only in accent color are wasted effort — the user can't distinguish them.
Variant naming: describe the stance, not the number.
sketches/
├── 001-calm-editorial/
│ ├── index.html
│ └── README.md
├── 001-utilitarian-dense/
│ ├── index.html
│ └── README.md
└── 001-playful-split/
├── index.html
└── README.mdEach variant is a single self-contained HTML file:
<style> — no build step, no external CSS<link><script src="https://cdn.tailwindcss.com"></script>) is fineOpen it in a browser. If it looks broken, fix it before showing the user.
Verify variants visually — use Hermes' browser tools. Don't just write HTML and hope it renders; load each variant and look at it:
browser_navigate(url="file:///absolute/path/to/sketches/001-calm-editorial/index.html")
browser_vision(question="Does this layout look clean and readable? Any visible bugs (overlapping text, unstyled elements, broken images)?")browser_vision returns an AI description of what's actually on the page plus a screenshot path — catches layout bugs that pure source inspection misses (e.g. a font import that silently failed, a flex container that collapsed). Fix and re-navigate until each variant looks right.
Default CSS reset + system font stack for fast starts:
html<style> * { box-sizing: border-box; margin: 0; padding: 0; } body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; -webkit-font-smoothing: antialiased; color: #1a1a1a; background: #fafafa; line-height: 1.5; } </style>
Each variant's README.md answers:
markdown## Variant: {stance name} ### Design stance One sentence on the principle driving this variant. ### Key choices - Layout: ... - Typography: ... - Color: ... - Interaction: ... ### Trade-offs - Strong at: ... - Weak at: ... ### Best for - The kind of user or use case this variant actually serves
After all variants are built, present them as a comparison. Don't just list — opinionate:
markdown## Three takes on the home screen | Dimension | Calm editorial | Utilitarian dense | Playful split | |-----------|----------------|-------------------|---------------| | Density | Low | High | Medium | | Primary action visibility | Low | High | Medium | | Scan-ability | High | Medium | Low | | Feel | Calm, trusted | Sharp, tool-like | Inviting, energetic | **My take:** Utilitarian dense for power users, calm editorial for content-forward audiences. Playful split is weakest — tries to do both and commits to neither.
Let the user pick a winner, or combine two into a hybrid, or ask for another round.
If the user has an existing theme (colors, fonts, tokens), put shared tokens in sketches/themes/tokens.css and @import them in each variant. Keep tokens minimal:
css/* sketches/themes/tokens.css */ :root { --color-bg: #fafafa; --color-fg: #1a1a1a; --color-accent: #0066ff; --color-muted: #666; --radius: 8px; --font-display: "Inter", sans-serif; --font-body: -apple-system, BlinkMacSystemFont, sans-serif; }
Don't over-tokenize a throwaway sketch — three colors and one font is usually enough.
A sketch is interactive enough when the user can:
More than that is over-engineering a throwaway. Less than that is a screenshot.
If sketches already exist and the user says "what should I sketch next?":
Propose 2-4 named candidates. Let the user pick.
sketches/ (or .planning/sketches/ if the user is using GSD conventions) in the repo rootNNN-stance-name/index.html + README.mdopen sketches/001-calm-editorial/index.html on macOS, xdg-open on Linux, start on WindowsTypical tool sequence for one variant:
terminal("mkdir -p sketches/001-calm-editorial")
write_file("sketches/001-calm-editorial/index.html", "<!doctype html>...")
write_file("sketches/001-calm-editorial/README.md", "## Variant: Calm editorial\n...")
browser_navigate(url="file://$(pwd)/sketches/001-calm-editorial/index.html")
browser_vision(question="How does this look? Any obvious layout issues?")Repeat for each variant, then present the comparison table.
Adapted from the GSD (Get Shit Done) project's /gsd-sketch workflow — MIT © 2025 Lex Christopherson (gsd-build/get-shit-done). The upstream GSD repo is now archived/unmaintained on GitHub; the get-shit-done-cc npm package still installs (npx get-shit-done-cc --hermes --global) and ships persistent sketch state, theme/variant pattern references, and consistency-audit workflows, but treat it as an archived community project.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-11 | fail→pass | 10,138 | 4,644 | -54% | 1 | 1 | 0% | 1,852 | 3,164 | +71% | 0 | 0 | — |
case-01 | fail→pass | 29,217 | 2,801 | -90% | 1 | 1 | 0% | 6,265 | 2,997 | -52% | 0 | 0 | — |
case-02 | fail→fail | 8,939 | 8,572 | -4% | 1 | 1 | 0% | 573 | 3,151 | +450% | 0 | 0 | — |
case-03 | fail→fail | 25,635 | 9,465 | -63% | 1 | 1 | 0% | 6,252 | 3,068 | -51% | 0 | 0 | — |
case-04 | fail→fail | 22,731 | 6,752 | -70% | 1 | 1 | 0% | 5,215 | 3,599 | -31% | 0 | 0 | — |
case-10 | fail→fail | 10,430 | 4,726 | -55% | 1 | 1 | 0% | 1,578 | 3,124 | +98% | 0 | 0 | — |
case-05 | fail→fail | 30,107 | 11,469 | -62% | 1 | 1 | 0% | 6,187 | 3,498 | -43% | 0 | 0 | — |
case-06 | pass→fail | 26,027 | 4,277 | -84% | 1 | 1 | 0% | 6,200 | 3,199 | -48% | 0 | 0 | — |
case-07 | fail→fail | 20,687 | 11,304 | -45% | 1 | 1 | 0% | 3,350 | 3,321 | -1% | 0 | 0 | — |
case-08 | fail→pass | 14,775 | 28,051 | +90% | 1 | 1 | 0% | 2,581 | 8,655 | +235% | 0 | 0 | — |
case-09 | fail→fail | 10,990 | 7,139 | -35% | 1 | 1 | 0% | 1,644 | 3,598 | +119% | 0 | 0 | — |
case-12 | fail→pass | 9,536 | 2,816 | -70% | 1 | 1 | 0% | 1,925 | 3,015 | +57% | 0 | 0 | — |
case-13 | fail→fail | 11,083 | 7,275 | -34% | 1 | 1 | 0% | 1,937 | 3,603 | +86% | 0 | 0 | — |
case-14 | fail→fail | 11,887 | 6,307 | -47% | 1 | 1 | 0% | 2,284 | 3,697 | +62% | 0 | 0 | — |
case-15 | pass→pass | 12,340 | 7,475 | -39% | 1 | 1 | 0% | 1,905 | 3,643 | +91% | 0 | 0 | — |
case-16 | fail→fail | 5,532 | 2,415 | -56% | 1 | 1 | 0% | 936 | 2,884 | +208% | 0 | 0 | — |
case-17 | pass→pass | 10,014 | 4,687 | -53% | 1 | 1 | 0% | 1,825 | 3,268 | +79% | 0 | 0 | — |
case-18 | pass→pass | 8,597 | 5,266 | -39% | 1 | 1 | 0% | 1,606 | 3,477 | +117% | 0 | 0 | — |
case-19 | fail→pass | 5,896 | 3,189 | -46% | 1 | 1 | 0% | 1,397 | 3,169 | +127% | 0 | 0 | — |
case-20 | pass→pass | 8,732 | 5,951 | -32% | 1 | 1 | 0% | 1,710 | 3,738 | +119% | 0 | 0 | — |
case-21 | pass→pass | 8,070 | 5,507 | -32% | 1 | 1 | 0% | 1,656 | 3,448 | +108% | 0 | 0 | — |
case-22 | fail→pass | 12,422 | 4,891 | -61% | 1 | 1 | 0% | 2,422 | 3,418 | +41% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 18 counted toward the lift figure. The other 4 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +23 percentage points is the difference between those two pass rates over the 18 comparable cases. 2 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.