See your email before you send it.

Render HTML emails across real email clients and capture pixel-accurate screenshots — in one API call.

Paste your HTML

…or drop a .eml file onto the box, or .

Coverage

Live clients, not approximations.

We render in the actual email client, never an engine approximation. Gmail, Outlook, and Yahoo Mail are live today — each has its own preview page if you only need one. The rest are landing soon.

Live

The strictest client. Renders in a live, logged-in Gmail session — strips flexbox, grid, position, box-shadow, and animations.

Live

Renders in a live, logged-in Outlook.com web session — its own quirks around positioning, spacing, and transforms.

Live

Renders in a live, logged-in Yahoo Mail session — its own CSS handling, and a tabbed inbox that sorts mail differently.

Apple Mail / iOS
Coming soon

Rendered on a real iOS Simulator over an iPhone/iPad device profile. WebKit engine, true-to-device pixel scale.

Gmail (iOS & Android)
Coming soon

The Gmail mobile apps, where most email is actually opened — real device widths and the mobile app's own rendering quirks.

+ Variants
Email us →

Dark mode, images-disabled, and custom viewport widths. Want a specific client or setup sooner? Get in touch.

Dark mode

Rendered dark. For real.

Clients don’t just dim their chrome in dark mode — they rewrite your email. Backgrounds invert, text gets recolored, logos vanish into the void. We flip the client’s true dark mode and screenshot what it did to your message — not a CSS filter over a light render.

Outlook (Web)
Dark · Live

OWA transforms message content aggressively in dark mode — the client most likely to repaint a design that looked fine in light.

Yahoo Mail (Web)
Dark · Live

Yahoo recolors message backgrounds and text in dark mode, with transforms of its own — passing Outlook’s dark pass doesn’t mean passing Yahoo’s.

Gmail (Web)
Light only

Gmail’s theme is an account setting, and message content renders light either way. A dark Gmail render would be an approximation, so we don’t fake one.

One spec per render — request dark alongside light and compare: { "client": "outlook", "color_scheme": "dark" }. The trial above includes dark automatically for every client that supports it.

The problem

Email is the hardest thing to render right.

Every client strips different CSS. Gmail kills flexbox. Outlook breaks your spacing. Dark mode inverts your logo. An agent writing email HTML is flying blind — there's no way to see the result.

01
No two clients agree

Gmail strips flexbox, grid, position, box-shadow, and animations. Outlook, Yahoo, and Apple Mail each have their own quirks. "Works in my browser" means nothing.

02
Agents can't see

An LLM can write email HTML, but it has no feedback loop. It can't open Gmail, can't check dark mode, can't tell if images got blocked. It guesses — and ships broken email.

03
Testing is manual misery

Humans paste HTML into test tools, eyeball a dozen screenshots, and hunt for what broke. It's slow, repetitive, and exactly the kind of work that should be automated.

How it works

Submit HTML. Get back screenshots.

One request. Every client. Real screenshots.

Post your email HTML to a single endpoint. We render it in parallel across real, logged-in email clients, screenshot each one at the viewport widths you specify, and return images an agent can look at directly.

  • 1
    Submit — POST your HTML with the exact renders you want: client, width, light or dark, images on or blocked.
  • 2
    Render — we deliver to real, logged-in inboxes, then screenshot each render.
  • 3
    Fix — the agent looks at the screenshots, patches the HTML, and re-runs until it’s clean.
submit-preview.sh
# Submit an email for preview
curl -X POST https://api.powerline.ai/v1/jobs \
  -H "Content-Type: application/json" \
  -d '{
    "html": "<html>…</html>",
    "subject": "Welcome aboard",
    "include_previews": true,
    "renders": [
      { "client": "gmail",   "viewport_width": 600 },
      { "client": "outlook", "viewport_width": 600 },
      { "client": "outlook", "viewport_width": 600, "color_scheme": "dark" },
      { "client": "yahoo",   "viewport_width": 600, "images_disabled": true }
    ]
  }'

# → 202 { "job_id": "j_…", "poll_url": "…" }
# poll that until status is "completed"
# include_previews adds the inbox row + subject heading (off by default)
{
  "status": "completed",
  "progress": { "total_renders": 4, "completed_renders": 4 },
  "results": {
    "renders": [{
      "client": "gmail",
      "viewport_width": 600,
      "color_scheme": "light",
      "images_disabled": false,
      "screenshot_url": "…/screenshots/gmail-600-light.png",
      "screenshot_dimensions": { "width": 860, "height": 146 },
      "device_scale_factor": 2,
      "subject_preview": { "screenshot_url": "…-subject.png" },
      "inbox_preview":   { "screenshot_url": "…-inbox.png" },
      "render_duration_ms": 17878
    }],
    // a client that errored appears here, not in renders
    "failed_renders": []
  }
}
People & agents

Five ways to plug in.

However you work — pasting HTML, calling the API, or wiring up an agent — there's a native path in. No glue code required.

Paste HTML

Live

Drop your email HTML into the box above and get a preview on the spot. Nothing to install.

REST API

Live

A clean /v1/jobs JSON API with an OpenAPI spec. Submit, poll, fetch screenshots. Works from any language.

MCP Server

Live

A hosted MCP endpoint at /v1/mcp — point Claude Code, Claude Desktop, Cursor, or any MCP client at it and call four preview tools directly. Nothing to install.

SKILLS.md

Live

A drop-in agent skill doc served at /v1/skills.md — point your agent at it and it knows the whole workflow.

Email it in

Coming soon

Send your email to an inbox and get a preview link back by reply. Works from any mail client, with nothing to wire up.