agentsclimarketplace

Memecli

Skill dhruvmehra/makememe/src/memecli

Agent-friendly meme CLI over memegen.link — pip install makememe

Install
npx -y skills add dhruvmehra/makememe --skill memecli

Assembled 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 meme CLI directly. Do not reimplement it (no hand-built URLs, no ad-hoc python/curl), do not guess template ids, and keep to one bare --print-url command. 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:

  1. Always go through the meme CLI. Never hand-build a memegen.link URL, 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.
  2. 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.
  3. Parse output with --json, read it directly. When you need the path/URL in a script, use meme ... --json and read the JSON fields. Do not pipe it through python3 -c, sed, or awk to extract values — --json / --print-url already give you exactly what you need.
  4. In CI/CD, install and call the CLI (pip install makememememe ... --print-url). Don't curl the API or build URLs inline in a workflow step.
  5. 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. Run meme as a single bare command — never pipe it into grep/tail/awk or add redirects. A bare, consistent meme ... 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

  1. Choose the most apt template — match the joke's shape, not a default.

    The single most important step. Don't reach for drake every 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 idLines
    Rejecting A, preferring Bdrake2
    Tempted away from the current thing by a shinier onedb3
    Agonizing between two conflicting optionsds3
    Swerving last-second to pick B over the obvious Aexit3
    A multi-step plan whose last step backfiresgru4
    Stating a hot take, daring you to arguecmm1
    Pretending all is fine amid disasterfine2
    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 identicalsame3
    Immediate regret right after a choiceregret2
    Mocking a statement by repeating it sarcasticallyspongebob2
    An accusation vs. a smug, dismissive replywoman-cat2
    "One does not simply X"mordor2
    "Not sure if X… or just Y" (suspicion)fry2
    "False." + a blunt correctiondwight2
    A forced smile hiding inner painharold2
    Absurd gains from a dumb movestonks2
    "X, X everywhere"buzz2
    "I'm not saying it's X… but it's X"aag2
    Smug delight at chaos you causeddisastergirl2
    Crude version vs. fancy/refined version of same thingpooh2
    An escalating back-and-forth argumentchair6
    "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 match
    

    Always verify the chosen id with meme --list --json before using it — guessing ids (e.g. buttons, twobuttons) leads to 404s. The map above is accurate, but confirm anything you pull from memory.

  2. 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 useEffect that 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, deadpan fine, escalating gru, mocking spongebob).
    • 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.
  3. 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-url
    

    Output (just the URL):

    https://api.memegen.link/images/ds/ship_it_Friday/wait_till_Monday.png
    

    Mind the line order for the template you picked — e.g. db reads new temptation / you / current thing; exit reads straight road / exit ramp / the car; fine is top speech / bottom "this is fine". If a render looks off, it's usually line order or count — re-check against --list.

    Using -t matters: every call starts with the same meme -t ... prefix, so the user only has to approve the command once — not once per template.

  4. 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 ![meme](url)). 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 (--list shows each template's lines count). 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/-o go before the --.)
  • If a download fails, the JSON output includes the url and error — 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

Keep looking

Skills are one crate of 328,083. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.