Store screenshots, captured from your CI.

One screenstack.yml captures every screen and UI element on web, Flutter, iOS, Android and React Native, then fills your layouts.

Two App Store screenshots composed by ScreenStack from real captures of this site: the Free and Studio pricing cards float over the pricing screen, and the captures of this page from one CI run float over the editor.

Real captures in. Store-ready sets out.

Every store size from one layout

Design the showcase once. iPhone, iPad and Play Store sizes all render from the same design.

1290 × 27962048 × 27321080 × 1920

Light, dark, every locale

Each run covers devices, locales and appearance, so a German dark-mode set is never a manual job.

en-USde-DEja-JPlightdark

Test users stay out of git

Reference a secret. The CLI swaps it for short-lived credentials at run time.

testUser: { secretRef: ssr_abc }

Marketing pages that update themselves

The web runner captures your live site and dashboard at every viewport, so the previews on your homepage match what shipped.

ScreenStack home page captured at 1440 by 900 by @voostack/screenstack-sdk
screenstack.yml

One file. Five platforms.

The same schema drives the web, Flutter, iOS, Android and React Native runners. Pick yours.

screenstack.yml Web
version: 2
project: prj_123
testUser: { secretRef: ssr_abc }
locales: [en-US]
appearance: [light, dark]
platforms:
  web:
    baseUrl: http://localhost:4173
    start: { command: npm run preview }
    browsers: [chromium]
    devices: [desktop-1440, iphone-16-pro]
    login: { url: /login, waitFor: "[data-app-ready]" }
screens:
  - id: home
    route: /
    auth: none
    waitFor: "main h1"
  - id: dashboard
    route: /app
    waitFor: "[data-screen=dashboard]"
    elements:
      - { id: revenue-card, web: "[data-ss=revenue]", padding: 16 }
npx @voostack/screenstack-sdk run
  1. Describe screens and elements

    Routes or deep links for each screen, plus the cards and rows you want as separate layers.

  2. Run one command in CI

    The SDK captures every device, locale and appearance, then uploads the run to your project.

  3. Canvases fill themselves

    Bound slots pick up the new captures, so the next export already shows what you shipped.

Capture one card. Float it anywhere.

Name an element by selector, Flutter key or test id. It comes back as a transparent layer and drops into the matching slot of every showcase.

Capture the screen
The Welcome back sign-in card, captured as a transparent layer by @voostack/screenstack-sdk
Cut out [data-ss=auth-form]
Compose the showcase

Ask Claude what changed. Then ship it.

The ScreenStack MCP server lets Claude read your capture runs, fix captions and upload exports to both stores, after you approve.

ScreenStack for Claude
Claude Code
claude mcp add --transport http --scope user screenstack https://api.screenstack.voostack.com/mcp

Start free. Upgrade when the team does.

Every store size is on the free plan. Studio adds web capture, scheduled runs and team seats.