
Logo Creator
- 2.7k installs
- 1.2k repo stars
- Updated July 27, 2026
- resciencelab/opc-skills
logo-creator is an OPC skill that guides AI logo generation, user iteration, and export of cropped PNG, transparent, and SVG brand assets.
About
The logo-creator skill runs an iterative brand mark workflow using AI image generation through the companion nanobanana skill and three external APIs. Discovery gathers project name, style preference from a style guide, aspect ratio, color direction, and optional references before any generation starts, and the skill waits for user confirmation first. It batch-generates about twenty variations into a dated .skill-archive folder, opens an HTML preview template, and loops on user favorites with additional rounds until one logo is approved. Finalization crops whitespace, removes backgrounds via remove.bg, vectorizes to SVG with Recraft, and delivers PNG, cropped, transparent, and vector files with a summary table. Required keys are GEMINI_API_KEY, REMOVE_BG_API_KEY, and RECRAFT_API_KEY. Prompt patterns cover pixel art, minimalist flat, mascot, lettermark, and abstract geometric styles across ratios from square favicons to wide banners.
- Discovery gate with style guide, ratio, and color confirmation before generation.
- Batch generation of twenty variations via nanobanana with dated archive folders.
- HTML preview template for side-by-side logo comparison in the browser.
- Finalize pipeline with crop, background removal, and SVG vectorization scripts.
- Prompt libraries for pixel, minimalist, mascot, lettermark, and abstract styles.
Logo Creator by the numbers
- 2,669 all-time installs (skills.sh)
- +69 installs in the week ending Jul 28, 2026 (Skillselion tracking)
- Ranked #139 of 1,340 Generative Media skills by installs in the Skillselion catalog
- Security screen: HIGH risk (skills.sh audit)
- Data as of Jul 28, 2026 (Skillselion catalog sync)
logo-creator capabilities & compatibility
- Capabilities
- style and ratio discovery with user confirmation · batch ai logo generation through nanobanana scri · html preview gallery for variation review · feedback driven refinement rounds with versioned · whitespace crop and background removal post proc · svg vectorization and final asset delivery table
- Use cases
- image generation · ui design · copywriting
- Pricing
- Bring your own API key
What logo-creator says it does
Wait for user confirmation before proceeding!
All generated files should be saved to the `.skill-archive` directory
Generate 20 logo variations (default) using the `nanobanana` skill
npx skills add https://github.com/resciencelab/opc-skills --skill logo-creatorAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 2.7k |
|---|---|
| repo stars | ★ 1.2k |
| Security audit | 2 / 3 scanners passed |
| Last updated | July 27, 2026 |
| Repository | resciencelab/opc-skills ↗ |
How do I go from a brand name and style preference to reviewable logo variations and a final vector asset?
Create logo concepts with AI image generation, iterate on feedback, then crop, remove background, and export SVG assets.
Who is it for?
Early brand exploration when you have Gemini, remove.bg, and Recraft API keys plus the nanobanana skill installed.
Skip if: Skip for finished brand systems, manual vector refinement only, or workflows without image generation API keys.
When should I use this skill?
User wants to create a logo, icon, favicon, brand mark, mascot, emblem, or design a logo with AI.
What you get
Archived logo variations, HTML preview, and finalized PNG, cropped, transparent, and SVG deliverables in .skill-archive.
- SVG logo files
- Favicon and brand icon assets
By the numbers
- Published as opc-skills version 1.0.0 with MIT license
- Bundles command scripts under ./scripts/
Files
Logo Creator Skill
Create professional logos through AI image generation with an iterative design process.
Prerequisites
Required API Keys (set in environment):
GEMINI_API_KEY- Get from Google AI StudioREMOVE_BG_API_KEY- Get from remove.bgRECRAFT_API_KEY- Get from recraft.ai
Required Skills:
nanobanana- AI image generation (Gemini 3 Pro Image)
File Output Location
All generated files should be saved to the .skill-archive directory:
.skill-archive/logo-creator/<yyyy-mm-dd-summaryname>/Example:
.skill-archive/logo-creator/2026-01-18-opc-logo/
logo-01.png
logo-02.png
...
logo-09-cropped.png
logo-09-nobg.png
logo-09.svg
preview.htmlGuidelines:
- Use current date in format
yyyy-mm-dd - Add short summary name (project/brand name, kebab-case)
- Create directory before generating first logo
- Keep all variations and iterations in same folder
- Final approved logo should be copied to user's desired location
Workflow
Step 1: Discovery & Requirements
Before generating, gather requirements from user:
Ask about: 1. Project/Brand name - What is the logo for? 2. Style preference - See references/styles.md for options:
- Pixel art / 8-bit retro
- Minimalist / flat design
- 3D / isometric
- Hand-drawn / sketch
- Mascot / character
- Monogram / lettermark
- Abstract / geometric
3. Aspect ratio - Default is 1:1 (square), options:
1:1- Square (favicons, app icons)16:9- Wide (headers, banners)4:3- Standard2:3- Portrait
4. Color preferences:
- Monochrome (black & white)
- Specific brand colors
- Let AI decide
5. Reference images - Any existing logos or styles to reference?
Wait for user confirmation before proceeding!
Step 2: Generate Logo Variations
Generate 20 logo variations (default) using the nanobanana skill:
# Generate single logo
python3 <nanobanana_skill_dir>/scripts/generate.py "{style} logo for {brand}, {description}, {colors}" \
--ratio 1:1 -o .skill-archive/logo-creator/<date-name>/logo-01.png
# Batch generate 20 logos
python3 <nanobanana_skill_dir>/scripts/batch_generate.py "{style} logo for {brand}, {description}, {colors}" \
-n 20 --ratio 1:1 -d .skill-archive/logo-creator/<date-name> -p logoGuidelines:
- Use batch_generate.py for multiple variations (includes auto-delay)
- Save to
.skill-archive/logo-creator/<yyyy-mm-dd-summaryname>/directory - Use sequential naming:
logo-01.png,logo-02.png, etc.
Prompt Tips:
- Include style keywords: "pixel art", "minimalist", "8-bit", "flat design"
- Specify colors: "black on white", "monochrome", "blue gradient"
- Add context: "tech startup", "food brand", "gaming company"
- Request format: "icon", "emblem", "mascot", "lettermark"
Step 3: Create HTML Preview
Copy the preview template and open in browser:
cp <skill_dir>/templates/preview.html .skill-archive/logo-creator/<yyyy-mm-dd-summaryname>/preview.htmlThen open in default browser:
open .skill-archive/logo-creator/<yyyy-mm-dd-summaryname>/preview.htmlIMPORTANT: Update the HTML to include the correct number of logos generated.
Step 4: Iterate with User
Ask user which logos they prefer:
- "Which logos do you like? (e.g., #5, #12, #18)"
- "What do you like about them?"
- "Any changes you'd want?"
Based on feedback: 1. Generate 10-20 more variations of favorite styles 2. Use naming: logo-{original}-v{n}.png (e.g., logo-05-v1.png) 3. Update HTML preview 4. Repeat until user selects final logo
Step 5: Finalize Logo
Once user approves a logo, process it:
5a. Crop whitespace (make 1:1 with no margins):
python3 <skill_dir>/scripts/crop_logo.py {input.png} {output-cropped.png}5b. Remove background:
python3 <skill_dir>/scripts/remove_bg.py {input.png} {output-nobg.png}5c. Convert to SVG:
python3 <skill_dir>/scripts/vectorize.py {input.png} {output.svg}Step 6: Deliver Final Assets
Present final deliverables:
## Final Logo Assets
| File | Description | Size |
|------|-------------|------|
| logo.png | Original | 1024x1024 |
| logo-cropped.png | No margins, 1:1 | ~800x800 |
| logo-nobg.png | Transparent background | ~800x800 |
| logo.svg | Vector (scalable) | ~20KB |
All files saved to: `.skill-archive/logo-creator/<yyyy-mm-dd-summaryname>/`
Copy final logo to user's desired location.Quick Reference
Common Prompt Patterns
Pixel Art:
Pixel art {subject} logo, 8-bit retro style, black pixels on white background, {size}x{size} grid, minimalist iconMinimalist:
Minimalist {subject} logo, flat design, clean lines, {color} on white, simple geometric shapesMascot:
Cute {animal/character} mascot logo, friendly expression, {style} style, {colors}, suitable for brand iconLettermark:
Letter "{letter}" logo, modern typography, {style} design, {colors}, clean professional lookSupported Aspect Ratios
1:1- Square (default for logos)2:3,3:2- Portrait/Landscape3:4,4:3- Standard4:5,5:4- Photo9:16,16:9- Wide21:9- Ultra-wide
References
- references/styles.md - Logo style guide with prompt examples
- examples/opc-logo-creation.md - Full example conversation
{
"name": "logo-creator",
"version": "1.0.0",
"description": "Create logos using AI image generation. Discuss style/ratio, generate variations, iterate with user feedback, crop, remove background, and export as SVG.",
"author": {
"name": "ReScienceLab"
},
"homepage": "https://github.com/ReScienceLab/opc-skills/tree/main/skills/logo-creator",
"repository": "https://github.com/ReScienceLab/opc-skills",
"license": "MIT",
"keywords": [
"logo",
"brand",
"icon",
"favicon",
"mascot",
"emblem",
"create logo",
"design logo"
],
"skills": [
"./SKILL.md"
],
"commands": [
"./scripts/"
]
}<svg version="1.1" xmlns="http://www.w3.org/2000/svg" style="display: block;" viewBox="0 0 2048 2048" width="833" height="833" preserveAspectRatio="none">
<path transform="translate(0,0)" fill="rgb(255,255,255)" d="M 0 0 L 2048 0 L 2048 2048 L 1496.57 2048 L 1433.26 2048 L 1338.97 2048 L 363.233 2048 L 0 2048 L 0 0 z"/>
<path transform="translate(0,0)" fill="rgb(0,0,0)" d="M 1087.15 221.99 C 1092.38 223.671 1111.74 222.88 1118.16 222.742 C 1119.33 228.956 1118.86 246.926 1118.88 254.022 C 1139.88 254.207 1160.88 254.227 1181.89 254.084 C 1181.8 260.003 1180.42 282.168 1183.39 285.517 L 1183.75 285.634 C 1193.44 285.838 1203.13 285.903 1212.82 285.828 L 1212.91 317.004 C 1223.32 316.853 1233.73 316.912 1244.13 317.178 L 1276.22 317.13 L 1276.14 348.197 C 1284.94 348.283 1299.69 348.025 1308.06 348.658 L 1339.02 348.86 L 1338.96 379.815 C 1354.81 380.441 1373.89 379.178 1388.52 380.123 L 1401.08 380.069 L 1401.92 379.969 C 1401.83 390.097 1401.52 401.307 1401.7 411.348 C 1407.49 411.506 1429.17 411.18 1433.21 411.903 C 1433.36 419.642 1434.04 435.943 1433.1 443.073 C 1433.06 459.3 1432.02 491.32 1433.51 505.879 L 1402.01 506.11 L 1402.03 631.777 L 1338.86 631.91 L 1338.83 663.126 C 1328.52 663.181 1317.89 663.117 1307.61 663.32 C 1307.72 694.245 1308.38 727.189 1307.76 757.885 L 1213.01 757.955 L 1212.9 726.682 C 1202.38 726.419 1191.87 726.225 1181.35 726.1 C 1181.44 745.711 1180.96 769.852 1181.74 789.119 L 1213.03 789.079 L 1213.2 820.329 L 1244.54 820.415 C 1244.55 858.566 1242.92 909.121 1244.58 946.413 L 1276.06 946.491 C 1276.06 977.388 1275.5 1010.1 1276.14 1040.84 L 1307.66 1041.06 C 1307.7 1072.24 1307.58 1103.81 1308.01 1134.98 L 1338.94 1135.17 L 1339.08 1166.18 C 1349.47 1166.44 1359.87 1166.63 1370.26 1166.75 L 1370.41 1198.03 L 1401.87 1198.23 L 1402.03 1229.83 C 1422.74 1229.83 1444.27 1229.55 1464.92 1229.92 L 1465.39 1261.15 L 1558.98 1261.25 L 1559.17 1292.29 L 1622.03 1292.66 C 1622.23 1302.75 1622.23 1313.59 1622.75 1323.61 L 1653.37 1323.9 L 1653.53 1355.32 L 1685.15 1355.76 L 1685.18 1481.79 L 1653.81 1481.95 L 1653.66 1513.03 L 1622.36 1513.12 L 1622.49 1544.72 L 1590.84 1544.84 L 1590.87 1670.48 C 1580.92 1670.5 1569.03 1670.24 1559.24 1670.62 L 1559.2 1796.14 L 1527.88 1796.29 L 1527.65 1921.95 L 1496.47 1922.18 L 1496.57 2048 L 1433.26 2048 L 1338.97 2048 L 363.233 2048 C 363.243 2017.6 362.529 1983.55 363.678 1953.45 C 373.836 1953.18 384.735 1953.3 394.953 1953.24 L 395.109 1859.24 L 426.243 1859.09 C 426.025 1797.13 425.239 1731.88 426.415 1670.12 L 457.917 1670.03 L 458.071 1449.98 L 489.176 1449.86 C 489.961 1376.72 488.411 1303.04 489.474 1229.96 L 520.539 1229.88 C 520.441 1167.36 519.781 1103.36 520.747 1040.97 L 552.165 1040.79 C 552.203 999.415 551.634 956.355 552.633 915.112 L 583.816 915.021 C 583.687 894.005 583.72 872.989 583.914 851.974 L 615.01 851.947 L 615.276 757.828 L 646.536 757.726 L 646.883 694.486 L 677.962 694.422 L 678.111 631.972 C 688.564 631.877 699.018 631.836 709.471 631.851 C 709.5 621.516 709.754 610.947 709.897 600.595 L 741.158 600.37 L 741.176 568.839 L 772.521 568.753 L 772.793 537.103 L 835.241 537.129 C 835.142 526.73 835.271 516.331 835.63 505.937 C 867.08 505.745 898.531 505.736 929.981 505.913 L 930.133 411.311 L 961.252 411.175 C 961.279 390.501 961.017 369.028 961.724 348.426 L 992.56 348.306 L 992.814 317.383 L 1024.38 317.047 C 1024.36 306.671 1024.46 296.295 1024.69 285.922 L 1055.86 285.842 L 1055.74 254.019 C 1055.05 243.455 1055.44 233.011 1055.66 222.435 C 1063.68 222.588 1079.62 222.986 1087.15 221.99 z"/>
<path transform="translate(0,0)" fill="rgb(255,255,255)" d="M 1244.67 1418.73 C 1276.18 1418.54 1307.7 1418.55 1339.21 1418.75 L 1339.13 1450 C 1380.42 1450.01 1424.21 1450.69 1465.31 1449.94 C 1465.23 1439.62 1465.02 1429.01 1465.15 1418.71 C 1475.68 1418.66 1486.21 1418.69 1496.75 1418.79 C 1496.48 1450.18 1496.43 1481.56 1496.59 1512.95 L 1527.79 1513.15 L 1527.69 1669.94 L 1496.73 1670.18 C 1495.82 1710.2 1495.82 1755.89 1496.56 1795.96 L 1464.99 1796.06 L 1464.69 1953.28 L 1433.56 1953.31 L 1433.26 2048 L 1338.97 2048 L 1338.81 1953.63 L 1307.85 1953.17 L 1307.63 1796.1 L 1276.17 1795.96 L 1276.05 1670.33 L 1244.65 1670.16 C 1243.13 1599.18 1245.72 1527.5 1244.49 1456.45 C 1244.29 1444.42 1243.94 1430.69 1244.67 1418.73 z"/>
<path transform="translate(0,0)" fill="rgb(255,255,255)" d="M 866.917 537.872 C 877.802 537.6 887.248 537.474 898.179 537.822 L 898.292 569.042 C 918.877 569.036 940.8 568.695 961.29 569.1 L 961.301 600.376 C 971.574 600.458 982.535 600.344 992.747 600.718 L 992.829 631.811 L 1024.36 631.928 L 1024.31 663.097 L 1055.9 663.237 L 1055.91 694.938 L 1087.16 694.983 L 1087.22 726.11 L 1024.18 726.023 L 1024.12 694.453 C 1014.29 694.673 1002.9 694.354 992.96 694.288 L 992.777 663.219 L 961.686 663.059 C 961.25 653.158 961.479 641.855 961.452 631.847 L 930.053 631.787 L 929.917 600.513 C 898.402 600.31 866.886 600.314 835.371 600.523 C 835.122 610.752 835.179 621.496 835.093 631.765 L 772.804 631.872 L 772.85 600.804 L 804.102 600.494 L 804.052 569.104 L 866.771 568.957 L 866.917 537.872 z"/>
<path transform="translate(0,0)" fill="rgb(250,197,31)" d="M 1244.13 317.178 L 1276.22 317.13 L 1276.14 348.197 C 1284.94 348.283 1299.69 348.025 1308.06 348.658 L 1339.02 348.86 L 1338.96 379.815 C 1354.81 380.441 1373.89 379.178 1388.52 380.123 C 1381.98 380.771 1377.44 380.917 1370.86 380.976 C 1370.91 389.209 1371.45 404.169 1370.17 411.777 C 1350.32 410.832 1328.05 411.259 1308.02 411.228 L 1307.97 380.171 L 1276.28 379.997 C 1275.96 369.829 1276.07 358.728 1275.99 348.487 L 1244.39 348.364 C 1243.95 338.154 1244.13 327.435 1244.13 317.178 z"/>
<path transform="translate(0,0)" fill="rgb(252,231,24)" d="M 1308.06 348.658 L 1339.02 348.86 L 1338.96 379.815 L 1308 380.141 L 1308.06 348.658 z"/>
<path transform="translate(0,0)" fill="rgb(223,155,26)" d="M 1118.88 254.022 C 1139.88 254.207 1160.88 254.227 1181.89 254.084 C 1181.8 260.003 1180.42 282.168 1183.39 285.517 L 1183.75 285.634 C 1193.44 285.838 1203.13 285.903 1212.82 285.828 L 1212.91 317.004 L 1182.19 317.075 L 1150.68 317.081 C 1150.43 306.648 1150.38 296.001 1150.24 285.55 C 1144.07 284.409 1125.85 284.992 1118.79 285.073 L 1118.88 254.022 z"/>
<path transform="translate(0,0)" fill="rgb(250,197,31)" d="M 1183.75 285.634 C 1193.44 285.838 1203.13 285.903 1212.82 285.828 L 1212.91 317.004 L 1182.19 317.075 C 1181.99 311.451 1180.5 288.78 1183.75 285.634 z"/>
<path transform="translate(0,0)" fill="rgb(255,255,255)" d="M 1087.22 726.11 C 1097.37 726.271 1108.82 726.19 1118.87 726.748 L 1118.88 757.844 L 1149.84 758.016 C 1149.83 777.104 1150.47 801.895 1149.72 820.567 L 1118.92 820.448 L 1118.81 789.091 L 1087.45 789.048 L 1087.22 726.11 z"/>
<path transform="translate(0,0)" fill="rgb(250,197,31)" d="M 1388.52 380.123 L 1401.08 380.069 L 1401.92 379.969 C 1401.83 390.097 1401.52 401.307 1401.7 411.348 C 1407.49 411.506 1429.17 411.18 1433.21 411.903 C 1433.36 419.642 1434.04 435.943 1433.1 443.073 C 1412.48 442.729 1390.81 443.017 1370.13 443.013 L 1370.17 411.777 C 1371.45 404.169 1370.91 389.209 1370.86 380.976 C 1377.44 380.917 1381.98 380.771 1388.52 380.123 z"/>
<path transform="translate(0,0)" fill="rgb(252,231,24)" d="M 1388.52 380.123 L 1401.08 380.069 C 1401 390.306 1400.75 400.964 1400.87 411.16 C 1392.68 411.23 1377.81 410.915 1370.17 411.777 C 1371.45 404.169 1370.91 389.209 1370.86 380.976 C 1377.44 380.917 1381.98 380.771 1388.52 380.123 z"/>
<path transform="translate(0,0)" fill="rgb(223,155,26)" d="M 1087.15 221.99 C 1092.38 223.671 1111.74 222.88 1118.16 222.742 C 1119.33 228.956 1118.86 246.926 1118.88 254.022 C 1108.36 253.971 1097.85 254.013 1087.34 254.148 L 1055.74 254.019 C 1055.05 243.455 1055.44 233.011 1055.66 222.435 C 1063.68 222.588 1079.62 222.986 1087.15 221.99 z"/>
<path transform="translate(0,0)" fill="rgb(255,255,255)" d="M 709.471 631.851 L 772.804 631.872 L 772.639 663.076 L 709.749 663.195 C 709.378 652.873 709.493 642.205 709.471 631.851 z"/>
<path transform="translate(0,0)" fill="rgb(171,87,31)" d="M 1087.34 254.148 C 1097.85 254.013 1108.36 253.971 1118.88 254.022 L 1118.79 285.073 C 1125.85 284.992 1144.07 284.409 1150.24 285.55 C 1141 286.873 1098.68 285.784 1087.43 285.693 L 1087.34 254.148 z"/>
<path transform="translate(0,0)" fill="rgb(223,155,26)" d="M 1212.91 317.004 C 1223.32 316.853 1233.73 316.912 1244.13 317.178 C 1244.13 327.435 1243.95 338.154 1244.39 348.364 L 1213.03 348.196 L 1212.91 317.004 z"/>
<path transform="translate(0,0)" fill="rgb(255,255,255)" d="M 929.981 505.913 L 961.383 506.055 L 961.255 537.051 L 929.956 537.076 L 929.981 505.913 z"/>
<path transform="translate(0,0)" fill="rgb(255,255,255)" d="M 1150.11 694.964 C 1160.65 694.872 1171.19 694.893 1181.73 695.028 L 1181.35 726.1 L 1150.26 726.01 L 1150.11 694.964 z"/>
<path transform="translate(0,0)" fill="rgb(255,255,255)" d="M 1181.64 852.124 C 1192.09 852.08 1202.54 852.141 1212.99 852.305 L 1213.02 915.014 L 1181.5 915.05 C 1181.67 894.075 1181.72 873.099 1181.64 852.124 z"/>
<path transform="translate(0,0)" fill="rgb(255,255,255)" d="M 1149.94 820.8 C 1160.46 820.722 1170.99 820.706 1181.51 820.752 C 1181.13 830.52 1181.28 841.904 1181.2 851.794 C 1172.4 852.291 1159.19 851.873 1150.06 851.847 L 1149.94 820.8 z"/>
<path transform="translate(0,0)" fill="rgb(250,197,31)" d="M 1308.01 159.4 L 1308.19 159.848 L 1339.19 159.914 C 1349.44 159.888 1359.7 159.797 1369.96 159.644 L 1370.12 191.173 C 1379.85 191.121 1392.51 190.698 1401.99 191.316 L 1402.05 222.235 C 1421.09 222.418 1445.45 221.8 1464.08 222.623 C 1443.37 222.83 1422.67 222.801 1401.96 222.536 L 1402 252.148 L 1401.97 285.901 C 1422.65 285.871 1444.15 285.546 1464.77 285.817 L 1464.81 296.695 C 1465.16 303.616 1465.27 310.548 1465.14 317.477 C 1486.04 317.221 1506.95 317.131 1527.86 317.207 L 1527.91 348.86 L 1496.28 348.782 C 1486.68 348.317 1474.11 348.549 1464.3 348.48 C 1463.38 356.696 1463.83 371.47 1464.05 380.149 C 1444.92 380.12 1420.72 380.695 1401.92 379.969 L 1401.08 380.069 L 1388.52 380.123 C 1373.89 379.178 1354.81 380.441 1338.96 379.815 L 1339.02 348.86 L 1308.06 348.658 C 1299.69 348.025 1284.94 348.283 1276.14 348.197 L 1276.22 317.13 L 1244.13 317.178 C 1233.73 316.912 1223.32 316.853 1212.91 317.004 L 1212.82 285.828 C 1203.13 285.903 1193.44 285.838 1183.75 285.634 L 1183.39 285.517 C 1180.42 282.168 1181.8 260.003 1181.89 254.084 L 1213.07 254.06 L 1213.09 222.995 L 1244.36 222.896 C 1244.84 213.737 1243.51 202.071 1245.33 193.301 C 1245.63 191.871 1246.98 191.978 1249.04 191.316 C 1254.94 191.018 1272.62 191.963 1276.13 190.01 L 1276.07 159.675 C 1284.56 159.812 1299.99 160.306 1308.01 159.4 z"/>
<path transform="translate(0,0)" fill="rgb(0,0,0)" d="M 1276.18 222.359 L 1338.87 222.712 L 1338.83 285.843 L 1277.89 285.91 L 1276.13 285.816 C 1275.92 265.466 1275.59 242.726 1276.18 222.359 z"/>
<path transform="translate(0,0)" fill="rgb(246,130,4)" d="M 1244.23 285.945 C 1254.86 286.219 1265.5 286.176 1276.13 285.816 L 1277.89 285.91 C 1275.8 293.148 1276.41 309.02 1276.46 317.06 C 1297.27 317.253 1318.08 317.239 1338.89 317.019 L 1339.02 348.86 L 1308.06 348.658 C 1299.69 348.025 1284.94 348.283 1276.14 348.197 L 1276.22 317.13 L 1244.13 317.178 C 1233.73 316.912 1223.32 316.853 1212.91 317.004 L 1212.82 285.828 C 1223.29 285.77 1233.76 285.809 1244.23 285.945 z"/>
<path transform="translate(0,0)" fill="rgb(171,87,31)" d="M 1213.07 254.06 L 1244.25 254.053 L 1244.23 285.945 C 1233.76 285.809 1223.29 285.77 1212.82 285.828 C 1203.13 285.903 1193.44 285.838 1183.75 285.634 L 1183.39 285.517 C 1180.42 282.168 1181.8 260.003 1181.89 254.084 L 1213.07 254.06 z"/>
<path transform="translate(0,0)" fill="rgb(246,130,4)" d="M 1339.02 348.86 C 1359.45 348.737 1381.6 349.009 1401.88 348.358 L 1401.92 379.969 L 1401.08 380.069 L 1388.52 380.123 C 1373.89 379.178 1354.81 380.441 1338.96 379.815 L 1339.02 348.86 z"/>
<path transform="translate(0,0)" fill="rgb(246,130,4)" d="M 1401.97 285.901 C 1422.65 285.871 1444.15 285.546 1464.77 285.817 L 1464.81 296.695 C 1464.15 301.823 1464.31 311.547 1464.25 317.07 L 1401.66 317.159 C 1401.55 306.997 1401.85 296.119 1401.97 285.901 z"/>
<path transform="translate(0,0)" fill="rgb(252,231,24)" d="M 1308.01 159.4 L 1308.19 159.848 C 1308 170.22 1307.88 180.592 1307.83 190.965 C 1301.39 191.1 1280.31 192.124 1276.13 190.01 L 1276.07 159.675 C 1284.56 159.812 1299.99 160.306 1308.01 159.4 z"/>
<path transform="translate(0,0)" fill="rgb(252,231,24)" d="M 1370.4 223.02 L 1401.96 222.536 L 1402 252.148 C 1399.45 255.764 1375.95 254.142 1370.65 254.071 C 1370.8 243.72 1370.71 233.367 1370.4 223.02 z"/>
<path transform="translate(0,0)" fill="rgb(223,155,26)" d="M 1181.88 2.3707 C 1192.26 2.51969 1202.64 2.59057 1213.02 2.58334 L 1213.06 65.7503 C 1213.08 74.7088 1212.69 88.224 1213.33 96.8195 L 1214.4 96.6955 C 1211.7 100.29 1213.27 122.495 1212.96 128.939 C 1212.98 137.469 1212.58 151.232 1213.2 159.339 L 1213.59 159.747 L 1244.66 159.821 C 1244.67 169.335 1244.92 179.943 1244.47 189.359 C 1246.78 191.546 1245.41 190.716 1249.04 191.316 C 1246.98 191.978 1245.63 191.871 1245.33 193.301 C 1243.51 202.071 1244.84 213.737 1244.36 222.896 L 1213.09 222.995 L 1213.07 254.06 L 1181.89 254.084 C 1160.88 254.227 1139.88 254.207 1118.88 254.022 C 1118.86 246.926 1119.33 228.956 1118.16 222.742 C 1111.74 222.88 1092.38 223.671 1087.15 221.99 L 1087.19 190.984 C 1097.71 191.015 1108.24 190.97 1118.76 190.85 L 1118.86 128.601 C 1127.42 127.724 1141.05 128.092 1150.01 128.071 L 1150.04 65.1843 L 1181.78 65.0192 C 1181.57 44.3377 1181.83 23.0933 1181.88 2.3707 z"/>
<path transform="translate(0,0)" fill="rgb(171,87,31)" d="M 1087.19 190.984 C 1097.71 191.015 1108.24 190.97 1118.76 190.85 C 1127.81 190.938 1142.32 190.644 1150.79 191.281 C 1141.47 192.388 1128.43 192.18 1118.93 191.769 C 1118.89 199.766 1119.26 215.016 1118.63 222.442 L 1181.85 222.584 L 1181.89 254.084 C 1160.88 254.227 1139.88 254.207 1118.88 254.022 C 1118.86 246.926 1119.33 228.956 1118.16 222.742 C 1111.74 222.88 1092.38 223.671 1087.15 221.99 L 1087.19 190.984 z"/>
<path transform="translate(0,0)" fill="rgb(0,0,0)" d="M 1118.86 128.601 C 1129.32 128.806 1139.77 128.805 1150.23 128.599 L 1150.79 191.281 C 1142.32 190.644 1127.81 190.938 1118.76 190.85 L 1118.86 128.601 z"/>
<path transform="translate(0,0)" fill="rgb(252,231,24)" d="M 1181.85 128.5 C 1188.07 128.393 1208.03 127.595 1212.96 128.939 C 1212.98 137.469 1212.58 151.232 1213.2 159.339 C 1207.87 160.387 1188.31 159.936 1181.98 159.9 C 1181.82 149.434 1181.77 138.967 1181.85 128.5 z"/>
<path transform="translate(0,0)" fill="rgb(246,130,4)" d="M 1213.59 159.747 L 1244.66 159.821 C 1244.67 169.335 1244.92 179.943 1244.47 189.359 C 1240.13 192.186 1220.25 191.037 1213.77 190.952 C 1213.34 183.384 1212.28 166.752 1213.59 159.747 z"/>
<path transform="translate(0,0)" fill="rgb(252,231,24)" d="M 1213.06 65.7503 C 1213.08 74.7088 1212.69 88.224 1213.33 96.8195 C 1209.88 96.2437 1186.42 96.5599 1181.83 96.517 C 1181.74 86.2118 1181.96 75.6285 1182.04 65.3002 C 1192.25 65.6354 1202.81 65.6256 1213.06 65.7503 z"/>
<path transform="translate(0,0)" fill="rgb(171,87,31)" d="M 1276.21 64.9933 L 1307.55 65.035 C 1307.67 94.3587 1306.74 130.637 1308.01 159.4 C 1299.99 160.306 1284.56 159.812 1276.07 159.675 L 1276.13 190.01 C 1272.62 191.963 1254.94 191.018 1249.04 191.316 C 1245.41 190.716 1246.78 191.546 1244.47 189.359 C 1244.92 179.943 1244.67 169.335 1244.66 159.821 L 1213.59 159.747 L 1213.2 159.339 C 1212.58 151.232 1212.98 137.469 1212.96 128.939 C 1213.27 122.495 1211.7 100.29 1214.4 96.6955 L 1275.97 96.5832 C 1276.03 86.2406 1275.93 75.2836 1276.21 64.9933 z"/>
<path transform="translate(0,0)" fill="rgb(171,87,31)" d="M 1464.72 191.047 L 1496.19 191.026 C 1496.76 222.538 1495.92 254.544 1496.68 285.837 L 1464.77 285.817 C 1444.15 285.546 1422.65 285.871 1401.97 285.901 L 1402 252.148 L 1401.96 222.536 C 1422.67 222.801 1443.37 222.83 1464.08 222.623 C 1465.39 219.382 1464.74 195.707 1464.72 191.047 z"/>
<path transform="translate(0,0)" fill="rgb(252,231,24)" d="M 1559.14 222.546 L 1590.75 222.797 C 1590.95 243.801 1591 264.805 1590.89 285.809 L 1559.55 285.823 L 1559.57 317.25 L 1527.86 317.207 C 1506.95 317.131 1486.04 317.221 1465.14 317.477 C 1465.27 310.548 1465.16 303.616 1464.81 296.695 L 1464.77 285.817 L 1496.68 285.837 L 1527.12 285.703 L 1527.27 253.883 L 1558.94 253.834 L 1559.14 222.546 z"/>
<path transform="translate(0,0)" fill="rgb(246,130,4)" d="M 1464.3 348.48 C 1474.11 348.549 1486.68 348.317 1496.28 348.782 C 1496.29 359.155 1496.16 369.836 1496.3 380.182 C 1496.62 390.592 1496.7 401.008 1496.54 411.422 L 1464.81 411.349 C 1456.73 411.313 1440.71 410.926 1433.21 411.903 C 1429.17 411.18 1407.49 411.506 1401.7 411.348 C 1401.52 401.307 1401.83 390.097 1401.92 379.969 C 1420.72 380.695 1444.92 380.12 1464.05 380.149 C 1463.83 371.47 1463.38 356.696 1464.3 348.48 z"/>
<path transform="translate(0,0)" fill="rgb(0,0,0)" d="M 1464.3 348.48 C 1474.11 348.549 1486.68 348.317 1496.28 348.782 C 1496.29 359.155 1496.16 369.836 1496.3 380.182 L 1464.8 380.003 C 1464.75 369.635 1464.89 358.794 1464.3 348.48 z"/>
<path transform="translate(0,0)" fill="rgb(252,231,24)" d="M 1369.94 96.3729 C 1380.37 96.4185 1391.42 96.3488 1401.84 96.6337 L 1401.99 191.316 C 1392.51 190.698 1379.85 191.121 1370.12 191.173 L 1369.96 159.644 C 1359.7 159.797 1349.44 159.888 1339.19 159.914 L 1339.13 128.037 L 1369.74 128.125 L 1369.94 96.3729 z"/>
<path transform="translate(0,0)" fill="rgb(171,87,31)" d="M 1433.21 411.903 C 1440.71 410.926 1456.73 411.313 1464.81 411.349 L 1464.79 443.072 L 1464.86 474.532 L 1433.9 474.712 C 1433.75 480.431 1434.08 501.639 1433.51 505.879 C 1432.02 491.32 1433.06 459.3 1433.1 443.073 C 1434.04 435.943 1433.36 419.642 1433.21 411.903 z"/>
<path transform="translate(0,0)" fill="rgb(250,197,31)" d="M 1464.79 443.072 L 1464.86 474.532 L 1433.9 474.712 C 1434.48 465.558 1434.03 452.512 1433.99 443.073 L 1464.79 443.072 z"/>
</svg>Example: Creating OPC Skills Logo
User: Create a logo for opc.dev - it's a website for agent skills for one person companies.
Agent: I'll help you create a logo for OPC Skills. Let me ask a few questions first:
1. Style preference? (Pixel art, minimalist, 3D, hand-drawn, etc.) 2. Aspect ratio? 1:1 square for favicon/icons? 3. Color preferences? Monochrome or specific colors? 4. Any reference images to draw inspiration from?
User: Please refer to this pixel art mule logo - I like the 8-bit retro style with black pixels on white background.
Agent: Got it! The reference is a classic pixel art style:
- Black pixels on white background
- 8-bit retro aesthetic
- Simple, recognizable silhouette
I'll generate 20 pixel art logo variations for OPC Skills.
Generating with prompts like:
- "Pixel art robot head logo, 8-bit retro style, black pixels on white background"
- "Pixel art crowned person, 8-bit style, solopreneur king"
- "Pixel art lightning bolt, 8-bit, black on white"
Here are the generated logos:









