agentsclimarketplace

Opendesign

Skill vanducng/skills/skills/opendesign

Generate polished single-file HTML design artifacts using the nexu-io/open-design catalog of production skills and brand-grade design systems. Use when the user asks to design, mock up, prototype, draft, build, or render a visual web artifact, chooses a brand/style direction, requests a deck/PPT, hero, section, component, marketing page, dashboard, email, doc page, or GitHub README/repo banner. Auto-opens the result for review. Produces editable HTML/CSS; use vd:marketing-design for AI-generated raster brand imagery.From its SKILL.md

Install
npx -y skills add vanducng/skills --skill opendesign

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 2 stars2 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its file declares

Copied from the file, not written here

The file declares its own license as MIT. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.

SKILL.md

12.6 KB, ~3.1k tokens by cl100k_base, as published. Nobody here has run it

opendesign

Compose a single self-contained HTML artifact from the upstream nexu-io/open-design catalog: pick the closest skill (workflow + seed template + section layouts), apply a design system (color tokens, typography, components), produce the artifact, open it in the browser.

Scope

This skill handles: static HTML/CSS/SVG artifacts (landings, marketing pages, dashboards, mobile screens, decks, posters, emails, e-guides, internal docs).

Does NOT handle: live React/Vue apps or backend wiring (use vd:uiuxdesign or vd:fastreact), AI-generated raster brand imagery (use vd:marketing-design), multimodal media (use vd:omnimedia), production release work (use vd:ship).

