Install any skill in seconds. Free to start, no credit card required.
Get Started Free →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. Run before /ads create or /ads generate for brand-consistent creative. Triggers on: "brand DNA", "brand profile", "extract brand", "brand identity", "brand colors", "analyze brand", "brand style guide", "brand voice"
.claude/skills/miosa-osa-ads-dna/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 5% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 14% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 52% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 0% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 3% | 0% |
> Extracts brand identity from a website and saves it as brand-profile.json > for use by /ads create, /ads generate, and /ads photoshoot.
bash/ads dna <url> /ads dna https://acme.com /ads dna https://acme.com --quick
| Flag | Type | Default | Description | |------|------|---------|-------------| | <url> | string | required | Website URL to analyze | | --quick | flag | false | Homepage only (skip secondary pages) |
If the user hasn't provided a URL, ask: > "What website URL should I analyze for brand DNA?"
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.
From the fetched HTML, extract:
Colors:
og:image meta tag — analyze dominant colorsbackground-color on body, header, .hero, .btn-primarycolor on h1, h2, .btnTypography:
@import URLs — extract font namesfont-family on h1, h2, bodyVoice: Analyze hero headline, subheadline, About page intro, and CTA button text. Score each axis 1-10:
| 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" | traditional_innovative -> innovative (+2) | | Customer testimonials lead | rational_emotional -> emotional (+2) |
Imagery style (from og:image and hero images):
Forbidden elements (infer from brand positioning):
json{ "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"] } }
Write to ./brand-profile.json in the current working directory.
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]
Run `/ads create` to generate campaign concepts from this profile.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 26,125 | 14,690 | -44% | 1 | 1 | 0% | 4,123 | 4,334 | +5% | 0 | 0 | — |
case-02 | fail→pass | 21,339 | 12,595 | -41% | 1 | 1 | 0% | 3,188 | 3,650 | +14% | 0 | 0 | — |
case-03 | fail→pass | 19,859 | 16,018 | -19% | 1 | 1 | 0% | 2,985 | 4,550 | +52% | 0 | 0 | — |
case-04 | pass→pass | 15,131 | 12,283 | -19% | 1 | 1 | 0% | 1,992 | 3,119 | +57% | 0 | 0 | — |
case-05 | pass→pass | 11,340 | 12,675 | +12% | 1 | 1 | 0% | 1,781 | 3,530 | +98% | 0 | 0 | — |
case-06 | pass→pass | 15,475 | 16,437 | +6% | 1 | 1 | 0% | 2,326 | 3,595 | +55% | 0 | 0 | — |
case-07 | pass→pass | 5,555 | 1,700 | -69% | 1 | 1 | 0% | 687 | 1,540 | +124% | 0 | 0 | — |
case-08 | pass→pass | 9,841 | 9,182 | -7% | 1 | 1 | 0% | 1,319 | 3,057 | +132% | 0 | 0 | — |
case-09 | fail→pass | 10,648 | 4,292 | -60% | 1 | 1 | 0% | 1,902 | 1,904 | +0% | 0 | 0 | — |
case-10 | fail→pass | 12,892 | 4,058 | -69% | 1 | 1 | 0% | 2,002 | 2,063 | +3% | 0 | 0 | — |
case-11 | fail→pass | 11,826 | 5,243 | -56% | 1 | 1 | 0% | 1,457 | 2,038 | +40% | 0 | 0 | — |
case-12 | fail→pass | 10,203 | 6,406 | -37% | 1 | 1 | 0% | 1,389 | 2,380 | +71% | 0 | 0 | — |
case-13 | fail→pass | 9,974 | 2,314 | -77% | 1 | 1 | 0% | 1,556 | 1,751 | +13% | 0 | 0 | — |
case-14 | fail→pass | 13,019 | 4,923 | -62% | 1 | 1 | 0% | 1,903 | 2,118 | +11% | 0 | 0 | — |
case-15 | fail→pass | 11,063 | 4,404 | -60% | 1 | 1 | 0% | 1,722 | 2,081 | +21% | 0 | 0 | — |
case-16 | fail→pass | 13,874 | 6,814 | -51% | 1 | 1 | 0% | 2,371 | 2,639 | +11% | 0 | 0 | — |
case-17 | fail→pass | 13,464 | 2,544 | -81% | 1 | 1 | 0% | 1,981 | 1,776 | -10% | 0 | 0 | — |
case-18 | pass→pass | 16,331 | 12,885 | -21% | 1 | 1 | 0% | 2,535 | 3,714 | +47% | 0 | 0 | — |
case-19 | pass→pass | 17,691 | 15,475 | -13% | 1 | 1 | 0% | 2,603 | 3,674 | +41% | 0 | 0 | — |
case-20 | pass→pass | 6,667 | 2,318 | -65% | 1 | 1 | 0% | 1,053 | 1,719 | +63% | 0 | 0 | — |
case-21 | fail→fail | 12,186 | 9,912 | -19% | 1 | 1 | 0% | 2,061 | 3,006 | +46% | 0 | 0 | — |
case-22 | pass→pass | 11,289 | 2,946 | -74% | 1 | 1 | 0% | 1,743 | 1,889 | +8% | 0 | 0 | — |
case-23 | fail→pass | 16,798 | 4,023 | -76% | 1 | 1 | 0% | 2,497 | 2,100 | -16% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of +57 percentage points is the difference between those two pass rates over the 23 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.