skills/capabilities/visual-brand-extractor/SKILL.md
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. Uses WebFetch to read pages and analyzes CSS/HTML to identify the color palette, font pairings, and aesthetic patterns.
npx skillsauth add athina-ai/goose-skills visual-brand-extractorInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
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.
Extract visual branding from https://vapi.ai for the Vapi client.
| 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 |
Two files saved to clients/<client-name>/brand/visual-identity.md:
skills/create-html-slides/STYLE_PRESETS.mdskills/content-asset-creator formatFetch 2-3 pages to get a representative sample of the brand:
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."
Analyze the fetched content to identify the color palette. Look for these sources in priority order:
Look for :root, html, or body blocks containing color variables:
--color-primary, --primary, --brand, --accent
--bg-*, --background-*
--text-*, --foreground-*
Check for:
<meta name="theme-color" content="#..."> — often the primary brand color<meta name="msapplication-TileColor" content="#...">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)If the site uses Tailwind CSS, map utility classes to hex values using the reference table below.
| 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). |
Check the luminance of bg-primary:
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, 700
Fontshare <link> tags — Similar URL pattern:
api.fontshare.com/v2/css?f[]=clash-display@400,700
→ Font: Clash Display
@font-face declarations — Extract the font-family value
font-family CSS properties — Direct declarations on elements
| 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).
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.
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 |
Based on the signals above, compose:
Create the file clients/<client-name>/brand/visual-identity.md with both output formats.
# 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.]
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:
If the site uses Tailwind utility classes, map them to hex values:
| 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 |
| 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 |
| Class | Hex | Class | Hex |
|-------|-----|-------|-----|
| blue-400 | #60A5FA | blue-700 | #1D4ED8 |
| blue-500 | #3B82F6 | blue-800 | #1E40AF |
| blue-600 | #2563EB | blue-900 | #1E3A8A |
| Class | Hex | Class | Hex |
|-------|-----|-------|-----|
| green-400 | #4ADE80 | green-600 | #16A34A |
| green-500 | #22C55E | green-700 | #15803D |
| 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.
Many modern sites (Next.js, React) inject styles via JavaScript. WebFetch may return minimal inline CSS. In this case:
class attributes<script> tags for embedded config objects<style> tags that contain CSS-in-JS outputSome 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.
Enterprise sites may use dozens of colors. Focus on:
If font detection fails completely:
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.)
fill values.content-media
Takes an existing screen recording or demo video and adds professional zoom/pan effects synchronized to the narration. Uses transcript-driven zoom targeting and Remotion for rendering. Optionally replaces audio with a soundtrack.
tools
Repurposes long-form video (podcasts, interviews, talks) into short-form vertical clips for Instagram Reels, TikTok, and YouTube Shorts. Handles transcription, moment selection, clip extraction, speaker-tracked reframing (16:9 to 9:16), and animated captions.
development
Creates talking head videos from any source material (docs, changelogs, blog posts, notes, transcripts). Produces multi-scene videos with avatar narration over screenshots/images using HeyGen v2 API. Supports Quick Shot and Full Producer modes.
tools
Generates Instagram-ready product reels from any e-commerce product page URL. Scrapes product images, classifies by type, generates AI-animated clips via Higgsfield API, creates text overlays with style presets, and composes a 15-20 second reel with music. Supports model-based and product-only reels.