Brand Kit logo

Brand Kit

Organization
cognyai
brand-kit

Build a portable brand-kit.json for the user's product — colors, typography, voice — that other skills (video, ad creative, landing page) can consume. Multiple discovery paths so it works whether the user has access to their site's source code or only a public URL or just a logo image.

Overview

Publishercognyai
Repositoryclaude-code-marketing-skills
Skill namebrand-kit
Stars
111
Forks
15
Bundled files
1
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • 1 bundled files

    Scripts, templates, and references the model can read while it works. Files are read-only and never executed.

  • Open source

    Published by cognyai on GitHub. Read the source before you install it.

Installation

Install the Brand Kit AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/cognyai/claude-code-marketing-skills/tree/main/skills/brand-kit
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/cognyai/claude-code-marketing-skills.git /tmp/claude-code-marketing-skills
mkdir -p .claude/skills
cp -r /tmp/claude-code-marketing-skills/skills/brand-kit .claude/skills/brand-kit
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Brand Kit in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Brand Kit on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Brand Kit is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Brand Kit

Build a brand-kit.json describing the user's product in a way other skills can consume — colors, type, voice, do/don't language, optional logo. Other Cogny skills (/tiktok-launch-video, /reddit-launch-video, /linkedin-launch-video, /landing-page-review, /ad-copy-writer) read this file when present.

The skill is built around the reality that users don't always have access to their site's source code. There are six paths to a kit, in priority order. Stop at the first one that yields enough.

Usage

/brand-kit https://example.com — extract from a live site /brand-kit ~/git/our-site — extract from a local repo (Tailwind / CSS vars) /brand-kit ~/Desktop/logo.png — extract palette from a logo or screenshot /brand-kit ~/Desktop/homepage.png logo.png — combine site screenshot + logo /brand-kit — interview the user

Works with

Paths 1–5 work with zero accounts (Path 3 needs ffmpeg, ImageMagick or Node, or falls back to reading the image by eye; see below). Cogny adds two shortcuts:

JobPrimaryAlso answers itNo account
Documented brand (voice, palette)Context tree (search_context), Solo and Cloud—Paths 1-4
Logo / brand images already uploadedcogny-image-gen tool_list_brand_assets (Cloud only)—User gives a file path
Palette from an image URLcogny-image-gen tool_analyze_media (Cloud only)—extract-palette.sh (Path 3)
Voice samples beyond the homepageLinkedIn_Organic tool_get_organization_postsX_Organic tool_get_user_postsHomepage + /about (Path 5)

On Solo, cogny-image-gen isn't available: skip Path 0b and use Path 3.

Output

