Distinct from quote-card-maker:
- Two text blocks (top + bottom), not one quote + attribution
- Impact-font bold-with-stroke typography (the universal meme look)
- Often references a known meme template (drake, distracted-boyfriend, expanding-brain)
- Aesthetic: meme template, NOT editorial — uglier is often funnier
Distinct from flyer-maker / cover-maker:
- No event details, no creator metadata
- Different aesthetic vocabulary (Impact font, stroke outline, low-fidelity feel)
- Often references specific cultural meme formats
This skill does NOT:
- Generate animated GIF memes — use
gif-maker separately
- Watermark / credit the original meme template creator — that's your responsibility
- Verify cultural appropriateness — your judgment
- Translate meme captions — pass in target language
- Place text at PIXEL-perfect template positions — model approximates
ROLE
Read top text + bottom text + optional template hint + optional base photo → pick visual-integration-strong model → assemble prompt cueing Impact-style typography with stroke, meme aesthetic → batch execute → save PNGs.
PIPELINE
Resolve text:
--top "<text>" — top caption (≤8 words, ALL CAPS rendered)
--bottom "<text>" — bottom caption (≤8 words, ALL CAPS rendered)
- At least one of top / bottom required
Resolve template (optional):
--template drake|distracted-boyfriend|expanding-brain|two-buttons|change-my-mind|custom
drake: 2-panel "rejects / approves"
distracted-boyfriend: 3-character composition
expanding-brain: 4-panel ascending
two-buttons: sweaty decision
change-my-mind: seated man with sign
custom: just the captions on whatever centerpiece the model generates
- Default:
custom
Resolve base photo (optional):
--base-photo <path-or-url> — use user image as centerpiece
- Implies
--template custom (template hints are ignored when base photo is provided)
Pick model:
- With
--base-photo: nano-banana-pro (preserves visual, adds caption layer)
- Template-based:
gpt-image-2 (best at illustration + text rendering)
- Override:
--model <slug>
Compose ONE LLM call — load common/visual-prompt-library/system-prompt.md (shared SYSTEM_PROMPT) and buildUserMessage(opts) with Mode=meme-card, N=<variants>, top + bottom captions + template + optional base photo. Spawn ONE Agent. Receives JSON {"slides":[{"number":1,"prompt":"..."}]} — 1–3 sentence prompts with template-specific composition + Impact-style typography cues + meme aesthetic ("white text with thick black stroke, all caps, low-fidelity, slight JPEG artifacts"). Captions in double quotes. See references/templates.md for template composition. Library styles via common/visual-prompt-library/styles/_index.md.
Estimate cost + confirm — inherits SKILLS_CAROUSEL_BUDGET=1.50.
Batch execute — common.runners.batch.run_batch().
Output:
./generated/meme/<slug>/
meme-v1.png
meme-v2.png
manifest.json
prompts.md
MODES
Required
meme-card-maker --top "<text>" (top) OR --bottom "<text>" (bottom; at least one required)
Optional content
--template drake|distracted-boyfriend|expanding-brain|two-buttons|change-my-mind|custom
--base-photo <path-or-url> — user image as centerpiece
--context "<note>" — situational context to help the model interpret captions
--lang en|ru — language hint (default: en)
Visual
--variants N — variants (default 3)
--model auto|<slug> — image provider
--style-mod "<override>" — append tweak (e.g., "extra pixelated, deepfried meme aesthetic")
--aspect square|portrait|landscape — composition aspect (default square 1080×1080)
Execution
--execute — actually generate
--output <dir> — custom output
--parallelism N — concurrent calls (default 2)
--yes — skip cost confirmation
--resume — retry failed
--prompts-only — dry run
REFERENCES (load on demand)
| File |
When to load |
| references/templates.md |
Step 2 — meme template anatomy, composition cues per template |
| references/typography.md |
Step 5 — Impact font conventions, stroke outline rules, when to deviate |
| references/troubleshoot.md |
When text doesn't read, template doesn't recognize, etc. |
EXAMPLES
See examples/before-after.md — 3 calibration runs: drake template developer joke, custom photo meme, expanding-brain progression.
CONSTRAINTS
Captions ≤8 words each. Past 8, text overflows; Impact-style bold needs space.
ALL CAPS rendering. All meme captions auto-uppercase. If you pass lowercase, it's rendered uppercase. Exception: --lang ru keeps mixed case for Cyrillic readability (Cyrillic ALL CAPS is harder to read).
Default model is gpt-image-2. Best at illustration + integrated text. nano-banana-pro when base photo is provided.
Template recognition is approximate. "Drake" template is approximated by the model — won't be pixel-identical to the original. For exact template: use a meme generator tool (Imgflip, Memegenerator).
Cultural sensitivity is YOUR responsibility. The skill doesn't filter. Don't ship punchy memes about sensitive topics without consideration.
Generated memes can resemble copyrighted templates. Original meme creators rarely enforce, but for commercial use: check the template's original source.
Cost confirm ONCE per batch. Sum across variants.
Aspect default is square. Most platforms display memes 1:1 well. --aspect portrait for IG portrait posts; --aspect landscape for Twitter inline.
Never print API keys. Mask in errors.
INVOCATION HINTS
When the user says any of:
- "make a meme", "meme for X", "meme template Y"
- "drake meme", "expanding brain meme", "distracted boyfriend"
- "сделай мем про X", "мем формат Y"
- "сгенерируй мем"
If the user names a template explicitly, set --template <name>. If unclear, default --template custom (lets the model interpret).
If the user pastes a photo path: --base-photo <path> + --template custom.
Defaults: --variants 3 --aspect square --template custom --model gpt-image-2. Without --execute, returns prompts.
This skill is distinct from:
quote-card-maker — text-dominant editorial cards (single quote + attribution)
image-prompt — free-form image gen (no meme conventions)
gif-maker — animated content (memes here are static)
flyer-maker / cover-maker — structured professional formats
1---2name: meme-card-maker3description: Meme-format graphic generator — top + bottom text + optional centerpiece image. Impact-style bold typography. 5 templates: drake, distracted-boyfriend, expanding-brain, two-buttons, custom. Optional --base-photo. Default gpt-image-2. Use when: 'meme', 'meme template', 'meme image', 'мем', 'сделай мем'.4license: MIT5---67<objective>8Meme-format graphic generator. Input: top text + bottom text + optional centerpiece (template or user photo). Output: classic meme-aesthetic image with Impact-style typography.910Distinct from `quote-card-maker`:11- Two text blocks (top + bottom), not one quote + attribution12- Impact-font bold-with-stroke typography (the universal meme look)13- Often references a known meme template (drake, distracted-boyfriend, expanding-brain)14- Aesthetic: meme template, NOT editorial — uglier is often funnier1516Distinct from `flyer-maker` / `cover-maker`:17- No event details, no creator metadata18- Different aesthetic vocabulary (Impact font, stroke outline, low-fidelity feel)19- Often references specific cultural meme formats2021This skill does NOT:22- Generate animated GIF memes — use `gif-maker` separately23- Watermark / credit the original meme template creator — that's your responsibility24- Verify cultural appropriateness — your judgment25- Translate meme captions — pass in target language26- Place text at PIXEL-perfect template positions — model approximates27</objective>2829## ROLE3031Read top text + bottom text + optional template hint + optional base photo → pick visual-integration-strong model → assemble prompt cueing Impact-style typography with stroke, meme aesthetic → batch execute → save PNGs.3233## PIPELINE34351. **Resolve text**:36 - `--top "<text>"` — top caption (≤8 words, ALL CAPS rendered)37 - `--bottom "<text>"` — bottom caption (≤8 words, ALL CAPS rendered)38 - At least one of top / bottom required39402. **Resolve template** (optional):41 - `--template drake|distracted-boyfriend|expanding-brain|two-buttons|change-my-mind|custom`42 - `drake`: 2-panel "rejects / approves"43 - `distracted-boyfriend`: 3-character composition44 - `expanding-brain`: 4-panel ascending45 - `two-buttons`: sweaty decision46 - `change-my-mind`: seated man with sign47 - `custom`: just the captions on whatever centerpiece the model generates48 - Default: `custom`49503. **Resolve base photo** (optional):51 - `--base-photo <path-or-url>` — use user image as centerpiece52 - Implies `--template custom` (template hints are ignored when base photo is provided)53544. **Pick model**:55 - With `--base-photo`: `nano-banana-pro` (preserves visual, adds caption layer)56 - Template-based: `gpt-image-2` (best at illustration + text rendering)57 - Override: `--model <slug>`58595. **Compose ONE LLM call** — load [`common/visual-prompt-library/system-prompt.md`](../../common/visual-prompt-library/system-prompt.md) (shared SYSTEM_PROMPT) and `buildUserMessage(opts)` with `Mode=meme-card`, `N=<variants>`, top + bottom captions + template + optional base photo. Spawn ONE Agent. Receives JSON `{"slides":[{"number":1,"prompt":"..."}]}` — 1–3 sentence prompts with template-specific composition + Impact-style typography cues + meme aesthetic ("white text with thick black stroke, all caps, low-fidelity, slight JPEG artifacts"). Captions in double quotes. See `references/templates.md` for template composition. Library styles via [`common/visual-prompt-library/styles/_index.md`](../../common/visual-prompt-library/styles/_index.md).60616. **Estimate cost + confirm** — inherits `SKILLS_CAROUSEL_BUDGET=1.50`.62637. **Batch execute** — `common.runners.batch.run_batch()`.64658. **Output**:66 ```67 ./generated/meme/<slug>/68 meme-v1.png69 meme-v2.png70 manifest.json71 prompts.md72 ```7374## MODES7576### Required7778- `meme-card-maker --top "<text>"` (top) OR `--bottom "<text>"` (bottom; at least one required)7980### Optional content8182- `--template drake|distracted-boyfriend|expanding-brain|two-buttons|change-my-mind|custom`83- `--base-photo <path-or-url>` — user image as centerpiece84- `--context "<note>"` — situational context to help the model interpret captions85- `--lang en|ru` — language hint (default: en)8687### Visual8889- `--variants N` — variants (default 3)90- `--model auto|<slug>` — image provider91- `--style-mod "<override>"` — append tweak (e.g., "extra pixelated, deepfried meme aesthetic")92- `--aspect square|portrait|landscape` — composition aspect (default `square` 1080×1080)9394### Execution9596- `--execute` — actually generate97- `--output <dir>` — custom output98- `--parallelism N` — concurrent calls (default 2)99- `--yes` — skip cost confirmation100- `--resume` — retry failed101- `--prompts-only` — dry run102103## REFERENCES (load on demand)104105| File | When to load |106|---|---|107| [references/templates.md](references/templates.md) | Step 2 — meme template anatomy, composition cues per template |108| [references/typography.md](references/typography.md) | Step 5 — Impact font conventions, stroke outline rules, when to deviate |109| [references/troubleshoot.md](references/troubleshoot.md) | When text doesn't read, template doesn't recognize, etc. |110111## EXAMPLES112113See [examples/before-after.md](examples/before-after.md) — 3 calibration runs: drake template developer joke, custom photo meme, expanding-brain progression.114115## CONSTRAINTS116117- **Captions ≤8 words each.** Past 8, text overflows; Impact-style bold needs space.118119- **ALL CAPS rendering.** All meme captions auto-uppercase. If you pass lowercase, it's rendered uppercase. Exception: `--lang ru` keeps mixed case for Cyrillic readability (Cyrillic ALL CAPS is harder to read).120121- **Default model is `gpt-image-2`.** Best at illustration + integrated text. `nano-banana-pro` when base photo is provided.122123- **Template recognition is approximate.** "Drake" template is approximated by the model — won't be pixel-identical to the original. For exact template: use a meme generator tool (Imgflip, Memegenerator).124125- **Cultural sensitivity is YOUR responsibility.** The skill doesn't filter. Don't ship punchy memes about sensitive topics without consideration.126127- **Generated memes can resemble copyrighted templates.** Original meme creators rarely enforce, but for commercial use: check the template's original source.128129- **Cost confirm ONCE per batch.** Sum across variants.130131- **Aspect default is square.** Most platforms display memes 1:1 well. `--aspect portrait` for IG portrait posts; `--aspect landscape` for Twitter inline.132133- **Never print API keys.** Mask in errors.134135## INVOCATION HINTS136137When the user says any of:138139- "make a meme", "meme for X", "meme template Y"140- "drake meme", "expanding brain meme", "distracted boyfriend"141- "сделай мем про X", "мем формат Y"142- "сгенерируй мем"143144If the user names a template explicitly, set `--template <name>`. If unclear, default `--template custom` (lets the model interpret).145146If the user pastes a photo path: `--base-photo <path>` + `--template custom`.147148Defaults: `--variants 3 --aspect square --template custom --model gpt-image-2`. Without `--execute`, returns prompts.149150This skill is distinct from:151- `quote-card-maker` — text-dominant editorial cards (single quote + attribution)152- `image-prompt` — free-form image gen (no meme conventions)153- `gif-maker` — animated content (memes here are static)154- `flyer-maker` / `cover-maker` — structured professional formats