TapCraft CLI
Last updated: November 8, 2026
Re-render a saved video with a new screen recording, from your terminal or CI. Same frame, background, camera, texts and taps — new footage.
What it's for
Make your launch video once in the studio. On every release, record the same flow again and let your build pipeline turn it into the finished video, without opening the editor.
1. Create an API key
API keys are part of Pro. Create one under Account → API keys. It's shown once, so copy it somewhere safe; you can revoke it anytime.
2. Install
Needs Node.js 18.3 or newer. No other dependencies.
npm install -g https://tapcraft.app/cli/tapcraft-0.1.0.tgzOr run it without installing, for example in CI:
npx --yes --package=https://tapcraft.app/cli/tapcraft-0.1.0.tgz tapcraft --help3. Sign in
Paste your key once and it's saved on this computer. In CI, set the TAPCRAFT_API_KEY secret instead.
tapcraft login
tapcraft whoami4. Render
List your saved videos, then render one with a new recording. Pass a project's id to always point at the same one.
tapcraft projects
tapcraft render "Launch video" --video ./new-recording.mp4 --out ./launch.mp4Taps are reused as they are, by position and time. If your app's layout or the flow's pacing changed, open the new video in the studio and nudge them.
Commands and options
tapcraft login [--key <key>] Save an API key (or set TAPCRAFT_API_KEY)
tapcraft logout Forget the saved key
tapcraft whoami Which account the key belongs to
tapcraft projects [--json] List your saved videos
tapcraft render <project> --video <file> [options]
--video <file> The new screen recording (MP4 or MOV, up to 3 minutes)
--out <file> Where to save the video (default: tapcraft-<project-name>.mp4)
--resolution <r> 1080, 2k or 4k (default: the project's own)
--trim-start <ms> Skip the first <ms> of the recording (default: the project's trim)
--duration <ms> Use only this much of the recording (default: all of it)
--max-wait <minutes> How long to wait for a free render server (default: 30)
<project> is an id from `tapcraft projects`, or a project's exact name.GitHub Actions
Render a new video on every release. Store your key as the repository secret TAPCRAFT_API_KEY.
name: Launch video
on:
release:
types: [published]
jobs:
video:
runs-on: macos-14
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
# Record your app's main flow however you like: XCUITest with
# `xcrun simctl io booted recordVideo`, Maestro, `adb shell screenrecord`…
- run: ./scripts/record-main-flow.sh build/flow.mp4
- name: Render the TapCraft video
env:
TAPCRAFT_API_KEY: ${{ secrets.TAPCRAFT_API_KEY }}
run: >
npx --yes --package=https://tapcraft.app/cli/tapcraft-0.1.0.tgz
tapcraft render "Launch video" --video build/flow.mp4 --out build/launch.mp4
- uses: actions/upload-artifact@v4
with:
name: launch-video
path: build/launch.mp4fastlane
Download the action into your project's fastlane/actions folder, then call it from a lane. It reads TAPCRAFT_API_KEY from the environment.
lane :launch_video do
# …record the flow into fastlane/recordings/flow.mp4…
video = tapcraft(
project: "Launch video", # id or exact name
video: "fastlane/recordings/flow.mp4",
output: "fastlane/launch.mp4",
)
UI.message("TapCraft video: #{video}")
endUpload store screenshots with fastlane
fastlane is a free, open-source tool that uploads to App Store Connect and Google Play from your computer. Tick “Lay out the zip for fastlane” in Store assets (it's automatic with several languages), unzip the download into your app project, and these commands upload the screenshots and feature graphic — nothing else in your listing changes and no app build is uploaded.
Before you start
- Install fastlane (fastlane.tools). Both apps must already exist in App Store Connect and Play Console.
- Google Play only accepts listing images once the app has had at least one build uploaded by hand.
- Replace com.example.app with your app's bundle id (App Store) and package name (Play).
App Store
In App Store Connect, go to Users and Access → Integrations → App Store Connect API and create a key with the App Manager role. Download the .p8 file (it's offered once), note the Key ID and Issuer ID, and put them in asc_key.json:
{
"key_id": "ABC123DEFG",
"issuer_id": "00000000-0000-0000-0000-000000000000",
"key": "-----BEGIN PRIVATE KEY-----\n…contents of AuthKey_ABC123DEFG.p8…\n-----END PRIVATE KEY-----",
"in_house": false
}fastlane deliver --api_key_path asc_key.json \
--app_identifier com.example.app \
--skip_binary_upload true --skip_metadata true \
--overwrite_screenshots true --force trueGoogle Play
In Google Cloud, create a service account and a JSON key for it. In Play Console, invite the service account's email under Users and permissions and give it access to your app's store listing. Then:
fastlane supply --json_key play_key.json \
--package_name com.example.app \
--skip_upload_apk true --skip_upload_aab true \
--skip_upload_metadata true --skip_upload_changelogs trueKeep asc_key.json and play_key.json out of git (add them to .gitignore). They are keys to your store accounts.
Limits
Server renders are up to three minutes long. One render per account runs at a time; when the servers are busy, the CLI waits and retries. Ctrl-C cancels the render.
Exit codes
0 done
1 failed (render error, upload error, plan limits)
2 bad usage or unreadable file
3 no key, key not accepted, or not on Pro
4 render servers stayed busy for all of --max-wait