Claude-code-minoan photo-to-slack-emoji

Photo to Slack Emoji Converter & Image Editor

install
source · Clone the upstream repo
git clone https://github.com/tdimino/claude-code-minoan
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/tdimino/claude-code-minoan "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/design-media/photo-to-slack-emoji" ~/.claude/skills/tdimino-claude-code-minoan-photo-to-slack-emoji && rm -rf "$T"
manifest: skills/design-media/photo-to-slack-emoji/SKILL.md
source content

Photo to Slack Emoji Converter & Image Editor

Transform any photo into a classic Slack-optimized emoji using Google's Nano Banana Pro (Gemini 3 Pro Image) model with automatic subject identification and style transformation. NEW: Edit existing images with natural language prompts!

When to Use This Skill

Use this skill when:

  • Converting photos into Slack custom emojis
  • Editing existing images/emojis (add hats, change colors, add accessories, etc.)
  • Creating icon-style representations of people, pets, objects, or concepts
  • Need automatic subject identification and isolation
  • Transforming photos to match classic emoji aesthetics (flat, simple, expressive)
  • Ensuring Slack's strict 64KB file size and dimension requirements are met

Overview

This skill combines:

  1. Google Nano Banana Pro (Gemini 3 Pro Image) - AI-powered subject identification, style transformation, and image editing with superior quality
  2. Slack Emoji Validators - Ensures compliance with Slack's 64KB limit and optimal dimensions
  3. Automatic Optimization - Color quantization, compression, and size validation

Two Main Workflows

1. Photo-to-Emoji Conversion (Original)

Photo Input → Gemini Identifies Subject → Transform to Emoji Style → Optimize for Slack → Validate

2. Image Editing (NEW!)

Existing Image → Natural Language Edit Prompt → Gemini Edits Image → Optimize (optional) → Save

How It Works

Photo Input → Gemini Identifies Subject → Transform to Emoji Style → Optimize for Slack → Validate

Workflow Steps:

  1. Upload photo - Provide path to source image
  2. AI identifies subject - Gemini's visual reasoning determines the main subject
  3. Style transformation - Converts to emoji/icon/sticker style with descriptive prompt
  4. Optimization - Reduces to 128x128, limits colors to 32-48, compresses to <64KB
  5. Validation - Confirms Slack requirements are met

Quick Start

Basic Photo-to-Emoji Usage

from core.photo_to_emoji import convert_photo_to_emoji

# Convert a photo to a Slack emoji
convert_photo_to_emoji(
    input_path="~/Downloads/my_cat.jpg",
    output_path="~/Desktop/cat_emoji.png",
    style="classic_emoji",
    description="happy cat face"  # Optional: helps guide transformation
)

NEW: Image Editing Usage

IMPORTANT: Never override existing generated images. Always use a different output filename to preserve the original. Iterative editing works best when you can compare versions.

# Command line (easiest way)
python edit_image.py input.jpg output.png "add a party hat"
python edit_image.py cat_emoji.png cat_with_sunglasses.png "add cool sunglasses" --optimize

# WRONG: Don't overwrite the original
# python edit_image.py cat_emoji.png cat_emoji.png "edit" ❌

# CORRECT: Use a new filename
# python edit_image.py cat_emoji.png cat_emoji_edited.png "edit" ✅

# Python API
from core.gemini_client import GeminiImageClient

client = GeminiImageClient()

# Edit an existing image
with open("cat_emoji.png", "rb") as f:
    image_data = f.read()

edited_data = client.edit_image(
    image_data=image_data,
    mime_type="image/png",
    edit_prompt="add a party hat to the cat"
)

# Always save to a NEW filename
with open("cat_with_hat.png", "wb") as f:
    f.write(edited_data)

Advanced Usage with Custom Styles

convert_photo_to_emoji(
    input_path="~/Downloads/portrait.jpg",
    output_path="~/Desktop/person_emoji.png",
    style="flat_icon",
    description="friendly person waving",
    custom_prompt="Transform this photo into a simple, flat design icon with bold outlines, minimal details, solid colors, and a white background. Focus on the subject's key features and expression."
)

Available Styles

1. classic_emoji (Recommended for most use cases)

  • Round, expressive, classic emoji aesthetic
  • Simplified features with bold outlines
  • High contrast, vibrant colors
  • Perfect for faces, animals, and expressive subjects

Example prompt template:

Transform this photo into a classic emoji style: round shape, simplified features,
bold outlines, expressive and friendly, vibrant yellow/warm tones, minimal shading,
white or transparent background. Focus on the subject's main expression.

2. flat_icon

  • Minimalist, flat design
  • Simple geometric shapes
  • Solid colors without gradients
  • Best for objects, logos, symbols

Example prompt template:

Transform this photo into a flat, minimalist icon: simple geometric shapes,
solid colors, no gradients, bold clean outlines, modern flat design aesthetic,
white background. Capture the essence of the subject with minimal detail.

3. kawaii_sticker

  • Cute, playful, Japanese kawaii aesthetic
  • Rounded features, large eyes
  • Pastel or vibrant colors
  • Best for animals, characters, food

Example prompt template:

Transform this photo into a kawaii-style sticker: cute and playful, rounded features,
large expressive eyes, simple cel-shading, vibrant color palette, bold clean outlines,
white background. Make it adorable and friendly.

4. pixel_art

  • Retro 8-bit/16-bit pixel art style
  • Chunky pixels, limited color palette
  • Nostalgic gaming aesthetic
  • Best for characters, objects, icons

Example prompt template:

Transform this photo into pixel art: 16x16 or 32x32 pixel style, retro 8-bit aesthetic,
limited color palette (8-16 colors), chunky pixels, clear subject outline,
simple shading, transparent or solid background.

5. custom

  • Provide your own transformation prompt
  • Full control over style description
  • Use for unique or specific aesthetic needs

API Configuration

Setting up Google Gemini API Key

You'll need a Google Gemini API key to use this skill.

  1. Get API Key: Visit Google AI Studio
  2. Set Environment Variable:
    export GEMINI_API_KEY="your-api-key-here"
    
  3. Or provide directly in code:
    convert_photo_to_emoji(
        input_path="photo.jpg",
        output_path="emoji.png",
        api_key="your-api-key-here"
    )
    

API Costs

Google Gemini 2.5 Flash Image pricing:

  • $30 per 1 million output tokens
  • Each image = 1290 tokens (flat rate up to 1024x1024px)
  • ~$0.039 per image generated

Very cost-effective for emoji creation!

Slack Requirements

Emoji Specifications (Strict)

  • Max file size: 64KB (strict enforcement)
  • Optimal dimensions: 128x128 pixels
  • Recommended colors: 32-48 colors maximum
  • Format: PNG with transparency support

Validation

The skill automatically validates and optimizes for these requirements:

from core.validators import validate_slack_emoji

# After conversion, validate
is_valid, report = validate_slack_emoji("emoji.png")

if is_valid:
    print("✅ Ready to upload to Slack!")
else:
    print(f"❌ Issues: {report}")

Examples

Example 1: Pet Photo to Emoji

# Convert a dog photo to a happy emoji
convert_photo_to_emoji(
    input_path="~/Photos/my_dog.jpg",
    output_path="~/Desktop/happy_dog_emoji.png",
    style="classic_emoji",
    description="happy golden retriever smiling"
)

Result: A round, simplified emoji-style dog face with expressive eyes and a big smile.

Example 2: Person Portrait to Icon

# Convert a headshot to a professional icon
convert_photo_to_emoji(
    input_path="~/Photos/headshot.jpg",
    output_path="~/Desktop/person_icon.png",
    style="flat_icon",
    description="professional person with glasses"
)

Result: A minimalist, flat design icon representation of the person.

Example 3: Food Photo to Kawaii Sticker

# Convert a pizza photo to cute sticker
convert_photo_to_emoji(
    input_path="~/Photos/pizza.jpg",
    output_path="~/Desktop/kawaii_pizza.png",
    style="kawaii_sticker",
    description="cute pizza slice with happy face"
)

Result: A kawaii-style pizza slice with adorable features.

Example 4: Batch Conversion

from core.photo_to_emoji import batch_convert

# Convert multiple photos at once
photos = [
    {"input": "cat.jpg", "output": "cat_emoji.png", "description": "happy cat"},
    {"input": "dog.jpg", "output": "dog_emoji.png", "description": "excited dog"},
    {"input": "bird.jpg", "output": "bird_emoji.png", "description": "singing bird"}
]

results = batch_convert(photos, style="classic_emoji")

Advanced Features

Custom Prompts

For maximum control, provide your own transformation prompt:

convert_photo_to_emoji(
    input_path="photo.jpg",
    output_path="emoji.png",
    style="custom",
    custom_prompt="""
    Transform this photo into a vintage cartoon style from the 1930s:
    thick black outlines, limited color palette (black, white, red, yellow),
    exaggerated features, bouncy and animated appearance, white background.
    """
)

Size Optimization Strategies

If your emoji exceeds 64KB after conversion:

from core.optimizer import aggressive_optimize

# Try aggressive optimization
aggressive_optimize(
    input_path="emoji.png",
    output_path="emoji_optimized.png",
    target_size_kb=60,  # Leave buffer below 64KB
    strategies=["reduce_colors", "reduce_dimensions", "compress_png"]
)

Preview Before Upload

from core.preview import preview_emoji

# Preview how it will look in Slack
preview_emoji("emoji.png", sizes=[16, 32, 64, 128])

Shows how the emoji appears at different sizes (Slack displays emojis at various scales).

Troubleshooting

Issue: File size exceeds 64KB

Solutions:

  1. Use fewer colors:
    max_colors=32
    instead of 48
  2. Simplify the style: "flat_icon" compresses better than "kawaii_sticker"
  3. Reduce detail in description: Less detail = simpler image = smaller file
  4. Use aggressive optimization (see Advanced Features)

Issue: Subject not identified correctly

Solutions:

  1. Provide more specific
    description
    parameter
  2. Crop photo to focus on main subject before conversion
  3. Use better-lit, clearer source photo
  4. Try a custom prompt with explicit subject description

Issue: Style doesn't match expectation

Solutions:

  1. Try different style presets (flat_icon vs classic_emoji)
  2. Use
    custom_prompt
    for precise control
  3. Add more descriptive terms to
    description
    parameter
  4. Review style examples in
    /templates/style_examples.md

Issue: API authentication fails

Solutions:

  1. Verify
    GEMINI_API_KEY
    environment variable is set
  2. Check API key is valid at Google AI Studio
  3. Ensure no extra spaces or quotes in API key
  4. Try providing
    api_key
    parameter directly

File Structure

~/.claude/skills/photo-to-slack-emoji/
├── skill.md                    # This file
├── core/
│   ├── photo_to_emoji.py      # Main conversion logic
│   ├── gemini_client.py       # Gemini API wrapper
│   ├── optimizer.py           # Image optimization utilities
│   ├── validators.py          # Slack requirement validators
│   └── preview.py             # Preview utilities
├── templates/
│   ├── style_prompts.json     # Pre-defined style templates
│   └── style_examples.md      # Visual style guide
└── references/
    ├── gemini-api-docs.md     # Gemini API documentation
    └── slack-emoji-specs.md   # Slack emoji specifications

Dependencies

# Required packages
pip install pillow google-genai requests

# Optional for advanced features
pip install imageio numpy

Best Practices

  1. Start with high-quality photos - Better input = better output
  2. Use descriptive filenames - Helps with organization in Slack
  3. NEVER override existing generated images - Always save edits to new filenames to preserve originals
  4. Test at multiple sizes - Preview before uploading to ensure clarity
  5. Keep it simple - Simpler styles compress better and meet size limits
  6. Provide context - Use the
    description
    parameter to guide transformation
  7. Batch process - Convert multiple photos at once for efficiency
  8. Iterative editing - Make small edits and save each version with descriptive names (e.g.,
    cat_v1.png
    ,
    cat_v2_hat.png
    ,
    cat_v3_final.png
    )

Limitations

  • API rate limits - Google Gemini has rate limits (check your quota)
  • Subject complexity - Very complex subjects may not simplify well
  • Background removal - Gemini does its best, but manual editing may improve results
  • Transparent backgrounds - Not always perfect; may need manual cleanup
  • Text in photos - May not preserve text accurately in emoji transformation

Related Skills

  • slack-gif-creator - Create animated GIFs for Slack
  • canvas-design - Design custom graphics from scratch
  • firecrawl-mcp - Scrape emoji images from web for reference

What's Next

After creating your emoji:

  1. Upload to Slack:

    • Go to Slack workspace settings
    • Click "Customize" → "Emoji"
    • Upload your PNG file
    • Give it a memorable name like
      :my_cat:
      or
      :happy_dog:
  2. Share with team:

    • Emojis are available to entire workspace
    • Use in messages, reactions, and status updates
  3. Create variations:

    • Try different styles for the same photo
    • Experiment with descriptions for different expressions
    • Build an emoji library for your team

Feedback & Support

This skill uses:

For issues or suggestions, check the skill's GitHub repository or the Claude Code skills directory.