Special case - GitHub README / repo hero banner: the catalog has no banner template (search returns social-cards that override the repo's brand). Skip the catalog and follow references/github-readme-banner.md - author/evolve a brand-locked banner.html, render to PNG at 2× via headless Chrome, and verify the render (measure margins + view) before shipping.

Dependencies

Required: git, bash, grep, awk (all preinstalled on macOS). Cache lives at ~/.cache/$USER-opendesign (~few MB after first sync). Override with OPENDESIGN_CACHE; legacy OPEN_DESIGN_CACHE is still honored.

Access-guarded .cache? Some harnesses block any command/path containing a literal .cache segment (scout-block hooks, sandbox denylists). Two clean workarounds - never stage copies into the work tree: (1) resolve paths into a shell var via the CLI and read through the var, so the literal .cache string never appears in the command - DS=$("$OPENDESIGN_BIN" show dashboard); cat "$DS/DESIGN.md" passes where cat ~/.cache/... is blocked; or (2) point the cache at an unguarded dir up front: export OPENDESIGN_CACHE="$PWD/.opendesign-cache" before sync. The Read tool may also be guarded on .cache paths - prefer cat "$VAR/..." via Bash.

Optional - better search via tobi/qmd: if qmd is on PATH, the search command auto-routes through qmd's BM25 lexical engine instead of the bash/grep fallback. Two install paths:

  1. Direct: bun install -g https://github.com/tobi/qmd (or npm i -g @tobilu/qmd).
  2. Via the levineam/qmd-skill Claude skill - bundles an auto-install hook plus broader qmd guidance for Claude. Recommended if you also use qmd for searching your own notes/docs.

Either path makes the qmd binary available. On the next opendesign sync, the script registers two namespaced collections (opendesign-skills, opendesign-design-systems) - instant, no model download. The script uses qmd search (pure BM25, no LLM model required); the heavyweight qmd vsearch/qmd query modes are deliberately not used (they download multi-GB models for marginal gain on a 197-doc catalog). No action needed otherwise - grep fallback works fine.

Workflow

Step 0 - Resolve the bundled CLI path (do this once)

This skill ships its CLI alongside SKILL.md so it works regardless of install location (dev clone, plugin cache, or user-level install). Set OPENDESIGN_BIN once, using the absolute path of this SKILL.md's directory:

OPENDESIGN_BIN="<dir-of-this-SKILL.md>/scripts/opendesign"
# Example resolved values (use whichever matches where this file was loaded):
#   /Users/vanducng/skills/skills/opendesign/scripts/opendesign          (dev clone)
#   ~/.claude/plugins/cache/vd-skills/skills/opendesign/scripts/opendesign   (plugin)
#   ~/.claude/skills/opendesign/scripts/opendesign                       (user-level)

All subsequent commands use "$OPENDESIGN_BIN".

Step 1 - Sync the catalog (first run, or when user asks for fresh content)

"$OPENDESIGN_BIN" sync

This clones (first time) or git pull --ff-onlys the upstream sparse checkout of skills/ + design-systems/. Offline-tolerant: falls back to existing cache silently.

Step 2 - Search for the best matching skill + design system

Pass the user's full design prompt verbatim:

"$OPENDESIGN_BIN" search "<user's prompt>"

Output ranks top 5 skills and top 5 design systems by token-overlap score, each with a one-line rationale (matching trigger or description). Pick:

  • One skill - usually the top-ranked. If user mentioned a surface explicitly (deck, dashboard, email, mobile), bias toward that.
  • One design system - top-ranked, OR honor an explicit user request (e.g. "in Linear's style" → linear-app).

State the picked pair to the user in one sentence before reading files. They can redirect cheaply now.

Step 3 - Resolve cache paths

SKILL_PATH=$("$OPENDESIGN_BIN" show <skill-name>)
DS_PATH=$("$OPENDESIGN_BIN" show <design-system-name>)

Step 4 - Read the upstream files

Two package shapes exist; check which one your picks resolved to (ls "$SKILL_PATH" "$DS_PATH") and follow the matching path.

A - Skill + seed template (classic; most catalog skills):

  1. $SKILL_PATH/SKILL.md - the chosen skill's own workflow. Follow it literally. It names the classes, layouts, and checks to use.
  2. $SKILL_PATH/assets/template.html - the seed (pre-built tokens + class system + chrome). Always use this; never write CSS from scratch.
  3. $SKILL_PATH/references/layouts.md - paste-ready section skeletons (don't invent sections; pick the closest).
  4. $SKILL_PATH/references/checklist.md - the P0/P1/P2 self-review (run before emitting).
  5. $SKILL_PATH/example.html - exemplar output (skim for visual reference).
  6. $DS_PATH/DESIGN.md - color palette, typography stack, spacing, component patterns.

B - Design System 2.0 package (modern design-systems like dashboard, linear-app; and the fallback when the picked skill has no assets/template.html - many catalog skills ship only SKILL.md). The design-system package stands alone - read it in this order and compose from it directly, no skill template needed:

  1. $DS_PATH/USAGE.md - the package contract + read order.
  2. $DS_PATH/DESIGN.md - visual intent, constraints, anti-patterns.
  3. $DS_PATH/tokens.css - paste verbatim into the artifact's first <style> block; this is the design system. (tailwind-v4.css / design-tokens.json are the same tokens in other formats for a React/Tailwind port.)
  4. $DS_PATH/components.manifest.json - the component inventory; compose only from these recipes. Open $DS_PATH/components.html (often large - grep it) when you need exact selectors/states.
  5. $DS_PATH/preview/ - visual sanity check.

Step 5 - Compose the artifact

Path A (skill + template): copy template.html<output>.html; replace :root vars with DESIGN.md tokens; swap <title> + brand; paste layouts.md sections into <main>, replace every [REPLACE] with real copy (no filler); run checklist.md - every P0 must pass.

Path B (Design System 2.0 - the winning pattern for app/dashboard/console surfaces):

  1. Start the file with tokens.css pasted verbatim into <style>. Preserve every token name exactly (cross-brand switching depends on it).
  2. Re-skin only the values in the :root block to the user's brand - pick one accent and use it at most twice per region, derive hovers via color-mix() on tokens (no new raw hex outside :root), set surface ramp + radii + font stack. Everything else stays token-driven.
  3. Build the layout only from components.manifest.json recipes; semantic primitives the spec demands but the manifest lacks (<table>, <nav>) are fine, invented decorative components are not.
  4. Fill with real domain data from the brief - no lorem.
  5. Self-review (P0): token names preserved (diff against the source tokens.css), no off-palette hex outside :root, one-accent-per-region holds, no invented components, no filler, a11y landmarks + visible focus + AA contrast.

This path produced a 9.17/10 console artifact in practice; it ports cleanly to React+Tailwind v4+shadcn because the tokens map 1:1 to @theme.

Step 6 - Preview the result

Unless the user passed --no-open or explicitly said not to open it:

"$OPENDESIGN_BIN" preview <output>.html

This calls open <file> on macOS (default browser). In the final handoff, include an openable target, not just the basename:

  • Clickable absolute file link: [artifact.html](/absolute/path/to/artifact.html)
  • Browser URI when helpful: file:///absolute/path/to/artifact.html
  • Repo-relative path as secondary context only: ./artifact.html

Never hand off only artifact.html; users need a path or URI they can open directly.

Step 7 - Iterate to a quality bar (optional, high-stakes artifacts)

A single composition rarely clears a "hatchet.dev/Linear-grade" or ">9/10" bar - first drafts land ~8.5–8.8. When the user sets a bar, loop: render to PNG (headless Chrome / browse screenshot --full-page) → score it against concrete lenses (visual craft, information design, brand distinctiveness, implementability) → apply every defect including nits (at this band the nits are the gap) without breaking the Path-B contract → re-render → re-score. Independent scorers (a judge panel) beat self-review; budget 2–3 rounds. Treat remaining minors that belong to the eventual React build (responsive recipes, aria-live, drill-ins) as carry-forward notes, not blockers on the static mock.

Examples

Example 1 - Landing page in Linear's style

User: "design a landing page for an indie task tracker, in Linear's style"

opendesign search "landing page indie task tracker Linear"
# → top skill: web-prototype  · matches 'landing'
# → top design-system: linear-app  · Productivity & SaaS, ultra-minimal purple accent
SKILL_PATH=$(opendesign show web-prototype)
DS_PATH=$(opendesign show linear-app)
# read SKILL.md, template.html, layouts.md, DESIGN.md
# produce ./tracker-landing.html using web-prototype seed + linear-app tokens
opendesign preview ./tracker-landing.html

Example 2 - Pitch deck

User: "magazine-style pitch deck for our seed round, brutalist vibe"

opendesign search "magazine pitch deck seed round brutalist"
# top skill: html-ppt-pitch-deck  (or guizang-ppt - magazine-style)
# top design-system: brutalism  (or neobrutalism)
# follow that skill's deck workflow → ./pitch-deck.html → preview

Example 3 - Specific brand request

User: "a Stripe-style pricing page"

opendesign search "Stripe pricing page"
# top skill: pricing-page
# top design-system: stripe (rank #1 due to explicit brand mention)
# if 'stripe' isn't in catalog, fall back to nearest neutral system (clean / linear-app)

Hard rules

  • Never invent CSS classes the upstream template.html doesn't define. If a class is missing, add it to <style> once, never inline.
  • Never write a section from scratch. Use layouts.md skeletons. If none fit, pick the closest and adapt copy.
  • Never use design tokens not in the chosen DESIGN.md. No off-palette colors, no off-stack fonts.
  • One accent per screen, used at most twice (per upstream convention).
  • Single self-contained HTML file. No external CSS/JS imports, no build step. Inline SVGs, base64 images only if the user provides them.
  • No filler copy. If a layout slot has no real content from the user's brief, drop the section.

Refresh

The cache is checked once per command via git pull --ff-only. To force a re-clone:

rm -rf ~/.cache/$USER-opendesign && "$OPENDESIGN_BIN" sync

Security

This skill executes a single bash CLI bundled at scripts/opendesign. It only:

  • clones / pulls a fixed public repo (github.com/nexu-io/open-design)
  • reads files inside ~/.cache/$USER-opendesign
  • calls open <file> (macOS) / xdg-open (Linux) on local HTML files

It does NOT execute upstream code, run upstream scripts, evaluate upstream HTML server-side, or send data anywhere. Refuse if asked to point the cache at an arbitrary user-supplied URL or to execute arbitrary cached content. Do not echo the contents of files outside the cache directory or the user's working tree.

What ships with it: 2 files

16.4 KB alongside SKILL.md, 1 of them executable

references/

scripts/

Keep looking

Skills are one crate of 326,852. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.