skills/ads-dna/SKILL.md
Brand DNA extractor for paid advertising. Scans a website URL to extract visual identity, tone of voice, color palette, typography, and imagery style. Outputs brand-profile.json to the current directory. Run before /ads create or /ads generate for brand-consistent creative. Triggers on: "brand DNA", "brand profile", "extract brand", "brand identity", "brand colors", "what is the brand voice", "analyze brand", "brand style guide".
npx skillsauth add tapanshah/ads-audit-claude ads-dnaInstall 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.
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 desktop screenshots of the website. These serve as
visual style references during /ads generate — the same approach Pomelli uses
to anchor ad images to the actual brand aesthetic.
Run for the homepage:
python ~/.claude/skills/ads/scripts/capture_screenshot.py [url]
This saves ./brand-screenshots/[domain]_desktop.png (default naming from the script).
Also attempt one secondary page (pricing or product page, whichever was accessible):
python ~/.claude/skills/ads/scripts/capture_screenshot.py [url]/pricing
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) |
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]_desktop.png",
"secondary": ["./brand-screenshots/[domain]_pricing_desktop.png"]
}
Omit the screenshots field entirely if Step 2b was skipped or 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 → ./brand-screenshots/] OR [skipped]
Run `/ads create` to generate campaign concepts from this profile.
{
"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"]
}
}
development
YouTube Ads specific analysis covering campaign types, creative quality, audience targeting, and measurement. Evaluates video ad performance across skippable, non-skippable, bumper, Shorts, and Demand Gen formats. Use when user says "YouTube Ads", "video ads", "pre-roll", "bumper ads", "YouTube campaign", or "Shorts ads".
testing
TikTok Ads deep analysis covering creative quality, tracking, bidding, campaign structure, and TikTok Shop. Evaluates 25 checks with emphasis on creative-first strategy, safe zone compliance, and Smart+ campaigns. Use when user says "TikTok Ads", "TikTok marketing", "TikTok Shop", "Spark Ads", "Smart+", or "TikTok campaign".
testing
Strategic paid advertising planning with industry-specific templates. Covers platform selection, campaign architecture, budget planning, creative strategy, and phased implementation roadmap. Use when user says "ad plan", "ad strategy", "campaign planning", "media plan", "PPC strategy", or "advertising plan".
development
Product photography enhancement for ad creatives using AI image generation. Takes a product image and generates 5 professional photography styles for ad use: Studio, Floating, Ingredient, In Use, and Lifestyle. Requires GOOGLE_API_KEY or configured ADS_IMAGE_PROVIDER. Triggers on: "product photo", "product photography", "photoshoot", "enhance product image", "product shoot", "product photos for ads", "generate product photos", "studio shot", "lifestyle photo".