hermes-agent/optional-skills/creative/meme-generation/SKILL.md
Teknium db22efbe88 feat(optional-skills): declare platforms frontmatter for all 63 undeclared skills
Extends the Windows-gating work to the optional-skills/ tree. Every
SKILL.md that previously omitted the platforms: field now carries an
explicit declaration, which Hermes's loader (agent.skill_utils.
skill_matches_platform) honors to skip-load on incompatible OSes.

58 skills declared cross-platform (platforms: [linux, macos, windows]):
  autonomous-ai-agents/blackbox, autonomous-ai-agents/honcho
  blockchain/base, blockchain/solana
  communication/one-three-one-rule
  creative/blender-mcp, creative/concept-diagrams, creative/hyperframes,
  creative/kanban-video-orchestrator, creative/meme-generation
  devops/cli (inference-sh-cli), devops/docker-management
  dogfood/adversarial-ux-test
  email/agentmail
  finance/3-statement-model, finance/comps-analysis, finance/dcf-model,
  finance/excel-author, finance/lbo-model, finance/merger-model,
  finance/pptx-author
  health/fitness-nutrition, health/neuroskill-bci
  mcp/fastmcp, mcp/mcporter
  migration/openclaw-migration
  mlops/accelerate, mlops/chroma, mlops/clip, mlops/guidance,
  mlops/hermes-atropos-environments, mlops/huggingface-tokenizers,
  mlops/instructor, mlops/lambda-labs, mlops/llava, mlops/modal,
  mlops/peft, mlops/pinecone, mlops/pytorch-lightning, mlops/qdrant,
  mlops/saelens, mlops/simpo, mlops/stable-diffusion
  productivity/canvas, productivity/shop-app, productivity/shopify,
  productivity/siyuan, productivity/telephony
  research/domain-intel, research/drug-discovery, research/duckduckgo-search,
  research/gitnexus-explorer, research/parallel-cli, research/scrapling
  security/1password, security/oss-forensics, security/sherlock
  web-development/page-agent

5 skills gated from Windows (platforms: [linux, macos]):
  mlops/flash-attention   - Flash Attention wheels are Linux-first; Windows
                            install requires building from source with CUDA
  mlops/faiss             - faiss-gpu has no Windows wheel; gate rather than
                            leak partial (faiss-cpu) support
  mlops/nemo-curator      - NVIDIA NeMo ecosystem has no first-class Windows path
  mlops/slime             - Megatron+SGLang RL stack is Linux-only in practice
  mlops/whisper           - openai-whisper + ffmpeg setup on Windows is
                            non-trivial; gate until Windows install stanza lands

Methodology: scanned every SKILL.md for Windows-hostile signals
(apt-get, brew, systemd, osascript, ptrace, X11 binaries, POSIX-only
Python APIs, Docker POSIX $(pwd) bind-mounts, explicit 'linux-only' /
'macos-only' text). 3 skills flagged as having hard signals on review:
docker-management and qdrant only had POSIX $(pwd) docker examples and
the tools themselves (Docker Desktop, Qdrant) run fine on Windows —
declared ALL. whisper had an apt/brew ffmpeg install path and nothing
else but the openai-whisper Windows install story is rough enough to
warrant gating.

Strict-over-lenient policy: when in doubt, gate. Easier to un-gate after
verified Windows support lands than to leak partial support that
manifests as mid-task failures for Windows users.
2026-05-08 14:27:40 -07:00

5.3 KiB

name description version author license platforms metadata
meme-generation Generate real meme images by picking a template and overlaying text with Pillow. Produces actual .png meme files. 2.0.0 adanaleycio MIT
linux
macos
windows
hermes
tags related_skills category
creative
memes
humor
images
ascii-art
generative-widgets
creative

Meme Generation

Generate actual meme images from a topic. Picks a template, writes captions, and renders a real .png file with text overlay.

When to Use

  • User asks you to make or generate a meme
  • User wants a meme about a specific topic, situation, or frustration
  • User says "meme this" or similar

Available Templates

The script supports any of the ~100 popular imgflip templates by name or ID, plus 10 curated templates with hand-tuned text positioning.

Curated Templates (custom text placement)

ID Name Fields Best for
this-is-fine This is Fine top, bottom chaos, denial
drake Drake Hotline Bling reject, approve rejecting/preferring
distracted-boyfriend Distracted Boyfriend distraction, current, person temptation, shifting priorities
two-buttons Two Buttons left, right, person impossible choice
expanding-brain Expanding Brain 4 levels escalating irony
change-my-mind Change My Mind statement hot takes
woman-yelling-at-cat Woman Yelling at Cat woman, cat arguments
one-does-not-simply One Does Not Simply top, bottom deceptively hard things
grus-plan Gru's Plan step1-3, realization plans that backfire
batman-slapping-robin Batman Slapping Robin robin, batman shutting down bad ideas

Dynamic Templates (from imgflip API)

Any template not in the curated list can be used by name or imgflip ID. These get smart default text positioning (top/bottom for 2-field, evenly spaced for 3+). Search with:

python "$SKILL_DIR/scripts/generate_meme.py" --search "disaster"

Procedure

Mode 1: Classic Template (default)

  1. Read the user's topic and identify the core dynamic (chaos, dilemma, preference, irony, etc.)
  2. Pick the template that best matches. Use the "Best for" column, or search with --search.
  3. Write short captions for each field (8-12 words max per field, shorter is better).
  4. Find the skill's script directory:
    SKILL_DIR=$(dirname "$(find ~/.hermes/skills -path '*/meme-generation/SKILL.md' 2>/dev/null | head -1)")
    
  5. Run the generator:
    python "$SKILL_DIR/scripts/generate_meme.py" <template_id> /tmp/meme.png "caption 1" "caption 2" ...
    
  6. Return the image with MEDIA:/tmp/meme.png

Mode 2: Custom AI Image (when image_generate is available)

Use this when no classic template fits, or when the user wants something original.

  1. Write the captions first.
  2. Use image_generate to create a scene that matches the meme concept. Do NOT include any text in the image prompt — text will be added by the script. Describe only the visual scene.
  3. Find the generated image path from the image_generate result URL. Download it to a local path if needed.
  4. Run the script with --image to overlay text, choosing a mode:
    • Overlay (text directly on image, white with black outline):
      python "$SKILL_DIR/scripts/generate_meme.py" --image /path/to/scene.png /tmp/meme.png "top text" "bottom text"
      
    • Bars (black bars above/below with white text — cleaner, always readable):
      python "$SKILL_DIR/scripts/generate_meme.py" --image /path/to/scene.png --bars /tmp/meme.png "top text" "bottom text"
      
    Use --bars when the image is busy/detailed and text would be hard to read on top of it.
  5. Verify with vision (if vision_analyze is available): Check the result looks good:
    vision_analyze(image_url="/tmp/meme.png", question="Is the text legible and well-positioned? Does the meme work visually?")
    
    If the vision model flags issues (text hard to read, bad placement, etc.), try the other mode (switch between overlay and bars) or regenerate the scene.
  6. Return the image with MEDIA:/tmp/meme.png

Examples

"debugging production at 2 AM":

python generate_meme.py this-is-fine /tmp/meme.png "SERVERS ARE ON FIRE" "This is fine"

"choosing between sleep and one more episode":

python generate_meme.py drake /tmp/meme.png "Getting 8 hours of sleep" "One more episode at 3 AM"

"the stages of a Monday morning":

python generate_meme.py expanding-brain /tmp/meme.png "Setting an alarm" "Setting 5 alarms" "Sleeping through all alarms" "Working from bed"

Listing Templates

To see all available templates:

python generate_meme.py --list

Pitfalls

  • Keep captions SHORT. Memes with long text look terrible.
  • Match the number of text arguments to the template's field count.
  • Pick the template that fits the joke structure, not just the topic.
  • Do not generate hateful, abusive, or personally targeted content.
  • The script caches template images in scripts/.cache/ after first download.

Verification

The output is correct if:

  • A .png file was created at the output path
  • Text is legible (white with black outline) on the template
  • The joke lands — caption matches the template's intended structure
  • File can be delivered via MEDIA: path