From claude-ads
Extracts brand identity from a website URL: visual identity, tone of voice, color palette, typography, imagery style. Outputs brand-profile.json for brand-consistent advertising creatives.
How this skill is triggered — by the user, by Claude, or both
Slash command
/claude-ads:ads-dnaThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Extracts brand identity from a website and saves it as `brand-profile.json`
Extracts brand identity from a website and saves it as brand-profile.json
for use by /ads create, /ads generate, and /ads photoshoot.
| Command | What it does |
|---|---|
/ads dna <url> | Full brand extraction → brand-profile.json |
/ads dna https://acme.com --quick | Fast extraction (homepage only) |
If the user hasn't provided a URL, ask:
"What website URL should I analyze for brand DNA? (e.g. https://yoursite.com)"
Use the WebFetch tool to retrieve each page. For each URL, use this fetch prompt:
"Return all visible text content, the full contents of any
<style>blocks, inlinestyle=attributes,<meta>tags, Google Fonts@importURLs, and anyog:imagevalues found on this page."
Fetch in this order:
<url>)<url>/about, then <url>/about-us, then <url>/our-story<url>/product, then <url>/products, then <url>/servicesIf --quick flag was provided: fetch the homepage only; skip steps 2 and 3.
If a secondary page returns a 404 or redirect error, continue with fewer pages and note: "Secondary pages unavailable; extraction based on homepage only. Confidence may be lower."
After fetching pages, capture 3 screenshots for comprehensive brand anchoring.
These serve as visual style references during /ads generate; the same approach
Pomelli uses to anchor ad images to the actual brand aesthetic.
Capture the following:
python ~/.claude/skills/ads/scripts/capture_screenshot.py [url]
Saves: ./brand-screenshots/{domain}_homepage.png
python ~/.claude/skills/ads/scripts/capture_screenshot.py [url]/products
Saves: ./brand-screenshots/{domain}_product.png
python ~/.claude/skills/ads/scripts/capture_screenshot.py [url]/about
Saves: ./brand-screenshots/{domain}_about.png
If a page is not found or returns an error, skip it gracefully and continue with the remaining pages.
If --quick flag was provided: skip screenshot capture entirely.
If capture fails (Playwright not installed, network error, JS-heavy SPA that times out):
"Screenshot capture skipped; run: python3 -m playwright install chromium"screenshots field in brand-profile.jsonFrom the fetched HTML, extract:
Colors:
og:image meta tag → analyze dominant colors (note 2-3 prominent hex values)background-color on body, header, .hero, .btn-primarycolor on h1, h2, .btnborder-color or background on .cta, .buttonTypography:
@import url(https://fonts.googleapis.com/...) → extract font names from URL pathfont-family on h1, h2, body, .headlinefamily=Inter:wght@..., heading_font = "Inter"Voice: Analyze hero headline, subheadline, About page intro, and CTA button text. Score each axis 1-10 using these heuristics:
| Signal | Score direction |
|---|---|
| Uses "you/your" frequently | formal_casual → casual (+2) |
| Uses technical jargon | expert_accessible → expert (-2) |
| Short punchy sentences (≤8 words) | bold_subtle → bold (+2) |
| Data/stats in hero | rational_emotional → rational (-2) |
| "Transform", "revolutionize", "disrupt" | traditional_innovative → innovative (+2) |
| Customer testimonials lead | rational_emotional → emotional (+2) |
| Industry awards, "trusted by X" | traditional_innovative → traditional (-1) |
Each voice axis gets a confidence rating based on signal count:
Also extract structured data when available: schema.org markup, Open Graph tags (og:title, og:description, og:image), Twitter Card metadata.
Imagery style (from og:image and any visible hero image descriptions):
Forbidden elements (infer from brand positioning):
Read ~/.claude/skills/ads/references/brand-dna-template.md for the exact schema.
Construct the JSON object following the schema precisely. Use null for any
field that cannot be confidently extracted; do not guess.
Example of a low-confidence field:
"typography": {
"heading_font": null,
"body_font": "system-ui",
"pairing_descriptor": "system default (Google Fonts not detected)"
}
Write the JSON to ./brand-profile.json in the current working directory
(where the user is running Claude Code).
If screenshots were captured successfully in Step 2b, include a screenshots field:
"screenshots": {
"homepage": "./brand-screenshots/{domain}_homepage.png",
"product": "./brand-screenshots/{domain}_product.png",
"about": "./brand-screenshots/{domain}_about.png"
}
Include only the screenshots that were successfully captured. If a page was not
found or errored, omit that key. Omit the screenshots field entirely if Step 2b
was skipped or all captures failed.
Show the user:
✓ brand-profile.json saved to ./brand-profile.json
Brand DNA Summary:
Brand: [brand_name]
Voice: [descriptor 1], [descriptor 2], [descriptor 3]
Primary Color: [hex]
Typography: [heading_font] / [body_font]
Target: [age_range] [profession]
Screenshots: [N captured (homepage, product, about) in ./brand-screenshots/] OR [skipped]
Run `/ads create` to generate campaign concepts from this profile.
The visual-designer agent uses the most relevant screenshot per concept as a style reference when generating images via banana. For example, a product-focused concept references the product page screenshot, while a brand awareness concept references the homepage or about page screenshot.
{
"schema_version": "1.0",
"brand_name": "string",
"website_url": "string",
"extracted_at": "ISO-8601",
"voice": {
"formal_casual": 1-10,
"rational_emotional": 1-10,
"playful_serious": 1-10,
"bold_subtle": 1-10,
"traditional_innovative": 1-10,
"expert_accessible": 1-10,
"descriptors": ["adjective1", "adjective2", "adjective3"]
},
"colors": {
"primary": "#hexcode or null",
"secondary": ["#hex1", "#hex2"],
"forbidden": ["#hex or color name"],
"background": "#hexcode",
"text": "#hexcode"
},
"typography": {
"heading_font": "Font Name or null",
"body_font": "Font Name or system-ui",
"pairing_descriptor": "brief description"
},
"imagery": {
"style": "professional photography | illustration | flat design | mixed",
"subjects": ["subject1", "subject2"],
"composition": "brief description",
"forbidden": ["element1", "element2"]
},
"aesthetic": {
"mood_keywords": ["keyword1", "keyword2", "keyword3"],
"texture": "minimal | textured | mixed",
"negative_space": "generous | moderate | dense"
},
"brand_values": ["value1", "value2", "value3"],
"target_audience": {
"age_range": "e.g. 25-45",
"profession": "brief description",
"pain_points": ["pain1", "pain2"],
"aspirations": ["aspiration1", "aspiration2"]
}
}
npx claudepluginhub hainrixz/claude-ads --plugin claude-adsExtracts brand identity (colors, typography, tone of voice, imagery style) from a website URL into brand-profile.json, for brand-consistent ad creative generation.
Analyzes brand websites via browser scraping to extract colors, typography, voice/tone, products, audience, and positioning into reusable brand_profile.json. Use before content creation.
Researches brands from URL or description to generate Brand DNA docs analyzing identity, visuals, typography, colors, photography, packaging, and ad styles. Saves to brands/{brand}/brand-dna.md.