meme-generator

$npx mdskill add vellum-ai/vellum-assistant/meme-generator

Generate memes using 170+ templates with Memegen.link API

  • Solves the task of creating captioned meme images for social media or humor
  • Uses Memegen.link API with no authentication or rate limits
  • Matches user input to template IDs and constructs URLs for specific memes
  • Delivers generated meme images via direct download links

SKILL.md

.github/skills/meme-generatorView on GitHub ↗
---
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:
    category: "content"
    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.

More from vellum-ai/vellum-assistant

SkillDescription
acpSpawn external coding agents via the Agent Client Protocol (ACP)
amazonShop on Amazon and Amazon Fresh through your browser
api-mappingRecord and analyze API surfaces of web services
app-builderBuild and edit small, personal visual tools and artifacts — dashboards, trackers, calculators, data visualizations, charts, simple landing pages, and slide decks the user wants for THEMSELVES. This is the right skill whenever the user asks to "visualize this," "make a chart," or "build an artifact" for their own use, or to edit an app they already built here. Do NOT reach for a ui_show dynamic_page to fake an artifact — build a real persistent app here. NOT for complex, multi-user, or shippable products — those go to a real project folder with a coding agent (see Scope below).
app-controlDrive a specific named macOS app via raw input bypassing the Accessibility tree
assistant-migrationMigrate from ChatGPT, Claude, OpenClaw, Hermes, Manus, and other AI assistants into Vellum by inspecting their data exports, conversation archives, files, prompts, custom instructions, memory, saved memories, tools, GPTs, workflows, integrations, and relationships, then mapping as much as safely possible into Vellum primitives. Handles single-source and multi-source migrations with a unified, deduplicated inventory.
chatgpt-importImport conversation history from ChatGPT into Vellum
cli-discoverDiscover which CLI tools are installed, their versions, and authentication status
computer-useControl the macOS desktop
contactsManage contacts, communication channels, access control, and invite links