App demo recorder
Make short screen recordings that look like a person confidently using the app: one feature per clip, no loading stalls, no debug overlays, no ads, a tidy status bar.
$S is scripts/appdemo.sh in this skill's directory. It needs ffmpeg (brew install ffmpeg), plus adb for Android or Xcode's xcrun simctl for iOS. In sandboxed agents, run it with escalated permissions: it talks to the emulator, the simulator, and writes outside the workspace.
1. Agree on what to show
- Ask which features to show if the user has not said. Record one clip per feature and name clips
NN_feature(01_price_search,02_calculator). Lead with what the product is best at, not with whatever screen the app opens on. - Ask which build and account to use when it is not obvious. Marketing footage normally needs a production release build with real data. A debug/staging build shows dev menus, warning toasts, test data, and runs slower. Do not assume; a staging recording usually has to be redone.
- If the clip needs a paid or premium state, look for a debug/developer override in the app before touching real billing.
- Credentials the user gives you: enter them with a command whose output you discard (
adb shell input text ... >/dev/nullon Android;printf ... | xcrun simctl pbcopy <udid>then paste on iOS) rather than through tools that log every command, and do not write them into files.
2. Make the device fast and quiet
- Android emulator: give it resources. A small AVD stutters on screen and the stutter ends up in the clip.
emulator -avd <name> -memory 6144 -cores 4 -gpu host -no-snapshot-save -no-boot-animIf the same app id is already installed with a different signing key, use another AVD instead of uninstalling (uninstalling deletes the user's data). - Release build installed and running; log in; dismiss first-run popups, permission prompts, and interstitial ads before recording.
$S statusbar on: fixed time (APPDEMO_TIME, default 9:41), full battery and signal, notification icons hidden.$S statusbar offrestores it.- On Android, do not press system Back on the app's root screen. It finishes the activity and an in-memory override (premium switch, feature flag) is lost on relaunch.
3. Rehearse, then record
- Rehearse each clip once without recording. Learn the taps, coordinates, and wait times. Opening the screen once also warms caches, so the recorded take loads faster.
- Record:
Recording runs on the host ($S start 01_price_search # drive the app: adb shell input tap/swipe/text, xcrun simctl, or your UI automation tool $S stop 01_price_search # -> $APPDEMO_OUT/01_price_search.mp4adb emu screenrecord/simctl io recordVideo). Do not use in-deviceadb shell screenrecordon an emulator: it competes with the app for CPU and can freeze the UI so scrolls and taps never show up. - Send the actions for a clip as one batch with short sleeps (0.5–2.5 s), not one tool call per tap. Inspecting the screen between steps leaves long dead stretches in the take.
- Scroll in deliberate steps (about 40 % of the screen, 600–800 ms per swipe) so viewers can read.
- Use the UI driver's text input for non-ASCII text (Korean, emoji);
adb shell input textonly handles ASCII. - When a feature only shows value with data (a ledger, a diary, a cart), record creating a realistic entry, then delete it right after and confirm the screen is back to its original state. Check sharing defaults first: a new post may be public.
4. Check every clip
$S strip $APPDEMO_OUT/01_price_search.mp4 /tmp/01.jpg 8
Look at the strip, not at your script: confirm each intended step actually happened (scrolls moved, the tab switched, the result appeared) and nothing unwanted is on screen: toasts, keyboards covering content, ads, personal data such as a real address, or debug banners. Re-record failed clips; do not ship a clip whose action silently did nothing.
5. Cut the waiting
$S tighten in.mp4 out.mp4 # idle lead-in cut, frozen stretches -> 0.35 s, final result screen kept 1.5 s
$S speed in.mp4 out.mp4 1.3 # optional uniform speed-up
tighten starts the clip 0.4 s before the first real action (the idle seconds after start are never perfectly still, so freeze detection alone misses them) and shortens every stretch where the picture does not change, so taps follow each other like a person who knows the app. Typical clips lose about half their length. Check a tightened clip with strip too: if a small change (typing a digit, toggling a chip) was cut, lower --noise; if pauses remain, lower --min-freeze.
6. Deliver
Put everything in one folder: raw clips, the tightened versions (recommended for editing), and a short README listing each clip, what it shows, and anything the user should know (data created and deleted, personal data visible, emulator camera cutout at the top). Report clip lengths and what could not be recorded and why.