id = "selfcontrol" name = "SelfControl" homepage = "https://selfcontrolapp.com/" # The project's own README, "About", trimmed to one sentence. description = "A free and open-source application for macOS that lets you block your own access to distracting websites." # The app icon at the largest size selfcontrolapp.com publishes. icon = "https://selfcontrolapp.com/img/apple-touch-icon-144-precomposed.png" # SelfControl ships no command-line tool, so `detect` carries the bundle # identifier. It is the one the project uses for itself: the repository holds # org.eyebeam.SelfControl.plist, its daemon is Daemon/org.eyebeam.selfcontrold.plist, # and the Homebrew cask zaps ~/Library/Preferences/org.eyebeam.SelfControl.plist # (Casks/s/selfcontrol.rb). executables = [] platforms = ["macos"] [installation] macos_bundle_ids = ["org.eyebeam.SelfControl"] [dotfiles] # The blocklist and the block settings are ordinary user defaults. SCConstants.m # registers them under `defaultUserDefaults` — "Blocklist" (the list of hosts), # "BlockAsWhitelist", "EvaluateCommonSubdomains", "IncludeLinkedDomains" and the # rest — and PreferencesGeneralViewController reads them back through # NSUserDefaults, so they land in the app's preferences domain. The Homebrew # cask names the same file in its zap stanza. [preferences] is # ~/Library/Preferences, and this entry is macOS-only, so there is no other # platform for that root to stand for. # # Common/SCSettings.m is deliberately not listed: the "secured settings" it # writes are the running block's state, kept in SETTINGS_FILE_DIR under a # root-owned file whose name is a SHA-1 of the machine's serial number, outside # the user's home entirely. paths = ["[preferences]/org.eyebeam.SelfControl.plist"] exclude = [] # No credential: SelfControl is free software and the domain holds a list of # hostnames the user chose to block, plus durations and UI settings. secret = [] # No machine_lines: the blocklist and the block duration are the whole reason # to carry the domain. A macOS property list has no matcher in this schema in # any case — `format` covers toml, yaml and json only — so a plist entry is # paths and nothing else.