Canva for your agent

Design engine for AI agents.

A free MCP server for Claude Code, Cursor and Codex. Your agent describes a social post, ad or banner once; keyline renders it as images and video at every size, with real text in your fonts and colors, the same every run.

Free · Fair Source · Latest release

Claude · keyline

Make a listing ad for Villa Lefka in Oia: an Instagram post, a Facebook banner and a skyscraper. Give the photo a slow zoom.

  1. keyline scene_create portrait, banner, sky · 8s loop sa41c9e07d v0
  2. keyline asset_add the villa photo villa 2400×1600 v1
  3. keyline layer_add photo, scrim, price chip, copy added photo,scrim,chip,copy v2 ok
  4. keyline render mp4 3 files · 8s, 200 frames each

Done: three sizes from one layout, all checks clean. The photo zooms toward the tower and back, and the loop runs every 8 seconds.

Post · 1080×1350
Banner · 1200×628
Skyscraper · 300×600

What it does

Everything an agent needs to ship a campaign, and nothing it has to guess.

Every size from one layout

Stacks, grids and constraints adapt one design to a post, a banner and a skyscraper ad, and any size can be tweaked on its own.

Checks before pixels

The server measures text, overflow, contrast and safe areas, and say where every layer landed and which part of each photo shows, so the agent verifies with numbers instead of screenshots.

Motion and video

Entrance effects, keyframes, staggered text and video clips, rendered as GIF, animated PNG, MP4 or WebM.

No browser

One native Rust binary on Skia. No headless Chrome, Puppeteer or Playwright to install, run or patch.

The same scene, the same design

No model generates pixels: a scene always renders the same way, on every machine.

Built for tokens

Six tools, batched edits and terse replies, so the agent spends its tokens on the design, not on reading the scene.

keyline vs headless Chrome and Playwright

We gave Claude two briefs, a conference speaker card and a vote-by-mail flyer with a photo, each at three sizes, and three ways to make them: keyline, HTML screenshotted by headless Chrome, or a browser driven through Playwright MCP. keyline used fewer tokens on both, and was correct as often. Here's what the speaker card took.

2× fewer tokens than headless Chrome, 6× fewer than Playwright MCP.

The speaker card made with keyline: portrait, name, talk title and a Get tickets button
keyline
The same speaker card made with HTML and headless Chrome
Headless Chrome

Each card is one correct run near its arm's median tokens. The model designs each run afresh, so layout and touches like the "Keynote" label differ from run to run in every arm; the tool doesn't add them.

Speaker card, median of 5 runs each, Claude Opus 5, October 2026. Correct: keyline and Playwright MCP 5 of 5, headless Chrome 4 of 5
Tokenskeyline: 144kHeadless Chrome: 505kPlaywright MCP: 1,053k
Model requestskeyline: 10Headless Chrome: 22Playwright MCP: 38
Timekeyline: 1.7 minHeadless Chrome: 4.4 minPlaywright MCP: 3.6 min
Images looked atkeyline: 4Headless Chrome: 9Playwright MCP: 7

Every run, with its prompt and the judge's scores, is in the benchmark.

How it works

The agent works in a small JSON scene. keyline measures it and says what's wrong, so the agent fixes the design before anyone looks at pixels.

  1. 1 The agent writes a scene

    Text, images, shapes, layout and motion, in names models already know from CSS and Figma.

    {"id": "headline",
     "type": "text",
     "text": "Cold Brew Season",
     "fontSize": 168,
     "fontWeight": 900,
     "textWrap": "balance",
     "media": {"banner":
       {"fontSize": 104}}}
  2. 2 keyline checks it

    Every edit replies with what doesn't fit, per size: cut text, overflow, low contrast, text under a platform's buttons.

    changed headline v4
    story headline text
      96,1110 888×290 168px 2L
    banner sub text
      60,372 470×62 26px
      !truncated needs 470×96
  3. 3 and renders every size

    PNG, JPEG, WebP, PDF, animated PNG, GIF, MP4 or WebM, with the layout as drawn: every layer's box and the part of each photo that shows.

    banner …/banner-v0.png
      (1200×628, 931 KB)
     photo image 0,0 1200×628
      cover shows 2400×1256
      from 0,155 of 2400×1600
     name text 48,228 525×99 99px
     empty y 423–628 (33%)

Questions

What is keyline?

keyline is a free, source-available MCP server that lets AI agents (Claude Code, Cursor, Codex, VS Code) design social posts, display ads, banners, flyers and video at every size from one JSON scene. It measures text fit and overflow before rendering, and renders with Skia instead of a headless browser.

How is it different from Puppeteer or Playwright screenshots?

There's no browser to install, run or patch: keyline is one native binary. It measures text fit, overflow and contrast itself, so the agent fixes a layout without taking screenshots. In our benchmark, on two tasks, an agent used 2× fewer tokens than with HTML and headless Chrome, and 6× fewer than with Playwright MCP.

How is it different from Bannerbear or Placid?

keyline runs on your machine or in CI, for free, with no hosted templates and no API key. The agent writes the design itself, as a JSON scene, instead of filling in a template someone made in a web editor.

Does it generate images with AI?

No. keyline renders deterministically: the agent writes the scene, and the same scene always renders the same pixels. Photos and logos are your own files.

How do I install keyline in Cursor?

Install the binary (brew install keyline-dev/tap/keyline-mcp, or a release download), then add { "mcpServers": { "keyline": { "command": "keyline-mcp" } } } to ~/.cursor/mcp.json. The install guide has every other client.

Is it free?

Yes. keyline is free to use, change and share, commercially too, under the Functional Source License (FSL-1.1-ALv2). The one thing it doesn't allow is offering keyline itself as a competing commercial product or service. Each release also becomes Apache-2.0 two years after it ships.

Install

macOS, Windows and Linux. Every download is checksummed and built by GitHub Actions.

The plugin installs everything, downloading keyline if it isn't on your PATH.

/plugin marketplace add keyline-dev/keyline
/plugin install keyline@keyline