From download to your first automated device in under 30 minutes.
| Requirement | Details |
|---|---|
| macOS | macOS 12 (Monterey) or later |
| Xcode | Xcode 12+ for iOS <17, Xcode 15+ for iOS 17.0–17.3, Xcode 15.3+ for iOS 17.4+ |
| Apple Developer Account | Paid account ($99/year) — free accounts are too limited for ControlFloor |
| iOS Devices | iOS 14+, trusted/paired with the Mac, Developer Mode enabled (iOS 16+) |
| Device Settings | Auto-Lock set to "Never" (Settings → Display & Brightness → Auto-Lock) |
| Keyboards | For keyboard automation: only two keyboards installed — one Western layout (e.g. English) and the Emoji keyboard |
| Python | Python 3.8+ for the Python API (optional, for scripting) |
Run the installer on each Mac that will host devices:
$ /bin/bash -c "$(curl -fsS https://controlfloor.com/dl/install.sh)"This creates the ~/cf directory containing the server, provider, iOS apps, and utilities. If setup fails partway through, re-run:
$ cd ~/cf
$ ./setup.shControlFloor includes three iOS apps that must be re-signed with your Apple Developer certificate before deploying to your devices. See the Signing Guide for full details.
Quick version:
# Unlock the keychain (you'll be prompted for your Mac password)
$ security unlock
# Set your signing identity and provisioning profile
$ export CFA_SIGNING_IDENTITY="your-signing-identity-hash"
$ export CFA_PROVISIONING_PROFILE="/path/to/your.mobileprovision"
# Sign all iOS apps
$ ./apps/Utils/sign_all.macos.sh ./apps/*.appEdit ~/cf/server/config.json:
{
"listen": ":8080",
"https": true
}By default, the server generates a self-signed TLS certificate. For production use, you can provide your own certificates. See HTTPS Configuration below.
The admin password is set during the initial setup. You can change it later via the CLI (see User Management).
$ cd ~/cf/server
$ ./cfserver run
The server starts and listens on the configured port. Access the web dashboard at
https://localhost:8080 (or your server's hostname).
Edit ~/cf/provider/config.json:
{
"licenseKeys": ["your-license-key-here"],
"controlfloor": {
"host": "localhost:8080",
"https": true,
"selfSigned": true
}
}
If you're running the Provider on a different Mac than the Server, replace
localhost with the Server's hostname or IP address.
Set selfSigned to false
if using a real TLS certificate.
On the same machine as the server, the first provider auto-pairs as
provider1 with a randomly generated password.
For additional providers or remote machines:
$ cd ~/cf/provider
$ ./cfprovider registerYou'll be prompted for admin credentials and a name for the new provider. The registration process assigns credentials that the provider uses to authenticate with the server.
Single device mode:
# List connected devices to find UDIDs
$ ./bin/go-ios list --details --pretty
# Run provider for a specific device
$ ./cfprovider run --udid YOUR_DEVICE_UDIDRunner mode (all devices):
$ ./cfprovider runnerRunner mode automatically detects all connected devices and manages them. It handles reconnections, launches agents, and keeps devices running unattended. This is the recommended mode for production deployments.
Each device needs initial configuration for optimal automation. ControlFloor can do this automatically:
This disables auto-correct, auto-capitalization, smart punctuation, and configures assistive controls needed for automation.
ControlFloor supports three HTTPS modes:
The server generates a self-signed certificate on first run. Suitable for development and internal use. Clients will need to accept the self-signed certificate.
Provide your own certificate and key in config.json:
{
"crt": "/path/to/fullchain.pem",
"key": "/path/to/privkey.pem"
}Point to your Let's Encrypt certificate files:
{
"crt": "/etc/letsencrypt/live/your-domain/fullchain.pem",
"key": "/etc/letsencrypt/live/your-domain/privkey.pem"
}Manage users via the server CLI:
# Create a new user
$ ./cfserver create-user -username new_user
# Change a user's password
$ ./cfserver modify-user -username admin -change-password
# Delete a user
$ ./cfserver delete-user -username old_useriOS 17 introduced a new device communication model called Remote Service Discovery (RSD). Traditional usbmuxd-based communication no longer works for many operations. ControlFloor supports multiple QUIC-based tunnel methods:
ControlFloor's own tunnel implementation using remotedtool
and utunuds helper binaries (set to suid root).
This is the default and recommended method. Note: a short range of early iOS 17
firmware versions are not supported by this method — use PMD3 for those devices.
Uses pymobiledevice3 to create individual QUIC tunnels per device. Requires Python 3 and pymobiledevice3 installed. Good fallback for devices where the internal method is not available.
Runs pymobiledevice3's tunneld daemon as a separate process
to manage all device tunnels centrally. Must be launched before the Provider.
See the Provider Configuration docs for detailed setup instructions for each tunnel method.