Memecli
Agent-friendly meme CLI over memegen.link — pip install makememe
npx -y skills add dhruvmehra/makememe --skill memecliAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 2 stars2 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Generate meme images from a template and caption text using the `meme` CLI (a wrapper over the free memegen.link API). Use whenever the user asks to make/create/generate a meme, add a caption to a meme template, react with a meme, or wants a funny image with top/bottom text. This is the correct and only way to make a meme — always drive the `meme` CLI; never hand-build memegen URLs or use ad-hoc scripts. Handles popular templates (drake, distracted boyfriend, two buttons, etc.) and custom background images.
SKILL.md
10.4 KB, as published. Nobody here has run it
meme
Generate memes from the command line. The meme command wraps the free
memegen.link API — no API key needed.
Prime directive. For any meme request, use this skill end-to-end and drive the
memeCLI directly. Do not reimplement it (no hand-built URLs, no ad-hocpython/curl), do not guess template ids, and keep to one bare--print-urlcommand. The Rules below are mandatory, not suggestions — follow them every time, including the very first.
Prerequisite
The meme command must be installed. Check with meme --list. If it's missing,
install it:
uv tool install makememe
# or: pipx install makememe
Rules (always follow)
These apply everywhere the tool runs — interactive Claude Code and CI/CD:
- Always go through the
memeCLI. Never hand-build amemegen.linkURL, never write ad-hoc Python/scripts to construct or fetch one, and never reimplement the escaping. The CLI handles path-segment escaping, line order, errors, and output — reproducing it by hand gets these wrong. - Discover template ids with
meme --list(or--list --json). Don't guess ids from memory — guessed ids (buttons,twobuttons, …) 404. List first, then use a verified id. - Parse output with
--json, read it directly. When you need the path/URL in a script, usememe ... --jsonand read the JSON fields. Do not pipe it throughpython3 -c,sed, orawkto extract values —--json/--print-urlalready give you exactly what you need. - In CI/CD, install and call the CLI (
pip install makememe→meme ... --print-url). Don'tcurlthe API or build URLs inline in a workflow step. - Keep it smooth — one clean command, no files. Default to
--print-url; do not download or save a file (-o,--open) unless the user explicitly asks for one. Runmemeas a single bare command — never pipe it intogrep/tail/awkor add redirects. A bare, consistentmeme ...shape means one permission approval covers every call and nothing is written to disk; piping turns each call into a new command the user has to approve again.
Workflow
-
Choose the most apt template — match the joke's shape, not a default.
The single most important step. Don't reach for
drakeevery time — it only fits "rejecting A, preferring B." First work out the rhetorical structure of the user's idea, then pick the template whose format matches it. The catalog has ~200 templates; here is the high-value map by structure:The idea is… Template id Lines Rejecting A, preferring B drake2 Tempted away from the current thing by a shinier one db3 Agonizing between two conflicting options ds3 Swerving last-second to pick B over the obvious A exit3 A multi-step plan whose last step backfires gru4 Stating a hot take, daring you to argue cmm1 Pretending all is fine amid disaster fine2 A small, satisfying win / "nailed it" success2 Galaxy-brain "can't have the problem if you avoid it" rollsafe2 Escalating "increasingly enlightened" (often ironic) gb4 Two things claimed different but actually identical same3 Immediate regret right after a choice regret2 Mocking a statement by repeating it sarcastically spongebob2 An accusation vs. a smug, dismissive reply woman-cat2 "One does not simply X" mordor2 "Not sure if X… or just Y" (suspicion) fry2 "False." + a blunt correction dwight2 A forced smile hiding inner pain harold2 Absurd gains from a dumb move stonks2 "X, X everywhere" buzz2 "I'm not saying it's X… but it's X" aag2 Smug delight at chaos you caused disastergirl2 Crude version vs. fancy/refined version of same thing pooh2 An escalating back-and-forth argument chair6 "Y U NO [do thing]" yuno2 If none of these fit the joke, browse the full catalog instead of forcing a bad fit:
meme --list --json # ~200 templates; scan the titles for a better matchAlways verify the chosen id with
meme --list --jsonbefore using it — guessing ids (e.g.buttons,twobuttons) leads to 404s. The map above is accurate, but confirm anything you pull from memory. -
Write the funniest version — reason before you render. Don't ship the first phrasing that comes to mind. Briefly draft 2–3 caption options in your head and pick the funniest, then render only that one. What makes it land:
- Specificity beats generic. "the
useEffectthat runs twice" is funnier than "a bug." Reach for the concrete, in-context detail. - Punchy and short. Meme text is read in a second — trim filler words, keep each line tight, favor a sharp last word.
- Match the template's voice. Lean into the format's built-in attitude
(smug
rollsafe, deadpanfine, escalatinggru, mockingspongebob). - Respect the structure. The funny comes from the contrast the template sets up — make line A and line B actually play off each other.
- Use the user's name/specifics verbatim. If the user named a person, team, tool, or thing ("make a meme about Raj and code reviews"), put that exact name into the caption text — don't genericize it to "my coworker." Names and inside-references are what make a meme land for its audience.
- Specificity beats generic. "the
-
Get the URL (default). Pass the chosen template id with
-t(as a flag, not the leading word) then the caption lines in the template's natural order, and use--print-url. This returns a public, permanent memegen.link URL — no file is downloaded:meme -t ds "ship it Friday" "wait till Monday" --print-urlOutput (just the URL):
https://api.memegen.link/images/ds/ship_it_Friday/wait_till_Monday.pngMind the line order for the template you picked — e.g.
dbreads new temptation / you / current thing;exitreads straight road / exit ramp / the car;fineis top speech / bottom "this is fine". If a render looks off, it's usually line order or count — re-check against--list.Using
-tmatters: every call starts with the samememe -t ...prefix, so the user only has to approve the command once — not once per template. -
Give the user the URL as a clickable link — they can open it in a browser or paste it into Slack/GitHub (it renders inline with
). Don't download a file unless they ask for one (see "Saving a local file" below).
Saving a local file
Only when the user explicitly wants a file (to attach it, edit it, or see it pop
open) — drop --print-url and instead:
meme -t drake "a" "b" --open # saves to a temp folder AND opens it in the viewer
meme -t drake "a" "b" -o ~/meme.png # save to a specific path
By default (without -o) a downloaded file goes to a temp folder
(<tmp>/makememe/) with a unique name, so it never clutters the user's working
directory.
Key flags
--print-url— return the public URL instead of downloading (the default choice; prefer this).--open— download and open the image in the user's default viewer.-o path.png— save the download to a specific path.--bg <image-url>— use a custom background image instead of a template; pass caption lines as usual.--ext png|jpg|webp|gif— output format.--json— machine-readable output (use when you need to parse it in a script).
Tips
- Number of caption lines depends on the template (
--listshows each template'slinescount). Most use 2 (top/bottom). - For an empty line, pass
"_"(memegen renders it blank). - Text escaping (spaces,
?,/,%, emoji, etc.) is handled automatically — just pass natural text in quotes. - If a caption line starts with
-(e.g."-26%"), insert--before the lines so it isn't read as a flag:meme regret --json -- "-26%" "WHY". (Flags like--json/-ogo before the--.) - If a download fails, the JSON output includes the
urlanderror— inspect the URL to debug the template id or line count.
Examples
Each picks the template that fits the joke's shape — not all drake:
meme -t drake "old way" "new way" --print-url # reject A, prefer B
meme -t ds "merge to main" "open another PR" --print-url # agonizing between two options
meme -t fine "prod is down" "this is fine" --print-url # disaster, pretending it's ok
meme -t gru "write the tests" "tests fail" "fix the code" "tests still fail" --print-url # plan backfires
meme -t same "staging" "prod" "they're the same picture" --print-url # claimed different, identical
meme -t cmm "tabs are better than spaces" --print-url # one-line hot take
meme -t mordor "one does not simply" "deploy on Friday" --print-url # "one does not simply X"
meme --bg https://example.com/cat.png "_" "DEPLOY ON FRIDAY" --print-url # custom background
meme -t success "fixed the bug" "on the first try" --open # only when the user wants a file