Expo Launch Video

io.github.RudrasamadhiyaPublished by GitHub account Rudrasamadhiyav0.1.2Updated Oct 30, 2026

Record your Expo app on a real phone and edit a 1080p launch video with motion graphics and sound.

Overview

AI-generated overview

Records a live Expo app on a real phone and lets an assistant plan, edit and render a 1080p launch video with captions, motion graphics and sound.

What you can do
  • Inspect and drive the connected app: status, screen outline, layout, screenshots, logs, network, JS eval, reload
  • Act on the app: tap, type, scroll, toggle, navigate, wait, batch steps, dismiss keyboard, press Android hardware keys
  • Capture footage: stills and full-page scroll captures for one or many routes, tap interactions, and short screen recordings
  • Plan and edit the video timeline: auto-plan scenes, adjust duration, speed, captions, zooms, transitions, format and sound
  • Open a browser studio, wait for the user's typed edit requests, reply in its chat, and render the MP4 to a file path
When to use it
Use it when you want a promo or store preview video of an Expo app built from real on-device footage, without a separate screen recorder or video editor. It suits agents already driving the app through expo-mcp-bridge and users who want to refine the cut by dragging or typing prompts.
Requirements
Runs locally via npx with Node.js 20 or newer. Needs an Expo app with expo-mcp-bridge mounted, the phone on the same Wi-Fi as the machine, and Chrome or Edge for MP4 export. Optional ANTHROPIC_API_KEY (or an Anthropic login profile) for free-form studio edits; EXPO_MCP_PORT, LAUNCH_VIDEO_PORT, LAUNCH_VIDEO_DIR, LAUNCH_VIDEO_AI and LAUNCH_VIDEO_MODEL tune ports, output folder and model.
Before you install
ANTHROPIC_API_KEY is optional but, when set, studio prompts and the selected scene are sent to the Claude API and may incur usage costs; leaving it unset routes edits to your agent instead. The app_* tools act on the running app: they tap, type, navigate, reload the bundle and run arbitrary JavaScript inside it, so use a development build and test data. Captures, project files and renders are written to a project folder on disk.

Installation

In SourceWeft

  1. Open Expo Launch Video in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

[expo-launch-video — your AI agent shoots and edits a launch video of your app, live]

[npm version] [CI] [node] [MIT license]

Website · Docs · The studio · Tools reference · Changelog


expo-launch-video lets your AI agent shoot and edit a launch video of your Expo app — live from your phone. Ask Claude Code, Antigravity or Cursor for a video; it records the real app (page loads, scrolling, taps, panels opening), picks the best takes, writes the captions and cuts a polished video with motion graphics, break-out pop-outs and sound. Then it opens a studio where you tweak the result by dragging, or just by typing what you want. Export is a real 1080p MP4, rendered in your browser. No After Effects, no ffmpeg, no screen-recording app.

"Make a 45 second launch video of the app: landing, login, dashboard, the question bank and one exam. Captions should sell the benefits."

Table of contents

Installation

bash
npx expo install expo-mcp-bridge react-native-view-shotnpm install --save-dev expo-launch-videonpx expo-launch-video init

init writes .mcp.json with a launch-video server — it includes every app_* tool from expo-mcp-bridge, so one server does both — plus the directing skill for Claude Code (.claude/skills/launch-video), the same playbook in AGENTS.md for Antigravity, Cursor and others, and a .gitignore entry for the project folder.

Quick start

The one-shot way. Paste this into your agent inside your Expo project:

text
Read https://raw.githubusercontent.com/Rudrasamadhiya/expo-launch-video/main/AI_SETUP.md and set up app control and launch videos in this project.

By hand:

  1. Install the packages and run init (above).

  2. Mount the bridge once in your root layout:

    tsx
    import { Stack, router } from 'expo-router';import { AgentBridge } from 'expo-mcp-bridge';
    export default function RootLayout() {  return (    <>      <Stack />      <AgentBridge router={router} />    </>  );}
  3. Run npx expo start and open the app on your phone (same Wi-Fi).

  4. Restart your agent and ask for a video.

On Windows the MCP config uses "command": "cmd", "args": ["/c", "npx", "expo-launch-video"].

Features

  • Real footage from the phone. Screen recordings at about 10–15 fps captured in-app: page loads and animations on camera, smooth scrolls from full-page captures, taps mid-take.
  • Auto-directed. A director plans timing, zooms into stat rows and buttons, speeds up long scrolls, and writes captions and pop-up chips from the real numbers on screen.
  • Motion graphics. Kinetic typography, glass callouts, light sweeps, accent wipes, and an animated intro and outro with a logo burst and a pulsing call to action.
  • The phone moves. In landscape the phone travels across the frame from scene to scene while the caption sweeps in over it; video_plan alternates sides, video_edit sets side:"left"|"right" per scene.
  • Break-out pop-outs. A tapped card lifts off the phone to center stage; a panel that opens springs out into a side-by-side layout.
  • Sound design. Synthesized pops, clicks, whooshes and chimes timed to every animation, mixed into an AAC track in the MP4.
  • Prompt the studio. "speed up analytics 2x", "text on the right", "zoom into the Start button". Simple edits apply instantly; anything else goes to your agent, which edits the video live.
  • Every format. 16:9 for stores and YouTube, 9:16 for Reels and Shorts, 1:1 for feeds.

How a video gets made

text
1. Shoot    video_record {route:"/dashboard", seconds:8, scroll:true}    live from the phone            video_record {tap:"My Analytics", seconds:6}                  tap → hero / side pop-out2. Plan     video_plan {targetSeconds:45, format:"landscape"}             timing, zooms, captions, chips3. Direct   video_edit [{op:"update", scene:"dashboard", title:"…", side:"right"}]  refine any scene4. Studio   video_studio  →  you drag, trim and type prompts              video_wait_for_prompt / video_reply5. Render   video_render  →  launch-video/out/launch-landscape.mp4

Common questions

How do I make an App Store preview video of my Expo app with AI?

Install this package next to expo-mcp-bridge, run npx expo-launch-video init, open the app on your phone and ask your agent: "Make a 30 second App Store preview, portrait." It records the real app, plans the video and opens a studio; export gives you a 1080p MP4.

Can Claude Code or Cursor make a promo video of my React Native app?

Yes, any MCP agent can. The agent records page loads, scrolls and taps live from the phone, writes captions from the real content on screen, and adds zooms, pop-outs, motion graphics and sound.

Do I need a screen recorder or a video editor?

No. Recording happens inside the app through expo-mcp-bridge, editing happens in a browser studio you can drag or prompt ("speed up analytics 2x"), and the MP4 is rendered in Chrome or Edge.

Which formats can it export?

16:9 for YouTube and websites, 9:16 for App Store and Play Store previews, Reels, Shorts and TikTok, and 1:1 for social feeds.

Tools

In addition to every app_* tool from expo-mcp-bridge. Full parameters are in the tools reference.

ToolDescription
video_recordScreen-record the phone: open the page on camera, hold while it loads, scroll — or tap mid-take
video_captureHigh-resolution stills and full-page scroll captures for one or many routes
video_capture_tapBefore / tap / after stills of an interaction
video_planAuto-plan the whole timeline from the captures
video_editEdit scenes: order, duration, speed, captions, chips, zooms (including timed zooms), pop-outs, transitions, format, caption side, theme, sound
video_timelineThe whole plan in a few lines
video_studioOpen the studio in the browser
video_wait_for_promptWait for what the user types in the studio
video_replyAnswer the user in the studio after an edit
video_renderExport the MP4 and return its path

The studio

A browser editor with live preview, a drag-to-reorder and drag-to-resize timeline, a per-scene inspector (captions, duration, speed, transitions, draw a zoom area, scroll amount), video settings (format, caption side, colors from your app, sound) and a prompt box. It understands common edits on its own:

text
make dashboard 4s · speed up analytics 2x · slow down the 3rd scene · remove pricingmove faq after help · zoom on Log In in login · no zoom on dashboard · scroll mistakes 60%title dashboard: Your day at a glance · fade transition on analytics · portrait · squaretext on the right · make it 30 seconds · cta: Get it on Google Play · color #7c3aed · mute · volume 60%

With ANTHROPIC_API_KEY set (or an ant auth login profile), free-form requests go straight to Claude (claude-opus-5-5); otherwise they go to your agent through video_wait_for_prompt. Prompts carry the scene you have selected, so "fix this" means that scene.

Reopen a project without an agent with npx expo-launch-video studio.

CLI and environment

bash
npx expo-launch-video init      # .mcp.json ("launch-video" server), skills, AGENTS.md, .gitignorenpx expo-launch-video studio    # reopen the studio for ./launch-video (edit, preview, export)npx expo-launch-video           # run the MCP server (your agent starts this for you)npx expo-launch-video --help
VariableDefaultDescription
EXPO_MCP_PORT8347Port the phone connects to (shared with expo-mcp-bridge)
LAUNCH_VIDEO_PORT8790Studio web server (the next free port if taken)
LAUNCH_VIDEO_DIR./launch-videoWhere captures, project.json and renders live
LAUNCH_VIDEO_AIonoff sends studio prompts to your agent instead of the Claude API
LAUNCH_VIDEO_MODELclaude-opus-5-5Model for direct studio edits (needs Anthropic credentials)

Project structure

text
server/       MCP server, director (auto-planning), capture and recording, studio server,              prompt parser, optional Claude editsstudio/       the editor (vanilla JS): renderer, motion graphics, sound design,              MP4 export (Mediabunny / WebCodecs)skill/        the directing playbook installed by initAI_SETUP.md   one-shot setup guide an AI agent can follow

Projects live in launch-video/ inside your app (captures, project.json, renders in out/); init adds the folder to .gitignore.

Troubleshooting

SymptomFix
The render dialog never finishesKeep the studio tab visible; exports use the browser's hardware encoder (Chrome or Edge).
A page capture shows an old screenUpdate both packages — captures use the visible screen view.
Lists are empty in recordingsThe app may need dev environment variables (for example EXPO_PUBLIC_* set only in eas.json); start Metro with them set.
A panel covers later takesClose modals between takes — video_record warns you when one is still open.
Anything elseSee the expo-mcp-bridge troubleshooting table.

Requirements

  • Node.js 20 or newer
  • An Expo app with expo-mcp-bridge mounted
  • Chrome or Edge for export (WebCodecs H.264 + AAC)

Related

Contributing

bash
npm installnpm test

See CONTRIBUTING.md for details.

License

MIT © Rudra Samadhiya

Exports are muxed with Mediabunny (MPL-2.0).

Source: README.md at commit dbe4d25

Tools

27

app_status

Check whether the mobile app is connected and show device info. Call first.

Takes no parameters.

app_snapshot

Compact text outline of the current screen (buttons, inputs, text, lists) with refs like [e3] to act on. Prefer this over screenshots.

ParametersmaxLines

app_layout

Positions (dp, window coordinates) and font sizes of elements on the current screen. For layout checks and visual work; app_snapshot is cheaper for acting.

Parameterslimit

app_screenshot

JPEG screenshot of the app. Use only for visual/layout questions; app_snapshot is cheaper for finding elements. With saveTo, writes the file and returns only its path (no image tokens).

ParametersareasaveToqualitymaxWidthfullScroll

app_batch

Run several actions in one call (fastest way to fill forms or walk a flow). Returns the screen once at the end. Steps: {action:"tap"|"type"|"scroll"|"toggle"|"navigate"|"wait"|"dismiss_keyboard", ...that tool's args}.

Parametersfullstepsrequiredsnapshot

app_tap

Press a button/pressable element. Returns what changed on screen plus any new errors.

ParametersreffulllongtexttestIDsnapshot

app_type

Set text in an input (replaces by default). Target by ref, testID, or placeholder text.

ParametersreffulltextvaluerequiredappendsubmittestIDsnapshot

app_scroll

Scroll a list/ScrollView (first one on screen if no target).

ParametersreffulltextamounttestIDsnapshotdirection

app_toggle

Flip a Switch (or set it with value).

ParametersreffulltextvaluetestIDsnapshot

app_navigate

Open a route (expo-router path like "/settings") or a full deep link.

Parametersfullpathrequiredreplacesnapshot

app_wait

Wait until text or a testID appears (or disappears with gone=true). Cheaper than polling snapshots.

ParametersgonetexttestIDtimeout

app_logs

Console logs and JS errors captured in the app.

Parametersclearlevellimitsincesearch

app_network

HTTP requests made by the app (fetch/XHR) with status, timing and truncated bodies.

ParameterslimitsincebodiessearchfailedOnly

app_eval

Run JavaScript inside the app (dev only) and return the JSON result. Expression or statements with return. `bridge` and `RN` (react-native) are in scope.

Parameterscoderequired

app_reload

Reload the JS bundle (like pressing r in Metro).

Takes no parameters.

app_dismiss_keyboard

Hide the on-screen keyboard.

Takes no parameters.

device_key

Press a hardware/system key on an Android device via adb (USB or Wi-Fi debugging): volume_up, volume_down, mute, back, home, app_switch, enter, tab, delete, power, menu, escape.

Parameterskeyrequiredrepeat

video_capture

Capture app screens for the launch video: screenshot, element positions and the full scroll content. Give routes to capture several screens in one call (in video order), or nothing to capture the current screen.

Parametersnameroutesscroll

video_record

Screen-record the phone for a few seconds (real frames, ~6-12 fps): optionally navigate first, scroll smoothly, or tap an element mid-way. The clip plays in the video as a live recording.

ParameterstapnameroutetapAtscrollsecondsliveLoadscrollFrom

video_capture_tap

Capture an interaction: the current screen, a tap on an element (animated finger + ripple in the video) and the screen it leads to.

ParametersrefnametexttestID

video_plan

Build the video timeline from all captured screens: intro, one scene per screen with automatic timing, zooms, scroll speed-ups and captions, then an outro. Replaces the current timeline.

ParametersctaformatappNametaglinetargetSeconds

video_timeline

Show the current video timeline (compact).

Takes no parameters.

video_edit

Edit the timeline. ops is a list of: {op:"update", scene, duration?, speed?, title?, subtitle?, transition?("slide"|"fade"|"zoom"|"rise"|"none"), focus?(element label | {x,y,w,h} dp | null), zoom?(1-3), zoomTimes?([inStart,inEnd,outStart,outEnd] recording seconds, for recordings), scroll?(0-1 | false), callouts?, popouts?} {op:"move", scene, to(number|"first"|"last") | before | after} · {op:"remove", scene} · {op:"add", asset, at?} · {op:"drop", asset} (discard a bad capture) {op:"settings", format?, appName?, tagline?, cta?, captionSide?("left"|"right"), sound?{sfx: bool, volume: 0-1}, theme?{accent, bg:[c1,c2]}} · {op:"plan", targetSeconds?} scene = id ("s3"), 1-based position, or a screen name/route ("dashboard").

Parametersopsrequired

video_studio

Open the studio in the browser: live preview, timeline, per-scene controls and a prompt box where the user can type edits.

Parametersopen

video_render

Render the video to MP4 (in the studio tab, opening it if needed) and return the file path.

Takes no parameters.

video_wait_for_prompt

Wait for the user to type an edit request in the studio prompt box (ones the studio could not apply itself). Apply it with video_edit, answer with video_reply, then call this again to keep collaborating.

ParameterstimeoutSeconds

video_reply

Show a short message to the user in the studio chat.

Parameterstextrequired

Version history

1
  1. v0.1.2LatestOct 21, 2026

Score

90% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts
  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts