🐸

Meme Generator

Content

Generate memes from 170+ classic templates using the free Memegen.link API. Search templates, generate captioned images, and download them for posting. No API key required.

Install
assistant skills install meme-generator

compatibility:Requires curl and python3. Works on macOS and Linux.
metadata.author:vellum-ai
metadata.version:0.1

Overview

Generate classic memes using the Memegen.link API — a free, open-source, stateless meme generator. No API key, no auth, no rate limits. Just URLs.

The API has 170+ templates covering all the classics: Drake, Distracted Boyfriend, This is Fine, Change My Mind, Always Has Been, etc.

How It Works

The API is entirely URL-based. Every meme is a deterministic URL:

https://api.memegen.link/images/{template_id}/{top_text}/{bottom_text}.{format}

No POST requests needed for basic generation — just construct the URL and fetch it.

Tools

All operations use bash with curl and python3.

Search Templates

Find a template by keyword:

curl -s "https://api.memegen.link/templates" | python3 - "SEARCH_TERM" <<'PYEOF'
import json, sys
templates = json.load(sys.stdin)
query = sys.argv[1].lower()
matches = [t for t in templates if query in t['name'].lower() or query in t['id'].lower() or any(query in k.lower() for k in t.get('keywords', []))]
for t in matches[:15]:
    print(f"{t['id']:25s} | {t['name']:45s} | {t['lines']} lines | Keywords: {', '.join(t.get('keywords', []))}")
print(f'\n{len(matches)} matches')
PYEOF

Browse Popular Templates

Quick reference for the most Twitter-worthy templates:

IDNameLinesBest For
drakeDrakeposting2"This not that" comparisons
dbDistracted Boyfriend3Three-way tension (boyfriend, girlfriend, other)
fineThis is Fine2Denial of obvious problems
cmmChange My Mind1Hot takes, controversial opinions
astronautAlways Has Been4"Wait it was X?" / "Always has been"
pigeonIs This a Pigeon?2Misidentifying something obvious
exitLeft Exit 12 Off Ramp3Choosing the wrong/chaotic option
gruGru's Plan4Plan that backfires in step 3-4
poohTuxedo Winnie the Pooh2Basic vs. sophisticated version
rollsafeRoll Safe2Galaxy-brain "logic"
chairAmerican Chopper Argument6Multi-panel heated debate
dsDaily Struggle3Two-button dilemma
sameThey're The Same Picture3Two things that are identical
midwitMidwit3Beginner and expert agree, midwit overthinks
gbGalaxy Brain4Escalating "big brain" ideas
rightAnakin and Padme3"Right...?" meme — dawning realization
haroldHide the Pain Harold2Suffering in silence
vinceVince McMahon Reaction4Escalating excitement
homeWe Have Food at Home2Wanting X, getting budget X
panik-kalm-panikPanik Kalm Panik3Emotional rollercoaster
woman-catWoman Yelling at a Cat2Accusation vs. unbothered response
spidermanSpider-Man Pointing2Two identical things

Generate a Meme

Build the URL and download the image:

curl -sL "https://api.memegen.link/images/{template_id}/{line1}/{line2}.{format}" \
  -o /workspace/scratch/meme_{descriptive_name}.png

Text encoding rules (critical — get these right):

CharacterEncodingExample
Space_ or -hello_world
Literal underscore__my__variable
Literal dash--mind--blowing
Question mark~qis_this_real~q
Exclamation~ewow~e
Hashtag~h~hAI
Ampersand~athis_~a_that
Percent~p100~p
Slash~seither~sor
Newline~nline_one~nline_two
Double quote'' (two single quotes)he_said_''hi''
EmojiDirect or alias👍 or :thumbsup:

Multi-line templates: Some templates support 3+ lines. Each line is a path segment:

# 3-line template (e.g., Distracted Boyfriend)
curl -sL "https://api.memegen.link/images/db/{label_on_guy}/{label_on_girlfriend}/{label_on_other_woman}.png" \
  -o /workspace/scratch/meme_db.png

