Skip to content
Back to skills

Meme Generator

BSecurity

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.

  • 1,380 stars
  • 0 votes
  • 0 copies
  • 4 views
  • Added May 27, 2026
data-aipythongobashreactapi

Works with

  • cli
  • api

Security analysis

B75/100
  • criticalDownloads and executes remote scripts — classic supply chain attack

Pro scans all 2 files and shows the line behind each finding

Scanned May 27, 2026

npx -y skills add vellum-ai/vellum-assistant --skill meme-generator --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Meme Generator?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Meme Generator
[![Security: B — Skills Directory](https://www.skillsdirectory.com/api/skills/vellum-ai-meme-generator/badge)](https://www.skillsdirectory.com/skills/vellum-ai-meme-generator)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: meme-generator
description: 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.
compatibility: "Requires curl and python3. Works on macOS and Linux."
metadata:
  emoji: "🐸"
  author: vellum-ai
  version: "0.1"
  vellum:
    display-name: "Meme Generator"
    activation-hints:
      - "User asks to create or generate a meme"
      - "User wants a meme image for a tweet or social media post"
      - "User mentions a specific meme template (Drake, Distracted Boyfriend, etc.)"
      - "User wants to add humor or images to content"
    avoid-when:
      - "User wants original AI-generated artwork (use image-generation instead)"
      - "User wants photo editing or non-meme image manipulation"
---

## Overview

Generate classic memes using the [Memegen.link](https://api.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:

```bash
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:

| ID                 | Name                      | Lines | Best For                                         |
| ------------------ | ------------------------- | ----- | ------------------------------------------------ |
| `drake`            | Drakeposting              | 2     | "This not that" comparisons                      |
| `db`               | Distracted Boyfriend      | 3     | Three-way tension (boyfriend, girlfriend, other) |
| `fine`             | This is Fine              | 2     | Denial of obvious problems                       |
| `cmm`              | Change My Mind            | 1     | Hot takes, controversial opinions                |
| `astronaut`        | Always Has Been           | 4     | "Wait it was X?" / "Always has been"             |
| `pigeon`           | Is This a Pigeon?         | 2     | Misidentifying something obvious                 |
| `exit`             | Left Exit 12 Off Ramp     | 3     | Choosing the wrong/chaotic option                |
| `gru`              | Gru's Plan                | 4     | Plan that backfires in step 3-4                  |
| `pooh`             | Tuxedo Winnie the Pooh    | 2     | Basic vs. sophisticated version                  |
| `rollsafe`         | Roll Safe                 | 2     | Galaxy-brain "logic"                             |
| `chair`            | American Chopper Argument | 6     | Multi-panel heated debate                        |
| `ds`               | Daily Struggle            | 3     | Two-button dilemma                               |
| `same`             | They're The Same Picture  | 3     | Two things that are identical                    |
| `midwit`           | Midwit                    | 3     | Beginner and expert agree, midwit overthinks     |
| `gb`               | Galaxy Brain              | 4     | Escalating "big brain" ideas                     |
| `right`            | Anakin and Padme          | 3     | "Right...?" meme — dawning realization           |
| `harold`           | Hide the Pain Harold      | 2     | Suffering in silence                             |
| `vince`            | Vince McMahon Reaction    | 4     | Escalating excitement                            |
| `home`             | We Have Food at Home      | 2     | Wanting X, getting budget X                      |
| `panik-kalm-panik` | Panik Kalm Panik          | 3     | Emotional rollercoaster                          |
| `woman-cat`        | Woman Yelling at a Cat    | 2     | Accusation vs. unbothered response               |
| `spiderman`        | Spider-Man Pointing       | 2     | Two identical things                             |

### Generate a Meme

Build the URL and download the image:

```bash
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):

| Character          | Encoding                 | Example              |
| ------------------ | ------------------------ | -------------------- |
| Space              | `_` or `-`               | `hello_world`        |
| Literal underscore | `__`                     | `my__variable`       |
| Literal dash       | `--`                     | `mind--blowing`      |
| Question mark      | `~q`                     | `is_this_real~q`     |
| Exclamation        | `~e`                     | `wow~e`              |
| Hashtag            | `~h`                     | `~hAI`               |
| Ampersand          | `~a`                     | `this_~a_that`       |
| Percent            | `~p`                     | `100~p`              |
| Slash              | `~s`                     | `either~sor`         |
| Newline            | `~n`                     | `line_one~nline_two` |
| Double quote       | `''` (two single quotes) | `he_said_''hi''`     |
| Emoji              | Direct or alias          | `👍` or `:thumbsup:` |

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

```bash
# 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):

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

**Fonts:**

| Font                | ID             | Alias   |
| ------------------- | -------------- | ------- |
| Titillium Web Black | `titilliumweb` | `thick` |
| Kalam Regular       | `kalam`        | `comic` |
| Impact              | `impact`       | —       |
| Noto Sans Bold      | `notosans`     | —       |

```bash
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):

```bash
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:

```bash
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):

```bash
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:

```bash
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:

```bash
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/](scripts/) wraps the API for quick CLI usage:

```bash
# 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:

```bash
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.

Files in this skill

  • SKILL.md10.1 KB
  • scripts/meme6.3 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.