A tiny zero-dependency CLI for generating memes via the free memegen.link API. Agent-friendly.
Project description
meme
A tiny, zero-dependency CLI for generating memes via the free memegen.link API. No API key, no signup, stdlib-only.
Built to be agent-friendly: predictable stdout, a --json mode, and a
bundled Claude Code skill so coding agents (Claude Code, Codex, etc.) can drive
it directly.
meme drake "not reading docs" "reading docs" -o out.png
Install
Requires Python 3.8+. Easiest is uv (installs
the meme command in its own isolated environment):
uv tool install makememe # or: pipx install makememe
Update later with:
uv tool upgrade makememe
Run once without installing anything:
uvx --from makememe meme drake "a" "b"
(If you specifically want pip: python3 -m pip install makememe.)
Check the version anytime:
meme --version
Usage
meme <template> "top line" "bottom line" [-o out.png]
| Flag | Meaning |
|---|---|
-o, --out |
output file (default: a unique file in a temp folder, so it never writes into your current directory) |
--bg URL |
use a custom background image instead of a template |
--ext |
png (default), jpg, webp, or gif |
--style / --font |
template style variant / font override |
--print-url |
print the image URL, don't download |
--json |
machine-readable output (for scripts/agents) |
--list |
list available template ids |
Examples
meme drake "manual deploys" "ci/cd"
meme same "after I sold" "if I held" "same picture"
meme --bg https://example.com/pic.png "_" "DODGED"
meme regret "SOLD @ 620" "NOW 780 (+26%)" --print-url
meme --list
meme --list --json
Text that starts with -
If a caption line begins with - (e.g. "-26%"), put -- before your lines so
it isn't parsed as a flag:
meme regret --json -- "-26%" "WHY"
(Put flags like --json/-o before the --.)
For agents (Claude Code / Codex / scripts)
The tool is designed to be parsed:
-
Plain mode prints only the output path to stdout (status goes to stderr), so
path=$(meme drake "a" "b")just works. -
--jsonmode prints a single JSON object:{ "path": "/tmp/makememe/meme-ab12cd.png", "bytes": 12345, "url": "https://api.memegen.link/..." }
--list --jsonreturns the template catalog as JSON;--print-url --jsonreturns{"url": "..."}; failures return{"error": "...", "url": "..."}with a non-zero exit code.
Typical agent flow:
meme --list --json # discover template ids
meme drake "old way" "new way" --json # generate, capture the path
Claude Code skill
The package bundles a Claude Code skill. After installing, run one command to make Claude Code auto-discover the tool:
meme --install-skill # installs into ~/.claude/skills/meme/ (all projects)
meme --install-skill --project # or into ./.claude/skills/meme/ (this repo only)
Restart Claude Code, then just ask things like "make a drake meme about
writing tests" and it will call meme for you.
(Other agents like Codex don't use this skill format — they discover everything
through meme --help and meme --list, which already works out of the box.)
Robustness
The CLI is built to fail gracefully, never with a raw traceback:
- Network errors, dead hosts, bad template ids (404), oversized text (414), and non-image backgrounds (415) all exit non-zero with a one-line message — and no partial/garbage file is written.
Ctrl-Cexits cleanly (code 130); piping intoheadetc. won't spew aBrokenPipeError.- Arbitrary text — emoji, CJK,
% # & / ? " \, tabs, control chars, 10k-char lines — is escaped safely.
Run the test suite (stdlib only, no network needed):
python -m unittest discover -s tests
How it works
It builds a memegen.link URL from your template + text (handling all the fiddly
path-segment escaping — spaces, _, -, ?, /, %, etc.), downloads the
image, and saves it. That's the whole trick.
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file makememe-0.1.4.tar.gz.
File metadata
- Download URL: makememe-0.1.4.tar.gz
- Upload date:
- Size: 10.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9f935858218ea15f1acba046957a20c0399a33c1542c725a89e13d93db7b5639
|
|
| MD5 |
0416fd50a93d1b4d3ffbf77ca221600f
|
|
| BLAKE2b-256 |
b01db92de2774b4ced6a154bc5a799d688cbee2f387218cdaf3f2fa49a76bf15
|
Provenance
The following attestation bundles were made for makememe-0.1.4.tar.gz:
Publisher:
publish.yml on dhruvmehra/makememe
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
makememe-0.1.4.tar.gz -
Subject digest:
9f935858218ea15f1acba046957a20c0399a33c1542c725a89e13d93db7b5639 - Sigstore transparency entry: 1724177811
- Sigstore integration time:
-
Permalink:
dhruvmehra/makememe@4cd6d218863cecb1d80e98fd93dc009f0332ef99 -
Branch / Tag:
refs/tags/v0.1.4 - Owner: https://github.com/dhruvmehra
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@4cd6d218863cecb1d80e98fd93dc009f0332ef99 -
Trigger Event:
release
-
Statement type:
File details
Details for the file makememe-0.1.4-py3-none-any.whl.
File metadata
- Download URL: makememe-0.1.4-py3-none-any.whl
- Upload date:
- Size: 10.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
62acf8f54b0c548ae659fcf91d64c0fc623b2c5ac9e113118f00060d3906af9a
|
|
| MD5 |
cb4eb6a6f16bf2c919a94ed478e69abe
|
|
| BLAKE2b-256 |
e7b52c684739ed8b160896c8cf83166b8abdda01224e5e210cff0903b4f66b8f
|
Provenance
The following attestation bundles were made for makememe-0.1.4-py3-none-any.whl:
Publisher:
publish.yml on dhruvmehra/makememe
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
makememe-0.1.4-py3-none-any.whl -
Subject digest:
62acf8f54b0c548ae659fcf91d64c0fc623b2c5ac9e113118f00060d3906af9a - Sigstore transparency entry: 1724177872
- Sigstore integration time:
-
Permalink:
dhruvmehra/makememe@4cd6d218863cecb1d80e98fd93dc009f0332ef99 -
Branch / Tag:
refs/tags/v0.1.4 - Owner: https://github.com/dhruvmehra
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@4cd6d218863cecb1d80e98fd93dc009f0332ef99 -
Trigger Event:
release
-
Statement type: