Brand color discovery and palette generation skill...
This skill guides brand color discovery and generates comprehensive palette reports. It walks through understanding brand identity, selecting hues from the RYB color wheel, setting chroma/tone preferences, then generates Obsidian-compatible markdown with full tonal scales (50-950), Tailwind configs, and APCA contrast validation.
Three entry points:
Execute via uv run:
uv run {base_dir}/scripts/brand_report.py [options]
| Script | Description |
|---|---|
brand_report.py |
Main entry point - generates palette reports |
| Option | Description |
|---|---|
--name NAME |
Brand name (required) |
--hue NAME:WEIGHT |
Hue with weight, repeat 1-3 times (e.g., Blue:0.6) |
--hex COLOR |
Start from hex color (e.g., #015856). Overrides --hue/--chroma/--tone |
--oklch 'L C H' |
Start from OKLCH values (e.g., '0.72 0.12 201.7'). Overrides --hue/--chroma/--tone |
--chroma 0-100 |
Chroma/saturation intent (default: 50) |
--tone 0-100 |
Tone/lightness intent (default: 50) |
--gamut p3|srgb |
Target color gamut (default: p3) |
--include-complement |
Include the complementary color (180° opposite in RYB) |
--auto-adjust |
Auto-adjust colors for APCA contrast |
--output PATH |
Output file path (required) |
Use this when starting from scratch with a new brand.
This phase is collaborative and iterative. Engage in genuine dialogue to understand the brand before making color decisions. Do not rush through as a checklist.
Key areas to explore:
Brand essence: What does the brand represent? Core values, personality traits, emotional associations? What feelings should the brand evoke?
Industry/category: Finance, health, entertainment, luxury, tech, sustainability? Industry norms provide useful starting points (but can be intentionally broken).
Target audience: Who is the primary audience? Consider age, sophistication level, cultural context, and what resonates with them visually.
Competitive landscape: Who are the direct competitors? Use web search tools or subagents to research what colors dominate the competitive space. The goal is not to avoid these colors entirely, but to understand existing associations. A competitor strongly associated with blue doesn't mean blue is off-limits—it means choosing blue requires intentional differentiation or acceptance of the association.
Existing constraints: Any existing brand colors, logo colors, or assets that must be respected or harmonized with?
Guidance:
⚠️ CHECKPOINT: Do NOT proceed to Phase 2 until the user explicitly confirms understanding of their brand. Present a summary of findings and wait for approval.
The palette system uses 6 anchor hues from the RYB color wheel. Select 1-3 hues with weights that reflect their relative importance to the brand identity.
Available Hues and Brand Associations:
| Hue | Associations |
|---|---|
| Red | Energy, passion, urgency, bold, confident, pioneering, excitement, youthful, active, powerful |
| Orange | Warmth, friendly, approachable, cheerful, creative, social, inviting, clarity, fun, optimistic |
| Yellow | Joy, optimism, sunshine, energetic, youthful, happy, cheerful, bright, summer, playful |
| Green | Nature, growth, health, trust, balance, safety, environmental, organic, peaceful, wealth |
| Blue | Trust, stability, calm, professional, secure, reliable, depth, progress, responsible, tranquil |
| Purple | Luxury, creativity, wisdom, elegance, ambition, noble, imaginative, mystical, sophisticated |
Selection guidance:
Industry starting points (guidance, not rules):
| Industry | Common Hues | Notes |
|---|---|---|
| Finance/Enterprise | Blue, Green | Trust, stability, growth |
| Health/Wellness | Green, Blue | Nature, calm, trust |
| Luxury/Premium | Purple, restrained Red | Elegance, sophistication |
| Food/Retail | Orange, Red, Yellow | Energy, appetite, warmth |
| Tech/SaaS | Blue, Purple | Trust, innovation |
| Sustainability/Eco | Green | Nature, environmental |
| Entertainment/Youth | Yellow, Orange, Red | Energy, fun, excitement |
Discussion points:
⚠️ CHECKPOINT: Propose hue selection with weights and reasoning. Do NOT proceed to Phase 3 until the user confirms the hue selection.
After hue selection, determine the chroma (saturation) and tone (lightness) intents. Both use a 0-100 scale and are independent of hue choice.
Chroma (Vividness): 0-100
| Range | Feel | Brand signals |
|---|---|---|
| 20-40 | Muted, sophisticated, calm | Luxury, premium, minimalist, formal, reserved |
| 40-60 | Balanced, professional | Enterprise, finance, healthcare, government |
| 60-80 | Vibrant, energetic | Consumer tech, retail, entertainment, youth |
| 80-100 | Bold, attention-grabbing | Promotions, sports, disruptive startups |
Higher chroma = more saturated, energetic, youthful Lower chroma = more muted, sophisticated, calm
Tone (Lightness): 0-100
| Range | Feel | Brand signals |
|---|---|---|
| 30-45 | Dark, weighty, authoritative | Luxury, power, prestige, serious |
| 45-55 | Balanced, versatile | Most professional contexts, enterprise |
| 55-70 | Light, friendly, approachable | Wellness, consumer, inclusive, optimistic |
| 70-85 | Airy, soft, gentle | Lifestyle, wellness, feminine products |
Higher tone = lighter, more approachable, open Lower tone = darker, more authoritative, weighty
Discussion points:
⚠️ CHECKPOINT: Propose chroma and tone values with reasoning. Do NOT proceed to Phase 4 until the user confirms these values.
Before generating the palette, present a summary of all choices for final approval.
Summary template:
Brand: [name]
Hues: [Hue1:weight1], [Hue2:weight2], ...
Chroma: [value] ([feel description])
Tone: [value] ([feel description])
Gamut: [p3 or srgb]
APCA Auto-Adjust: [yes/no]
Additional options to confirm:
Example summary:
Brand: Acme Corp
Hues: Blue:0.6, Purple:0.4
Chroma: 55 (balanced, professional)
Tone: 50 (versatile, mid-range)
Gamut: Display P3
APCA Auto-Adjust: yes
⚠️ CRITICAL: Wait for explicit user confirmation before proceeding. Do NOT generate the palette until the user approves the summary.
Generate command (only after approval):
uv run {base_dir}/scripts/brand_report.py \
--name "Brand Name" \
--hue Blue:0.6 --hue Purple:0.4 \
--chroma 55 \
--tone 50 \
--gamut p3 \
--auto-adjust \
--output thoughts/shared/brand/YYYY-MM-DD_brand-name_palette.md
After generation:
tailwind.config.js--hex to refine: pick a specific color from the palette and regenerate around itUse this when the user already has a specific color they want to build from:
Get the color from the user - either hex (e.g., #015856) or OKLCH (e.g., 0.72 0.12 201.7)
Confirm the color by showing what palette will be generated:
Generate directly:
# From hex color
uv run {base_dir}/scripts/brand_report.py \
--name "Brand Name" \
--hex "#015856" \
--include-complement \
--output thoughts/shared/brand/YYYY-MM-DD_brand-name_palette.md
# From OKLCH values
uv run {base_dir}/scripts/brand_report.py \
--name "Brand Name" \
--oklch "0.72 0.12 201.7" \
--include-complement \
--output thoughts/shared/brand/YYYY-MM-DD_brand-name_palette.md
User: "I like this teal color #015856 from the last palette. Can you regenerate around it?"
Agent: "I'll generate a new palette with #015856 as your primary anchor. This color has:
Generating palette..."
uv run {base_dir}/scripts/brand_report.py \
--name "Refined Brand" \
--hex "#015856" \
--include-complement \
--output thoughts/shared/brand/2026-01-01_refined_palette.md
Reports include:
Output location: thoughts/shared/brand/YYYY-MM-DD_brand-name_palette.md
Script location: Scripts are bundled with this skill at {base_dir}/scripts/.
--hex to refine: pick a color from generated palette, regenerate around it