Skip to main content
FlowDeck has two JSON config formats, and they are easy to confuse:
  1. Explicit command config used with --config
  2. Project settings config stored in .flowdeck/config.json or .flowdeck/config.local.json
Use --config for reproducible command invocations in CI, scripts, and one-off runs. Use the project settings files for shared project defaults and per-scheme overrides inside a repository.
Today, explicit --config remains the clearest way to drive a full build, run, or test invocation from the CLI. The project settings files are the canonical shared on-disk format, while legacy sidecar files remain supported for compatibility in current runtime paths.

Explicit Command Config (--config)

Explicit Command Config Structure

Explicit Command Config Field Reference

Explicit Command Config Target Resolution Priority

When determining the build target, FlowDeck uses this priority order:
  1. deviceUdid - Physical device (if specified and connected)
  2. simulatorUdid - Exact simulator by UDID
  3. platform + version - Auto-resolve best matching simulator
  4. platform: "macOS" - Native Mac build (no simulator needed)

Explicit Command Config Examples

Uses default Debug configuration and latest available iOS simulator.
Builds for macOS without simulator.
Get device UDID from flowdeck device list --json.
Targets iOS 17.5 simulator specifically. If not available, FlowDeck will create one.

Project Settings Files

Project settings files are the shared on-disk format for project-level defaults:
  • .flowdeck/config.json — shared team config, usually committed
  • .flowdeck/config.local.json — per-user local override, usually gitignored
When config.local.json exists and is valid JSON, it fully replaces config.json — it is not merged with the shared file. This is enforced by both the CLI (build/run/test) and the macOS app’s Settings UI. If config.local.json exists but fails to parse, the CLI ignores it and falls back to config.json, printing a warning that names the file and the decode error rather than silently treating the project as unconfigured. The same applies to a malformed config.json with no local override present. (The macOS app’s Settings UI falls back the same way but does not yet surface an equivalent warning.)

Config Discovery

build, run, and test no longer require you to invoke them from the exact directory that owns .flowdeck/. FlowDeck walks upward from the working directory (or --project, if passed) looking for the nearest ancestor directory that contains .flowdeck/config.json, .flowdeck/config.local.json, or one of the legacy compatibility files, and loads project settings from there. The walk stops before your home directory and before /, so it never mistakes your ~/.flowdeck/ global state (CLI state, license cache, etc.) for a project config.
This discovered directory — the “config root” — is used only for loading .flowdeck/config.json and its sidecars. Derived data, saved state, and other paths keyed by project location still use the exact directory you invoked FlowDeck from or passed via --project.
Run with --verbose to see which directory FlowDeck resolved as the config root, along with the final merged launch args and env — see App Launch Settings for details.

Project Settings Structure

Project Settings Field Reference

Each entry under schemes may contain:
  • configuration
  • appLaunch
  • xcodebuild

Legacy Compatibility Files

Older FlowDeck setups may still contain:
  • .flowdeck/schemes.json
  • .flowdeck/app-launch-settings.json
  • .flowdeck/build-settings.json
Prefer the project settings files for new setup and new documentation. Compatibility rule:
  • Missing fields in the new project settings config may be filled from legacy files.
  • Present-but-empty fields are treated as intentional and should not fall back to legacy files.

Custom Derived Data

Specify a custom derived data path to:
  • Avoid conflicts with Xcode
  • Enable parallel builds with separate derived data
  • Use faster storage (e.g., RAM disk)
Or on the command line:

xcodebuild Passthrough in --config

The xcodebuild section passes arguments and environment variables directly to xcodebuild:
See Xcodebuild Arguments for complete passthrough documentation and common arguments.

App Launch Settings in --config

The appLaunch section passes arguments and environment variables to your app when it launches (for run command only):
These are passed to simctl launch or the device launch process, not to xcodebuild.
See App Launch Settings for complete documentation, common arguments, and local settings file support.

File Locations

Project Config

Store shared project settings in your repository:
Keep config.local.json gitignored so local overrides do not replace the shared team config for everyone else.

Multiple Configurations

Create separate explicit --config files for different scenarios:

CLI Override

Command-line parameters override config file values:

Generating Config Files

From Interactive Mode

  1. Run flowdeck -i in your project directory
  2. Configure your build settings
  3. Press P, then select Export Project Config
  4. Save the exported explicit command config where you want to reuse it for --config

Troubleshooting

Config File Not Found

Ensure the path is correct:

Invalid JSON

Validate your JSON syntax:

Workspace Not Found

Workspace paths are relative to the project root (where you run FlowDeck), not the config file location:
If your workspace is in a subdirectory:

Simulator Not Available

If the specified simulator doesn’t exist:
  1. FlowDeck will try to resolve from platform + version
  2. If a matching runtime exists, it creates a new simulator
  3. Otherwise, it uses the first available simulator for that platform
To ensure consistency, use simulator UDID: