---
name: osg-app-preview
description: >-
  How App Preview video boards work in Open Screenshot Generator: preview scenes, the user's
  screen recording, animation timing and the App Store rules for previews. Load it before
  adding or editing a preview board, or when the user asks for a video or an App Preview.
---
# App Preview video in depth

## The rule behind it

Apple Review Guideline 2.3.4: an App Preview may only use video captured from the app itself.
Text overlays and gesture hints that explain the footage are allowed; an animated mockup or a
montage of stills is not. So a preview board is built around the user's real screen recording.

## What you can and cannot do

- You cannot supply the recording, not even from the user's app folder: import_project_image
  takes pictures only. The user adds it: they select the phone layer (named "Phone (drop your
  recording here)" on a scene) and use Upload Recording in the Properties panel.
- list_recordings lists the recordings already stored, newest first, with mediaId and duration.
  Put one in with update_element mediaId on the video-device layer.
- upload_recording takes source as an http(s) URL the app can fetch. Use it only when the user
  gives you such a link; never paste video data into a tool call.
- posterSrc on a video-device shows a still (an asset ref, for example one of the user's
  screenshots) until the recording arrives.
- The MP4 is rendered from the editor's Export dialog. No tool renders it.

## Building a board

1. list_preview_scenes with a query ("finance", "fitness", "social", "proof"). Each scene is a
   whole finished board: a phone playing the recording, timed copy, gesture hints and a call to
   action, 18 seconds long. 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.
2. add_preview_scene with sceneId (and a name) adds it as a new board after the active one. It
   takes the project's size when that is a portrait phone canvas; the MP4 is 886x1920 either way.
3. get_artboard for the layer ids and names.
4. Rewrite every text layer with update_element: 3 to 5 words, one idea each, readable in under
   two seconds over moving footage.
5. get_preview_timeline to check the board before telling the user it is ready.

Building from scratch is several times the work. add_elements takes type video-device (a phone
or tablet playing a recording, with the frame as subType), video (a frameless recording) and
gesture (gestureType tap, double-tap, swipe-left, swipe-right, swipe-up or swipe-down, with
triggerTime, gestureDuration and gestureRepeat).

## Timing

- set_animation takes elementId with enter (fade, slide-up, slide-down, slide-left, slide-right,
  scale-up, pop), enterDelay (the second it starts), enterDuration (default 0.6), exit, exitStart
  (an absolute second; without it the layer never leaves) and exitDuration, or clear true. null
  removes an enter or an exit.
- An exitStart before the entrance has landed is rejected.
- set_animation refuses recordings and gestures. A recording always starts the board (trim it
  with trimStart and trimEnd on update_element), and a gesture is timed by triggerTime and
  gestureDuration.
- On the canvas and in a PNG every layer is drawn at rest, all at once. Never stack two layers in
  one place to take turns in time: that works in the MP4 and looks like a smear everywhere else.
- set_preview_duration with seconds: 15 to 30 for the App Store (1 to 60 is allowed). null goes
  back to the length the content needs.
- get_preview_timeline reports the length, one clip per layer, and what will cause trouble at
  export: a board under 15 seconds, a layer animating past the end, no recording in the phone yet.

## Export constraints

The MP4 is 886x1920 portrait (1920x886 landscape), H.264, one file per board, and the App Store
takes 15 to 30 seconds. Only flat frames play the footage: a 3D or perspective device exports as
a still, so keep the phone flat. The recording's own sound is kept only when keepAudio is true.

## Keep it apart from screenshots

A video-device, video or gesture layer, or any animation, switches the whole project's Export to
the video dialog. If the open project is a screenshot set, confirm before adding a preview board,
and suggest a separate project for it.