User: I like #09 with the crowned person - it represents "king of your own company". Please create 20 more variations of that concept.
Agent: Generating 20 variations of the "Crowned Person" concept...
Here are the variations:






User: The original #09 looks best. Please crop it to fit a 1:1 square, remove background, and convert to SVG.
Agent: Processing the logo through finalization steps:
1. Cropping to 1:1 square (removing margins) 2. Removing background for transparency 3. Converting to SVG for scalability


The SVG is now ready for web use, favicons, and print!
Logo Styles Reference
Common logo styles and prompt patterns for AI image generation.
Style Categories
1. Pixel Art / 8-bit Retro
Classic video game aesthetic with blocky pixels.
Best for: Gaming, indie apps, nostalgic brands, tech startups
Prompt patterns:
Pixel art {subject} logo, 8-bit retro style, black pixels on white background, 32x32 grid, minimalist icon, sharp edges, no anti-aliasing
Pixel art {subject}, 8-bit style, {color} pixels on white, clean geometric, retro arcade game spriteKeywords: pixel art, 8-bit, retro, blocky, sharp edges, grid, arcade
---
2. Minimalist / Flat Design
Clean, simple shapes with no gradients or shadows.
Best for: Modern brands, tech companies, professional services
Prompt patterns:
Minimalist {subject} logo, flat design, clean lines, {color} on white background, simple geometric shapes, modern professional
Minimalist icon of {subject}, single color, ultra simple, negative space, clean vector styleKeywords: minimalist, flat, clean, simple, geometric, modern, negative space
---
3. 3D / Isometric
Three-dimensional appearance with depth and perspective.
Best for: Tech products, games, modern apps
Prompt patterns:
3D isometric {subject} logo, modern tech style, {colors}, clean render, glossy finish, white background
Isometric icon of {subject}, 3D cube style, geometric, {colors}, soft shadows, clean designKeywords: 3D, isometric, depth, perspective, glossy, render, dimensional
---
4. Hand-drawn / Sketch
Organic, artistic feel with visible strokes.
Best for: Creative agencies, artisan brands, personal projects
Prompt patterns:
Hand-drawn {subject} logo, sketch style, black ink on white paper, artistic strokes, organic lines
Doodle style {subject} icon, hand-sketched, playful, loose lines, {color} inkKeywords: hand-drawn, sketch, doodle, ink, artistic, organic, strokes
---
5. Mascot / Character
Friendly character representing the brand.
Best for: Food brands, children's products, gaming, community apps
Prompt patterns:
Cute {animal/character} mascot logo, friendly expression, {style} style, {colors}, suitable for brand icon
Adorable {character} mascot, cartoon style, big eyes, happy expression, {colors}, clean simple designKeywords: mascot, character, cute, friendly, cartoon, adorable, expressive
---
6. Monogram / Lettermark
Stylized letter(s) as the logo.
Best for: Personal brands, luxury, corporate, professional services
Prompt patterns:
Letter "{letter}" logo, modern typography, {style} design, {colors}, clean professional look
Monogram logo combining letters "{letters}", elegant design, {style}, minimalist, {colors}Keywords: monogram, lettermark, typography, initial, elegant, professional
---
7. Abstract / Geometric
Non-representational shapes and patterns.
Best for: Tech companies, startups, modern brands
Prompt patterns:
Abstract geometric logo, {shapes} pattern, {colors}, modern minimal, clean vector design
Abstract symbol logo, interconnected {shapes}, flowing design, {colors}, contemporary styleKeywords: abstract, geometric, shapes, pattern, modern, symbol, contemporary
---
8. Emblem / Badge
Logo contained within a shape (circle, shield, etc.).
Best for: Sports teams, organizations, traditional brands, craft products
Prompt patterns:
{Subject} emblem logo in circular badge, vintage style, {colors}, detailed border, traditional design
Shield emblem with {subject}, {style} style, banner ribbon, {colors}, heraldic lookKeywords: emblem, badge, shield, seal, crest, vintage, traditional
---
9. Wordmark / Typography
The brand name itself as the logo with custom typography.
Best for: Established brands, media companies, fashion
Prompt patterns:
"{brand name}" wordmark logo, custom typography, {style} font style, {colors}, clean design
Typography logo spelling "{name}", creative letterforms, {style}, modern minimalKeywords: wordmark, typography, lettering, font, text-based
---
10. Combination Mark
Icon combined with text.
Best for: Most brands, especially new ones needing recognition
Prompt patterns:
{Subject} icon with "{name}" text below, {style} style, {colors}, balanced composition
Logo combining {symbol} icon and "{name}" wordmark, {style}, professional, {colors}Keywords: combination, icon + text, symbol + name, integrated
---
Color Guidelines
Monochrome
- Black on white (most versatile)
- White on black (dark mode)
- Single brand color
Limited Palette
- 2-3 colors maximum
- High contrast combinations
- Consider accessibility
Common Color Meanings
- Blue: Trust, professional, tech
- Green: Growth, nature, health
- Red: Energy, passion, urgency
- Orange: Creative, friendly, youthful
- Purple: Luxury, creative, wisdom
- Yellow: Optimism, warmth, clarity
- Black: Premium, elegant, powerful
---
Aspect Ratios
| Ratio | Use Case |
|---|---|
| 1:1 | Favicons, app icons, social avatars |
| 16:9 | Website headers, presentations |
| 4:3 | Traditional formats |
| 2:1 | Horizontal banners |
| 1:2 | Vertical banners, mobile |
---
File Format Guidelines
| Format | Use Case |
|---|---|
| SVG | Web, print, scaling |
| PNG | Web with transparency |
| JPG | Web photos, no transparency |
| ICO | Favicons |
| Print, documents |
---
Tips for Better Prompts
1. Be specific about style: "minimalist flat design" vs just "simple" 2. Specify colors: "black on white" or "navy blue and gold" 3. Mention use case: "suitable for app icon" or "for website header" 4. Include constraints: "no text" or "must work at small sizes" 5. Reference known styles: "like Apple's design" or "retro 80s arcade"
#!/usr/bin/env python3
"""
Crop whitespace from logo and center in 1:1 square.
Usage:
python3 crop_logo.py input.png output.png [--padding 5]
"""
import sys
import os
try:
from PIL import Image
import numpy as np
except ImportError:
print("Error: PIL and numpy required. Install with: pip install Pillow numpy")
sys.exit(1)
def crop_to_content(image_path, output_path, padding=5, threshold=240):
"""
Crop whitespace from image and center in 1:1 square.
Args:
image_path: Path to input image
output_path: Path to save cropped image
padding: Pixels of padding around content (default: 5)
threshold: Pixel value threshold for "white" (default: 240)
"""
img = Image.open(image_path).convert('RGB')
data = np.array(img)
# Find non-white pixels (where any channel is below threshold)
mask = (data[:,:,0] < threshold) | (data[:,:,1] < threshold) | (data[:,:,2] < threshold)
rows = np.any(mask, axis=1)
cols = np.any(mask, axis=0)
if not np.any(rows) or not np.any(cols):
print(f"Warning: No content found in {image_path}")
img.save(output_path)
return output_path
rmin, rmax = np.where(rows)[0][[0, -1]]
cmin, cmax = np.where(cols)[0][[0, -1]]
# Add padding
top = max(0, rmin - padding)
bottom = min(img.size[1], rmax + padding + 1)
left = max(0, cmin - padding)
right = min(img.size[0], cmax + padding + 1)
# Crop to content
cropped = img.crop((left, top, right, bottom))
# Make square
w, h = cropped.size
size = max(w, h)
# Create new square image with white background
square = Image.new('RGB', (size, size), (255, 255, 255))
# Center the cropped image
x = (size - w) // 2
y = (size - h) // 2
square.paste(cropped, (x, y))
square.save(output_path, quality=95)
print(f"Original: {img.size[0]}x{img.size[1]}")
print(f"Content: {cmax-cmin+1}x{rmax-rmin+1}")
print(f"Output: {size}x{size}")
print(f"Saved to: {output_path}")
return output_path
def main():
if len(sys.argv) < 3:
print(__doc__)
sys.exit(1)
input_path = sys.argv[1]
output_path = sys.argv[2]
padding = int(sys.argv[3]) if len(sys.argv) > 3 else 5
if not os.path.exists(input_path):
print(f"Error: File not found: {input_path}")
sys.exit(1)
crop_to_content(input_path, output_path, padding)
if __name__ == "__main__":
main()
#!/usr/bin/env python3
"""
Remove background from image using remove.bg API.
Requires REMOVE_BG_API_KEY environment variable.
Usage:
python3 remove_bg.py input.png output.png
"""
import sys
import os
import subprocess
def remove_background(input_path, output_path):
"""
Remove background from image using remove.bg API.
Args:
input_path: Path to input image
output_path: Path to save output image (transparent PNG)
"""
api_key = os.environ.get('REMOVE_BG_API_KEY')
if not api_key:
# Try to get from ~/.zshrc
try:
result = subprocess.run(
['grep', 'REMOVE_BG_API_KEY', os.path.expanduser('~/.zshrc')],
capture_output=True, text=True
)
if result.stdout:
api_key = result.stdout.split('"')[1]
except:
pass
if not api_key:
print("Error: REMOVE_BG_API_KEY not found in environment or ~/.zshrc")
print("Get your API key from: https://www.remove.bg/api")
sys.exit(1)
if not os.path.exists(input_path):
print(f"Error: File not found: {input_path}")
sys.exit(1)
# Use curl to call the API
cmd = [
'curl', '-s',
'-H', f'X-Api-Key: {api_key}',
'-F', f'image_file=@{input_path}',
'-F', 'size=auto',
'-F', 'format=png',
'-o', output_path,
'https://api.remove.bg/v1.0/removebg'
]
print(f"Removing background from: {input_path}")
result = subprocess.run(cmd, capture_output=True, text=True)
if result.returncode != 0:
print(f"Error: {result.stderr}")
sys.exit(1)
# Check if output is valid
if os.path.exists(output_path) and os.path.getsize(output_path) > 100:
print(f"Success! Saved to: {output_path}")
print(f"File size: {os.path.getsize(output_path) / 1024:.1f} KB")
else:
print("Error: API call failed. Check your API key and quota.")
if os.path.exists(output_path):
with open(output_path, 'r') as f:
print(f.read())
sys.exit(1)
return output_path
def main():
if len(sys.argv) < 3:
print(__doc__)
sys.exit(1)
input_path = sys.argv[1]
output_path = sys.argv[2]
remove_background(input_path, output_path)
if __name__ == "__main__":
main()
#!/usr/bin/env python3
"""
Convert raster image to SVG using Recraft API.
Requires RECRAFT_API_KEY environment variable.
Usage:
python3 vectorize.py input.png output.svg
"""
import sys
import os
import subprocess
import json
def vectorize_image(input_path, output_path):
"""
Convert raster image to SVG using Recraft API.
Args:
input_path: Path to input image (PNG, JPG, or WEBP)
output_path: Path to save SVG output
"""
api_key = os.environ.get('RECRAFT_API_KEY')
if not api_key:
# Try to get from ~/.zshrc
try:
result = subprocess.run(
['grep', 'RECRAFT_API_KEY', os.path.expanduser('~/.zshrc')],
capture_output=True, text=True
)
if result.stdout:
api_key = result.stdout.split('"')[1]
except:
pass
if not api_key:
print("Error: RECRAFT_API_KEY not found in environment or ~/.zshrc")
print("Get your API key from: https://www.recraft.ai/")
sys.exit(1)
if not os.path.exists(input_path):
print(f"Error: File not found: {input_path}")
sys.exit(1)
# Step 1: Call Recraft API to vectorize
print(f"Vectorizing: {input_path}")
cmd = [
'curl', '-s', '-X', 'POST',
'https://external.api.recraft.ai/v1/images/vectorize',
'-H', f'Authorization: Bearer {api_key}',
'-H', 'Content-Type: multipart/form-data',
'-F', f'file=@{input_path}'
]
result = subprocess.run(cmd, capture_output=True, text=True)
if result.returncode != 0:
print(f"Error: {result.stderr}")
sys.exit(1)
try:
response = json.loads(result.stdout)
except json.JSONDecodeError:
print(f"Error: Invalid API response: {result.stdout}")
sys.exit(1)
if 'error' in response:
print(f"API Error: {response['error']}")
sys.exit(1)
svg_url = response.get('image', {}).get('url')
if not svg_url:
print(f"Error: No SVG URL in response: {response}")
sys.exit(1)
print(f"SVG URL: {svg_url}")
# Step 2: Download the SVG
download_cmd = ['curl', '-s', svg_url, '-o', output_path]
result = subprocess.run(download_cmd, capture_output=True, text=True)
if result.returncode != 0:
print(f"Error downloading SVG: {result.stderr}")
sys.exit(1)
# Verify output
if os.path.exists(output_path) and os.path.getsize(output_path) > 100:
# Check if it's actually an SVG
with open(output_path, 'r') as f:
content = f.read(100)
if '<svg' in content.lower() or '<?xml' in content.lower():
print(f"Success! Saved to: {output_path}")
print(f"File size: {os.path.getsize(output_path) / 1024:.1f} KB")
else:
print(f"Warning: Output may not be a valid SVG")
print(f"First 100 chars: {content}")
else:
print("Error: Failed to download SVG")
sys.exit(1)
return output_path
def main():
if len(sys.argv) < 3:
print(__doc__)
sys.exit(1)
input_path = sys.argv[1]
output_path = sys.argv[2]
vectorize_image(input_path, output_path)
if __name__ == "__main__":
main()
<!DOCTYPE html>
<html>
<head>
<title>Logo Preview Gallery</title>
<style>
* { box-sizing: border-box; }
body {
font-family: system-ui, -apple-system, sans-serif;
background: #1a1a1a;
padding: 20px;
margin: 0;
color: white;
}
h1 { text-align: center; margin-bottom: 10px; }
.subtitle { text-align: center; color: #888; margin-bottom: 30px; }
.controls {
text-align: center;
margin-bottom: 20px;
}
.controls input {
padding: 8px 16px;
font-size: 14px;
border: 1px solid #444;
border-radius: 6px;
background: #2a2a2a;
color: white;
width: 300px;
}
.grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
gap: 16px;
max-width: 1400px;
margin: 0 auto;
}
.logo-card {
background: white;
border-radius: 10px;
padding: 16px;
text-align: center;
cursor: pointer;
transition: transform 0.2s, box-shadow 0.2s;
}
.logo-card:hover {
transform: translateY(-4px);
box-shadow: 0 8px 20px rgba(0,0,0,0.4);
}
.logo-card img {
width: 100%;
height: 120px;
object-fit: contain;
margin-bottom: 8px;
}
.logo-card p {
margin: 0;
color: #333;
font-size: 13px;
font-weight: 600;
}
.logo-card span {
display: block;
color: #888;
font-size: 11px;
margin-top: 4px;
}
.logo-card.favorite {
box-shadow: 0 0 0 3px #4CAF50;
}
.modal {
display: none;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0,0,0,0.9);
z-index: 1000;
align-items: center;
justify-content: center;
flex-direction: column;
}
.modal.active { display: flex; }
.modal img {
max-width: 500px;
max-height: 500px;
background: white;
padding: 30px;
border-radius: 12px;
}
.modal-info {
margin-top: 20px;
color: white;
text-align: center;
}
.modal-info p { margin: 5px 0; }
.modal-close {
position: absolute;
top: 20px;
right: 30px;
color: white;
font-size: 40px;
cursor: pointer;
}
.modal-nav {
position: absolute;
top: 50%;
transform: translateY(-50%);
color: white;
font-size: 60px;
cursor: pointer;
user-select: none;
padding: 20px;
}
.modal-nav:hover { color: #4CAF50; }
.modal-nav.prev { left: 20px; }
.modal-nav.next { right: 20px; }
.favorites-bar {
position: fixed;
bottom: 0;
left: 0;
right: 0;
background: #2a2a2a;
padding: 15px 20px;
display: flex;
align-items: center;
gap: 15px;
border-top: 1px solid #444;
}
.favorites-bar span { color: #888; }
.favorites-list {
flex: 1;
color: #4CAF50;
font-weight: 600;
}
.section-divider {
grid-column: 1 / -1;
text-align: center;
padding: 20px 0;
color: #666;
font-size: 14px;
border-top: 1px solid #333;
margin-top: 10px;
}
body { padding-bottom: 80px; }
</style>
</head>
<body>
<h1>Logo Preview Gallery</h1>
<p class="subtitle">Click any logo to enlarge • Click again to toggle favorite</p>
<div class="controls">
<input type="text" id="search" placeholder="Filter logos... (e.g., 'v1' or '05')">
</div>
<div class="grid" id="grid">
<!-- LOGO_CARDS_PLACEHOLDER -->
<!-- Example cards - replace with actual logos -->
<div class="logo-card" data-src="logo-01.png" onclick="showModal(this)">
<img src="logo-01.png" onerror="this.parentElement.style.display='none'">
<p>#01</p>
</div>
<div class="logo-card" data-src="logo-02.png" onclick="showModal(this)">
<img src="logo-02.png" onerror="this.parentElement.style.display='none'">
<p>#02</p>
</div>
<div class="logo-card" data-src="logo-03.png" onclick="showModal(this)">
<img src="logo-03.png" onerror="this.parentElement.style.display='none'">
<p>#03</p>
</div>
<div class="logo-card" data-src="logo-04.png" onclick="showModal(this)">
<img src="logo-04.png" onerror="this.parentElement.style.display='none'">
<p>#04</p>
</div>
<div class="logo-card" data-src="logo-05.png" onclick="showModal(this)">
<img src="logo-05.png" onerror="this.parentElement.style.display='none'">
<p>#05</p>
</div>
<div class="logo-card" data-src="logo-06.png" onclick="showModal(this)">
<img src="logo-06.png" onerror="this.parentElement.style.display='none'">
<p>#06</p>
</div>
<div class="logo-card" data-src="logo-07.png" onclick="showModal(this)">
<img src="logo-07.png" onerror="this.parentElement.style.display='none'">
<p>#07</p>
</div>
<div class="logo-card" data-src="logo-08.png" onclick="showModal(this)">
<img src="logo-08.png" onerror="this.parentElement.style.display='none'">
<p>#08</p>
</div>
<div class="logo-card" data-src="logo-09.png" onclick="showModal(this)">
<img src="logo-09.png" onerror="this.parentElement.style.display='none'">
<p>#09</p>
</div>
<div class="logo-card" data-src="logo-10.png" onclick="showModal(this)">
<img src="logo-10.png" onerror="this.parentElement.style.display='none'">
<p>#10</p>
</div>
<div class="logo-card" data-src="logo-11.png" onclick="showModal(this)">
<img src="logo-11.png" onerror="this.parentElement.style.display='none'">
<p>#11</p>
</div>
<div class="logo-card" data-src="logo-12.png" onclick="showModal(this)">
<img src="logo-12.png" onerror="this.parentElement.style.display='none'">
<p>#12</p>
</div>
<div class="logo-card" data-src="logo-13.png" onclick="showModal(this)">
<img src="logo-13.png" onerror="this.parentElement.style.display='none'">
<p>#13</p>
</div>
<div class="logo-card" data-src="logo-14.png" onclick="showModal(this)">
<img src="logo-14.png" onerror="this.parentElement.style.display='none'">
<p>#14</p>
</div>
<div class="logo-card" data-src="logo-15.png" onclick="showModal(this)">
<img src="logo-15.png" onerror="this.parentElement.style.display='none'">
<p>#15</p>
</div>
<div class="logo-card" data-src="logo-16.png" onclick="showModal(this)">
<img src="logo-16.png" onerror="this.parentElement.style.display='none'">
<p>#16</p>
</div>
<div class="logo-card" data-src="logo-17.png" onclick="showModal(this)">
<img src="logo-17.png" onerror="this.parentElement.style.display='none'">
<p>#17</p>
</div>
<div class="logo-card" data-src="logo-18.png" onclick="showModal(this)">
<img src="logo-18.png" onerror="this.parentElement.style.display='none'">
<p>#18</p>
</div>
<div class="logo-card" data-src="logo-19.png" onclick="showModal(this)">
<img src="logo-19.png" onerror="this.parentElement.style.display='none'">
<p>#19</p>
</div>
<div class="logo-card" data-src="logo-20.png" onclick="showModal(this)">
<img src="logo-20.png" onerror="this.parentElement.style.display='none'">
<p>#20</p>
</div>
</div>
<div class="favorites-bar">
<span>Favorites:</span>
<div class="favorites-list" id="favorites-list">None selected (click logos to favorite)</div>
</div>
<div class="modal" id="modal" onclick="if(event.target === this) hideModal()">
<span class="modal-close" onclick="hideModal()">×</span>
<span class="modal-nav prev" onclick="navModal(-1)">‹</span>
<span class="modal-nav next" onclick="navModal(1)">›</span>
<img id="modal-img" src="">
<div class="modal-info">
<p id="modal-name"></p>
<p style="color:#888;font-size:12px">Press F to favorite • Arrow keys to navigate • Escape to close</p>
</div>
</div>
<script>
let currentCard = null;
let favorites = new Set();
let visibleCards = [];
function updateVisibleCards() {
visibleCards = Array.from(document.querySelectorAll('.logo-card')).filter(c => c.style.display !== 'none');
}
function showModal(card) {
currentCard = card;
const src = card.dataset.src;
document.getElementById('modal-img').src = src;
document.getElementById('modal-name').textContent = card.querySelector('p').textContent;
document.getElementById('modal').classList.add('active');
updateVisibleCards();
}
function hideModal() {
document.getElementById('modal').classList.remove('active');
currentCard = null;
}
function navModal(dir) {
if (!currentCard) return;
updateVisibleCards();
const idx = visibleCards.indexOf(currentCard);
const newIdx = (idx + dir + visibleCards.length) % visibleCards.length;
showModal(visibleCards[newIdx]);
}
function toggleFavorite(card) {
const name = card.querySelector('p').textContent;
if (favorites.has(name)) {
favorites.delete(name);
card.classList.remove('favorite');
} else {
favorites.add(name);
card.classList.add('favorite');
}
updateFavoritesList();
}
function updateFavoritesList() {
const list = document.getElementById('favorites-list');
if (favorites.size === 0) {
list.textContent = 'None selected (click logos to favorite)';
} else {
list.textContent = Array.from(favorites).sort().join(', ');
}
}
document.addEventListener('keydown', (e) => {
if (e.key === 'Escape') hideModal();
if (e.key === 'ArrowLeft') navModal(-1);
if (e.key === 'ArrowRight') navModal(1);
if ((e.key === 'f' || e.key === 'F') && currentCard) {
toggleFavorite(currentCard);
}
});
document.querySelectorAll('.logo-card').forEach(card => {
card.addEventListener('dblclick', () => toggleFavorite(card));
});
document.getElementById('search').addEventListener('input', (e) => {
const query = e.target.value.toLowerCase();
document.querySelectorAll('.logo-card').forEach(card => {
const name = card.querySelector('p').textContent.toLowerCase();
const src = card.dataset.src.toLowerCase();
card.style.display = (name.includes(query) || src.includes(query)) ? '' : 'none';
});
});
</script>
</body>
</html>
Related skills
How it compares
Pick logo-creator over general image skills when the deliverable must be an exported SVG logo, favicon, or brand icon rather than arbitrary raster art.
FAQ
Which API keys does logo-creator require?
GEMINI_API_KEY, REMOVE_BG_API_KEY, and RECRAFT_API_KEY, plus the nanobanana skill for Gemini image generation.
Where are generated files saved?
Under .skill-archive/logo-creator/<yyyy-mm-dd-summaryname>/ with sequential logo-NN.png names and preview.html.
How many variations are generated initially?
About twenty logo variations by default using batch_generate.py before user feedback drives refinement rounds.
Is Logo Creator safe to install?
skills.sh reports 2 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.