The settings file
Everything you set in the app's Settings window is saved in one JSON file, the deployment config:
~/Library/Application Support/CleanSignals/deployment-config.jsonThe 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#
{
"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.