# 4-line template (e.g., Gru's Plan)
curl -sL "https://api.memegen.link/images/gru/{step1}/{step2}/{step3}/{step4}.png" \
  -o /workspace/scratch/meme_gru.png

Blank lines: Use _ (single underscore) for an empty text line. Useful for templates where you only want text on one panel.

Customize Appearance

Dimensions (for Twitter, 1200x675 or similar works well):

curl -sL "https://api.memegen.link/images/drake/top/bottom.png?width=1200" \
  -o /workspace/scratch/meme.png

Fonts:

FontIDAlias
Titillium Web Blacktitilliumwebthick
Kalam Regularkalamcomic
Impactimpact
Noto Sans Boldnotosans
curl -sL "https://api.memegen.link/images/cmm/hot_take.png?font=impact" \
  -o /workspace/scratch/meme.png

Text colors (comma-separated for multiple lines):

curl -sL "https://api.memegen.link/images/drake/top/bottom.png?color=red,blue" \
  -o /workspace/scratch/meme.png

Layout — move text to top only:

curl -sL "https://api.memegen.link/images/rollsafe/big_brain_move.png?layout=top" \
  -o /workspace/scratch/meme.png

Animated formats (GIF/WebP — text animates onto static backgrounds, or animated templates play):

curl -sL "https://api.memegen.link/images/oprah/you_get_a_meme/and_you_get_a_meme.gif" \
  -o /workspace/scratch/meme.gif

Custom Background

Use any image URL as the meme background:

curl -sL "https://api.memegen.link/images/custom/top_text/bottom_text.png?background=https://example.com/photo.jpg" \
  -o /workspace/scratch/meme_custom.png

Image Overlays

Layer an image on top of a template using the style parameter:

curl -sL "https://api.memegen.link/images/pigeon/Engineer/_/Is_this_AI~q.png?style=https://i.imgur.com/example.png" \
  -o /workspace/scratch/meme_overlay.png

Overlay position and scale can be tuned with center=<x>,<y> and scale=<float>.

Workflow: Generating Memes for Tweets

  1. Start with the take. What's the observation, hot take, or joke?
  2. Pick the template. Match the joke structure to the meme format:
    • Comparison/preference → Drake, Pooh
    • Hot take → Change My Mind
    • Misidentification → Pigeon
    • Denial → This is Fine
    • Realization → Always Has Been, Anakin and Padme
    • Escalation → Galaxy Brain, Vince McMahon
    • Dilemma → Daily Struggle, Left Exit
  3. Write tight copy. Meme text should be short — 3-8 words per line max. If you need a sentence, the joke isn't tight enough.
  4. Generate and preview. Download the image, review it visually.
  5. Pair with tweet text. The meme is the hook; the tweet text adds context or lands the punchline.

Workflow: Using the Helper Script

The meme script in scripts/ wraps the API for quick CLI usage:

# Search for templates
meme search dragon

# Generate a meme
meme gen drake "Building from scratch" "Using the free API"

# Generate with custom width
meme gen --width 1200 cmm "Most hot takes are lukewarm"

# List popular templates
meme list

Install it:

cp <skill-dir>/scripts/meme ~/.local/bin/meme && chmod +x ~/.local/bin/meme

Tips

  • Keep text short. The best memes have 3-8 words per line. Long text gets tiny and unreadable.
  • Test encoding. Special characters are the main failure mode. When in doubt, preview the image before sending.
  • Use .png for Twitter. JPG works but PNG is crisper for text. Twitter accepts both.
  • Width 1200 is a good default for Twitter image cards.
  • Blank panels: Use _ for lines you want empty. E.g., images/pigeon/Engineer/_/Is_this_AI~q.png leaves the middle line blank.
  • The API is stateless and free. No caching needed, no API keys, no rate limits to worry about. Generate freely.
CreatorVellum
LicenseMIT
Updated1 month ago
SecurityVerified
View on GitHub

The Personal AI you were promised

GET STARTED