Builds an App Store App Preview video (and a Play Store or landing page promo cut) from a screen recording of the app, using the open-screenshot-generator CLI (osg video): it starts from one of 20…
Install the "app-preview-video" agent skill from https://github.com/dotnetdreamer/open-screenshot-generator/tree/main/skills/app-preview-video into .claude/skills/app-preview-video/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "app-preview-video", then confirm the skill loads.
Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
Type this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
skills CLI
$ npx skills add dotnetdreamer/open-screenshot-generator --skill app-preview-video -a codex
Project install goes to .agents/skills/; add -g for ~/.codex/skills/.
Install the "app-preview-video" agent skill from https://github.com/dotnetdreamer/open-screenshot-generator/tree/main/skills/app-preview-video into .agents/skills/app-preview-video/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "app-preview-video", then confirm the skill loads.
Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
skills CLI
$ npx skills add dotnetdreamer/open-screenshot-generator --skill app-preview-video -a cursor
Project install goes to .agents/skills/; add -g for ~/.cursor/skills/.
Install the "app-preview-video" agent skill from https://github.com/dotnetdreamer/open-screenshot-generator/tree/main/skills/app-preview-video into .cursor/skills/app-preview-video/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "app-preview-video", then confirm the skill loads.
Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
skills CLI
$ npx skills add dotnetdreamer/open-screenshot-generator --skill app-preview-video -a gemini-cli
Project install goes to .agents/skills/; add -g for ~/.gemini/skills/.
Install the "app-preview-video" agent skill from https://github.com/dotnetdreamer/open-screenshot-generator/tree/main/skills/app-preview-video into .gemini/skills/app-preview-video/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "app-preview-video", then confirm the skill loads.
Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
Installs for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
skills CLI
$ npx skills add dotnetdreamer/open-screenshot-generator --skill app-preview-video -a github-copilot
Project install goes to .agents/skills/; add -g for ~/.copilot/skills/.
Install the "app-preview-video" agent skill from https://github.com/dotnetdreamer/open-screenshot-generator/tree/main/skills/app-preview-video into .github/skills/app-preview-video/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "app-preview-video", then confirm the skill loads.
GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
skills CLI
$ npx skills add dotnetdreamer/open-screenshot-generator --skill app-preview-video -a opencode
OpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
Install the "app-preview-video" agent skill from https://github.com/dotnetdreamer/open-screenshot-generator/tree/main/skills/app-preview-video into .opencode/skills/app-preview-video/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "app-preview-video", then confirm the skill loads.
OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
Facts
Skill name
app-preview-video
GitHub stars
125
Token cost
~3.3k tokens
SKILL.md length
1,773 words
Files
1
Skills in repo
13
Repo updated
First seen
Licence
MIT
At a glance
Builds an App Store App Preview video (and a Play Store or landing page promo cut) from a screen recording of the app, using the open-screenshot-generator CLI (osg video): it starts from one of 20…
Works in 6 steps: doctor first, because of one trap → get real footage → start from a preview scene, not from an… → …
Follow ups: a different story
SKILL.md covers The rule that governs…, Step 0: doctor first, because…, Step 1: get real footage and Step 2: start from a preview…, plus 7 more sections
Calls npx, adb and xcrun
What it does
App Preview Video is an agent skill from dotnetdreamer/open-screenshot-generator. Builds an App Store App Preview video (and a Play Store or landing page promo cut) from a screen recording of the app, using the open-screenshot-generator CLI (osg video): it starts from one of 20 ready made preview scenes, drops real captured footage into the phone mockup, times the text and gesture overlays, checks the timeline against Apple Review Guideline 2.3.4, and renders H.264 MP4s at 886x1920. Use this whenever someone asks for an app preview, a preview video, a store video, an App Store trailer, a demo…
Its SKILL.md is about 3.3k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Mobile, covering App store release, Landing pages and Video production. It works with Tauri. The repository describes itself as: Open source Canva with CLI/GUI, AI Agent, MCP for App Store and Play Store screenshots. Free alternative to AppScreens, AppLaunchpad and Previewed. The licence is MIT.
When your agent uses it
Follow ups: a different story
Different overlay copy
A version without the frame
Example prompts
“make a video for the App Store”
“turn this screen recording into a store preview”
“my listing needs a video”
“/app-preview-video”
Requirements
Node.js
Workflow steps
6 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 556578e. It shows what the files ask for, not the result of running them.
Tool permissions
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Runs code
Shell commands in SKILL.md call:
npx
adb
xcrun
From the folder's file list and the shell code blocks in SKILL.md.
Network
No URLs in SKILL.md. Its commands use npx, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Credentials
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Context cost
App Preview Video loads about 3.3k tokens when it runs. Until then it costs about 208 tokens; SKILL.md has 1,773 words of instructions outside code blocks.
Always· name and description, kept in context so the agent knows when to use it
~208
When it runs· the whole SKILL.md, loaded when a task matches
~3.3k
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
Safety
Auto-check passed
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
Download SKILL.mdSave it as .claude/skills/app-preview-video/SKILL.md (or your agent's skills folder).
name
app-preview-video
description
Builds an App Store App Preview video (and a Play Store or landing page promo cut) from a screen recording of the app, using the open-screenshot-generator CLI (`osg video`): it starts from one of 20 ready made preview scenes, drops real captured footage into the phone mockup, times the text and gesture overlays, checks the timeline against Apple Review Guideline 2.3.4, and renders H.264 MP4s at 886x1920. Use this whenever someone asks for an app preview, a preview video, a store video, an App Store trailer, a demo video for the listing, or says things like "make a video for the App Store", "turn this screen recording into a store preview" or "my listing needs a video". Also use it for follow ups: a different story, different overlay copy, retiming, a longer or shorter cut, or a version without the frame.
license
MIT
metadata.package
open-screenshot-generator
metadata.homepage
https://openscrgen.app
App Preview video for the app in this repository
The end state: one MP4 per preview board under osg/out/, 886x1920, H.264, no audio track,
between 15 and 30 seconds, built from real captured footage of the app, listed in
osg/osg.manifest.json and accepted by App Store Connect.
The rule that governs everything here
Apple Review Guideline 2.3.4: an App Preview may only use video screen captures of the app itself.
Not a mockup, not an animated design, not a montage of stills. The same guideline explicitly allows
narration and video or textual overlays to explain what the footage does not.
That is why this pipeline has three modes and only two of them can be uploaded to the App Store.
video.mode
What renders
Where it is allowed
store-raw
the recording, full bleed, nothing else
App Store, the safest submission
store-text
the recording, full bleed, plus the board's text and gesture layers with their animations
App Store, and the better of the two for most apps
styled
the whole designed board: background, device frame, every layer
a landing page, social, a Play promo video on YouTube. Not an App Store preview
styled is a good asset and a bad submission. If the user asks for "a video for the store", produce
store-text and say why. If they ask for "a video for the website", produce styled.
Step 0: doctor first, because of one trap
bash
npx -y open-screenshot-generator@0 doctor
MP4 export needs a branded browser. The encoder is WebCodecs with an avc1 (H.264) profile, and
H.264 is a proprietary codec that plain Chromium and Chrome for Testing do not ship. PNG export, the
49 design tools and the AI agent work on any Chromium. Video does not. So:
Chrome, Edge or Brave: works.
Chromium from a distro package, or the build osg doctor --install-browser fetches: VideoEncoder
reports no supported H.264 config and the render fails with a "use Chrome or Edge" message. There
is no fallback encoder.
Point at a branded build with --browser "C:/Program Files/Google/Chrome/Application/chrome.exe"
or --browser /usr/bin/google-chrome-stable, or set browser in osg/osg.config.ts.
doctor probes this per browser and says so, rather than assuming. Do not start a capture session
before it passes.
Step 1: get real footage
osg does not record your app. Capture it with the platform's own tooling:
Rules that come from the compositor, not from taste:
Record the Release build. A dev banner in the footage is a rejection and a bad ad.
Record one continuous journey, not a montage: open the app, start the core action, finish it, see
the result. The cut has to read on its own without narration.
A phone records at 1290x2796 and that is fine. The export cover scales and centers to 886x1920, so
a portrait recording fills the frame edge to edge.
Record 20 to 40 seconds and trim, rather than recording exactly 18 and finding a stumble in it.
No audio is used. The MP4 has a video track only, so nothing you say into the recording survives.
Put the file path in video.recording in the config. The CLI serves it to the page over the local
origin, so a large file never has to travel as base64.
Step 2: start from a preview scene, not from an empty board
There are 20 finished App Preview scenes, each a whole board: background, phone mockup playing the
recording, timed copy, gesture hints and a call to action, arriving 18 seconds long, already inside
Apple's 15 to 30 second window. Building the same thing from add_elements plus set_animation is
several times the work and rarely as good.
Scene ids include spotlight-launch, feature-rush, headline-punch, five-star-proof,
three-taps, money-mode, sweat-session, calm-hour, night-feed, order-up, trip-ready,
beat-drop, learn-streak, shop-drop, focus-block, snap-fix, team-sync, health-check,
play-now and home-control. list_preview_scenes is the live list.
Preview scenes are not in osg templates or in list_templates: that catalog deliberately hides
the app-preview category, because those boards play a recording. list_preview_scenes is the door.
The get_artboard call at the end is not optional. It returns the layer ids and names you need next,
and a model cannot see the canvas.
Step 3: put the footage in the phone
The recording is not an image asset. upload_asset probes bytes with an <img> and refuses a video,
and its asset: references get expanded into data URLs, which would inline tens of megabytes into
the saved project. Recordings stay blobs and elements carry only a media id.
source takes an http(s) URL the page can fetch, a data:video/... URL, or bare base64. Prefer a URL
for anything large: a request body is capped at 32 MiB. The layer to target is the one named "Phone
(drop your recording here)".
Use the config for a local file.osg video reads video.recording, publishes that file on the
CLI's own local origin, and hands the page a URL, so a 90 MB .mov on disk never has to be encoded
into a JSON body. Reach for upload_recording by hand only when you need two different clips on two
boards.
Trim inside the element rather than re-recording: trimStart and trimEnd are seconds into the
source, on the video-device layer.
Step 4: rewrite the overlays and check the timeline
Rewrite every placeholder string with update_element. Overlay copy is not the same as screenshot
copy: it has to be readable in under two seconds, over moving footage, at phone size. Three to five
words. One idea per overlay.
Timing lives in set_animation:
Presets are fade, slide-up, slide-down, slide-left, slide-right, scale-up, pop.
enterDelay is the second the entrance starts, enterDuration defaults to 0.6.
An exit needs exitStart, an absolute second. Without it the layer never leaves, and an exitStart
before the entrance lands is rejected rather than stored.
Animations only play in the exported MP4 and in the timeline player. On the canvas and in a PNG
every layer is drawn at rest, all at once, so two layers must never share a position and take turns
in time. That looks right in the video and like a smear everywhere else.
set_animation refuses recordings and gestures on purpose. A recording always starts the board
(trim it), and a gesture is timed by triggerTime and gestureDuration.
Gesture hints are their own element type: tap, double-tap, swipe-left, swipe-right,
swipe-up, swipe-down, placed over the point in the footage where the finger goes, with
triggerTime matched to the moment the recording shows the interaction. gestureRepeat loops it for
the whole board.
Then read the board back as data before you spend minutes on a render:
json
[{ "tool": "get_preview_timeline", "args": {} }]
It returns the board length, one clip per layer, and a list of what will bite at export: a board
under Apple's 15 second floor, a layer animating past the end, or no recording in the phone yet.
set_preview_duration sets the board length explicitly, 15 to 30 for the App Store, and
seconds: null hands it back to whatever the content works out to.
Show full SKILL.md (635 more words)Show less
Step 5: render
bash
npx -y open-screenshot-generator@0 video
Reads video.mode, video.fps, video.duration and video.recording from osg/osg.config.ts.
One MP4 per preview board, rendered sequentially. Expect minutes, not seconds: every layer is
rasterized once and then composited frame by frame.
Constraints, all of them real and none of them worth trying to work around:
886x1920 portrait, or 1920x886 landscape. Output dimensions are forced even for H.264.
15 to 30 seconds. App Store Connect rejects anything shorter or longer.
30 fps. 60 renders, and Apple's spec is 30. Leave fps at 30 unless the user insists.
H.264, roughly 12 Mbps, avc1, faststart.
No audio track.
Flat frames only. A 3D or perspective device pose exports as a static sprite. Only a
video-device layer composites live footage, so keep the mockup flat on a preview board.
One MP4 per artboard. A three scene preview is three boards and three files, and Apple takes up
to three previews per localization anyway.
verify checks duration, dimensions, codec and file size against the store rules and exits 3 on a
failure. See the store-compliance skill.
Keep video content off the screenshot boards
Adding a video-device, a video, a gesture or any animation switches the whole project to
the video export path. A screenshot board that picked up a stray gesture layer stops exporting as a
PNG set. Keep preview boards in their own project, or at minimum know that this is why the export
suddenly asks about frame rates.
Follow up dispatch
The user asks for
Edit
Then run
Different overlay copy
update_elementcontent on the text layers
video
A longer or shorter cut
set_preview_duration, or video.duration
video
Retiming, "the text comes in too late"
set_animationenterDelay / exitStart
video
A different story or look
a different sceneId via add_preview_scene
video
New footage
video.recording, or upload_recording plus mediaId
video
Trim the clip
trimStart / trimEnd on the video layer
video
"Apple rejected the preview"
video.mode to store-raw or store-text
video
A version for the website
video.mode to styled
video
A still for the listing instead
nothing
render
Troubleshooting
"No H.264 profile" or "use the desktop app, Chrome or Edge". The browser is a plain Chromium
build. See Step 0. This is the single most common failure on CI runners and on Linux.
The MP4 is a still image under the overlays. No recording reached the phone layer, and the poster
fallback stood in so the layout could be proofed. Check get_preview_timeline, it says so, then
upload_recording and set mediaId.
The video is 4 seconds long. The board length follows the content when nothing overrides it. Set
set_preview_duration to 15 or more, or lengthen the animations.
A layer is on screen the whole time. It has no exitStart, so it never leaves. That is the
default and often correct.
A layer never appears. Its enterDelay is past the end of the board, or an exitStart sits
before the entrance lands.
The device frame is a static picture while the screen plays. Correct and expected for a
video-device: the chrome is a sprite drawn under the footage with the notch drawn back over it.
A 3D posed phone does not play. 3D and perspective poses export as static sprites. Switch the
layer to a flat frame.
The render died part way on a big board. Re-run with --verbose to see the page console. On a
container add nothing: the CLI already passes the sandbox and shared memory flags a runner needs.
App Store Connect took the file and failed it hours later. That is Apple's asynchronous asset
processing, and it is almost always duration or dimensions. Run osg verify before uploading, every
time.
Related skills
store-screenshots for the PNG set, which is the required half of a listing
store-compliance for what verify checks and for osg upload
editor-tools for the tool by tool detail behind every call on this page
App Preview Video next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
App Preview Video compared with similar skills
Skill
Stars
Used in
Tokens
Auto-check
Licence
Repo updated
App Preview Video this skilldotnetdreamer/open-screenshot-generator
A skill your agent uses when the design's perceived quality affects whether users will tolerate friction, give the product a chance, or judge it as well-made — which is most consumer-facing…
A skill your agent uses when turning product links, app store listings, landing pages, or product briefs into advertising videos with Remotion or Hyperframes projects, storyboards, render-engine…
Writes the launch for an app clone: the landing page built on the positioning angle, pricing set against the original's public pricing and its users' complaints, and the App Store and Google Play…
When the user wants to plan, script, produce, or optimize App Store Preview videos or Google Play promo videos — the autoplay videos that show in App Store/Play Store search and product pages.
The discovery surfaces outside the App Store app — your apps.apple.com product page ranking on Google, an owned landing page with a Smart App Banner, and the deal-site ecosystem that auto-amplifies…
A skill your agent uses when building any web page, HTML artifact, landing page, dashboard, slide deck, report, email, or UI component the user will look at.
Drive Open Screenshot Generator headlessly (puppeteer-core + Edge) to take UI screenshots, add palette elements, upload device screenshots, export artboard PNGs, and regenerate the 3D device…
Drives the live Open Screenshot Generator editor tool by tool over MCP, using osg mcp to expose the design tools (artboards, elements, backgrounds, fonts, the asset libraries, templates, App Preview…
Checks that rendered store assets will actually be accepted, and then ships them, using the open-screenshot-generator CLI: osg verify audits the produced PNGs and MP4s against App Store and Google…
Ships one screenshot design in many App Store and Play Store languages using the open-screenshot-generator CLI (osg localize): it adds store locales to an existing project, writes per language copy…
Builds an App Store App Preview video (and a Play Store or landing page promo cut) from a screen recording of the app, using the open-screenshot-generator CLI (osg video): it starts from one of 20…. App Preview Video is an agent skill from dotnetdreamer/open-screenshot-generator.264 MP4s at 886x1920.
When should I use App Preview Video?
App Preview Video fits situations like: follow ups: a different story; different overlay copy; A version without the frame.
How do I install App Preview Video in Claude Code?
Run `npx skills add dotnetdreamer/open-screenshot-generator --skill app-preview-video -a claude-code`. Or copy the skill folder (skills/app-preview-video in dotnetdreamer/open-screenshot-generator) into .claude/skills/app-preview-video in your project. Claude Code loads it when a task matches its description.
How do I install App Preview Video in Codex?
Run `npx skills add dotnetdreamer/open-screenshot-generator --skill app-preview-video -a codex`. Or copy the skill folder (skills/app-preview-video in dotnetdreamer/open-screenshot-generator) into .agents/skills/app-preview-video in your project. Codex loads it when a task matches its description.
Can I use App Preview Video in Cursor, Gemini CLI or GitHub Copilot?
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add dotnetdreamer/open-screenshot-generator --skill app-preview-video -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/app-preview-video, .gemini/skills/app-preview-video, .github/skills/app-preview-video and .opencode/skills/app-preview-video in your project.
What does App Preview Video need to run?
Going by SKILL.md and its folder, App Preview Video needs the command-line tools its instructions call (npx, adb and xcrun). Our summary lists: Node.js.
Does App Preview Video access the network?
SKILL.md contains no URLs. Its commands use npx, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Is App Preview Video safe to install?
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
What licence does App Preview Video use?
App Preview Video is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
How many tokens does App Preview Video use?
About 3.3k tokens (SKILL.md is roughly 13k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
What are the alternatives to App Preview Video?
Skills that share tags, products or a category with App Preview Video: Aesthetic Usability Effect (hashgraph-online/awesome-codex-plugins, 1.3k stars), Remotion Ad Video (leosssvip-dot/remotion-ad-video-skill, 110 stars), Replica Launch (Jakeschincariol/replica-skill, 1.2k stars) and App Preview Video (appeeky/aso-skills, 2.2k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
Who maintains App Preview Video?
dotnetdreamer (a GitHub user) maintains it in dotnetdreamer/open-screenshot-generator, which has 125 GitHub stars. The repository holds 13 skills in this directory. The repository was last updated on October 7, 2026.