brand-extract
Extract a complete Brand Kit from a live website by driving the in-app browser
Install / Use
npx skills add nexu-io/open-design --skill brand-extractInstalls into whichever agent you are using.
SKILL.md
Installable skill definition
Quality Score
Category
DesignSupported Platforms
Our assessment of brand-extract
brand-extract scores 97/100 on our quality scale, 11th of 156 Design skills we index (top 8%).
Its SKILL.md is 12 KB long, well organised into 8 sections with 4 code examples: a thorough specification that gives an agent plenty to work with.
With 97,896 GitHub stars, it is one of the more widely adopted skills in the catalogue.
Maintenance, license and trust
- The repository was last updated yesterday, so brand-extract is actively maintained.
- It is released under the Apache-2.0 license, a permissive license that allows use, modification and commercial use with attribution.
- Its trust signals score 100/100, with no cautions. These come from repository metadata, not a code audit — read the skill file before letting an agent act on it.
Safety scan
No issues foundOur scan of the whole file found no instruction hijacking, hidden characters, credential access, data exfiltration or destructive commands. An AI review of the same text found nothing harmful.
AI review by kimi-k2.7-code on 2026-09-26. Automated pattern scan on 2026-09-26. It catches known dangerous patterns, not every risk — read a skill before letting an agent act on it.
brand-extract compared with similar skills
All 4 of these similar skills score higher than brand-extract; compare them before choosing.
| Skill | Score | Stars | Updated | Format |
|---|---|---|---|---|
| brand-extract (this skill)by nexu-io | 97 | 97.9k | 1d ago | SKILL.md |
| algorithmic-artby anthropics | 100 | 177.9k | 3d ago | SKILL.md |
| pptxby anthropics | 100 | 177.9k | 3d ago | SKILL.md |
| designby nextlevelbuilder | 100 | 130.2k | 4d ago | SKILL.md |
| ui-ux-pro-maxby nextlevelbuilder | 100 | 130.2k | 4d ago | SKILL.md |
Frequently asked questions
- How do I install brand-extract?
- Run
npx skills add nexu-io/open-design --skill brand-extract. The install tabs above show the steps for each supported agent. - Which AI agents does brand-extract work with?
- It is written for Universal, as a SKILL.md file. Other agents that read the same format can often use it too.
- Is brand-extract safe to use?
- Our scan of the whole file found no instruction hijacking, hidden characters, credential access, data exfiltration or destructive commands. An AI review of the same text found nothing harmful. It is Apache-2.0-licensed and scores 100/100 on trust signals. Skills are instructions an agent will follow, so read the file before installing it and do not approve commands you do not understand.
- Is brand-extract still maintained?
- The repository was last updated yesterday, so brand-extract is actively maintained.
Skill content
View source on GitHubname: brand-extract description: | Extract a complete Brand Kit from a live website by driving the in-app browser. Use when a brand-extraction project opens with a site in the Browser tab, or when the user asks to "extract a brand", "pull the brand from <url>", "get the colors/fonts/logo from this site", or build a brand/design system from a reference website. Pairs with the agent-browser tool for measurement and pauses for the user when an anti-bot wall blocks the page. triggers:
- "extract a brand"
- "extract brand"
- "brand from url"
- "brand extraction"
- "pull the brand"
- "extract the colors"
- "extract the fonts"
- "extract the logo"
- "build a brand kit"
od:
mode: design
surface: web
scenario: validation
design_system:
requires: false
capabilities_required:
- file_write
brand-extract
Turn a live website into a complete, machine-consumable Brand Kit —
identity, semantic color palette, typography, voice — by measuring the real
page, not guessing from memory. This is the methodology behind a brand-extraction
project: the target site is open in a secondary in-app Browser tab, and you
drive it with the agent-browser tool.
The live kit page (brand.html)
The extraction project opens with brand.html as the active tab — a
self-contained brand-kit page (template:
brand-extract/templates/brand-kit.html) that the daemon renders from
brand.json. The daemon pre-seeds it with a deterministic first paint — a
harvested logo, an approximate palette, font families, and a few cover images —
so it is NOT all-skeleton when it opens. Your job is to replace that seed with
measured truth and fill in the rest, progressively, so the user watches it
complete module by module. You never hand-edit it: you write brand.json, then
run od brand preview <brandId> and the daemon re-renders the page (the page
soft-reloads itself while extracting). Optimize for fast first paint and
progressive fill-in — write a partial brand.json and preview it the moment
you have a name, a couple of colors, and a logo, then preview again after each
field group rather than batching the whole kit to the end.
The trap to avoid: an LLM left alone regresses to the mean — Inter, an indigo accent, a purple gradient. That is off-brand for everyone. Every value you emit must trace to something you measured on the page.
The three-step chain
Work in order. Skipping straight to writing brand.json is how off-brand,
hallucinated kits happen.
1. Measure (drive the open Browser tab)
Use agent-browser against the selected browser tab (its URL/title are in
your run context — treat "this page" / "the site" as that tab):
agent-browser get url/get titleto confirm the target.agent-browser snapshotbefore extracting anything.- Harvest the real design language from the DOM/CSS, not the screenshot alone:
- Colors — frequency-rank color literals and resolve the seven semantic
roles:
background,surface,foreground,muted,border,accent,accent-secondary. The most frequent near-white/cream is usually the background; the most frequent chromatic mid-saturation color is usually the accent. - Typography — the
@font-facenames andfont-familydeclarations for display, body, and (if present) mono. Note weights actually used. - Logo (save MULTIPLE candidates) — extract every logo asset you find and
save each as a file under
logos/: the inline header/nav<svg>(write the literal<svg>…</svg>markup verbatim tologos/header.svg— do not just reference it), any<img>logo,apple-touch-icon, favicon, andog:image. Fetch the asset URLs directly — never leavelogo.primaryempty when the site has any mark. Setlogo.primaryto the best vector / transparent lockup (SVG wordmark > apple-touch-icon > favicon > og:image) and list the rest inlogo.alternates; the kit page renders them as switchable thumbnails. (The daemon auto-fetches a favicon/og:image fallback intologos/so the page is never logo-less, but that safety net is no substitute for saving the real wordmark.) - Imagery (save 6–8 of the site's LARGE / COVER / HERO images) — this is
the Images module. Harvest the site's actual big representative pictures and
save them into
imagery/: theog:image/twitter:imagesocial card, the hero/banner art, the largest<img>(resolve the highest-ressrcset/<picture>source), CSSbackground-imagehero blocks, product or app screenshots, and illustration/photography samples. Filter by rendered size — keep only big images (roughly ≥320px on the long edge) and drop icons, sprites, logos, avatars, and tracking pixels. List them inbrand.jsonasimagery.samples(see shape below); the kit page renders them as a clean labeled Images gallery (a thumbnail grid). Pick 6–8 varied, on-brand images — never UI chrome or icons. (The daemon runs a deterministic cover/hero-image fallback at finalize so the gallery is rarely empty, but that safety net is no substitute for picking the real hero images.) - Voice — representative headings, taglines, and body copy to ground the voice; quote-level fidelity, not generic marketing speak.
- Colors — frequency-rank color literals and resolve the seven semantic
roles:
- Save any self-hosted webfont files you can fetch into
fonts/. - Capture one page screenshot as visual evidence when it helps.
Anti-bot wall → ask the user (do NOT bypass)
If the page is an anti-bot interstitial instead of the real site — Cloudflare
"Just a moment…", "Verify you are human", "Attention Required", DataDome,
PerimeterX, Incapsula — stop measuring and emit a <question-form> asking
the user to clear it by hand in the Browser tab:
<question-form id="cf-verify" title="Verify in the browser">
[
{
"id": "ready",
"type": "radio",
"label": "The site is behind a verification wall. Please complete the check in the Browser tab on the right, then choose Continue.",
"options": ["Continue — I cleared the wall", "Skip — extract from public knowledge instead"]
}
]
</question-form>
Then end the turn. When the user submits the form, re-run
agent-browser snapshot on the now-unblocked tab and resume measuring. Never
attempt to solve CAPTCHAs or bypass the wall yourself. If the user picks
"Skip", fall back to your knowledge of the brand's public identity and clearly
mark each such value (from brand knowledge) in its usage/notes.
2. Synthesize (write the kit) — incrementally, preview early
Write brand.json into the project as soon as you have the name, a couple of
colors, and a logo candidate — do not wait for everything. Then run:
od brand preview <brandId>
This re-renders brand.html so the user immediately sees a real, on-brand page
forming. Then preview after each field group, do not batch to the end —
after you measure and add each of (a) colors, (b) typography/fonts, (c) logo
candidates, (d) cover/hero imagery samples, (e) voice & tone, (f) imagery /
layout posture, update brand.json and re-run od brand preview. Partial data
renders the filled modules with skeletons for the rest, which is exactly the
progressive "filling in" experience the user should watch.
brand.json — must parse as JSON, with this exact shape:
{
"name": "Acme",
"tagline": "one-line brand tagline",
"description": "2-3 sentences on what the company does",
"sourceUrl": "https://acme.com",
"logo": { "primary": "logos/<best candidate or null>", "alternates": ["logos/<others>"], "notes": "why this primary; usage" },
"colors": [
{ "role": "background", "hex": "#f5f4ed", "oklch": "oklch(96% 0.01 90)", "name": "Parchment", "usage": "page background" },
{ "role": "surface", "hex": "#ffffff", "oklch": "oklch(100% 0 0)", "name": "Card", "usage": "cards, panels" },
{ "role": "foreground", "hex": "#141413", "oklch": "oklch(17% 0.005 90)", "name": "Ink", "usage": "primary text" },
{ "role": "muted", "hex": "#87867f", "oklch": "oklch(60% 0.01 90)", "name": "Stone", "usage": "secondary text" },
{ "role": "border", "hex": "#e8e6dc", "oklch": "oklch(92% 0.01 90)", "name": "Hairline", "usage": "borders, dividers" },
{ "role": "accent", "hex": "#d97757", "oklch": "oklch(67% 0.13 40)", "name": "Terracotta", "usage": "CTAs, links" },
{ "role": "accent-secondary", "hex": "#3d7a4f", "oklch": "oklch(50% 0.09 150)", "name": "Moss", "usage": "success, secondary" }
],
"typography": {
"display": { "family": "Tiempos", "fallbacks": ["Georgia", "serif"], "weights": [400, 600], "notes": "headlines" },
"body": { "family": "Inter", "fallbacks": ["system-ui", "sans-serif"], "weights": [400, 500, 700], "googleFontsUrl": "https://fonts.googleapis.com/css2?family=Inter:wght@400;500;700&display=swap" },
"mono": { "family": "JetBrains Mono", "fallbacks": ["monospace"], "weights": [400] }
},
"voice": { "adjectives": ["confident", "warm"], "tone": "how the brand speaks", "messagingPillars": ["pillar"], "vocabulary": { "use": ["words it uses"], "avoid": ["words it avoids"] } },
"imagery": {
"style": "one line", "subjects": ["typical subjects"], "treatment": "how images are treated", "avoid": ["clichés to avoid"],
"samples": [
{ "file": "imagery/hero.png", "kind": "hero", "caption": "Homepage hero" },
{ "file": "imagery/product.png", "kind": "product", "caption": "Product screenshot" }
]
},
"layout": { "radius": "12px", "borderWeight": "1px", "spacing": "8px baseline grid", "postureRules": ["3-5 observed posture rules"] }
}
Hard rules:
- Never guess colors from memory. Pick the seven roles from what you
measured. If a role has no measured candidate, derive it from a measured one
with
oklch()and say so inusage. - Fonts: spell self-hosted families exactly as they appear; for proprietary
faces with no file, keep the real
family, put the closest Google Font first infallbacks, setgoogleFontsUrl, and note "stand-in for <face>". - Logo: use the
logos/<file>paths you saved; never pick a photographicog:imageas primary unless nothing else exists. Never leavelogo.primaryempty when the site has any mark. - Imagery: save the site's real large/cover/hero images under
imagery/and reference them by theirimagery/<file>path inimagery.samples; 6–8 varied, on-brand images filtered by rendered size — never icons or chrome. - Do not invent company facts beyond what the copy supports.
BRAND.md — a prose brand guide an autonomous design agent can follow
(visual theme, logo usage, color roles, typography, voice & tone, imagery,
component stylings, layout & spacing, depth, dos & don'ts, agent prompt guide).
3. Build & register
Run the finalizer — it validates your brand.json, derives the
light/dark/compact design tokens and the brand-system artifacts (landing, deck,
poster, email, newsletter, form), and registers the brand as a reusable
user:<id> design system so it is selectable everywhere:
od brand finalize <brandId> --json
This self-hosts any Google Fonts you declared (so the Fonts specimen tiles —
a big "Ag" per family — and the kit render in the real typefaces), mirrors your
imagery/ samples into the brand so the Images gallery resolves, and
re-renders brand.html one last time with the status flipped to "Brand ready",
a Design system module (the live component kit
with a Light/Dark toggle plus the derived token chips — colorPrimary, fontSize,
borderRadius, …), and the six Brand Assets tiles (landing, deck, poster,
email, newsletter, form) lit up as live previews that each link to their full
system/artifacts/<kind>.html page. If finalize reports a v
Truncated for display — read the full file on GitHub.
Related Skills
algorithmic-art
177.9kCreating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems.
pptx
177.9kUse this skill any time a .pptx or .potx file is involved in any way — as input, output, or both. This includes: creating slide decks, pitch decks, or presentations; reading, parsing, or extracting text from any .pptx or .potx file (even if the extracted content will be used elsewhere, like in an em…
design
130.2kComprehensive design skill: brand identity, design tokens, UI styling, logo generation (55 styles, Gemini, Atlas Cloud, or MuAPI AI), corporate identity program (50 deliverables, CIP mockups), HTML presentations (Chart.js), banner design (22 styles, social/ads/web/print), icon design (15 styles, SVG…
ui-ux-pro-max
130.2kUI/UX design intelligence for web, mobile, and desktop. This skill should be used when designing, building, reviewing, or fixing interfaces, including pages, components, design systems, accessibility, interaction, responsive layout, typography, color, charts, and stack-specific UI implementation.
Languages
Trust signals
From repository metadata: license, adoption, age and documentation. Not a code audit — see the Safety scan above for what the skill file itself contains.
