id = "controlplane" name = "ControlPlane" homepage = "http://www.controlplaneapp.com" description = "A macOS menu-bar app that automatically switches your Mac's configuration based on where you are and what's happening around you." # The source art for the app's own icon, from its repository — # controlplaneapp.com publishes no icon. icon = "https://raw.githubusercontent.com/dustinrue/ControlPlane/main/Resources/cp-icon-source.png" # ControlPlane ships no command-line tool, so `detect` carries the name of the # executable inside the app bundle rather than a binary on $PATH. executables = ["ControlPlane"] platforms = ["macos"] [dotfiles] # Sources/ControlPlaneApp/AppDatabase.swift says it on the type itself: "The # database file lives in ~/Library/Application Support/ControlPlane/ (or inside # the sandbox container when the app is sandboxed — FileManager resolves the # correct path automatically in both cases)", and its appSupportDirectory() # builds that path from FileManager's .applicationSupportDirectory plus # "ControlPlane". Sources/ControlPlaneApp/SensorConfigStore.swift writes into # the same directory — "Persists sensor option values to a JSON file in # Application Support", sensor-config.json. On macOS, the only platform this # app runs on, that directory is [appData]. # The profiles, rules and actions are rows in the SQLite database next to the # JSON, so the directory is listed whole rather than file by file. paths = ["[appData]/ControlPlane/"] # Caches and logs are not written here; there is nothing to carve out. # Nothing in this directory is a whole-file credential: the JSON holds sensor # option values (an SSID, a USB vendor id) and the database holds profiles and # rules. An action that needs a secret runs a Shortcut or a shell script, which # keeps its own elsewhere. secret = [] # No machine_lines: a rule matches on an SSID, a Bluetooth device name or a USB # id, which is exactly what a user wants to carry to the next Mac, and the rules # live in a SQLite database that prefix and key_path matching cannot read.