Local MCP server generating complete App Store & Google Play screenshot sets.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste into ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows)
Truepane is a free, open-source screenshot-set builder for the App Store and Google Play. Compose and localize a complete release visually in the browser, or hand the same project to an AI agent through the bundled MCP server. Try it at truepane.dev.
Everything renders to <canvas> in the browser. Screenshots stay on your machine.
Optional AI helpers send only the text you ask them to process (and, when supplied,
your Groq API key) to the configured Edge Function and model provider. Google Fonts
are also loaded from Google's CDN unless you use a system or uploaded font.

Most screenshot generators composite a pre-rendered PNG of a phone. This one draws the device frame procedurally on a canvas β body, bezel, buttons, camera, and the screen mask are all geometry, not bitmaps. That choice drives most of what makes the tool small, sharp, and cheap to run.
Custom⦠is a parameter
surface rather than a preset: pick a primitive (ring, disc, arc, triangle, bar, blob) and
an arrangement (scatter, grid, row, radial, wave), then tune count, size, spacing,
rotation, stroke weight, and a fade along the strip. It is data, not code β twelve
bounded numbers and two closed enums β so a shared project file stays inert, renders
identically forever, and can be diffed. That makes it the intended surface for
agent-driven variation over MCP: an agent composes a background by filling in numbers
instead of shipping drawing code. Its controls live behind Advanced in the background
panel so the picker stays uncluttered..ttf/.otf/.woff(2) upload.target/locale/NN-name.png paths take priority; conflicts never overwrite silently..truepane-brand.json files and
never contain slides, screenshots, targets, translations, credentials, or history.Each of these was a deliberate fork, chosen for a reason:
src/core/ β platform-neutral project logic shared by the browser and MCP server:
canvas rendering, normalization, composition, output validation, preflight, bulk
import, brand kits, release comparison, and background-image preparation.
src/core/render.ts defines the device frames and paints every pixel.
x + r equal across all three; same for y + r). Breaking it
produces "laddery" corner kinks. New frames go through defineFrame(), which throws
on violation; the shell() helper derives the inner rects so the invariant holds by
construction.mulberry32 PRNG keeps a strip reproducible.destination-in / destination-out (rather
than ctx.clip()) to get antialiased edges.src/App.tsx β editor state, history, hydration, persistence coordination, and web
export paths. src/Sidebar.tsx and src/MobileLayout.tsx provide the desktop
and mobile control surfaces; src/components.tsx contains shared controls and the
canvas preview.src/storage/ β IndexedDB document and content-addressed asset storage, including
migration from the original localStorage format and cleanup of unreferenced binaries.src/Welcome.tsx and src/GuidePage.tsx β the public landing page and
prerendered guide/comparison routes. src/ai.ts is the browser client for the
optional AI style and translation endpoints.server/mcp/ β the Node MCP server and native-canvas adapter. The publishable npm
package metadata lives in packages/truepane-mcp/.supabase/functions/generator-bg-prompt/ β the Edge Function that turns a prompt
into validated, clamped style params (raw model output never reaches the renderer).supabase/functions/generator-translate/ β the optional title/subhead translation
endpoint.The AI prompt feature is optional. Without it, the app is fully functional and the
AI controls are hidden. To enable them, copy .env.example to .env and opt in:
VITE_ENABLE_AI gates both helpers. Configure either endpoint independently; an
unconfigured helper stays hidden. The Edge Functions read GROQ_API_KEY from Supabase
secrets. The background helper also accepts an optional BG_PROMPT_MODEL (default
llama-3.3-70b-versatile). Deploy them with:
Server-side rate limiting is currently best-effort (in-memory, per isolate). Add a durable limiter before a high-traffic public launch.
A soft, client-side password gate can be enabled during private beta by setting
VITE_GATE_PASSWORD_HASH to the SHA-256 of your password (unset = no gate):
It's a deterrent, not real security (it's a static client app) β meant to be removed after beta.
Truepane ships a local MCP server, so an AI agent
(Claude Code, Codex, β¦) can take simulator screenshots and turn them into store-ready
slides without a human driving the browser UI. It renders with a native canvas
(@napi-rs/canvas) β screenshots are read from local paths and PNGs are written to
local paths; nothing is uploaded anywhere, and no configuration or env vars are
needed: the agent is the LLM, so styling and translation are its own judgment calls
(the web app's AI helpers are not involved).
It's a standard stdio MCP server published to npm as
truepane-mcp, so any MCP-capable
client can launch it with npx -y truepane-mcp β no checkout needed. Setup for
the common ones:
Claude Code
Codex CLI
Or configure Codex manually in ~/.codex/config.toml:
Cursor, Windsurf, Claude Desktop, and other JSON-config clients β add to the
client's mcpServers block (e.g. .cursor/mcp.json,
claude_desktop_config.json):
Restart the client, then confirm that the Truepane tools are available.
The server lives in packages/truepane-mcp. To run it
from a repo checkout instead (for development), point the client's command at
npx tsx server/mcp/index.ts, or npm run mcp:build and run
node packages/truepane-mcp/dist/index.js.
list_options β start here to discover the full workflow, platforms (with exact
store pixel sizes), output surfaces, fonts, fills, shapes, and composition presets.create_project β slide titles/subheads + absolute screenshot file paths. Pass
targets to start a multi-platform project.set_style β colors, background, typography (font, titleScale/subtitleScale,
and titleWeight/subtitleWeight from 100β900), chosen with the agent's own
design judgment (suggest_palette_from_screenshot extracts an accent + background
tint from a screenshot with pure local math if a starting point helps). Its
composition patch controls normalized text/device position, size, alignment,
and flat rotation. Use slide_index for a slide-specific composition.set_screenshots β attach each capture with its target and optional language.
A missing target stays visibly empty; Truepane never stretches a capture from a
different platform into it.
For a prepared directory, import_screenshots returns a dry-run mapping by default;
repeat with apply: true, dry_run: false to apply only non-conflicting files.render β writes full-resolution PNGs (e.g. iPhone 6.9β³ = 1320Γ2868) into an
output dir you pass, and returns a small inline preview to inspect. Adjust and
re-render until it looks right. Pass target: "all" for one folder per target.
render summarizes advisory preflight warnings; call validate_project for the
complete ordered target/locale/slide matrix.set_translations β the agent translates the slide texts itself and stores the
results per language; then render with language: "all" writes per-language
subfolders (source/, es/, β¦), matching the web app's all-languages ZIP. A
locale can also carry its own screenshots (for apps whose UI is itself
localized): pass screenshot_path per slide here, or set_screenshots with a
language; a locale without its own screenshot reuses the base one. Each
language can render in its own font too (font here, or set_style with a
language) β e.g. San Francisco for the base and Noto Sans Arabic for ar β
since the server has no per-glyph fallback for scripts a font doesn't cover.export_project / load_project β round-trip v2 project JSON with the web
app's Import/Export Project, so a human can fine-tune the agent's work (or vice
versa).Use span_device_across_slides to place one device across an adjacent slide pair.
The two clipped halves keep their screenshot, position, scale, and rotation linked,
including after project export/import and later screenshot or copy updates.
export_brand_kit and apply_brand_kit move the current visual defaults between
projects without carrying project content. Applying preserves per-slide overrides
unless clear_slide_overrides: true is explicitly supplied.
Use set_output to persist a native, play-feature, or custom output on an MCP
project. render also accepts temporary output_id, output_width,
output_height, and output_frame overrides.
Use compare_release, set_release_baseline, and render changed_only:true for
release updates through MCP. Any future pixel-affecting renderer change must bump
RENDERER_SCHEMA_VERSION in src/core/release.ts, intentionally marking every
asset changed.
Google Fonts are fetched on demand and cached in ~/.cache/truepane/fonts (Inter is
bundled, so offline rendering works out of the box). The -apple-system font renders
as real San Francisco on macOS β from your own installed system font, which is never
bundled or redistributed (Apple's font is proprietary) β and falls back to Inter on
Linux/CI. Because SF is a variable font, its full weight range resolves (including
Heavy/Black via titleWeight/subtitleWeight), not just Regular/Bold. A curated set
of Google fonts β Inter, Manrope, and Fraunces β is loaded as a single-file
variable font too, so their full weight range resolves as well; every other Google
font uses its static faces (typically up to 700). Want another font's full range?
Open an issue or PR adding it to VARIABLE_FONT_URLS in server/mcp/fonts.ts. For
non-Latin target languages,
pick a font that covers the script (Inter covers Cyrillic/Greek; Noto Sans JP/KR/SC
for CJK; Noto Sans Arabic for Arabic, which is shaped and laid out right-to-left
automatically) β unlike browsers, server-side rendering has no per-glyph system-font
fallback, so glyphs a font lacks come out as boxes.
The site builds to dist/ and can be hosted as a static SPA anywhere. This repository is
configured for Cloudflare Workers static assets through wrangler.jsonc; deploy it with:
Set VITE_PUBLIC_SITE_URL at build time for canonical URLs, robots.txt, the sitemap,
and prerendered guide metadata. Set the optional AI variables above only when those
helpers should be exposed.
AGPL-3.0. Because this is a client-side app, the source is distributed to every browser β so forks, including publicly hosted ones, must make their source available under the same license.
The Inter font files bundled with truepane-mcp are distributed under the SIL Open
Font License 1.1; the copyright notice and license travel with them in
server/mcp/assets/fonts/LICENSE-Inter.txt and in the published npm package.
If this is useful to you, sponsorship is welcome β see .github/FUNDING.yml.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/truepane)<a href="https://allmcps.com/mcp/truepane"><img src="https://allmcps.com/api/badge/truepane?style=directory" alt="Truepane on AllMCPs" /></a>