Install
$ agentstack add skill-vanducng-skills-opendesign Open-source listing — not yet scanned by AgentStack. Follow the source repository for install instructions.
Security review
⚠ Flagged1 finding(s); flagged for manual review. · v0.1.0 How review works →
- • Prompt-injection patterns
- • Secret / credential exfiltration
- • Dangerous shell & filesystem operations
- • Untrusted network calls
- • Known-malicious package signatures
- high Destructive filesystem operation.
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
About
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:
- Direct:
bun install -g https://github.com/tobi/qmd(ornpm i -g @tobilu/qmd). - 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="/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 ""
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 )
DS_PATH=$("$OPENDESIGN_BIN" show )
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):
$SKILL_PATH/SKILL.md— the chosen skill's own workflow. Follow it literally. It names the classes, layouts, and checks to use.$SKILL_PATH/assets/template.html— the seed (pre-built tokens + class system + chrome). Always use this; never write CSS from scratch.$SKILL_PATH/references/layouts.md— paste-ready section skeletons (don't invent sections; pick the closest).$SKILL_PATH/references/checklist.md— the P0/P1/P2 self-review (run before emitting).$SKILL_PATH/example.html— exemplar output (skim for visual reference).$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:
$DS_PATH/USAGE.md— the package contract + read order.$DS_PATH/DESIGN.md— visual intent, constraints, anti-patterns.$DS_PATH/tokens.css— **paste verbatim into the artifact's first `block**; this is the design system. (tailwind-v4.css/design-tokens.json` are the same tokens in other formats for a React/Tailwind port.)$DS_PATH/components.manifest.json— the component inventory; compose only from these recipes. Open$DS_PATH/components.html(often large —grepit) when you need exact selectors/states.$DS_PATH/preview/— visual sanity check.
Step 5 — Compose the artifact
Path A (skill + template): copy template.html → .html; replace :root vars with DESIGN.md tokens; swap ` + brand; paste layouts.md sections into , 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):
- Start the file with
tokens.csspasted verbatim into ``. **Preserve every token name exactly** (cross-brand switching depends on it). - **Re-skin only the values** in the
:rootblock to the user's brand — pick one accent and use it at most twice per region, derive hovers viacolor-mix()on tokens (no new raw hex outside:root), set surface ramp + radii + font stack. Everything else stays token-driven. - Build the layout only from
components.manifest.jsonrecipes; semantic primitives the spec demands but the manifest lacks (`,`) are fine, invented decorative components are not. - Fill with real domain data from the brief — no lorem.
- 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 .html
This calls open 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.htmldoesn't define. If a class is missing, add it to `` once, never inline. - Never write a section from scratch. Use
layouts.mdskeletons. 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(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.
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: vanducng
- Source: vanducng/skills
- License: MIT
- Homepage: https://skills.vanducng.dev
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet — be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.