Skip to main content
FlowDeck ships built-in UI automation for macOS apps so you can drive native interfaces, validate UI state, and capture accessibility trees from the CLI. Use flowdeck ui mac to run automation commands.

What It Does

Use macOS automation to:
  • Capture screenshots and accessibility trees from any running macOS app.
  • Click elements, type text, scroll, drag, and navigate menus.
  • Wait for UI state changes and assert UI conditions.
  • Manage windows, launch/quit apps, and send keyboard shortcuts.

When to Use It

  • Smoke tests for macOS app flows.
  • Scripted demos or QA checks on native Mac apps.
  • AI-driven interaction loops that need consistent UI state.
  • Automating menu-driven workflows or window management.

Prerequisites

macOS automation requires two system permissions:
  1. Accessibility — allows FlowDeck to read the accessibility tree and inject input.
  2. Screen Recording — allows FlowDeck to capture window screenshots (macOS 14+).
Check and request permissions:
After granting permissions in System Settings > Privacy & Security, restart your terminal for changes to take effect.

Quick Start

The --app flag accepts an app name (e.g., "Safari"), bundle ID (e.g., "com.apple.Safari"), or PID (e.g., "12345"). It is required on most commands.

Background Mode (the default)

Action commands drive the app without moving your cursor or stealing focus, and you don’t pass a flag to get that. Events are delivered straight to the target app through the accessibility layer (and window-targeted system events for coordinate clicks), so the app doesn’t need to be frontmost — you keep working while automation runs.
To type into a field, focus it first with a tap, then type:
Both element targets and --point coordinates work in the background. An accessibility id or label is still the more robust choice, because coordinates break when the layout shifts.

Foreground Mode (--foreground)

--foreground opts out: events go to the global event tap, which moves your real cursor and brings the app forward. Five commands have no background path and refuse to run without it:
If you are driving FlowDeck from an agent, treat the refusal as a prompt to ask the user, not to re-run with --foreground. A background action that failed to find its element is a targeting problem — re-read the accessibility tree or use scroll --until — and there is deliberately no environment variable or config key that disables the gate for a whole session.
--background still parses but is a no-op, kept so existing scripts don’t break. Earlier versions had this backwards: foreground was the default and --background was opt-in, so one forgotten flag interrupted whatever you were doing.

Tangible Workflows

1) Automate a macOS app form fill

Use this to fill out a form in a native macOS app and verify the result.

2) Drive a menu-based workflow

3) Window management

4) Verify a build output visually

Build and run your macOS app, then capture its UI:
Compare /tmp/current-ui.png with the expected design and iterate.

App Targeting

The --app flag resolves targets in this order:
  1. Numeric — treated as a PID (e.g., --app "12345")
  2. Contains a dot — treated as a bundle ID (e.g., --app "com.apple.Safari")
  3. Otherwise — fuzzy-matched against running app names (e.g., --app "Safari")
To see all running GUI apps:

Differences from iOS Simulator Automation

Performance and Reliability Tips

  • Prefer accessibility identifiers and use --by-id for clicks, finds, and assertions (fastest and most reliable).
  • For automation loops, start a session and read latest-tree.json/latest.jpg from disk instead of calling screen every step.
  • For agent loops, run flowdeck ui mac session start --app "MyApp" --json to capture tree + screenshots in the background and read from ~/.flowdeck/automation/mac-sessions/<session-short-id>/ (use latest.json, latest.jpg, and latest-tree.json to find the newest capture). Starting a session stops any active macOS UI session first.
  • session start returns the session directory plus latest_screenshot and latest_tree paths in JSON.
  • macOS UI sessions stop automatically when the owner process that started them exits. Set FLOWDECK_OWNER_PID to bind a session to a specific owner process.
  • Use flowdeck ui mac screen --tree --json --app "MyApp" when you only need the accessibility tree (no screenshot).
  • Coordinates are screen-absolute points matching the values returned by find. Do not scale by Retina factors.
  • Use flowdeck ui mac find to discover element labels and IDs before interacting.
  • For smooth scrolling, use --smooth on the scroll command.
  • Tune input timing with environment variables:
    • FLOWDECK_HID_STABILIZATION_MS (default 25) for click/gesture stability
    • FLOWDECK_TYPE_DELAY_MS (default 1) for typing speed
For the complete command list and flags, see the macOS UI Automation command reference.