Orca iOS Simulator Control
stablyai/orca
iOS Simulator control from inside Orca, with the live device view in Orca's emulator pane. Use when driving a booted Apple Simulator on macOS: taps, gestures…
FlowDeck is REQUIRED for all Apple platform build/run/test/launch/debug/simulator/device/log/automation tasks.
$ npx skills add SwiftedMind/Tessera --skill flowdeck -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install SwiftedMind/Tessera flowdeck --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/SwiftedMind/Tessera.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.codex/skills/flowdeck .claude/skills/flowdeck && rm -rf skills-srcUse ~/.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/
Install the "flowdeck" agent skill from https://github.com/SwiftedMind/Tessera/tree/main/.codex/skills/flowdeck into .claude/skills/flowdeck/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "flowdeck", 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.
$skill-installer install https://github.com/SwiftedMind/Tessera/tree/main/.codex/skills/flowdeckType 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.
$ npx skills add SwiftedMind/Tessera --skill flowdeck -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install SwiftedMind/Tessera flowdeck --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/SwiftedMind/Tessera.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.codex/skills/flowdeck .agents/skills/flowdeck && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "flowdeck" agent skill from https://github.com/SwiftedMind/Tessera/tree/main/.codex/skills/flowdeck into .agents/skills/flowdeck/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "flowdeck", 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.
$ npx skills add SwiftedMind/Tessera --skill flowdeck -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install SwiftedMind/Tessera flowdeck --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/SwiftedMind/Tessera.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.codex/skills/flowdeck .cursor/skills/flowdeck && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "flowdeck" agent skill from https://github.com/SwiftedMind/Tessera/tree/main/.codex/skills/flowdeck into .cursor/skills/flowdeck/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "flowdeck", 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.
$ gemini skills install https://github.com/SwiftedMind/Tessera.git --path .codex/skills/flowdeck--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add SwiftedMind/Tessera --skill flowdeck -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install SwiftedMind/Tessera flowdeck --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/SwiftedMind/Tessera.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.codex/skills/flowdeck .gemini/skills/flowdeck && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "flowdeck" agent skill from https://github.com/SwiftedMind/Tessera/tree/main/.codex/skills/flowdeck into .gemini/skills/flowdeck/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "flowdeck", 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.
$ gh skill install SwiftedMind/Tessera flowdeckInstalls 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).
$ npx skills add SwiftedMind/Tessera --skill flowdeck -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/SwiftedMind/Tessera.git skills-src && mkdir -p .github/skills && cp -r skills-src/.codex/skills/flowdeck .github/skills/flowdeck && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "flowdeck" agent skill from https://github.com/SwiftedMind/Tessera/tree/main/.codex/skills/flowdeck into .github/skills/flowdeck/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "flowdeck", 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.
$ npx skills add SwiftedMind/Tessera --skill flowdeck -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install SwiftedMind/Tessera flowdeck --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/SwiftedMind/Tessera.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.codex/skills/flowdeck .opencode/skills/flowdeck && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "flowdeck" agent skill from https://github.com/SwiftedMind/Tessera/tree/main/.codex/skills/flowdeck into .opencode/skills/flowdeck/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "flowdeck", 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.
flowdeckFlowDeck is REQUIRED for all Apple platform build/run/test/launch/debug/simulator/device/log/automation tasks.
Flowdeck is an agent skill from SwiftedMind/Tessera. FlowDeck is REQUIRED for all Apple platform build/run/test/launch/debug/simulator/device/log/automation tasks. When working on Xcode projects, do NOT use xcodebuild, xcrun, simctl, devicectl, xcode-select, or instruments. Do NOT parse Xcode project files manually. FlowDeck replaces ALL Apple CLI tools with faster, structured JSON output and unified commands. Use it for project discovery, build/run/test, simulator management (create/boot/screenshot/erase), device operations (install/launch/logs), UI automation…
Its SKILL.md is about 11k tokens, which your agent loads only when the skill is triggered. The skill folder holds 22 other files (for example `CHANGELOG.md`, `resources/ai.md` and `resources/apps.md`).
It sits in Mobile, covering iOS development and Mobile testing and debugging. It works with Xcode, macOS, iOS and SwiftUI. The repository describes itself as: A Swift package that turns a single generated tile composed of SwiftUI views into an endlessly repeating, seamlessly wrapping pattern. The licence is MIT.
6 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 8956e9b. It shows what the files ask for, not the result of running them.
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.
Shell commands in SKILL.md call:
rgxcrunFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
flowdeck.studioFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
FLOWDECK_LICENSE_KEYFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Flowdeck loads about 11k tokens when it runs. Until then it costs about 247 tokens; SKILL.md has 3,440 words of instructions outside code blocks.
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.
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.
The full file from SwiftedMind/Tessera at commit 8956e9b, republished under its MIT licence (© SwiftedMind). 3,440 words, ~10,769 tokens.
.claude/skills/flowdeck/SKILL.md (or your agent's skills folder). This skill also uses 21 other files; get the full folder from GitHub.Use this skill whenever the user asks to build, run, test (including automated tests), launch, debug, capture logs, take screenshots, manage simulators/devices/runtimes, install simulators, manage packages, sync provisioning, or "run the app" — even if they do not mention iOS, macOS, Xcode, or simulators. If the request could involve Apple tooling or CI automation, default to FlowDeck.
Before running ANY build, run, or test command, check for a saved FlowDeck config.
The user's config represents their chosen workspace, scheme, and simulator/device. Respect it.
flowdeck config get --jsonThis returns one of two results:
The user has already chosen their settings. Use bare commands - no flags needed:
flowdeck build # Uses saved workspace, scheme, target
flowdeck run # Uses saved workspace, scheme, target
flowdeck test # Uses saved workspace, scheme, target
flowdeck clean # Uses saved workspace, schemeOnly add flags when the user explicitly asks for something different from the saved config:
| User Says | Command |
|---|---|
| "Build the app" | flowdeck build |
| "Run the app" | flowdeck run |
| "Run tests" | flowdeck test |
| "Build for Release" | flowdeck build -C Release |
| "Run on iPhone 16 Pro Max" | flowdeck run -S "iPhone 16 Pro Max" |
| "Test on my physical device" | flowdeck test -D "iPhone" |
| "Run on macOS" | flowdeck run -D "My Mac" |
| "Run the UITests scheme" | flowdeck test -s UITestScheme |
Explicit CLI flags override config values for that invocation only - they do not change the saved config.
When you see No saved config found, create a config so all subsequent commands work without flags:
# 1. Discover what's available
flowdeck context --json
# 2. Create config based on what you find
flowdeck config set -w <workspace> -s <scheme> -S "<simulator>"
# 3. Now use bare commands
flowdeck build
flowdeck run
flowdeck testHow to pick values when creating config:
| Parameter | How to Choose |
|---|---|
Workspace (-w) | Use the workspace/project found by flowdeck context --json (usually only one) |
Scheme (-s) | If one scheme -> use it. If multiple -> pick the main app scheme (not test/framework schemes). If user mentions a specific target -> match it. |
Simulator (-S) | If user mentions a device -> use it. Otherwise -> pick the newest available iPhone simulator from context output. |
Device (-D) | Use "My Mac" for macOS tasks, or "iPhone" for physical device tasks. |
Tell the user what you're creating:
"No FlowDeck config found. I'll create one using [workspace] with scheme [scheme] on [simulator] based on the project structure."
flowdeck config set --force over an existing config - the user chose those settings deliberatelyflowdeck config reset unless the user explicitly asksFlowDeck provides capabilities you don't have otherwise:
| Capability | What It Means For You |
|---|---|
| Saved Config | flowdeck config get returns the user's chosen workspace/scheme/target. No guessing, no manual discovery. |
| Project Discovery | flowdeck context --json returns workspace path, schemes, configs, simulators. No parsing .xcodeproj files. |
| Screenshots | flowdeck ui simulator session start -S <name-or-udid> captures UI continuously. Read latest.jpg, latest-tree.json, and latest.json to see the app. |
| App Tracking | flowdeck apps shows what's running. flowdeck logs <id> streams output. You control the app lifecycle. |
| Unified Interface | One tool for simulators, devices, builds, tests. Consistent syntax, JSON output. |
FlowDeck is how you interact with iOS/macOS projects. You don't need to parse Xcode files, figure out build commands, or manage simulators manually.
flowdeck ui simulator for screen/record/find/tap/double-tap/type/swipe/scroll/back/pinch/wait/assert/erase/hide-keyboard/key/open-url/clear-state/rotate/button/touch)Each command set has its own reference doc. Use these for detailed flags, examples, and workflows.
resources/config.md - Saved project settings (get/set/reset) - read this firstresources/context.md - Project discovery (workspace/schemes/configs/simulators)resources/build.md - Build projects and targetsresources/run.md - Run apps on simulator/device/macOSresources/test.md - Run tests and discover testsresources/clean.md - Clean build artifactsresources/apps.md - List running apps launched by FlowDeckresources/logs.md - Stream logs for a running appresources/stop.md - Stop a running appresources/uninstall.md - Uninstall an app from a simulator or deviceresources/simulator.md - Simulator management and runtimesresources/ui.md - UI automation for iOS Simulatorresources/device.md - Physical device managementresources/ai.md - Install or remove the FlowDeck skill pack for AI agentsresources/pixel-perfect-design.md - Pixel-perfect UI implementation from design mockupsresources/project.md - Project inspection and packagesresources/package-resolution.md - Package resolution escalation playbook (update -> resolve -> clear -> clean)resources/license.md - License status/activate/deactivateresources/update.md - Update FlowDeckresources/init.md - Deprecated alias for config set+-------------------------------------------------------------+
| YOUR DEBUGGING LOOP |
+-------------------------------------------------------------+
| |
| flowdeck config get --json -> Check saved settings |
| (if none: context + config set) |
| |
| flowdeck run -> Launch app, get App ID |
| |
| flowdeck logs <app-id> -> See runtime behavior |
| |
| flowdeck ui simulator session -> See the UI |
| start -S <name-or-udid> --json (read latest.jpg) |
| |
| Edit code -> Repeat |
| |
+-------------------------------------------------------------+Don't guess. Observe. Run the app, watch the logs, read session screenshots.
| You Need To... | Command (config exists) | Command (no config / override) |
|---|---|---|
| Check saved settings | flowdeck config get --json | - |
| Create/save settings | - | flowdeck config set -w <ws> -s <scheme> -S "iPhone 16" |
| Understand the project | flowdeck context --json | flowdeck context --json |
| Build (iOS Simulator) | flowdeck build | flowdeck build -w <ws> -s <scheme> -S "iPhone 16" |
| Build (macOS) | flowdeck build -D "My Mac" | flowdeck build -w <ws> -s <scheme> -D "My Mac" |
| Build (physical device) | flowdeck build -D "iPhone" | flowdeck build -w <ws> -s <scheme> -D "iPhone" |
| Run and observe | flowdeck run | flowdeck run -w <ws> -s <scheme> -S "iPhone 16" |
| Run with logs | flowdeck run --log | flowdeck run -w <ws> -s <scheme> -S "iPhone 16" --log |
| See runtime logs | flowdeck apps then flowdeck logs <id> | same |
| Uninstall an app | flowdeck uninstall <app-id-or-bundle-id> | flowdeck uninstall <app-id-or-bundle-id> --simulator "iPhone 16" |
| See the screen (start session) | flowdeck ui simulator session start -S "iPhone 16" --json | same |
| See the accessibility tree | Read latest_tree from session JSON | same |
| See the screen (fallback) | flowdeck ui simulator screen -S "iPhone 16" --output <path> | same |
| Tap / type / interact | flowdeck ui simulator tap "Login" -S "iPhone 16" --json | same |
| Run tests | flowdeck test | flowdeck test -w <ws> -s <scheme> -S "iPhone 16" |
| Run tests from a plan | flowdeck test --plan "MyPlan" | flowdeck test -w <ws> -s <scheme> -S "iPhone 16" --plan "MyPlan" |
| Run specific tests | flowdeck test --only LoginTests | flowdeck test -w <ws> -s <scheme> -S "iPhone 16" --only LoginTests |
| Find specific tests | flowdeck test discover | flowdeck test discover -w <ws> -s <scheme> |
| List test plans | flowdeck test plans | flowdeck test plans -w <ws> -s <scheme> |
| List simulators | flowdeck simulator list --json | same |
| List physical devices | flowdeck device list --json | same |
| Create a simulator | flowdeck simulator create --name "..." --device-type "..." --runtime "..." | same |
| List installed runtimes | flowdeck simulator runtime list | same |
| List downloadable runtimes | flowdeck simulator runtime available | same |
| Install a runtime | flowdeck simulator runtime create iOS 18.0 | same |
| Clean builds | flowdeck clean | flowdeck clean -w <ws> -s <scheme> |
| Clean all caches | flowdeck clean --all | same |
| List schemes | flowdeck project schemes | flowdeck project schemes -w <ws> |
| List build configs | flowdeck project configs | flowdeck project configs -w <ws> |
| Resolve SPM packages | flowdeck project packages resolve | flowdeck project packages resolve -w <ws> |
| Update SPM packages | flowdeck project packages update | flowdeck project packages update -w <ws> |
| Clear package cache | flowdeck project packages clear | flowdeck project packages clear -w <ws> |
| Fix package resolution failures | See resources/package-resolution.md | See resources/package-resolution.md |
| Refresh provisioning | flowdeck project sync-profiles | flowdeck project sync-profiles -w <ws> -s <scheme> |
xcrun simctl spawn <udid> log show ..., use flowdeck apps then flowdeck logs <id>, or run with flowdeck run --log.flowdeck logs <id> --json | rg 'Pattern|thepattern' or flowdeck logs <id> | rg 'Pattern|thepattern'.--last 2m, run flowdeck logs while reproducing the issue, then stop streaming after the window you need.flowdeck config get --json first - It tells you if the user has saved settings. If yes, use bare commands. If no, create a config before proceeding.flowdeck build, flowdeck run, flowdeck test with no flags. Only add flags for user-requested overrides.config set --force or config reset unless the user asks. Their config is their choice.flowdeck run to launch apps - It returns an App ID for log streaming (and targetUdid in JSON mode)flowdeck ui simulator session start -S "iPhone 16" --json. Parse the JSON output to get the latest_screenshot and latest_tree file paths. Use your Read tool on these paths to see the screen and inspect elements.latest_screenshot to confirm the UI changed. Never chain actions blindly.flowdeck <command> --help or read the matching resource before retrying. Do not guess aliases like --skip-build, --x, --y, or string key names.flowdeck ui simulator open-url for website navigation unless the user is explicitly testing deep links or external handoff.flowdeck apps before launching - Know what's already runningTip: Most commands support --examples to print usage examples.
-S)Every flowdeck ui simulator ... command requires -S to target a simulator. It accepts either:
-S "iPhone 16" — FlowDeck resolves it to a UDID automatically.-S "A1B2C3D4-E5F6-7890-ABCD-EF1234567890" — used as-is.Where to get the name or UDID:
flowdeck context --json — returns all simulators with name and udid fields.flowdeck run ... --json — the app_registered event includes targetUdid.flowdeck config get --json — returns the resolved UDID if flowdeck config set -S was used.Never omit -S. Multiple simulators may be booted — omitting -S risks acting on the wrong one.
A session continuously captures the simulator's accessibility tree and screenshot every 500ms and writes them to files on disk. You MUST start a session before doing any UI work. This is how you see what is on screen.
STEP 1 Start the session (do this ONCE before any UI interaction):
flowdeck ui simulator session start -S "iPhone 16" --json
Parse the JSON output. Extract these three absolute file paths:
- latest_screenshot → e.g. "/path/to/.flowdeck/automation/sessions/9E6A58EF/latest.jpg"
- latest_tree → e.g. "/path/to/.flowdeck/automation/sessions/9E6A58EF/latest-tree.json"
- latest → e.g. "/path/to/.flowdeck/automation/sessions/9E6A58EF/latest.json" (in session_dir)
Save these paths — you will reuse them for the rest of the session.
STEP 2 Read the tree to discover elements:
Use your Read tool on the latest_tree path.
The tree is a JSON array of elements with: label, id, role, frame, enabled, visible.
Use element labels or IDs to target taps, finds, waits, and assertions.
STEP 3 Read the screenshot to see the UI:
Use your Read tool on the latest_screenshot path.
This is a JPEG image. You will see the current simulator screen.
STEP 4 Interact (tap, type, swipe, etc.):
flowdeck ui simulator tap "Login" -S "iPhone 16" --json
flowdeck ui simulator type "hello@example.com" -S "iPhone 16" --json
STEP 5 VERIFY after every action — read the screenshot and/or tree again:
Use your Read tool on the SAME latest_screenshot and latest_tree paths.
The session updates these files automatically (~500ms).
Wait ~1 second after an action, then read to confirm the UI changed as expected.
DO NOT skip this step. If you don't verify, you're guessing.
STEP 6 If the session appears stale, RESTART IT instead of switching tools:
Symptoms of a stale session:
- latest_screenshot/latest_tree still show the old screen after a real UI change
- the frontmost app or dialog clearly changed, but the session files did not
- multiple re-reads after a short wait still disagree with the actual simulator state
Recovery:
1. Run `flowdeck ui simulator session start -S "iPhone 16" --json` again.
Starting a session automatically stops the previous one.
2. Parse the new JSON output.
3. Replace your saved `latest_screenshot`, `latest_tree`, and `latest` paths.
4. Continue using the restarted session.
Do NOT fall back to `flowdeck ui simulator screen` just because the session might be stale.
Use `screen` only if the restarted session is still wrong or if you explicitly need a one-off static capture.
STEP 7 Repeat steps 4-6 for each interaction.
STEP 8 Stop the session when done:
flowdeck ui simulator session stop -S "iPhone 16"latest.jpg and latest-tree.json automatically whenever the UI changes.screen or any capture command between actions — just re-read the same file paths.latest.json contains capture metadata (timestamp, dimensions).These rules apply to ALL UI automation workflows:
latest.jpg to confirm the UI changed.latest-tree.json to confirm the element exists and is visible.flowdeck ui simulator scroll --until "id:yourElement" -S "iPhone 16" first.flowdeck ui simulator session start -S ... --json, save the new file paths, and continue with the restarted session.flowdeck ui simulator <subcommand> --help or read resources/ui.md before retrying.open-url is for deep-link/system handoff testing, not browser page validation.Use flowdeck ui simulator screen only when sessions fail to start, a restarted session is still wrong, or you need a specific format:
flowdeck ui simulator screen -S "iPhone 16" --output /tmp/screenshot.png
flowdeck ui simulator screen -S "iPhone 16" --tree --json # tree only--by-id) over labels — faster and more reliable.flowdeck ui simulator scroll --until "id:yourElement" -S "iPhone 16" before tapping.FLOWDECK_HID_STABILIZATION_MS and FLOWDECK_TYPE_DELAY_MS when needed.Every workflow starts the same way: check config, then act.
flowdeck config get --json # Check saved settings
# If no config: flowdeck context --json -> flowdeck config set ...
flowdeck run # Launch app
flowdeck apps # Get app ID
flowdeck logs <app-id> # Watch runtime
flowdeck ui simulator session start -S "iPhone 16" --json # Start session on the active simulator
# Parse JSON → save latest_screenshot and latest_tree paths
# Read latest_screenshot with Read tool # SEE the current screen
# Read latest_tree with Read tool # SEE element labels/IDs
# Ask user to reproduce the bug, then:
# Read latest_screenshot again # SEE what changed
# Read latest_tree again # INSPECT element state
# Analyze, fix code, re-run, verify again
flowdeck ui simulator session stop -S "iPhone 16" # Stop session when doneflowdeck config get --json # Check saved settings
# If no config: flowdeck context --json -> flowdeck config set ...
flowdeck run
flowdeck apps # Get app ID
flowdeck ui simulator session start -S "iPhone 16" --json # Start session on the active simulator
# Parse JSON → save latest_screenshot and latest_tree paths
flowdeck logs <app-id> # See what's happening
# Read latest_screenshot with Read tool # NOW you have data, not guesses
flowdeck ui simulator session stop -S "iPhone 16" # Stop session when doneflowdeck config get --json # Check saved settings
# If no config: flowdeck context --json -> flowdeck config set ...
# Implement the feature
flowdeck build # Verify compilation
flowdeck run # Test it
flowdeck ui simulator session start -S "iPhone 16" --json # Start session on the active simulator
# Parse JSON → save latest_screenshot and latest_tree paths
# Read latest_screenshot with Read tool # Verify the feature looks right
# Read latest_tree with Read tool # Verify elements exist
# If you need to interact:
# flowdeck ui simulator tap "Button" -S "iPhone 16" --json # Tap
# Read latest_screenshot again # VERIFY the tap worked
flowdeck ui simulator session stop -S "iPhone 16" # Stop session when done-i, --interactive - Launch interactive mode (terminal UI with build/run/test shortcuts)--changelog - Show release notes--version - Show installed versionInteractive Mode Highlights:
B build, R run, Shift+R run without build, T/U tests, C/K clean, L logs, X stop appS scheme, D device/simulator, G build config, W workspace/projectE devices/sims/runtimes, P project tools, F FlowDeck settings, H support, ? help overlay, V version, Q quitP) → Export Project ConfigThese still work for compatibility but prefer full commands:
log (logs), sim (simulator), dev (device), up (update)
FLOWDECK_LICENSE_KEY - License key for CI/CD (avoids machine activation)DEVELOPER_DIR - Override Xcode installation pathFLOWDECK_NO_UPDATE_CHECK=1 - Disable update checks# For iOS Simulator (get workspace and scheme from 'flowdeck context --json')
flowdeck run -w App.xcworkspace -s MyApp -S "iPhone 16"
# For macOS
flowdeck run -w App.xcworkspace -s MyApp -D "My Mac"
# For physical iOS device
flowdeck run -w App.xcworkspace -s MyApp -D "iPhone"This builds, installs, and launches the app. Note the App ID returned.
# See running apps and their IDs
flowdeck apps
# Attach to logs for a specific app
flowdeck logs <app-id>Why separate run and logs?
With logs streaming, ask the user to interact with the app:
"I'm watching the app logs. Please tap the Login button and tell me what happens on screen."
Watch for:
# Start a session
flowdeck ui simulator session start -S "iPhone 16" --jsonThe JSON output tells you where to read. Example:
{
"success": true,
"udid": "A1B2C3D4-...",
"latest_screenshot": "/Users/you/project/.flowdeck/automation/sessions/9E6A58EF/latest.jpg",
"latest_tree": "/Users/you/project/.flowdeck/automation/sessions/9E6A58EF/latest-tree.json"
}Save these absolute paths. Then use your Read tool on them:
latest_screenshot — you will see the current simulator screen as a JPEG image.latest_tree — you will see element labels, accessibility IDs, roles, and frames as JSON.These files update automatically (~500ms). After any UI action, wait ~1 second and read them again to see the result.
Fallback (only if sessions are not working even after a restart):
flowdeck ui simulator screen -S "iPhone 16" --output /tmp/screenshot.png# After making code changes
flowdeck run -w App.xcworkspace -s MyApp -S "iPhone 16"
# Reattach to logs
flowdeck apps
flowdeck logs <new-app-id>
# Session continues capturing — read latest_screenshot with Read tool to verify the fix
# If the session looks stale after relaunch, restart the session and replace the saved paths
# IMPORTANT: always verify by reading the screenshot after code changes
# Stop session when done
flowdeck ui simulator session stop -S "iPhone 16"Repeat until the issue is resolved.
1. flowdeck config get --json # Check for saved settings
(if none: flowdeck context --json -> config set)
2. flowdeck run # Launch app
3. flowdeck apps # Get app ID
4. flowdeck logs <app-id> # Attach to logs
5. flowdeck ui simulator session start -S "iPhone 16" --json # Start session on the active simulator
6. Parse JSON → save latest_screenshot and latest_tree paths
7. Read tool on latest_screenshot # SEE the current screen
8. Read tool on latest_tree # SEE element labels/IDs
9. Ask user to reproduce → re-read latest_screenshot # SEE what changed
10. Analyze and fix code → re-run → re-read screenshot # VERIFY fix
11. flowdeck ui simulator session stop -S "iPhone 16" # Stop when done1. flowdeck config get --json # Check for saved settings
(if none: flowdeck context --json -> config set)
2. Implement the feature # Write code
3. flowdeck build # Verify it compiles
4. flowdeck run # Launch and test
5. flowdeck ui simulator session start -S "iPhone 16" --json # Start session on the active simulator
6. Parse JSON → save latest_screenshot and latest_tree paths
7. Read tool on latest_screenshot # VERIFY the feature looks right
8. Read tool on latest_tree # VERIFY elements exist
9. flowdeck apps + logs # Check for errors
10. flowdeck ui simulator session stop -S "iPhone 16" # Stop when done1. flowdeck config get --json # Check for saved settings
(if none: flowdeck context --json -> config set)
2. flowdeck run # Run it yourself
3. flowdeck apps # Get app ID
4. flowdeck logs <app-id> # Watch what happens
5. flowdeck ui simulator session start -S "iPhone 16" --json # Start session on the active simulator
6. Parse JSON → save latest_screenshot and latest_tree paths
7. Read tool on latest_screenshot # SEE what's on screen
8. Ask user what they expected # Compare with what you see
9. flowdeck ui simulator session stop -S "iPhone 16" # Stop when done1. flowdeck config get --json # Check for saved settings
(if none: flowdeck context --json -> config set)
2. flowdeck run # Run the app
3. flowdeck ui simulator session start -S "iPhone 16" --json # Start session on the active simulator
4. Parse JSON → save latest_screenshot path
5. Read tool on latest_screenshot # SEE current state
6. Compare user screenshot with what you see # Identify differences
7. flowdeck logs <app-id> # Check for related errors
8. flowdeck ui simulator session stop -S "iPhone 16" # Stop when done1. flowdeck config get --json # Check for saved settings
(if none: flowdeck context --json -> config set)
2. flowdeck run --log # Use --log to capture startup
3. Read the crash/error logs
4. Fix the issue
5. flowdeck run # Rebuild and testIf you need to pass all parameters manually (rare - prefer creating config):
flowdeck build -w App.xcworkspace -s MyApp -S "iPhone 16"
flowdeck run -w App.xcworkspace -s MyApp -S "iPhone 16"
flowdeck test -w App.xcworkspace -s MyApp -S "iPhone 16"If you run many commands with the same settings, use flowdeck config set:
# 1. Save settings once
flowdeck config set -w App.xcworkspace -s MyApp -S "iPhone 16"
# 2. Run commands without parameters
flowdeck build
flowdeck run
flowdeck testIf you need to clear saved settings for the current folder:
flowdeck config reset
flowdeck config reset --json# 1. Create a temporary config file
cat > /tmp/flowdeck-config.json << 'EOF'
{
"workspace": "App.xcworkspace",
"scheme": "MyApp-iOS",
"configuration": "Debug",
"platform": "iOS",
"version": "18.0",
"simulatorUdid": "A1B2C3D4-E5F6-7890-ABCD-EF1234567890",
"derivedDataPath": "~/Library/Developer/FlowDeck/DerivedData",
"xcodebuild": {
"args": ["-enableCodeCoverage", "YES"],
"env": {
"CI": "true"
}
},
"appLaunch": {
"args": ["-SkipOnboarding"],
"env": {
"DEBUG_MODE": "1"
}
}
}
EOF
# 2. Use --config to load from file
flowdeck build --config /tmp/flowdeck-config.json
flowdeck run --config /tmp/flowdeck-config.json
flowdeck test --config /tmp/flowdeck-config.json
# 3. Clean up when done
rm /tmp/flowdeck-config.jsonNote: workspace paths in config files are relative to the project root (where you run FlowDeck), not the config file location.
FlowDeck auto-loads local settings files from your project root:
.flowdeck/build-settings.json - xcodebuild args/env for build/run/test.flowdeck/app-launch-settings.json - app launch args/env (run only).flowdeck/build-settings.json
{
"args": ["-enableCodeCoverage", "YES"],
"env": { "CI": "true" }
}.flowdeck/app-launch-settings.json
{
"args": ["-SkipOnboarding"],
"env": { "API_ENVIRONMENT": "staging" }
}Settings are merged in this order (lowest -> highest):
flowdeck config set)--config JSON file.flowdeck/-S, -D, -C, --xcodebuild-options, etc.)When resolving a target from a config file, FlowDeck prioritizes:
deviceUdid (physical device)simulatorUdid (exact simulator)platform + version (auto-resolve best match)platform: "macOS" (native Mac build)flowdeck -i, open Project Tools (P), then Export Project Configflowdeck context --json > .flowdeck/config.jsonIf you see "LICENSE REQUIRED", "trial expired", or similar:
flowdeck license activate <key> if they have a keyflowdeck license status to check current statusFLOWDECK_LICENSE_KEY instead of activating| Error | Solution |
|---|---|
| "No saved config found" | Run flowdeck context --json then flowdeck config set -w <ws> -s <scheme> -S "<sim>" |
| "Missing required target" | Add -S "iPhone 16" for simulator, -D "My Mac"/"My Mac Catalyst" for macOS, or -D "iPhone" for device (or create a config) |
| "Missing required parameter: --workspace" | Create a config with flowdeck config set -w <ws> ... or pass -w explicitly |
| "Simulator not found" | Ask the user if they want to create a new simulator. Use flowdeck simulator list --available-only to check, then flowdeck simulator create ... |
| "Device not found" | Run flowdeck device list to see connected devices |
| "Scheme not found" | Run flowdeck context --json or flowdeck project schemes -w <ws> to list schemes |
| "License required" | Activate with flowdeck license activate <key> or purchase at flowdeck.studio/cli/purchase/ |
| "App not found" | Run flowdeck apps to list running apps |
| "No logs available" | App may not be running; use flowdeck run first |
| "Need different simulator/runtime" | Ask user to confirm, then flowdeck simulator runtime create iOS <version> and flowdeck simulator create ... |
| "Runtime not installed" | Use flowdeck simulator runtime create iOS <version> to install |
| "Package not found" / SPM errors | See resources/package-resolution.md |
| Outdated packages | Run flowdeck project packages update |
| "Provisioning profile" errors | Run flowdeck project sync-profiles |
Most commands support --json (often -j) for programmatic parsing. Common examples:
flowdeck config get --json
flowdeck context --json
flowdeck build --json
flowdeck run --json
flowdeck test --json
flowdeck apps --json
flowdeck simulator list --json
flowdeck ui simulator screen -S <name-or-udid> --json
flowdeck device list --json
flowdeck project schemes --json
flowdeck project configs --json
flowdeck project packages resolve --json
flowdeck project sync-profiles --json
flowdeck simulator runtime list --json
flowdeck license status --jsonNote: When config is saved, JSON commands also work without explicit flags.
When the user provides a design reference — an image, a Figma link, or a verbal description — and asks you to build UI from it, follow this automated workflow. See resources/pixel-perfect-design.md for the complete methodology.
The workflow is the same regardless of the design source. The only difference is how you extract specs in step 1:
Activate this workflow when ANY of these conditions are true:
Explicit signals (user provides a design reference):
figma.com/design/..., figma.com/file/...)Implicit signals (user is describing a UI to build):
During implementation (mid-task triggers):
1. EXTRACT SPECS from the design source
If IMAGE: Read the image with the Read tool
- Identify visual hierarchy, layout strategy, spacing rhythm
- Estimate measurements, typography, colors, effects
- See Phase 0 + Phase 1 in resources/pixel-perfect-design.md
If FIGMA LINK: Use the Figma MCP server
- Fetch exact spacing, typography, colors, effects, and component structure
- No estimation needed — use the exact values returned
In both cases: Document all specs as code comments before writing any views
2. IMPLEMENT in layers (structure → typography → colors → shapes → effects)
- Use explicit spacing (spacing: 0 on stacks, fixed Spacers)
- Use exact colors (hex values, not .gray/.blue approximations)
- Use .continuous corner style for rounded rectangles
- Never use default .padding() — always specify exact values
3. BUILD and LAUNCH
flowdeck run
4. START SESSION and NAVIGATE TO THE TARGET SCREEN
flowdeck ui simulator session start -S "<simulator>" --json
# Parse JSON → save latest_screenshot and latest_tree paths
# Read latest_tree to find navigation elements
# Tap/scroll through the app to reach the screen you're implementing:
flowdeck ui simulator tap "Tab Name" -S "<simulator>" --json
flowdeck ui simulator tap "List Item" -S "<simulator>" --json
# Read latest_screenshot to confirm you're on the right screen
5. COMPARE against design
- Read latest_screenshot with Read tool
- Compare against original design image
- Squint test: do they have the same visual weight and rhythm?
- Check: margins, spacing, typography, colors, shadows, alignment
6. DOCUMENT discrepancies specifically
// e.g., "Title top margin: 52pt in impl, ~60pt in design → increase by 8pt"
7. FIX one discrepancy at a time
- Edit code
- flowdeck run (rebuild)
- Navigate back to the target screen (repeat step 4 navigation)
- Read latest_screenshot to verify the fix
- Do NOT batch fixes — one change at a time
8. REPEAT steps 5-7 until no visible differences remain
9. VERIFY on multiple screen sizes (navigate to screen on each)
flowdeck run -S "iPhone SE (3rd generation)"
# Navigate to screen, capture, check for overflow/clipping
flowdeck run -S "iPhone 16 Pro Max"
# Navigate to screen, capture, check proportions.padding(.horizontal, 20) not .padding(); Color(hex: "#1A1A1A") not .blackRoundedRectangle(cornerRadius: 16, style: .continuous) for Apple-style squircles#1A1A1A for body text, not #000000 (softer, more professional).shadow() calllatest_screenshot after navigating to the target screenflowdeck config get --json before any build/run/testcontext --json, then config setflowdeck run -S "iPad Pro" for one-off targetsflowdeck run to launch - Never use open commandflowdeck apps first - Know what's running before launchingflowdeck simulator for all simulator ops - List, create, boot, delete, runtimes© SwiftedMind, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 21 other files in .codex/skills/flowdeck of SwiftedMind/Tessera.
Open the folder on GitHubat commit 8956e9b
Flowdeck 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.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Flowdeck this skillSwiftedMind/Tessera | 116 | — | ~11k | Automated safety check: Pass | MIT | |
| Orca iOS Simulator Controlstablyai/orca | 87k | 1 repos | ~584 | Automated safety check: Pass | Apache-2.0 | |
| Apple Crash Log .NET Symbolicationdotnet/skills | 5.6k | 1 repos | ~2.4k | Automated safety check: Pass | MIT | |
| SwiftUI Design SkillWholiver/swiftui-design-skill | 210 | — | ~2.8k | Automated safety check: Pass | MIT | |
| Bootstrap iOSRayFernando1337/rayfernando-skills | 130 | — | ~1.1k | Automated safety check: Pass | Apache-2.0 | |
| Xcstrings ManagerEslzzyl/Pixiv-SwiftUI | 111 | — | ~482 | Automated safety check: Pass | AGPL-3.0 |
stablyai/orca
iOS Simulator control from inside Orca, with the live device view in Orca's emulator pane. Use when driving a booted Apple Simulator on macOS: taps, gestures…
dotnet/skills
Resolves .NET runtime frames in Apple .ips crash logs to function names, source files and line numbers using dSYM symbols, atos and the Microsoft symbol server.
Wholiver/swiftui-design-skill
Guides the agent to design distinctive SwiftUI interfaces for iOS and macOS, with six anti-generic rules, a design direction workflow and a five-dimension review.
RayFernando1337/rayfernando-skills
Bootstrap agents for iOS, iPadOS, macOS, Swift, SwiftUI, SwiftData/Core Data, Swift Testing, Xcode build/test/debug, Simulator, App Intents, or XcodeBuildMCP work.
Eslzzyl/Pixiv-SwiftUI
Manage Xcode String Catalog (.xcstrings) localization files through a command-line interface.
EveryInc/compound-engineering-plugin
Builds an iOS app, exercises it on a simulator with XcodeBuildMCP and reports PASS, FAIL or PARTIAL with screenshots, logs and per-screen evidence.
Categories
FlowDeck is REQUIRED for all Apple platform build/run/test/launch/debug/simulator/device/log/automation tasks. Flowdeck is an agent skill from SwiftedMind/Tessera. FlowDeck is REQUIRED for all Apple platform build/run/test/launch/debug/simulator/device/log/automation tasks.
Flowdeck fits situations like: project discovery; simulator management (create/boot/screenshot/erase); device operations (install/launch/logs); UI automation (flowdeck ui simulator).
Run `npx skills add SwiftedMind/Tessera --skill flowdeck -a claude-code`. Or copy the skill folder (.codex/skills/flowdeck in SwiftedMind/Tessera) into .claude/skills/flowdeck in your project. Claude Code loads it when a task matches its description.
Run `npx skills add SwiftedMind/Tessera --skill flowdeck -a codex`. Or copy the skill folder (.codex/skills/flowdeck in SwiftedMind/Tessera) into .agents/skills/flowdeck in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add SwiftedMind/Tessera --skill flowdeck -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/flowdeck, .gemini/skills/flowdeck, .github/skills/flowdeck and .opencode/skills/flowdeck in your project.
Going by SKILL.md and its folder, Flowdeck needs the command-line tools its instructions call (rg and xcrun) and credentials named FLOWDECK_LICENSE_KEY.
SKILL.md names 1 domain. As links in the text: flowdeck.studio. This is read from the text; nothing was executed.
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.
Flowdeck is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 11k tokens (SKILL.md is roughly 43k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Flowdeck: Orca iOS Simulator Control (stablyai/orca, 87k stars), Apple Crash Log .NET Symbolication (dotnet/skills, 5.6k stars), SwiftUI Design Skill (Wholiver/swiftui-design-skill, 210 stars) and Bootstrap iOS (RayFernando1337/rayfernando-skills, 130 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
SwiftedMind (a GitHub user) maintains it in SwiftedMind/Tessera, which has 116 GitHub stars. The repository was last updated on April 24, 2026.
Source: SwiftedMind/Tessera on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.