Home · Skills · Development
Visual brand extractor
Extract visual branding (colors, typography, layout patterns) from a client's website and generate a style preset compatible with the HTML slides skill and a brand config JSON for the content asset creator.
How to use it
- Hit Copy SKILL.md — or use the Claude Code line below to get every file.
- Claude: ⋯ → Download .md, then Customize → Skills → Add → Upload skill.
ChatGPT: make a Project and paste it into Instructions.
Neither? Paste it at the top of a new chat — it works for that chat. - Describe your job in plain words. The AI follows the skill from there.
npx degit gooseworks-ai/goose-skills/skills/brand/capabilities/visual-brand-extractor#main ~/.claude/skills/visual-brand-extractorFor one project only, change the path to .claude/skills/visual-brand-extractor. This skill also uses Next.js — copying SKILL.md alone won't be enough. See the folder on GitHub.
Not working?
- Check which app you pasted it into — the steps above name the right one.
- Some skills need the paid tier of Claude or ChatGPT.
Paste into Claude, ChatGPT or Cursor.
Show the full text406 lines
Visual Brand Extractor
Extract a client's visual identity from their website and generate reusable style presets for slides and content assets. This is an agent-executed skill — the AI reads pages via WebFetch and performs the analysis directly.
Quick Start
Extract visual branding from https://vapi.ai for the Vapi client.
Inputs
| Input | Required | Description |
|---|---|---|
| Website URL | Yes | Client's homepage or landing page URL |
| Client name | Yes | For naming the output files |
| Additional pages | No | Product page, docs page, etc. for richer extraction |
Output
Two files saved to clients/<client-name>/brand/visual-identity.md:
- Slide preset — CSS custom properties, typography, and signature elements matching the format in
skills/create-html-slides/STYLE_PRESETS.md - Brand config JSON — Simple color/font config matching
skills/content-asset-creatorformat
Process
Phase 1: Fetch Target Pages
Fetch 2-3 pages to get a representative sample of the brand:
- Homepage (mandatory) — the primary brand expression
- Product/feature page (if available) — deeper color and layout usage
- Blog or about page (optional) — secondary design context
Use WebFetch on each URL with a prompt like:
"Extract the full content of this page. I need: all color values (hex, rgb, hsl), font family names, CSS class names (especially Tailwind utility classes), any CSS custom properties/variables, meta tags, and the general structure of the page layout. Preserve exact color codes and font names."
Phase 2: Extract Color Palette
Analyze the fetched content to identify the color palette. Look for these sources in priority order:
2.1 CSS Custom Properties
Look for :root, html, or body blocks containing color variables:
--color-primary, --primary, --brand, --accent
--bg-*, --background-*
--text-*, --foreground-*
2.2 Meta Tags
Check for:
<meta name="theme-color" content="#...">— often the primary brand color<meta name="msapplication-TileColor" content="#...">
2.3 Explicit CSS Color Declarations
Search for color values in these properties:
background-color,background(including gradients)color(text colors)border-color,borderbox-shadow(accent/glow colors)fill,stroke(SVG logo colors)
2.4 Tailwind Utility Classes
If the site uses Tailwind CSS, map utility classes to hex values using the reference table below.
2.5 Classify Colors into Roles
| Role | How to Identify |
|---|---|
| bg-primary | background-color on body, html, or outermost container. The most common background. |
| bg-secondary | Background on cards, sections, or secondary containers. Slightly different from primary. |
| text-primary | color on body or the most common text color. |
| text-secondary | Muted text variant — used on subtitles, descriptions, .text-gray-* elements. |
| accent | Most prominent non-bg, non-text color. Found on buttons, links, CTAs, highlights. Also check <meta name="theme-color">. |
| accent-secondary | Second accent color, or gradient partner. Found on secondary buttons, hover states. |
| card-bg | Background of cards, modals, or elevated surfaces (if different from bg-primary). |
2.6 Determine Theme Type
Check the luminance of bg-primary:
- Dark theme: Dark background (black, navy, charcoal) with light text
- Light theme: White or cream background with dark text
- Mixed: Note if the site uses both (e.g., dark hero + light content sections)
Phase 3: Extract Typography
3.1 Find Font Sources
Look for font loading in this order:
Google Fonts
<link>tags — Font name is in the URL:fonts.googleapis.com/css2?family=Inter:wght@400;700→ Font:
Inter, weights: 400, 700Fontshare
<link>tags — Similar URL pattern:api.fontshare.com/v2/css?f[]=clash-display@400,700→ Font:
Clash Display@font-facedeclarations — Extract thefont-familyvaluefont-familyCSS properties — Direct declarations on elements
3.2 Classify into Display vs Body
| Role | How to Identify |
|---|---|
| Display font | Font on h1, h2, .title, .heading, .hero-title, or the largest/boldest text. |
| Body font | Font on body, p, or general content elements. |
If both use the same font family, it's a single-family pairing (like "Manrope + Manrope"). Note the different weights used for display (700-900) vs body (400-500).
3.3 Handle Proprietary Fonts
If the site uses a font NOT available on Google Fonts or Fontshare, map it to the closest available equivalent using the Font Fallback Table below.
Phase 4: Analyze Visual Patterns
Examine the CSS and page structure for these aesthetic signals:
| Signal | What to Look For | Aesthetic Implication |
|---|---|---|
| Border radius | border-radius values — large (12px+, 9999px) vs small (2-4px) vs none |
Rounded = friendly/modern. Sharp = corporate/bold. |
| Gradients | linear-gradient, radial-gradient in backgrounds |
Gradient-forward = modern SaaS aesthetic |
| Shadows | box-shadow frequency and intensity |
Heavy shadows = depth/elevation. None = flat/minimal. |
| Spacing | Padding/margin sizes — generous (4rem+) vs tight (1rem) | Airy = premium/minimal. Dense = information-rich. |
| Animations | @keyframes, transition, transform presence |
Motion-forward = energetic. Minimal = calm/professional. |
| Grid patterns | Background grid/dot patterns, decorative overlays | Technical/developer aesthetic |
| Gradient orbs | radial-gradient on positioned pseudo-elements |
Modern, atmospheric aesthetic |
| Borders as accents | Colored border-left or border-top on sections |
Editorial, organized aesthetic |
Synthesize the Vibe
Based on the signals above, compose:
- Vibe: 2-4 adjectives (e.g., "Clean, technical, developer-focused, modern")
- Layout description: 1 sentence (e.g., "Full-width dark sections with centered content and generous whitespace")
- Signature elements: 3-4 reproducible CSS patterns from the site
Phase 5: Generate Output
Create the file clients/<client-name>/brand/visual-identity.md with both output formats.
Output Template
# Visual Brand Identity: [Company Name]
**Extracted from:** [URL(s)]
**Date:** [YYYY-MM-DD]
---
## Slide Preset
**Vibe:** [2-4 adjectives]
**Layout:** [1 sentence describing dominant layout pattern]
**Typography:**
- Display: `[Font Name]` ([weight, e.g., 700/800])
- Body: `[Font Name]` ([weight, e.g., 400/500])
**Colors:**
```css
:root {
--bg-primary: [hex];
--bg-secondary: [hex];
--text-primary: [hex];
--text-secondary: [hex];
--accent: [hex];
--accent-secondary: [hex];
}
```
**Signature Elements:**
- [Element 1, e.g., "Subtle gradient orbs as background decoration"]
- [Element 2, e.g., "Rounded cards with 12px border-radius and light shadow"]
- [Element 3, e.g., "Accent-colored left border on feature blocks"]
- [Element 4, e.g., "Grid dot pattern overlay on hero sections"]
**Font Loading:**
```html
<link href="https://fonts.googleapis.com/css2?family=[Font1]:wght@[weights]&family=[Font2]:wght@[weights]&display=swap" rel="stylesheet">
```
---
## Brand Config (JSON)
For use with `content-asset-creator` and other skills:
```json
{
"name": "[Company]",
"primary_color": "[accent hex]",
"secondary_color": "[accent-secondary hex]",
"accent_color": "[accent hex]",
"background": "[bg-primary hex]",
"text_color": "[text-primary hex]",
"font_heading": "[Display Font]",
"font_body": "[Body Font]",
"logo_url": "[if discovered, otherwise omit]"
}
```
---
## Extraction Notes
[Any notes about the extraction — proprietary fonts that were mapped, multiple themes detected, sparse CSS from JS-rendered sites, etc.]
Font Fallback Table
When a site uses a proprietary font not available on Google Fonts or Fontshare, use this mapping to find the closest available alternative:
| Font Category | Proprietary Examples | Google Fonts Alternative | Fontshare Alternative |
|---|---|---|---|
| Geometric sans | Circular, Roobert, Graphik, Product Sans | Plus Jakarta Sans, Outfit, Manrope |
General Sans, Satoshi |
| Humanist sans | Proxima Nova, Calibri, Gill Sans | Source Sans 3, DM Sans, Work Sans |
— |
| Neo-grotesque | Akkurat, Aktiv Grotesk, Suisse Int'l | Space Grotesk, Archivo, Albert Sans |
Switzer |
| Modern serif | Tiempos, Canela, GT Sectra | Fraunces, Cormorant, Playfair Display |
Zodiak, Sentient |
| Slab serif | Sentinel, Clarendon, Rockwell | Zilla Slab, Roboto Slab |
— |
| Classic serif | Mercury, Chronicle, Minion | Source Serif 4, Lora, Libre Baskerville |
Bespoke Serif |
| Monospace | SF Mono, Berkeley Mono, Dank Mono | JetBrains Mono, Fira Code, Space Mono |
Jet Brains Mono |
| Display / decorative | GT Walsheim, Recoleta, Campton | Syne, Archivo Black, Bricolage Grotesque |
Clash Display, Cabinet Grotesk |
Decision heuristic: If unsure which category a font falls into, look at its characteristics:
- Round dots and geometric 'o' → Geometric sans
- Varies stroke widths, warm feel → Humanist sans
- Uniform strokes, neutral → Neo-grotesque
- Serifs with high contrast → Modern serif
Tailwind CSS Color Reference
If the site uses Tailwind utility classes, map them to hex values:
Grays
| Class | Hex | Class | Hex |
|---|---|---|---|
gray-50 |
#F9FAFB |
gray-500 |
#6B7280 |
gray-100 |
#F3F4F6 |
gray-600 |
#4B5563 |
gray-200 |
#E5E7EB |
gray-700 |
#374151 |
gray-300 |
#D1D5DB |
gray-800 |
#1F2937 |
gray-400 |
#9CA3AF |
gray-900 |
#111827 |
gray-950 |
#030712 |
Slate (common for dark themes)
| Class | Hex | Class | Hex |
|---|---|---|---|
slate-50 |
#F8FAFC |
slate-500 |
#64748B |
slate-100 |
#F1F5F9 |
slate-600 |
#475569 |
slate-200 |
#E2E8F0 |
slate-700 |
#334155 |
slate-300 |
#CBD5E1 |
slate-800 |
#1E293B |
slate-400 |
#94A3B8 |
slate-900 |
#0F172A |
slate-950 |
#020617 |
Blues
| Class | Hex | Class | Hex |
|---|---|---|---|
blue-400 |
#60A5FA |
blue-700 |
#1D4ED8 |
blue-500 |
#3B82F6 |
blue-800 |
#1E40AF |
blue-600 |
#2563EB |
blue-900 |
#1E3A8A |
Greens
| Class | Hex | Class | Hex |
|---|---|---|---|
green-400 |
#4ADE80 |
green-600 |
#16A34A |
green-500 |
#22C55E |
green-700 |
#15803D |
Common Accent Colors
| Class | Hex | Class | Hex |
|---|---|---|---|
indigo-500 |
#6366F1 |
purple-500 |
#A855F7 |
indigo-600 |
#4F46E5 |
violet-500 |
#8B5CF6 |
emerald-500 |
#10B981 |
amber-500 |
#F59E0B |
teal-500 |
#14B8A6 |
rose-500 |
#F43F5E |
cyan-500 |
#06B6D4 |
orange-500 |
#F97316 |
Note: Tailwind classes appear as bg-blue-600, text-gray-900, border-indigo-500, etc. Strip the property prefix (bg-, text-, border-) to get the color token, then look up the hex value above.
For custom Tailwind themes (e.g., bg-brand, text-brand-light), check the page's <script> tags for a tailwind.config object that defines custom colors.
Edge Cases
JS-Rendered Sites (Sparse CSS)
Many modern sites (Next.js, React) inject styles via JavaScript. WebFetch may return minimal inline CSS. In this case:
- Focus on Tailwind utility classes in
classattributes - Check
<script>tags for embedded config objects - Look for
<style>tags that contain CSS-in-JS output - If still sparse, ask the user: "The site appears to use dynamic styling. Could you share a screenshot or provide their brand guidelines directly?"
Multiple Color Schemes (Light/Dark Mode)
Some sites define both light and dark themes via prefers-color-scheme. Extract the default (non-media-query) theme. If a dark mode variant is detected, note it in the Extraction Notes section.
Too Many Colors
Enterprise sites may use dozens of colors. Focus on:
- The hero/above-the-fold section for the primary palette
- Button/CTA colors for accent identification
- Frequency analysis — top 5-7 unique colors define the brand
No Usable Font Information
If font detection fails completely:
- Check if the site mentions font names in its CSS comments or config
- Look at the overall aesthetic and pick a matching pairing from the existing slide presets
- Default to a safe, distinctive pairing based on vibe: serif display + sans body for premium; geometric sans for modern tech
Example
Running this skill on https://vapi.ai might produce:
# Visual Brand Identity: Vapi
**Extracted from:** https://vapi.ai, https://docs.vapi.ai
**Date:** 2026-02-26
---
## Slide Preset
**Vibe:** Technical, developer-focused, clean, modern
**Layout:** Dark full-width sections with centered content, card-based feature grids, generous spacing
**Typography:**
- Display: `Inter` (700/800)
- Body: `Inter` (400/500)
**Colors:**
\```css
:root {
--bg-primary: #0F172A;
--bg-secondary: #1E293B;
--text-primary: #F8FAFC;
--text-secondary: #94A3B8;
--accent: #22C55E;
--accent-secondary: #3B82F6;
}
\```
**Signature Elements:**
- Subtle gradient orbs in background (green-to-blue radial gradients)
- Rounded cards with slate-800 background and subtle border
- Code-style monospace accents for technical terms
- Green accent on CTAs and interactive elements
**Font Loading:**
\```html
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;700;800&display=swap" rel="stylesheet">
\```
(This is an illustrative example — actual extraction results will vary based on the live site.)
Tips
- Homepage is usually enough. If the homepage has clear branding, you don't need additional pages. Fetch a second page only if the homepage is sparse or uses a different aesthetic from the rest of the site.
- Buttons reveal the accent color. The most reliable way to identify the primary accent is to find the button/CTA background color.
- Check the favicon/logo. SVG logos often contain the exact brand colors as
fillvalues. - Don't over-extract. The goal is 5-7 colors, 1-2 fonts, and 3-4 signature elements. More than that creates noise, not signal.
- When in doubt, simplify. A 3-color palette (bg + text + accent) with one font family at two weights makes a clean, usable preset.
Dependencies
- Web fetch capability (for reading website pages)
- No API keys or paid tools required
| 1 | |
| 2 | name visual-brand-extractor |
| 3 | description > |
| 4 | Extract visual branding (colors, typography, layout patterns) from a client's |
| 5 | website and generate a style preset compatible with the HTML slides skill and |
| 6 | a brand config JSON for the content asset creator. Uses WebFetch to read pages |
| 7 | and analyzes CSS/HTML to identify the color palette, font pairings, and |
| 8 | aesthetic patterns. |
| 9 | tags [brand] |
| 10 | |
| 11 | |
| 12 | # Visual Brand Extractor |
| 13 | |
| 14 | Extract a client's visual identity from their website and generate reusable style presets for slides and content assets. This is an agent-executed skill — the AI reads pages via WebFetch and performs the analysis directly. |
| 15 | |
| 16 | ## Quick Start |
| 17 | |
| 18 | |
| 19 | Extract visual branding from https://vapi.ai for the Vapi client. |
| 20 | |
| 21 | |
| 22 | ## Inputs |
| 23 | |
| 24 | | Input | Required | Description | |
| 25 | |-------|----------|-------------| |
| 26 | | **Website URL** | Yes | Client's homepage or landing page URL | |
| 27 | | **Client name** | Yes | For naming the output files | |
| 28 | | **Additional pages** | No | Product page, docs page, etc. for richer extraction | |
| 29 | |
| 30 | ## Output |
| 31 | |
| 32 | Two files saved to `clients/<client-name>/brand/visual-identity.md`: |
| 33 | |
| 34 | **Slide preset** — CSS custom properties, typography, and signature elements matching the format in `skills/create-html-slides/STYLE_PRESETS.md` |
| 35 | **Brand config JSON** — Simple color/font config matching `skills/content-asset-creator` format |
| 36 | |
| 37 | |
| 38 | |
| 39 | ## Process |
| 40 | |
| 41 | ### Phase 1: Fetch Target Pages |
| 42 | |
| 43 | Fetch 2-3 pages to get a representative sample of the brand: |
| 44 | |
| 45 | **Homepage** (mandatory) — the primary brand expression |
| 46 | **Product/feature page** (if available) — deeper color and layout usage |
| 47 | **Blog or about page** (optional) — secondary design context |
| 48 | |
| 49 | Use WebFetch on each URL with a prompt like: |
| 50 | |
| 51 | > "Extract the full content of this page. I need: all color values (hex, rgb, hsl), font family names, CSS class names (especially Tailwind utility classes), any CSS custom properties/variables, meta tags, and the general structure of the page layout. Preserve exact color codes and font names." |
| 52 | |
| 53 | ### Phase 2: Extract Color Palette |
| 54 | |
| 55 | Analyze the fetched content to identify the color palette. Look for these sources in priority order: |
| 56 | |
| 57 | #### 2.1 CSS Custom Properties |
| 58 | |
| 59 | Look for `:root`, `html`, or `body` blocks containing color variables: |
| 60 | |
| 61 | --color-primary, --primary, --brand, --accent |
| 62 | --bg-*, --background-* |
| 63 | --text-*, --foreground-* |
| 64 | |
| 65 | |
| 66 | #### 2.2 Meta Tags |
| 67 | |
| 68 | Check for: |
| 69 | `<meta name="theme-color" content="#...">` — often the primary brand color |
| 70 | `<meta name="msapplication-TileColor" content="#...">` |
| 71 | |
| 72 | #### 2.3 Explicit CSS Color Declarations |
| 73 | |
| 74 | Search for color values in these properties: |
| 75 | `background-color`, `background` (including gradients) |
| 76 | `color` (text colors) |
| 77 | `border-color`, `border` |
| 78 | `box-shadow` (accent/glow colors) |
| 79 | `fill`, `stroke` (SVG logo colors) |
| 80 | |
| 81 | #### 2.4 Tailwind Utility Classes |
| 82 | |
| 83 | If the site uses Tailwind CSS, map utility classes to hex values using the reference table below. |
| 84 | |
| 85 | #### 2.5 Classify Colors into Roles |
| 86 | |
| 87 | | Role | How to Identify | |
| 88 | |------|----------------| |
| 89 | | **bg-primary** | `background-color` on `body`, `html`, or outermost container. The most common background. | |
| 90 | | **bg-secondary** | Background on cards, sections, or secondary containers. Slightly different from primary. | |
| 91 | | **text-primary** | `color` on `body` or the most common text color. | |
| 92 | | **text-secondary** | Muted text variant — used on subtitles, descriptions, `.text-gray-*` elements. | |
| 93 | | **accent** | Most prominent non-bg, non-text color. Found on buttons, links, CTAs, highlights. Also check `<meta name="theme-color">`. | |
| 94 | | **accent-secondary** | Second accent color, or gradient partner. Found on secondary buttons, hover states. | |
| 95 | | **card-bg** | Background of cards, modals, or elevated surfaces (if different from bg-primary). | |
| 96 | |
| 97 | #### 2.6 Determine Theme Type |
| 98 | |
| 99 | Check the luminance of bg-primary: |
| 100 | **Dark theme:** Dark background (black, navy, charcoal) with light text |
| 101 | **Light theme:** White or cream background with dark text |
| 102 | **Mixed:** Note if the site uses both (e.g., dark hero + light content sections) |
| 103 | |
| 104 | |
| 105 | |
| 106 | ### Phase 3: Extract Typography |
| 107 | |
| 108 | #### 3.1 Find Font Sources |
| 109 | |
| 110 | Look for font loading in this order: |
| 111 | |
| 112 | **Google Fonts `<link>` tags** — Font name is in the URL: |
| 113 | |
| 114 | fonts.googleapis.com/css2?family=Inter:wght@400;700 |
| 115 | |
| 116 | → Font: `Inter`, weights: 400, 700 |
| 117 | |
| 118 | **Fontshare `<link>` tags** — Similar URL pattern: |
| 119 | |
| 120 | api.fontshare.com/v2/css?f[]=clash-display@400,700 |
| 121 | |
| 122 | → Font: `Clash Display` |
| 123 | |
| 124 | **`@font-face` declarations** — Extract the `font-family` value |
| 125 | |
| 126 | **`font-family` CSS properties** — Direct declarations on elements |
| 127 | |
| 128 | #### 3.2 Classify into Display vs Body |
| 129 | |
| 130 | | Role | How to Identify | |
| 131 | |------|----------------| |
| 132 | | **Display font** | Font on `h1`, `h2`, `.title`, `.heading`, `.hero-title`, or the largest/boldest text. | |
| 133 | | **Body font** | Font on `body`, `p`, or general content elements. | |
| 134 | |
| 135 | If both use the same font family, it's a single-family pairing (like "Manrope + Manrope"). Note the different weights used for display (700-900) vs body (400-500). |
| 136 | |
| 137 | #### 3.3 Handle Proprietary Fonts |
| 138 | |
| 139 | If the site uses a font NOT available on Google Fonts or Fontshare, map it to the closest available equivalent using the **Font Fallback Table** below. |
| 140 | |
| 141 | |
| 142 | |
| 143 | ### Phase 4: Analyze Visual Patterns |
| 144 | |
| 145 | Examine the CSS and page structure for these aesthetic signals: |
| 146 | |
| 147 | | Signal | What to Look For | Aesthetic Implication | |
| 148 | |--------|-----------------|---------------------| |
| 149 | | **Border radius** | `border-radius` values — large (12px+, 9999px) vs small (2-4px) vs none | Rounded = friendly/modern. Sharp = corporate/bold. | |
| 150 | | **Gradients** | `linear-gradient`, `radial-gradient` in backgrounds | Gradient-forward = modern SaaS aesthetic | |
| 151 | | **Shadows** | `box-shadow` frequency and intensity | Heavy shadows = depth/elevation. None = flat/minimal. | |
| 152 | | **Spacing** | Padding/margin sizes — generous (4rem+) vs tight (1rem) | Airy = premium/minimal. Dense = information-rich. | |
| 153 | | **Animations** | `@keyframes`, `transition`, `transform` presence | Motion-forward = energetic. Minimal = calm/professional. | |
| 154 | | **Grid patterns** | Background grid/dot patterns, decorative overlays | Technical/developer aesthetic | |
| 155 | | **Gradient orbs** | `radial-gradient` on positioned pseudo-elements | Modern, atmospheric aesthetic | |
| 156 | | **Borders as accents** | Colored `border-left` or `border-top` on sections | Editorial, organized aesthetic | |
| 157 | |
| 158 | #### Synthesize the Vibe |
| 159 | |
| 160 | Based on the signals above, compose: |
| 161 | **Vibe:** 2-4 adjectives (e.g., "Clean, technical, developer-focused, modern") |
| 162 | **Layout description:** 1 sentence (e.g., "Full-width dark sections with centered content and generous whitespace") |
| 163 | **Signature elements:** 3-4 reproducible CSS patterns from the site |
| 164 | |
| 165 | |
| 166 | |
| 167 | ### Phase 5: Generate Output |
| 168 | |
| 169 | Create the file `clients/<client-name>/brand/visual-identity.md` with both output formats. |
| 170 | |
| 171 | #### Output Template |
| 172 | |
| 173 | |
| 174 | # Visual Brand Identity: [Company Name] |
| 175 | |
| 176 | **Extracted from:** [URL(s)] |
| 177 | **Date:** [YYYY-MM-DD] |
| 178 | |
| 179 | |
| 180 | |
| 181 | ## Slide Preset |
| 182 | |
| 183 | **Vibe:** [2-4 adjectives] |
| 184 | |
| 185 | **Layout:** [1 sentence describing dominant layout pattern] |
| 186 | |
| 187 | **Typography:** |
| 188 | - Display: `[Font Name]` ([weight, e.g., 700/800]) |
| 189 | - Body: `[Font Name]` ([weight, e.g., 400/500]) |
| 190 | |
| 191 | **Colors:** |
| 192 | |
| 193 | :root { |
| 194 | --bg-primary: [hex]; |
| 195 | --bg-secondary: [hex]; |
| 196 | --text-primary: [hex]; |
| 197 | --text-secondary: [hex]; |
| 198 | --accent: [hex]; |
| 199 | --accent-secondary: [hex]; |
| 200 | } |
| 201 | |
| 202 | |
| 203 | **Signature Elements:** |
| 204 | - [Element 1, e.g., "Subtle gradient orbs as background decoration"] |
| 205 | - [Element 2, e.g., "Rounded cards with 12px border-radius and light shadow"] |
| 206 | - [Element 3, e.g., "Accent-colored left border on feature blocks"] |
| 207 | - [Element 4, e.g., "Grid dot pattern overlay on hero sections"] |
| 208 | |
| 209 | **Font Loading:** |
| 210 | |
| 211 | <link href="https://fonts.googleapis.com/css2?family=[Font1]:wght@[weights]&family=[Font2]:wght@[weights]&display=swap" rel="stylesheet"> |
| 212 | |
| 213 | |
| 214 | |
| 215 | |
| 216 | ## Brand Config (JSON) |
| 217 | |
| 218 | For use with `content-asset-creator` and other skills: |
| 219 | |
| 220 | |
| 221 | { |
| 222 | "name": "[Company]", |
| 223 | "primary_color": "[accent hex]", |
| 224 | "secondary_color": "[accent-secondary hex]", |
| 225 | "accent_color": "[accent hex]", |
| 226 | "background": "[bg-primary hex]", |
| 227 | "text_color": "[text-primary hex]", |
| 228 | "font_heading": "[Display Font]", |
| 229 | "font_body": "[Body Font]", |
| 230 | "logo_url": "[if discovered, otherwise omit]" |
| 231 | } |
| 232 | |
| 233 | |
| 234 | |
| 235 | |
| 236 | ## Extraction Notes |
| 237 | |
| 238 | [Any notes about the extraction — proprietary fonts that were mapped, multiple themes detected, sparse CSS from JS-rendered sites, etc.] |
| 239 | |
| 240 | |
| 241 | |
| 242 | |
| 243 | ## Font Fallback Table |
| 244 | |
| 245 | When a site uses a proprietary font not available on Google Fonts or Fontshare, use this mapping to find the closest available alternative: |
| 246 | |
| 247 | | Font Category | Proprietary Examples | Google Fonts Alternative | Fontshare Alternative | |
| 248 | |--------------|---------------------|-------------------------|----------------------| |
| 249 | | Geometric sans | Circular, Roobert, Graphik, Product Sans | `Plus Jakarta Sans`, `Outfit`, `Manrope` | `General Sans`, `Satoshi` | |
| 250 | | Humanist sans | Proxima Nova, Calibri, Gill Sans | `Source Sans 3`, `DM Sans`, `Work Sans` | — | |
| 251 | | Neo-grotesque | Akkurat, Aktiv Grotesk, Suisse Int'l | `Space Grotesk`, `Archivo`, `Albert Sans` | `Switzer` | |
| 252 | | Modern serif | Tiempos, Canela, GT Sectra | `Fraunces`, `Cormorant`, `Playfair Display` | `Zodiak`, `Sentient` | |
| 253 | | Slab serif | Sentinel, Clarendon, Rockwell | `Zilla Slab`, `Roboto Slab` | — | |
| 254 | | Classic serif | Mercury, Chronicle, Minion | `Source Serif 4`, `Lora`, `Libre Baskerville` | `Bespoke Serif` | |
| 255 | | Monospace | SF Mono, Berkeley Mono, Dank Mono | `JetBrains Mono`, `Fira Code`, `Space Mono` | `Jet Brains Mono` | |
| 256 | | Display / decorative | GT Walsheim, Recoleta, Campton | `Syne`, `Archivo Black`, `Bricolage Grotesque` | `Clash Display`, `Cabinet Grotesk` | |
| 257 | |
| 258 | **Decision heuristic:** If unsure which category a font falls into, look at its characteristics: |
| 259 | Round dots and geometric 'o' → Geometric sans |
| 260 | Varies stroke widths, warm feel → Humanist sans |
| 261 | Uniform strokes, neutral → Neo-grotesque |
| 262 | Serifs with high contrast → Modern serif |
| 263 | |
| 264 | |
| 265 | |
| 266 | ## Tailwind CSS Color Reference |
| 267 | |
| 268 | If the site uses Tailwind utility classes, map them to hex values: |
| 269 | |
| 270 | ### Grays |
| 271 | | Class | Hex | Class | Hex | |
| 272 | |-------|-----|-------|-----| |
| 273 | | `gray-50` | `#F9FAFB` | `gray-500` | `#6B7280` | |
| 274 | | `gray-100` | `#F3F4F6` | `gray-600` | `#4B5563` | |
| 275 | | `gray-200` | `#E5E7EB` | `gray-700` | `#374151` | |
| 276 | | `gray-300` | `#D1D5DB` | `gray-800` | `#1F2937` | |
| 277 | | `gray-400` | `#9CA3AF` | `gray-900` | `#111827` | |
| 278 | | | | `gray-950` | `#030712` | |
| 279 | |
| 280 | ### Slate (common for dark themes) |
| 281 | | Class | Hex | Class | Hex | |
| 282 | |-------|-----|-------|-----| |
| 283 | | `slate-50` | `#F8FAFC` | `slate-500` | `#64748B` | |
| 284 | | `slate-100` | `#F1F5F9` | `slate-600` | `#475569` | |
| 285 | | `slate-200` | `#E2E8F0` | `slate-700` | `#334155` | |
| 286 | | `slate-300` | `#CBD5E1` | `slate-800` | `#1E293B` | |
| 287 | | `slate-400` | `#94A3B8` | `slate-900` | `#0F172A` | |
| 288 | | | | `slate-950` | `#020617` | |
| 289 | |
| 290 | ### Blues |
| 291 | | Class | Hex | Class | Hex | |
| 292 | |-------|-----|-------|-----| |
| 293 | | `blue-400` | `#60A5FA` | `blue-700` | `#1D4ED8` | |
| 294 | | `blue-500` | `#3B82F6` | `blue-800` | `#1E40AF` | |
| 295 | | `blue-600` | `#2563EB` | `blue-900` | `#1E3A8A` | |
| 296 | |
| 297 | ### Greens |
| 298 | | Class | Hex | Class | Hex | |
| 299 | |-------|-----|-------|-----| |
| 300 | | `green-400` | `#4ADE80` | `green-600` | `#16A34A` | |
| 301 | | `green-500` | `#22C55E` | `green-700` | `#15803D` | |
| 302 | |
| 303 | ### Common Accent Colors |
| 304 | | Class | Hex | Class | Hex | |
| 305 | |-------|-----|-------|-----| |
| 306 | | `indigo-500` | `#6366F1` | `purple-500` | `#A855F7` | |
| 307 | | `indigo-600` | `#4F46E5` | `violet-500` | `#8B5CF6` | |
| 308 | | `emerald-500` | `#10B981` | `amber-500` | `#F59E0B` | |
| 309 | | `teal-500` | `#14B8A6` | `rose-500` | `#F43F5E` | |
| 310 | | `cyan-500` | `#06B6D4` | `orange-500` | `#F97316` | |
| 311 | |
| 312 | **Note:** Tailwind classes appear as `bg-blue-600`, `text-gray-900`, `border-indigo-500`, etc. Strip the property prefix (`bg-`, `text-`, `border-`) to get the color token, then look up the hex value above. |
| 313 | |
| 314 | For custom Tailwind themes (e.g., `bg-brand`, `text-brand-light`), check the page's `<script>` tags for a `tailwind.config` object that defines custom colors. |
| 315 | |
| 316 | |
| 317 | |
| 318 | ## Edge Cases |
| 319 | |
| 320 | ### JS-Rendered Sites (Sparse CSS) |
| 321 | Many modern sites (Next.js, React) inject styles via JavaScript. WebFetch may return minimal inline CSS. In this case: |
| 322 | Focus on Tailwind utility classes in `class` attributes |
| 323 | Check `<script>` tags for embedded config objects |
| 324 | Look for `<style>` tags that contain CSS-in-JS output |
| 325 | If still sparse, ask the user: "The site appears to use dynamic styling. Could you share a screenshot or provide their brand guidelines directly?" |
| 326 | |
| 327 | ### Multiple Color Schemes (Light/Dark Mode) |
| 328 | Some sites define both light and dark themes via `prefers-color-scheme`. Extract the **default** (non-media-query) theme. If a dark mode variant is detected, note it in the Extraction Notes section. |
| 329 | |
| 330 | ### Too Many Colors |
| 331 | Enterprise sites may use dozens of colors. Focus on: |
| 332 | The hero/above-the-fold section for the primary palette |
| 333 | Button/CTA colors for accent identification |
| 334 | Frequency analysis — top 5-7 unique colors define the brand |
| 335 | |
| 336 | ### No Usable Font Information |
| 337 | If font detection fails completely: |
| 338 | Check if the site mentions font names in its CSS comments or config |
| 339 | Look at the overall aesthetic and pick a matching pairing from the existing slide presets |
| 340 | Default to a safe, distinctive pairing based on vibe: serif display + sans body for premium; geometric sans for modern tech |
| 341 | |
| 342 | |
| 343 | |
| 344 | ## Example |
| 345 | |
| 346 | Running this skill on `https://vapi.ai` might produce: |
| 347 | |
| 348 | |
| 349 | # Visual Brand Identity: Vapi |
| 350 | |
| 351 | **Extracted from:** https://vapi.ai, https://docs.vapi.ai |
| 352 | **Date:** 2026-02-26 |
| 353 | |
| 354 | |
| 355 | |
| 356 | ## Slide Preset |
| 357 | |
| 358 | **Vibe:** Technical, developer-focused, clean, modern |
| 359 | |
| 360 | **Layout:** Dark full-width sections with centered content, card-based feature grids, generous spacing |
| 361 | |
| 362 | **Typography:** |
| 363 | - Display: `Inter` (700/800) |
| 364 | - Body: `Inter` (400/500) |
| 365 | |
| 366 | **Colors:** |
| 367 | \```css |
| 368 | :root { |
| 369 | --bg-primary: #0F172A; |
| 370 | --bg-secondary: #1E293B; |
| 371 | --text-primary: #F8FAFC; |
| 372 | --text-secondary: #94A3B8; |
| 373 | --accent: #22C55E; |
| 374 | --accent-secondary: #3B82F6; |
| 375 | } |
| 376 | \``` |
| 377 | |
| 378 | **Signature Elements:** |
| 379 | - Subtle gradient orbs in background (green-to-blue radial gradients) |
| 380 | - Rounded cards with slate-800 background and subtle border |
| 381 | - Code-style monospace accents for technical terms |
| 382 | - Green accent on CTAs and interactive elements |
| 383 | |
| 384 | **Font Loading:** |
| 385 | \```html |
| 386 | <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;700;800&display=swap" rel="stylesheet"> |
| 387 | \``` |
| 388 | |
| 389 | |
| 390 | *(This is an illustrative example — actual extraction results will vary based on the live site.)* |
| 391 | |
| 392 | |
| 393 | |
| 394 | ## Tips |
| 395 | |
| 396 | **Homepage is usually enough.** If the homepage has clear branding, you don't need additional pages. Fetch a second page only if the homepage is sparse or uses a different aesthetic from the rest of the site. |
| 397 | **Buttons reveal the accent color.** The most reliable way to identify the primary accent is to find the button/CTA background color. |
| 398 | **Check the favicon/logo.** SVG logos often contain the exact brand colors as `fill` values. |
| 399 | **Don't over-extract.** The goal is 5-7 colors, 1-2 fonts, and 3-4 signature elements. More than that creates noise, not signal. |
| 400 | **When in doubt, simplify.** A 3-color palette (bg + text + accent) with one font family at two weights makes a clean, usable preset. |
| 401 | |
| 402 | ## Dependencies |
| 403 | |
| 404 | Web fetch capability (for reading website pages) |
| 405 | No API keys or paid tools required |
| 406 |