Metzpapa

Memewright

Community Metzpapa
Updated

The open-source meme engine for AI agents. Template + captions in, a correctly typeset meme out. CLI, MCP server, or three lines of code.

Memewright

The open-source meme engine for AI agents.

Give it a template and a caption for each box. It renders a clean, correctlytypeset image-macro — right font, proper outline, text that wraps and shrinks tofit. Drive it from a CLI, an MCP server, or three lines of code.

Memes are one of the highest-performing formats in marketing, and agents canwrite the jokes. They just can't render them. Memewright is the missing hands.

Why this exists

Ask an AI agent to "make a meme" and it hits a wall: it can write a killercaption, but it can't place text in the right spot, in the right font, outlinedso it's legible, wrapped so it fits. So agents fall back to describing a meme inwords, or generating a warped image where the text is gibberish.

Memewright is the rendering layer. The agent decides what the joke is; Memewrighthandles how it looks — pixel-correct, every time. The hard part is not drawingtext on an image. It's the typesetting: fitting an unknown-length caption into afixed box, wrapping it, and shrinking the font until it sits perfectly. That'swhat Memewright does, on a library of templates that each know what they mean.

Quick start

# no install needed
npx memewright list
npx memewright make waiting-skeleton \
  --top "me waiting for the cleaner to flag the damage" \
  --bottom "before the next guest checks in" \
  -o meme.png

That's a finished, shareable PNG. No watermark, no dragging text boxes.

Use it from an AI agent (MCP)

Memewright ships an MCP server so any agent(Claude, Cursor, your own) can make memes as tool calls:

// add to your MCP client config
{
  "mcpServers": {
    "memewright": { "command": "npx", "args": ["memewright-mcp"] }
  }
}

The agent gets three tools:

Tool What it does
list_templates Every template, its box ids, and what the meme means
get_template One template's boxes + when-to-use guidance
render_meme Render captions into a template; returns the PNG

The workflow an agent follows: list_templates to find a template that fits thejoke → get_template to see the box ids → render_meme with a caption per box.The "meaning" metadata is what lets an agent pick the right template instead offorcing every joke into top/bottom text.

Use it from code

import { makeMeme } from 'memewright';
import fs from 'node:fs';

const { buffer } = await makeMeme('drake-hotline-bling', {
  reject: 'driving to every unit to inspect it',
  approve: 'reading the AI report from your phone',
});
fs.writeFileSync('drake.png', buffer);

The template library (the moat)

Every template carries structured metadata, not just an image:

{
  "name": "Woman Yelling at Cat",
  "meaning": "A furious accusation (left) met with total, smug indifference (right).",
  "when_to_use": "woman = the angry complaint; cat = the unbothered reply.",
  "boxes": [
    { "id": "woman", "x": 0.02, "y": 0.03, "w": 0.46, "h": 0.22 },
    { "id": "cat",   "x": 0.52, "y": 0.03, "w": 0.46, "h": 0.22 }
  ]
}

Box coordinates are fractions of the image, so a template renders identically atany resolution. The meaning and when_to_use fields are the real product: theyturn a folder of images into something an agent can reason about.

16 templates today. The roadmap is a larger, richer library plus trendingmeme data — the formats that are hot this week, which is what makes mememarketing actually land.

How the text fitting works

For each caption, Memewright finds the largest font size at which the text both wrapsinside the box width and fits the box height, shrinking the font (andhard-wrapping over-long words) until it does. White fill, black outline, all-capsby default — the image-macro standard — with per-box overrides for panels thatneed dark text on light backgrounds (Drake, Expanding Brain, UNO).

Fonts: Memewright bundles Anton (SIL OpenFont License), the open substitute for Impact, so the package is legallyself-contained. Have Impact and prefer it? Register it and pass { font: "Impact" }.

Self-host / hosted

Memewright is AGPL-3.0 and fully self-hostable — the CLI, the MCP server, and thelibrary are the whole thing; run them anywhere Node runs. A hosted cloud (webeditor, brand kits, auto-posting, the trending-meme database) is the plannedcommercial layer, but the engine is and stays open source.

License

AGPL-3.0-or-later. Bundled font: Anton, SIL OFL (seeassets/fonts/OFL.txt).

MCP Server · Populars

MCP Server · New

    healthchainai

    healthchain

    Python SDK for healthcare AI — typed, validated FHIR tools for agents, real-time EHR connectivity, production deployment ✨ 🏥

    Community healthchainai
    deverman

    FocusRelay — Fast Swift OmniFocus MCP Server and CLI for macOS

    Fast native Swift OmniFocus MCP server and CLI for macOS. Let AI assistants safely read, update, complete, and organize tasks and projects through documented Omni Automation APIs.

    Community deverman
    Glade-tool

    GladeKit MCP

    Connect any MCP-compatible AI client (Claude Code, Cursor, Windsurf) to Unity or Godot. 235+ granular tools, an editor aware system prompt, game design document project context, script semantic search, and skill calibration.

    Community Glade-tool
    Consiliency

    Code-Index-MCP

    Code indexing MCP server to provide context to coding agents.

    Community Consiliency
    semihbugrasezer

    seerxo

    AI-powered Etsy product listing generator for Claude Desktop Generate perfect SEO titles, descriptions, and tags in seconds

    Community semihbugrasezer