Loading...
Loading...
Extract a complete design system — colors, typography, spacing, components, shadows, and W3C design tokens — from any live website using Dembrandt. Runs a headless browser against the URL and returns real computed values from the DOM. Use when you need a site's actual design tokens, want to reverse-engineer a visual design, or need to seed a design system from an existing product.
npx skill4agent add dembrandt/dembrandt-skills extract-design# Zero-install — npx fetches the package on first run (lowest friction)
npx -y dembrandt https://stripe.com
# Or install once (global), then call `dembrandt` directly
npm i -g dembrandt
# Basic extraction — outputs to terminal
dembrandt https://stripe.com
# JSON output — pipe into files or other tools
dembrandt https://stripe.com --json-only > stripe-tokens.json
# W3C DTCG format (design-tokens.org standard)
dembrandt https://stripe.com --dtcg --save-output
# Generate DESIGN.md (human + AI readable brand doc)
dembrandt https://stripe.com --design-md
# Multi-page crawl (follows internal links)
dembrandt https://stripe.com --crawl 5
# Dark mode colors
dembrandt https://stripe.com --dark-mode
# Mobile viewport
dembrandt https://stripe.com --mobile
# Everything saved to output/
dembrandt https://stripe.com --save-output
# Tailwind v4 @theme CSS — observed values only [dembrandt 0.28+]
dembrandt https://stripe.com --tailwind src/app.css
# Self-contained HTML report — open offline or attach as a CI artifact [dembrandt 0.19+]
dembrandt https://stripe.com --html report.html
# Drift gate — compare against a saved baseline; exits 1 on drift [dembrandt 0.19+]
dembrandt https://app.example.com --compare baseline.json --html report.htmlnpx{ "mcpServers": { "dembrandt": { "command": "npx", "args": ["-y", "--package", "dembrandt", "dembrandt-mcp"] } } }job_idget_job_statusstatus"completed"1. get_design_tokens({ url: "stripe.com" })
→ { job_id: "job_123_abc", status: "queued" }
2. get_job_status({ job_id: "job_123_abc" })
→ { status: "running" } // poll again
3. get_job_status({ job_id: "job_123_abc" })
→ { status: "completed", result: { ... } }sync: trueget_design_tokensget_color_paletteget_typographyget_component_stylesget_surfacesget_spacingget_brand_identityslowmobilecookieget_design_tokensget_color_palettedarkModewcagcompute_driftget_findingsexport_dtcggenerate_design_mdrender_reportget_job_statuslist_jobscancel_jobMcpDepsMissingErrorcolors.palette — Deduplicated colors with confidence (high/medium/low).
Each entry carries hex (`normalized`), plus `lch` and
`oklch` of the same colour, and derived `role`,
`onColor`, `hover`.
colors.semantic — Primary, secondary, background, text, and accent detection
colors.cssVariables — Named CSS custom properties. `value` is the author's
string verbatim (the only record of the authored
notation), plus computed hex + LCH + OKLCH.
typography.styles — Font family, size, weight, line-height per context.
Each entry carries `count`, the number of elements
rendering that exact style.
typography.sources — Google Fonts, Adobe Fonts, variable font detection.
`urls` lists the resolved font asset and webfont
stylesheet URLs, deduped, so you can re-fetch or verify
the real files. `filteredFamilies` lists families
dropped by the usage floor — check it before concluding
a face is missing.
spacing.commonValues — Margin/padding scale with rem equivalents
spacing.scaleType — 4px, 8px, or custom grid
borderRadius.values — Border radius tokens with element context
borders.combinations — Width + style + color combinations
shadows — Box shadow elevation system
components.buttons — Button variants with hover/active/focus states
components.inputs — Input styles with focus states
components.links — Link colors and hover states
components.badges — Badge/tag/chip variants
breakpoints — Responsive breakpoints from CSS media queries
frameworks — Detected CSS framework (Tailwind, shadcn, MUI, etc.)
iconSystem — Detected icon library (Heroicons, FA, Material, etc.)--tailwind@themedembrandt https://stripe.com --tailwind # → output/<domain>/theme.css
dembrandt https://stripe.com --tailwind src/app.css # or straight into the project@import "tailwindcss";
@theme {
--color-primary: #ea580c;
--text-display: 96px;
--text-display--line-height: 1;
--spacing: 8px;
--radius-lg: 8px;
--breakpoint-md: 700px;
}--color-primary--color-brand-N--spacingtailwind.config.jscolors.semantictheme.colorstypography.stylesfontFamilyspacing.commonValuesspacingborderRadius.valuesborderRadiusshadowsboxShadow:root {
--background: /* from colors.semantic.background (0.22.0+), else colors.palette — lightest neutral */;
--foreground: /* from colors.semantic.text (0.22.0+), else colors.palette — darkest neutral */;
--primary: /* from colors.semantic.primary */;
--primary-foreground: /* contrasting color */;
--muted: /* mid-tone neutral */;
--border: /* from borders.combinations[0].color */;
--radius: /* from borderRadius.values[0].value */;
}| Confidence | Meaning |
|---|---|
| high | Appears on semantically labeled elements (buttons, CTAs, headers with brand classes). Almost certainly a brand color. |
| medium | Moderate frequency or moderate context. Likely a brand color. |
| low | Rare, low semantic context. May be a one-off or component-specific color. |
highmediumlowlchoklch--color-formatnormalizedcssVariables[name].value| Flag | What it does |
|---|---|
| Clean JSON to stdout — pipe into files or tools |
| Save JSON to |
| W3C Design Tokens Community Group format |
| Generate |
| Self-contained HTML report (inline CSS, embedded JSON). Open offline or attach as a CI artifact. (0.19+) |
| Diff against a saved extraction; prints a drift verdict and exits |
| Generate a PDF brand guide |
| Extract dark color scheme and merge into palette |
| Extract at 390px mobile viewport |
| Crawl up to N pages and merge tokens |
| Discover pages from sitemap.xml |
| 3× timeouts — use on slow-loading or JS-heavy sites |
| Save a full-page screenshot |
| Include pre-filter raw colors in JSON output |
| Notation for colors printed to the terminal: |
| Write a Tailwind v4 |
| Use Firefox instead of Chromium |
| Opt-in anti-detection: navigator spoofing + human mouse simulation. Use only when authorized. |
| Custom user agent string |
| Browser locale, e.g. |
| Browser timezone, e.g. |
| Custom |
| Physical screen resolution to report, e.g. |
--compare# 1. capture a baseline (in the SAME environment you will check against)
dembrandt https://app.example.com --json-only > baseline.json
# 2. later — compare; exits 0 if stable, 1 if drifted
dembrandt https://app.example.com --compare baseline.json --html report.html01--html--comparebodytext--compare <baseline> --approve--compare <baseline> --html report.html1computeDriftdembrandt/driftgenerateHtmlReportdembrandt/report--slow--stealthcolors.semantic.primarytypography.stylesspacing.scaleTypecomponents.buttonsframeworks--dark-mode--crawl 3