agentsclimarketplace

Brand logo kit

Skill puntorigen/skills/brand-logo-kit

Local-first agent skills for Cursor & other AI coding agents — 100% on your machine, no cloud, no API keys. Apple-Silicon-tuned (MLX/Metal): local image generation, voice cloning, background music, talking-head video, video→3D splat & printable STL, web-action recording, and Word .docx editing.

Install
npx -y skills add puntorigen/skills --skill brand-logo-kit

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

2 things to look at

  • no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
  • 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its author says it does

Copied from the file, not written here

Generate a brand logo and a matching, brand-consistent set of visual assets - logo marks, wordmark lockups, monograms, app icons, favicons, social avatars, banners, seamless patterns, spot illustrations, and UI icons. Local-first: it prefers on-device generation via the image-gen skill (FLUX.2 Klein on Apple Silicon) and only falls back to a CLOUD image API (Google Gemini / Nano Banana Pro, or OpenRouter) when local can't run - no API key is bundled, it is auto-discovered from your environment or another installed skill and cached outside the repo. Crisp on-brand text is set from real fonts with wordmark.py (no misspelled diffusion text), `--look` presets steer the visual finish, and a set is kept cohesive via a shared palette and, on the cloud path, the chosen logo as a reference. Use when the user asks to create a logo, brand identity, brand kit, visual identity, brand style, wordmark, app icon, favicon, or a consistent set of on-brand graphics/assets.

SKILL.md

17.4 KB, as published. Nobody here has run it

Brand Logo Kit

Generate a logo and a brand-consistent style — a cohesive set of assets that share the logo's shapes, palette, and feel — with Gemini image models. You (the model) shape the brief, generate a few logo candidates, let the user pick, derive a palette, then produce every downstream asset from that winner so the set stays on-brand.

flowchart LR
  Brief["brief: name, industry, vibe, colors"] --> Logo["generate.py --style logo<br/>--look modern --count 4 --transparent"]
  Logo --> Pick["user picks the winner"]
  Pick --> Pal["extract_palette.py<br/>-> brand.json"]
  Pick --> Ref{{"logo.png as --ref {image1} (cloud)"}}
  Pick --> WM["wordmark.py --text Name<br/>--font Futura --mark logo.png<br/>-> real-font lockup"]
  Pal --> Assets["generate.py --style app-icon /<br/>brand-illustration / pattern / banner"]
  Ref --> Assets

Local-first, with a cloud fallback. This repo is local-first, so by default each generation runs on-device via the image-gen skill (FLUX.2 Klein, MLX) — no key, no cloud. Local is chosen automatically when it can realistically run: an Apple Silicon Mac with image-gen set up, and either the weights already downloaded or enough free disk to fetch them (~12 GB, one time). When local isn't usable, it falls back to a cloud API (Google Gemini / OpenRouter's Nano Banana Pro) — best quality, reference-based consistency, SynthID-watermarked. Set BRAND_LOGO_KIT_PREFER=cloud to try a key first. No key is ever stored in the repo.

Two things make logos look intentional rather than generic: --look presets nudge the finish (e.g. modern, gradient, glow, flow, minimal), and wordmark.py sets the brand name in a real high-quality font (Futura, Avenir Next, Gill Sans, DIN…) instead of relying on the model to draw text — so wordmarks are crisp, correctly spelled, and deterministic.

Prerequisites

  • Python 3.9+ (any OS). uv is used if present for a faster install, otherwise the stdlib venv + pip are used.
  • Dependencies installed by setup into a local venv: google-genai, Pillow, numpy, requests.
  • For the preferred local path: an Apple Silicon Mac and the local image-gen skill set up (bash ../image-gen/scripts/setup_env.sh). The first local render downloads the FLUX.2 Klein weights (~12 GB free needed, one time). If disk is tight, either free space or provide a key.
  • For the cloud fallback: a Gemini or OpenRouter API key — you usually don't set one up, it is auto-discovered (see providers).
  • For wordmark.py: real fonts already on the machine (macOS ships Futura, Avenir Next, Gill Sans, DIN, Optima, Didot…). No extra install; --list-fonts shows what's available, or pass any .ttf/.otf path.

Setup