A brand-kit.json written to (in priority order, whichever path makes sense for the user's setup):

  1. .agents/brand-kit.json (if .agents/ exists)
  2. .claude/brand-kit.json (if .claude/ exists)
  3. ./brand-kit.json (otherwise — current working directory)

Always print the path you wrote to so the user can move it.

Schema

json
{
  "name": "cogny",
  "site": "https://cogny.com",
  "logo": {
    "path": "./brand/logo-square.png",
    "use_in_video": false
  },
  "colors": {
    "background": "#1f1d1d",
    "foreground": "#ede8e3",
    "primary":    "#b09acd",
    "accent":     "#c9badf",
    "muted":      "#9a9494",
    "card":       "#282525",
    "fuchsia":    "#d4848a",
    "success":    "#7ec8a4",
    "amber":      "#d4a857"
  },
  "type": {
    "family":   "'JetBrains Mono', 'Fira Code', ui-monospace, monospace",
    "weight_display": 700,
    "weight_body":    500,
    "letter_spacing_display": "-0.02em"
  },
  "voice": {
    "register":   "technical, direct, anti-jargon, CLI-aesthetic",
    "person":     "first-person plural (we / your)",
    "do":         ["concrete numbers", "name the tradeoff", "name the tool"],
    "dont":       ["leverage", "unlock", "revolutionary", "next-gen"]
  },
  "source": "repo: ~/git/cogny/tailwind.config.ts + src/index.css",
  "captured_at": "2026-04-25"
}

Minimum viable kit: colors.background, colors.foreground, colors.primary, type.family, voice.register. Don't ship without all five.


Path 0 — Cogny MCP context tree (cheapest, run first if connected)

If Cogny isn't connected, skip this and note what connecting adds (a brand voice and palette the team already documented, so nothing needs scraping).

Use when: the cogny MCP server is in .mcp.json. The user may have already documented their brand — voice, palette, tone — in their context tree, in which case scraping is redundant.

mcp__cogny__get_context_tree_overview              # see what's documented
mcp__cogny__search_context query="brand"           # palette, voice, tone, design tokens
mcp__cogny__search_context query="positioning"     # voice + register often live here
mcp__cogny__read_context_node node_id="…"

If the tree returns brand / palette / voice nodes, hydrate the kit from those values. Cross-check against Path 1 or 3 only if something looks stale or contradictory.

If the cogny MCP isn't connected, or the tree has nothing brand-related, fall through to Path 0b (Cloud) or Path 1.

Path 0b — Uploaded brand assets (Cloud only)

If Cogny isn't connected, skip this and note what connecting adds (uploaded logos and product shots reused directly). Use when: mcp__cogny__mcp__cogny-image-gen__tool_list_brand_assets exists (Cloud workspaces). Solo workspaces don't have it; skip.

  1. tool_list_brand_assets with asset_type: "logo" (also product, lifestyle). Each row has id, name, description and public_url.
  2. Set logo.path to the logo's public_url and add "brand_asset_id": "<id>" so image-generating skills can pass it as brand_asset_ids.
  3. For colors, mcp__cogny__mcp__cogny-image-gen__tool_analyze_media with media_url = the logo's public_url and prompt: "List the 3-6 distinct brand colors as hex codes, ordered by area, and say which is background". Treat the answer as a candidate palette and cross-check it with Path 2 or 3: vision models round hex values.

Path 1 — Repo with Tailwind / CSS variables (best signal)

Use when: the user has access to the site's source.

Look for, in order. Check which tools exist first: command -v ffmpeg fd convert magick node prints only the ones installed. fd is often missing; use the find lines then.

bash
# Tailwind config — custom color namespaces
fd -t f 'tailwind\.config\.(ts|js|mjs|cjs)$' <repo>
# CSS custom properties (most modern stacks)
fd -t f '(globals|index|app|theme|variables)\.css$' <repo>
# Design tokens
fd -t f '(design-tokens|tokens|theme)\.json$' <repo>

# Same, without fd
find <repo> -path '*/node_modules' -prune -o -type f \( -name 'tailwind.config.*' -o -name 'globals.css' -o -name 'index.css' -o -name 'app.css' -o -name 'theme.css' -o -name 'variables.css' -o -name 'tokens.json' -o -name 'design-tokens.json' -o -name 'theme.json' \) -print

When you find a Tailwind config, look for a custom color namespace (commonly the brand name, e.g. cogny: {...}):

ts
// tailwind.config.ts (cogny example)
colors: {
  cogny: { dark: "#1f1d1d", purple: "#b09acd", secondary: "#7E69AB", light: "#c9badf" }
}

When you find a CSS file, grep for the canonical custom-property names:

bash
grep -E '^\s*--(background|foreground|primary|accent|muted|card)' <css-file>

Map the values into the kit schema. If you find both --primary (HSL or hex) and a Tailwind namespace, prefer the Tailwind namespace — it's usually the explicit brand intent rather than a shadcn default.

Type detection in the same files:

bash
grep -rE --include='*.css' --include='*.ts' --include='*.tsx' --include='*.js' --exclude-dir=node_modules "(font-family|fontFamily|--font-)" <repo>/src 2>/dev/null | head

Path 2 — Live site URL (works without source access)

Use when: the user only has a public URL.

Steps:

  1. Fetch the homepage HTML with curl, not WebFetch: WebFetch returns a summary and can't see <head>, <style> or <link> tags.

    bash
    curl -sL -A "Mozilla/5.0" "<url>" -o /tmp/home.html
    grep -oiE '<link[^>]+rel="?(stylesheet|icon|apple-touch-icon|manifest)[^>]*>' /tmp/home.html
    grep -oiE '<meta[^>]+(theme-color|og:image)[^>]*>' /tmp/home.html
    sed -n '/<style/,/<\/style>/p' /tmp/home.html | head -c 50000
  2. Fetch the main stylesheet (the largest CSS link in the head, typically). curl -sL <css-url> | head -c 200000 is enough — look for CSS custom properties (--primary, --background, etc.) and @font-face rules.

  3. Look for a manifest at /site.webmanifest, /manifest.json, or /manifest.webmanifest. Manifests contain theme_color, background_color, and an icon list — gold for brand kits.

  4. Look for a favicon and a high-res logo:

    bash
    curl -sL "<site>/favicon.ico" -o /tmp/favicon.ico
    curl -sL "<site>/apple-touch-icon.png" -o /tmp/touch.png
    # Or extract from <link rel="icon"> in the homepage HTML

    The largest PNG icon on the site (Apple touch icon, manifest icon, og:image) is the brand mark. Check each with curl -sI (status 200 and an image/* content type) before using it.

    If only a favicon exists (a 16–48px .ico/PNG, no touch icon, manifest icon or usable SVG logo): don't build a palette from it alone. Small icons are anti-aliased and often simplified, so a palette from them gives one reliable primary at best. Take the dominant color as a candidate primary, keep logo.path empty (or set use_in_video: false), and get the rest from the CSS (step 2), an inline SVG logo in the HTML (grep -oiE '<svg[^>]*>.*?</svg>' on the header, fill colors are exact), or by asking the user for a logo file or a homepage screenshot for Path 3.

  5. Detect typography: search the inline CSS for font-family declarations on body, html, or h1. If you see Google Fonts links in <head>, the family name is right there in the URL.

If the site ships a static frontend (Next.js, etc.), the bundled CSS often contains the same custom properties as the dev source — so you might still recover the full brand palette without repo access.

If you only get partial info (e.g. you got theme_color from the manifest but no full palette), proceed to Path 3 to fill in gaps from the logo / a screenshot.


Path 3 — Logo or screenshot palette extraction

Use when: the user uploads a logo image, a screenshot of their homepage, or a brand asset PNG/JPG.

The user usually has some image — a logo on Desktop, a slack avatar, a website screenshot. Check what's installed first (command -v ffmpeg convert magick node) and use the first available option. With FFmpeg:

bash
# Generate a small palette image (max 6 distinct colors) from any image.
ffmpeg -y -i <input.png> \
  -vf "palettegen=max_colors=6:reserve_transparent=0:stats_mode=single" \
  -frames:v 1 -update 1 /tmp/_palette.png

# Read those palette colors back as hex. The PPM header is
#   P6\n<W> <H>\n255\n  → 13 bytes for the standard 16x16 palette.
ffmpeg -y -i /tmp/_palette.png -c:v ppm -f image2 -update 1 - 2>/dev/null \
  | tail -c +14 \
  | xxd -c 3 -p \
  | awk '!seen[$0]++' \
  | head -8 \
  | awk '{print "#" toupper($1)}'

Output for the cogny logo (gradient C on dark warm bg):

#1D1B1B   ← background
#5F4953   ← deep plum
#BB93B9   ← lavender (primary brand)
#CA8B9D   ← coral-pink
#D2858C   ← coral (accent)

Mapping rules — the palette is sorted by frequency, but the role assignment is yours to make:

  • Darkest color → colors.background (if it covers >40% of pixels)
  • Brightest non-white → colors.foreground (if there's no off-white, default #fafafa)
  • Most saturated chroma → colors.primary
  • Second most saturated → colors.accent

Eyeball the original image once and confirm — algorithmic role assignment gets it right ~70% of the time.

For typography from a screenshot: image-based font detection is unreliable. Either:

  • Ask the user ("the headline font on this image is…?"), or
  • Use a free tool like WhatTheFont or Fontspring Matcherator — show the user the URL, don't try to do it programmatically.

Optional: semantic palette via node-vibrant (one npm install, gives vibrant/muted/dark-vibrant/light-vibrant categories — more useful for primary/accent role mapping):

bash
npm install -g node-vibrant
node -e "
  const Vibrant = require('node-vibrant');
  Vibrant.from(process.argv[1]).getPalette().then(p => {
    const out = {};
    for (const k of ['Vibrant','Muted','DarkVibrant','LightVibrant','DarkMuted','LightMuted']) {
      if (p[k]) out[k] = p[k].hex;
    }
    console.log(JSON.stringify(out, null, 2));
  });
" <input.png>

With ImageMagick instead (convert, or magick on v7):

bash
convert <input.png> -resize 200x200 -colors 6 -format %c histogram:info:- | sort -rn | head -6

Use whichever is available. If none of ffmpeg, ImageMagick or Node is installed, open the image with the Read tool (it displays images), name the 3–5 dominant colors by eye as approximate hex values, and mark them "estimated, please confirm" in the kit; or go to Path 4.


Path 4 — Color picker / manual entry (always available)

Use when: nothing else worked, or the user wants to override the kit explicitly.

Ask, in this order, and accept partial answers:

  1. Background hex? (the page background users see most)
  2. Foreground hex? (body text color)
  3. Primary brand hex? (the color a button or link uses)
  4. Accent hex? (optional — if there's a second brand color)
  5. Font family? ("a sans like Inter", "JetBrains Mono", etc. — best-effort, system fallbacks are fine)

Three colors and a font is enough to ship.


Path 5 — Voice extraction (always run, regardless of color path)

Voice is the part of a brand kit that copy-paste tooling forgets. It changes which beats a video would write or which headlines an ad-copy skill would produce.

Source for voice: the homepage hero + 1–2 deeper pages (about, pricing, blog).

Enhanced when connected: the brand's own social posts show how it writes when it isn't selling. mcp__cogny__mcp__LinkedIn_Organic__tool_list_organizations → tool_get_organization_posts (organization, count: 20), or mcp__cogny__mcp__X_Organic__tool_get_me → tool_get_user_posts (max_results: 20). Use the top posts by engagement as voice samples. If site copy and social voice disagree, show both and ask which one the kit should follow.

Steps:

  1. Fetch the homepage hero text (h1, h2, the first paragraph after the hero CTA).
  2. Fetch one deep page (/about or /pricing typically).
  3. Read the copy and produce three fields:
json
"voice": {
  "register": "<one-line description>",
  "do":   ["pattern 1", "pattern 2", "pattern 3"],
  "dont": ["banned word 1", "banned word 2"]
}

Examples (these are real, derived from each company's homepage):

Brandregisterdodont
cogny"technical, direct, anti-jargon, CLI-aesthetic"concrete numbers, name the tradeoff, name the toolleverage, unlock, revolutionary, next-gen
Linear"operator, opinionated, fast"second-person, terse, build-mode languageenterprise, synergy, robust
Mailchimp"warm, conversational, plain-English"first-person, friendly contractions, clear CTAsutilize, paradigm, leverage

If you can't infer voice from the page (e.g. very thin homepage), ask the user for one sentence describing how they want to sound. Don't make it up.


Steps (the actual flow)

  1. Detect what input the user gave you:

    • URL → Path 2 → fall through to 3 / 5 if needed
    • Repo path → Path 1 → fall through to 5
    • Image path → Path 3 + ask for site URL or repo for voice (Path 5)
    • Nothing → Path 0b if on Cloud, else Path 4 + ask if they have a logo to extract from
  2. Build the kit incrementally. Print partial state after each step so the user can intervene:

    ◆ Brand kit (cogny)
    ✓ colors    bg=#1f1d1d  fg=#ede8e3  primary=#b09acd  accent=#c9badf
    ✓ type      JetBrains Mono / mono
    ◇ voice     pending — fetching /about for analysis…
  3. Show the user the result before writing the file. They should approve color role assignments (background vs primary, etc.) — these are the high-leverage calls.

  4. Write brand-kit.json to the most appropriate location (see Output section). If a kit already exists, diff it and ask before overwriting.

  5. Print a one-line install hint for the consumer skills:

    Saved → .agents/brand-kit.json
    Used by: /tiktok-launch-video, /reddit-launch-video, /linkedin-launch-video,
             /ad-copy-writer, /landing-page-review

Common mistakes

  1. Treating a single hex color as the brand — most brands have a primary + an accent + a background-foreground pair. Three colors minimum.
  2. Shipping without voice — colors carry brand 30%; voice carries it 70%. Don't skip Path 5.
  3. Using shadcn defaults as the brand — if the user's CSS file has the literal shadcn --primary: 240 5.9% 10%, that's a placeholder not a brand. Cross-check with the homepage screenshot.
  4. Over-saturating the kit with logo gradient artifacts — palette extraction from a gradient logo will return 4–5 transitional colors. Pick the endpoints (primary + accent), drop the in-betweens.
  5. Letting LinkedIn-blue / Twitter-blue / TikTok-pink slip into the kit — those are platform UI colors that bleed into screenshots, not brand colors.
  6. Trusting theme-color blindly — sites sometimes set theme-color to match the address bar of mobile Safari, which is decorative and may not match the actual brand primary.

Related

  • /tiktok-launch-video, /reddit-launch-video, /linkedin-launch-video — consume the kit
  • /ad-copy-writer — uses voice rules to write platform-appropriate copy
  • /landing-page-review — checks consistency between a landing page and the brand kit
  • /non-commodity-content — voice extraction overlaps with this skill's interview step

Bundled files

The model reads these on demand while the skill is loaded. They are exposed as readable files and are never executed.

Frequently asked questions

What does the Brand Kit AI skill do?

Build a portable brand-kit.json for the user's product — colors, typography, voice — that other skills (video, ad creative, landing page) can consume. Multiple discovery paths so it works whether the user has access to their site's source code or only a public URL or just a logo image.

Why use Brand Kit on TypingMind?

Because you install it once and use it with any model. Brand Kit is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Brand Kit in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/cognyai/claude-code-marketing-skills/tree/main/skills/brand-kit. TypingMind reads its SKILL.md and bundles its files and installs it as a skill you can enable per chat.

Which AI models can use Brand Kit?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Brand Kit?

As many as you like. As long as a model supports skills, you can use Brand Kit with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Brand Kit AI skill free?

It is published on GitHub by cognyai. Check the repository for licensing terms. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