The settings file

Everything you set in the app's Settings window is saved in one JSON file, the deployment config:

Text
~/Library/Application Support/CleanSignals/deployment-config.json

The app reads its settings only from this file and reloads it when you click Save. You can export it from Settings → General and import it on another Mac. This Mac keeps its own deviceId when you import.

The file contains your webhook secret. Share it only with people you trust.

Fields#

Field Default Meaning
schemaVersion 1 Version of this file's format.
orgId "personal" Organisation id, sent as org_id.
externalRef "" Optional reference, sent as external_xref.
deviceId generated Id of this Mac.
salt generated Private value used to make coded ids. Never sent.
webhookURL "" Where batches go. Empty means "keep on this Mac".
webhookSecret "" Secret used to sign batches.
savedDashboardURL, savedDashboardSecret "" The last CleanSignals dashboard address and secret, so Settings can switch back to it.
savedCustomURL, savedCustomSecret "" The last address and secret of your own webhook, kept for the same reason.
flushIntervalSeconds 60 How often to send.
maxBatch 500 Most signals in one batch.
enabledSignals see below {"app.focus": true, …} on/off per signal.
excludedBundleIds password managers, Messages, Health… Apps that are never observed.
excludedDomains password managers, banks… Websites that are never observed.
excludedTitleWords password, payslip, salary, medical, bank statement Windows whose title contains one of these are never observed.
retentionDays 30 How long sent data stays on this Mac.
idleThresholdSeconds 180 No input for this long counts as idle.
episodeGapSeconds 300 A break this long starts a new task episode.
workCategories 10 categories [{"name": "...", "description": "..."}] for work.category.
taskLabels 9 task names Same shape, for task.label.
appCategories {} Your own app → category rules, such as {"com.acme.crm": "data_entry"}.
useAppleIntelligence true Use Apple's on-device model when the Mac has it.
screenshotReader false Read text from window pictures for apps that show little text.
startAtLogin true Open CleanSignals when you log in.
paused false Stop noticing and sending.

All signals are on by default except input.pattern (sensitive) and the two "coming later" signals.

Example#

JSON
{
  "orgId": "acme",
  "externalRef": "emp-00421",
  "webhookURL": "https://cleansignals.io/v1/signals/rcv_0123456789abcdef01234567",
  "webhookSecret": "whsec_…",
  "flushIntervalSeconds": 60,
  "enabledSignals": { "input.pattern": false, "task.label": true },
  "excludedDomains": ["revolut.com", "mybank.ie"],
  "workCategories": [
    { "name": "customer_support", "description": "support tickets, replying to customers, help desk" },
    { "name": "sales", "description": "CRM, deals, leads, proposals, pipeline" }
  ]
}

Missing fields take their defaults, so a file can be as short as you like.

The Settings window shows the same values in a friendlier form. Its Delivery page offers three destinations (CleanSignals dashboard, your own webhook, or keep on this Mac) and fills webhookURL and webhookSecret from the saved values when you switch.

Later, for companies#

In company deployments, this file will be signed and locked by an administrator and installed on many Macs at once. The secret will move to the macOS Keychain.