Resolve the skill directory and run setup once. It creates a self-contained venv at ~/.brand-logo-kit/.venv, installs the deps, and prints the venv python on its last line:

SKILL_DIR="<the folder this SKILL.md lives in>"   # e.g. .cursor/skills/brand-logo-kit
bash "$SKILL_DIR/scripts/setup_env.sh"

Then set the two handles every command below uses (setup prints PY too):

PY="$HOME/.brand-logo-kit/.venv/bin/python"
SC="$SKILL_DIR/scripts"

See which provider will be used (prints a masked summary; caches any key it finds):

"$PY" "$SC/resolve_key.py"            # resolve provider (local-first)
"$PY" "$SC/resolve_key.py" --status   # local diagnostics: disk, weights, usability

The venv and any cached key live outside the repo under ~/.brand-logo-kit/ so nothing sensitive is committed.

Providers & key auto-discovery

Because the repo is local-first, resolve_key.py (and every generate call) picks a provider in this order:

  1. Local (preferred) — the on-device image-gen skill (FLUX.2 Klein / MLX) is chosen whenever it is usable: Apple Silicon + image-gen set up, and either the weights are already downloaded or there's enough free disk (~12 GB) to fetch them. No key, no cloud.
  2. A cloud key — used when local isn't usable. Discovered from, and the first hit cached to ~/.brand-logo-kit/config.json:
    • the cached config from a previous run
    • env vars — Google: GEMINI_API_KEY, GOOGLE_API_KEY, GOOGLE_GENAI_API_KEY, GOOGLE_AI_API_KEY; OpenRouter: OPENROUTER_API_KEY
    • config.json of other installed skills (e.g. asset-generator) under ~/.cursor/skills, ~/.claude/skills, ~/.config/skills
  3. Local (last resort) — if no key is found but image-gen is installed, local is used even with low disk (the run may fail mid-download).

The provider is inferred from a key's prefix (AIza… → Google, sk-or-… → OpenRouter). Env knobs:

export BRAND_LOGO_KIT_PREFER=cloud       # try a key BEFORE local
export BRAND_LOGO_KIT_MIN_DISK_GB=8      # lower the free-disk bar for auto-local
export GEMINI_API_KEY=AIza...            # Google AI Studio
export OPENROUTER_API_KEY=sk-or-...      # OpenRouter (Nano Banana Pro)
"$PY" "$SC/resolve_key.py" --set <KEY>   # cache a key manually

Force a provider on any command with --provider google|openrouter|local.

Local path (default): trade-offs

The local model (default FLUX.2 Klein; --model z-image-turbo also works) is text-to-image only, so vs the cloud path:

  • No reference images--ref is ignored. Keep a set on-brand by repeating the palette hexes and identical style wording / --look in every prompt (see brand.json's prompt_snippet).
  • Don't let the model draw the brand name — diffusion text is mushy and often misspelled. Generate the symbol here, then set the wordmark with wordmark.py (real font) and combine them into a lockup. See Step 6.
  • Best for symbol marks / icons / patterns / illustrations.
  • The default --look for local is modern (gradient + soft glow + flowing curves), which tests far better than the old plain/abstract output. Override with --look (e.g. minimal, geometric, badge).
  • Transparent cutout still works (renders on a flat chroma background, then keys it).

Workflow

Copy this checklist and track progress:

- [ ] 1. Capture the brief: name, industry, personality, color hints, mark vs wordmark
- [ ] 2. Setup: run setup_env.sh (first time) + resolve_key.py (see the provider)
- [ ] 3. Generate 3-4 logo candidates (pick a --look); show them; let the user pick
- [ ] 4. Regenerate the winner at higher resolution + clean transparent cutout
- [ ] 5. Extract the brand palette -> brand.json
- [ ] 6. Set the wordmark/lockup with wordmark.py (real font) from the winner
- [ ] 7. Generate the brand-consistent asset set (palette + look; --ref on cloud)
- [ ] 8. Export platform sizes (favicon / app icon) and deliver

Step 1: Nail the brief

Pull these from the user (or infer and state your choices): brand name, industry, personality (e.g. "calm, premium, minimal"), any color preferences, and whether they want a symbol, a wordmark, or both. Fold them into the prompt text.

Step 3: Logo candidates

Generate several transparent marks so the user can choose. Describe a concrete, recognizable symbol (not "an abstract mark") and pick a --look for the finish — modern, gradient, glow, flow, minimal, geometric, badge, line, 3d… (--list-looks). Local defaults to modern; cloud defaults to none.

"$PY" "$SC/generate.py" \
  "a mark for 'Northwind', a calm premium sailing club: a stylized wind-and-wave symbol, deep navy" \
  --style logo --look modern --transparent --count 4 -o out/northwind_logo.png

Show the candidates inline (read the PNGs) and let the user pick. If results feel generic/abstract, name the symbol more concretely and/or try a different --look.

Step 4: Winner + cleanup

Regenerate the chosen direction at high resolution:

"$PY" "$SC/generate.py" "<the winning description>" \
  --style logo --transparent -r 2K -o out/logo.png

Step 5: Brand palette

Derive a reusable palette from the chosen logo:

"$PY" "$SC/extract_palette.py" out/logo.png --name "Northwind" -o out/brand.json

brand.json holds the palette, role colors (primary / accent / ink / paper), and a ready prompt_snippet to paste into later prompts for consistency.

Step 6: Wordmark & lockup (real fonts)

Set the brand name with wordmark.py, which renders genuine fonts (crisp, correctly spelled, transparent) — never rely on the image model to draw the name, especially on the local path. Optionally combine it with the winning symbol into a lockup:

# Wordmark only, in the brand ink color from brand.json, airy uppercase tracking:
"$PY" "$SC/wordmark.py" --text "Northwind" --font Futura --case upper \
  --tracking 0.12 --brand out/brand.json -o out/wordmark.png

# Horizontal lockup: the symbol on the left, the name on the right:
"$PY" "$SC/wordmark.py" --text "Northwind" --font "Avenir Next" \
  --mark out/logo.png --layout horizontal --color "#0B2A4A" -o out/lockup.png

--list-fonts shows curated fonts on this machine; --font also accepts any family substring or a .ttf/.otf path. Key options: --case upper|lower|title, --tracking <em>, --layout horizontal|vertical, --mark-scale, --gap, --bg.

Step 7: Brand-consistent assets

Mention the palette (and keep the same --look) so every asset inherits the logo's DNA. On the cloud path also pass the logo as a reference (--ref, referenced as {image1}); on the local path drop --ref and lean on the palette

  • look wording:
# App icon from the mark (cloud: reference the logo)
"$PY" "$SC/generate.py" "app icon using the mark {image1} on a deep navy background" \
  --ref out/logo.png --style app-icon -o out/app_icon.png

# On-brand spot illustration matching the logo
"$PY" "$SC/generate.py" "a sailboat spot illustration in the same style and palette as {image1}" \
  --ref out/logo.png --style brand-illustration -o out/illus_boat.png

# Seamless pattern + a social banner with room for a headline
"$PY" "$SC/generate.py" "seamless pattern from simplified motifs of {image1}, navy on off-white" \
  --ref out/logo.png --style brand-pattern -o out/pattern.png
"$PY" "$SC/generate.py" "brand banner in the style of {image1}, wind-and-wave motif, space for a headline on the left" \
  --ref out/logo.png --style brand-banner -ar 16:9 -o out/banner.png

For a consistent icon set or illustration set, reuse the same reference, palette, --look, and identical style wording across every call.

Step 8: Export sizes + deliver

Export square sizes for favicons / app icons in one call, then embed/link the files:

"$PY" "$SC/generate.py" "app icon using the mark {image1} on deep navy" --ref out/logo.png \
  --style app-icon -o out/app_icon.png --sizes 16,32,180,512,1024

Style presets

PresetBest forRatioTransparent
logoPrimary symbol mark1:1Recommended
logo-wordmarkBrand name lockup3:2Recommended
monogramInitials lettermark1:1Recommended
app-iconRounded app icon1:1No
favicon16px-legible mark1:1Recommended
social-avatarCircular profile pic1:1No
brand-illustrationOn-brand spot illustration1:1No
brand-patternSeamless background pattern1:1No
brand-bannerSocial/hero banner16:9No
brand-photoOn-brand photography16:9No
brand-iconUI icon in brand style1:1Recommended

List them any time: "$PY" "$SC/generate.py" --list-styles.

Looks (visual finish)

A --look appends a consistent finish to any style — steer designs away from generic/abstract without hand-tuning the prompt. --list-looks prints them all:

LookEffect
autoDefault — modern for local, none for cloud
modernGradient + soft glow + flowing curves (premium tech feel)
minimalFlat, restrained, lots of negative space
geometricPrecise grid construction, symmetry
gradient / glow / flowIndividual modern finishes
lineClean monoline art
badgeVintage emblem/crest
3d / mesh / duotone / corporateDepth / colorful mesh / two-tone / corporate

Keep the same look across a set for cohesion.

Key options (generate.py)

OptionShortPurpose
--style STYLE-sBrand preset (default logo)
--look LOOK-lVisual finish (default auto); --list-looks
--transparent-tTransparent-background PNG (chroma-key cutout)
--ref PATHReference image (repeatable, cloud only). Use {image1}..{imageN}
--count N-nNumber of variations (1-4)
--aspect-ratio AR-ar1:1, 3:2, 2:3, 16:9, 9:16, 4:3, 3:4, 4:5, 5:4, 21:9
--resolution RES-r1K (default), 2K, 4K
--format FMT-fpng (default), webp, jpeg
--sizes LISTAlso export square sizes, e.g. 16,32,180,512
--provider PForce local (on-device, no key), google, or openrouter
--model NAMEOverride the model (local: flux2-klein-4b or z-image-turbo)
--output PATH-oOutput file path

Key options (wordmark.py)

Deterministic real-font wordmark/lockup composer — use it for all brand text.

OptionPurpose
--text STR (-T)The name/text to set (required)
--font SPECFamily name, substring, or .ttf/.otf path; --list-fonts
--color HEX / --brand brand.jsonInk color, or pull it from a brand.json role (--color-role)
--caseupper / lower / title / as-is
--tracking EMLetter-spacing in em (e.g. 0.15)
--mark PATHSymbol image to build a lockup with
--layouthorizontal (default) or vertical
--mark-scale / --gapMark height vs text, and spacing (em) in a lockup
--bg HEX / --padding NBackground fill (default transparent) / px padding
--output PATH (-o)Output PNG path

Consistency tips

  • Set all brand text with wordmark.py (one chosen font) — never let the image model draw the name.
  • Repeat the palette (from brand.json's prompt_snippet) and keep the same --look in every prompt across a set.
  • On the cloud path, reference the winning logo (--ref logo.png + {image1}) so shapes and construction carry over. On the local path (text-to-image) drop --ref and lean harder on palette + look + identical style wording.
  • Generate a set with --count and pick the most on-brand result.

Safety

  • Disclose AI-generated imagery where the platform or context calls for it; cloud Gemini outputs carry an invisible SynthID watermark (local ones don't).
  • Trademark check the final logo before commercial use — a generator can coincidentally reproduce an existing mark. Verify originality and don't imitate a known brand's identity.
  • The local path is fully offline. On the cloud path your prompts and reference images are sent to the API provider (Google or OpenRouter) — don't include anything confidential you wouldn't upload.
  • The API key never enters the repo — it is cached under ~/.brand-logo-kit/, which is git-ignored. wordmark.py runs entirely locally.

Anti-patterns

  • Letting the image model draw the brand name — diffusion text is mushy and misspells; set it with wordmark.py (real font) instead.
  • Prompting for "an abstract mark" and expecting a strong logo — name a concrete symbol and pick a --look; abstract wording yields generic blobs.
  • Shipping the first logo take — generate --count 3-4 and let the user choose.
  • Generating each brand asset with a different look/palette — keep them identical so the set stays cohesive (and --ref the winner on the cloud path).
  • Baking a key into config.json in the repo — it belongs in the env or the git-ignored ~/.brand-logo-kit/config.json cache.
  • Rendering tiny favicons directly from a detailed mark — use the favicon style (radically simplified) or --sizes to downscale a clean master.

Resources

  • Provider details, model slugs, key-resolution internals, prompt formula, and troubleshooting: REFERENCE.md

Keep looking

Skills are one crate of 328,083. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.