Agent skill

App Preview Video

by dotnetdreamer in 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…

MITAuto-check passedMobile

Install App Preview Video

skills CLI
$ npx skills add dotnetdreamer/open-screenshot-generator --skill app-preview-video -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install dotnetdreamer/open-screenshot-generator app-preview-video --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/dotnetdreamer/open-screenshot-generator.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/app-preview-video .claude/skills/app-preview-video && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

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.

  1. doctor first, because of one trap
  2. get real footage
  3. start from a preview scene, not from an empty board
  4. put the footage in the phone
  5. rewrite the overlays and check the timeline
  6. render

What it can do on your machine

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.

SKILL.md

The full file from dotnetdreamer/open-screenshot-generator at commit 556578e, republished under its MIT licence (© dotnetdreamer). 1,773 words, ~3,310 tokens.

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.modeWhat rendersWhere it is allowed
store-rawthe recording, full bleed, nothing elseApp Store, the safest submission
store-textthe recording, full bleed, plus the board's text and gesture layers with their animationsApp Store, and the better of the two for most apps
styledthe whole designed board: background, device frame, every layera 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:

bash
xcrun simctl io booted recordVideo --codec h264 osg/media/demo.mov
adb shell screenrecord /sdcard/demo.mp4 && adb pull /sdcard/demo.mp4 osg/media/demo.mp4

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.

bash
npx -y open-screenshot-generator@0 edit --script osg/preview.json
json
[
  { "tool": "list_preview_scenes", "args": { "query": "finance" } },
  { "tool": "add_preview_scene", "args": { "sceneId": "spotlight-launch" } },
  { "tool": "get_artboard", "args": {} }
]

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.

json
[
  { "tool": "upload_recording", "args": { "source": "https://example.com/demo.mp4", "name": "demo" } },
  { "tool": "update_element", "args": { "elementId": "phone", "mediaId": "<the id it returned>" } }
]

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.

Then:

bash
npx -y open-screenshot-generator@0 manifest
npx -y open-screenshot-generator@0 verify

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 forEditThen run
Different overlay copyupdate_element content on the text layersvideo
A longer or shorter cutset_preview_duration, or video.durationvideo
Retiming, "the text comes in too late"set_animation enterDelay / exitStartvideo
A different story or looka different sceneId via add_preview_scenevideo
New footagevideo.recording, or upload_recording plus mediaIdvideo
Trim the cliptrimStart / trimEnd on the video layervideo
"Apple rejected the preview"video.mode to store-raw or store-textvideo
A version for the websitevideo.mode to styledvideo
A still for the listing insteadnothingrender

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.

  • 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

© dotnetdreamer, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in skills/app-preview-video of dotnetdreamer/open-screenshot-generator.

Open the folder on GitHubat commit 556578e

Compare with similar skills

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
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
App Preview Video this skilldotnetdreamer/open-screenshot-generator125—~3.3kAutomated safety check: PassMIT
Aesthetic Usability Effecthashgraph-online/awesome-codex-plugins1.3k—~3.9kAutomated safety check: PassApache-2.0
Remotion Ad Videoleosssvip-dot/remotion-ad-video-skill110—~6.3kAutomated safety check: PassMIT
Replica LaunchJakeschincariol/replica-skill1.2k—~1kAutomated safety check: PassMIT
App Preview Videoappeeky/aso-skills2.2k—~1.6kAutomated safety check: PassMIT
Web Presencershankras/claude-code-apple-skills785—~1.3kAutomated safety check: PassMIT

Similar skills

  • Aesthetic Usability Effect

    hashgraph-online/awesome-codex-plugins

    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…

    1.3k GitHub stars~3.9k tokensUpdated today
    Frontend & DesignAuto-check passed
  • Remotion Ad Video

    leosssvip-dot/remotion-ad-video-skill

    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…

    110 GitHub stars~6.3k tokensUpdated 4 mo ago
    Media & CreativeAuto-check passed
  • Replica Launch

    Jakeschincariol/replica-skill

    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…

    1.2k GitHub stars~1k tokensUpdated 6 days ago
    Frontend & DesignAuto-check passed
  • App Preview Video

    appeeky/aso-skills

    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.

    2.2k GitHub stars~1.6k tokensUpdated 2 days ago
    MobileAuto-check passed
  • Web Presence

    rshankras/claude-code-apple-skills

    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…

    785 GitHub stars~1.3k tokensUpdated 2 mo ago
    Frontend & DesignAuto-check passed
  • Web Design

    drewnekota/cetus

    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.

    146 GitHub stars~2.1k tokensUpdated today
    Frontend & DesignAuto-check passed

More from dotnetdreamer/open-screenshot-generator

All 13 skills in this repo
  • App Screenshots

    dotnetdreamer/open-screenshot-generator

    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…

    125 GitHub stars~5.1k tokensUpdated 2 days ago
    Auto-check: notes
  • Editor Tools

    dotnetdreamer/open-screenshot-generator

    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…

    125 GitHub stars~3.8k tokensUpdated 2 days ago
    Auto-check passed
  • Gpt4free Provider Sync

    dotnetdreamer/open-screenshot-generator

    Check the latest xtekky/gpt4free releases for provider additions/changes and decide whether Open Screenshot Generator's AI providers need the same.

    125 GitHub stars~2.3k tokensUpdated 2 days ago
    Auto-check passed
  • Stock Image Assets

    dotnetdreamer/open-screenshot-generator

    Add properly licensed Adobe Stock photos to the Images palette library (e.g.

    125 GitHub stars~1.7k tokensUpdated 2 days ago
    Auto-check passed
  • Store Compliance

    dotnetdreamer/open-screenshot-generator

    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…

    125 GitHub stars~3k tokensUpdated 2 days ago
    Auto-check passed
  • Store Localization

    dotnetdreamer/open-screenshot-generator

    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…

    125 GitHub stars~3.8k tokensUpdated 2 days ago
    Auto-check passed

Works with

Questions about App Preview Video

What does App Preview Video do?

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.

Source: dotnetdreamer/open-screenshot-generator on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.