How CleanSignals works
In one sentence#
CleanSignals is a small Mac app that notices how you use your computer, turns that into simple, private facts called signals, and sends only those facts to a server you choose.
The idea#
Most tools that study computer work record everything: screenshots, every key you press, what you copy. Then they try to hide the private parts.
CleanSignals does the opposite. It never records the private parts in the first place. It looks at what is happening, works out a short fact such as "Excel was used for 12 minutes", and keeps only that fact.
Installing#
- Download CleanSignals.dmg from the website and open it.
- In the window that appears, drag CleanSignals onto the Applications folder.
- Open CleanSignals from your Applications folder, not from the installer window.
- The welcome screen asks for one permission, Accessibility. Turn it on in System Settings → Privacy & Security → Accessibility. The welcome screen ticks itself off when it is done.
The app needs macOS 14 or later and works on Apple silicon and Intel Macs. It is signed and notarised by Apple.
How it works, step by step#
- You install the app from the website and give it one permission in System Settings, called Accessibility. This lets it see which app and window are in front.
- You choose your settings: which signals to send, which apps and websites to ignore, and where to send the data.
- The app watches quietly from the menu bar. It notices small moments called events, like "you switched to Mail" or "you stopped typing". Events stay on your Mac.
- The app builds signals from those events, such as "45 minutes of focused work in Excel". Signals contain only times, counts, categories and coded ids. Never text, never pictures.
- The app sends signals to the server every minute, in a signed package so the server knows they are genuine.
- You can see everything sent in the Activity log in the menu bar, and you can pause at any time.
What the app never sends#
- What you type
- What you copy and paste
- Screenshots
- Window titles, file names and web addresses (only the website name, such as workday.com)
- Where your mouse is on the screen
Events: what the app notices (15, never sent)#
| Event | What it means |
|---|---|
| app.activated | You brought an app to the front. |
| window.changed | A different window or document came to the front. |
| title.changed | The same window changed its title, like a new browser tab. |
| url.changed | The browser went to a different web address. |
| typing.started | You started typing after a pause. Keys are not recorded. |
| typing.paused | You stopped typing for two seconds. |
| click | You clicked. The position is not recorded. |
| scroll | You scrolled. |
| copy.detected | You copied something. Only its type, size and app are noted. |
| paste.detected | You pasted something, and into which app. |
| idle.started | No keyboard or mouse use for three minutes. |
| idle.ended | You came back. |
| screen.locked | The screen was locked or the Mac went to sleep. |
| screen.unlocked | The screen was unlocked or the Mac woke up. |
| heartbeat | A "still working" tick every minute while you are active. |
Signals: what the app sends (15 designed, 12 in the first version)#
Time and activity
| Signal | What it tells | First version |
|---|---|---|
| activity.presence | When you were active, idle or away. | Yes |
| activity.intensity | How busy each five minutes was, as counts of keys, clicks and scrolls. | Yes |
| work.day.summary | When your day started and ended, active time, breaks, longest focus. | Yes |
Apps
| Signal | What it tells | First version |
|---|---|---|
| app.focus | Which app was in front, from when to when, and its category. | Yes |
| app.usage.summary | Time per app per hour or day, and how often you switched. | Yes |
| window.context | The kind of window, such as document or ticket, and the website name. | Yes |
How work flows
| Signal | What it tells | First version |
|---|---|---|
| app.switch | You moved from one app to another, and how long you stayed in the first. | Yes |
| task.episode | One continuous piece of work: how long, which apps, how many switches and pastes. | Yes |
| handover | Something was copied in one app and pasted in another. Not what it was. | Yes |
| process.step | Each single action inside a task, for process-mapping tools. | Later |
Working style
| Signal | What it tells | First version |
|---|---|---|
| input.pattern | Your typing rhythm. Off unless you switch it on, because it is sensitive. | Off |
| interaction.friction | Signs of struggle, like undoing many times. | Later |
Understanding the work (uses a small classifier built into the app)
| Signal | What it tells | First version |
|---|---|---|
| work.category | The kind of work, such as email, data entry or analysis. | Yes |
| task.label | A name for each task from your own list, such as "payroll". | Yes |
| document.ref | A coded id for each file, so shared files can be spotted without names. | Yes |
Telling activities apart in the same app#
A web browser can be email one minute and a budget document the next. The app tells them apart without pictures. Through the Accessibility permission it can read the web address, the tab title and the text on the page, on your Mac. For example:
| What the app reads on your Mac | What is sent |
|---|---|
| mail.google.com, "Inbox (3)" | work.category = communication |
| docs.google.com, "Q3 budget" | work.category = documentation |
| company.atlassian.net, "PROJ-142 Fix login" | work.category = ticketing |
A few apps, such as Figma or remote desktops, show very little text this way. For those you can switch on the optional screenshot reader. It takes a picture of the window, reads the words in it with Apple's built-in text reader, and deletes the picture straight away. It is off unless you turn it on, and pictures are never kept or sent.
The classifier, simply#
Two signals need to understand what the work is about. For those, the app uses Apple's language tools that are already part of macOS, so there is nothing extra to download. It reads the text in the window for a moment, compares it with the descriptions of your categories, picks the closest one, and forgets the text. Only the label is sent. On Macs with Apple Intelligence switched on, it can use Apple's own built-in AI for a better answer.
Because the categories are matched by meaning, you can edit the list in Settings and the app uses your new list straight away.
Where the data goes#
You decide, in Settings → Delivery. There are three choices:
- CleanSignals dashboard. Create an optional free account on the dashboard, click "Connect this Mac", and explore your data online. If this Mac is not connected yet, the page shows a "Get my dashboard address" button.
- My own webhook. Enter any https address and a secret. The documentation explains every field the app sends.
- Keep on this Mac. Nothing is sent. You can still read every signal in the Activity Log.
The app remembers the address and secret for each choice, so you can switch back and forth without losing anything. Signals collected before you connected are sent once you do.
The website and the download never need an account.
The free dashboard#
- Sign in with Google, an email link, or an email and password.
- Each account gets its own webhook address and secret. "Connect this Mac" fills them into the app for you.
- Up to 3 Macs per account. Use Connect a Mac to add another Mac, or to reconnect one that was sending somewhere else.
- See active time, apps used, switches, task episodes, a day timeline, time per app, kinds of work and a live feed.
- Signals are kept for 30 days and then deleted automatically. You can delete everything, or your whole account, at any time.
Knowing it is working#
The CleanSignals icon in the menu bar has a small coloured dot:
| Dot | Meaning |
|---|---|
| Green | Connected: collecting and delivering. |
| Yellow | Connecting: waiting for the first delivery to succeed. |
| Red | Delivery problem: recent sends failed and will be retried. |
| Orange | Needs permission: Accessibility is not allowed yet. |
| Blue | Not connected: signals are kept on this Mac. |
| Grey | Paused. |
Click the icon to see where signals are going, when the last delivery was, and today's numbers. Activity Log shows every event the app noticed (never sent), the latest signals, and every batch sent, with its exact content.
Settings at a glance#
| Page | What you see or set |
|---|---|
| Overview | Status at a glance, today's numbers, permissions, and which classifier is running. |
| Signals | Which signals to send, each with an on/off switch. |
| Privacy | Apps, websites and title words to keep out completely, idle and task timing, and how long data stays on your Mac. |
| Categories | Your list of work categories and task names, and whether to use Apple Intelligence. |
| Delivery | Where signals go (dashboard, your own webhook, or this Mac), how often to send, and a "Send test batch" button. |
| Identity | Your organisation id, an optional employee reference, this Mac's id and its coded subject. |
| General | Start at login, pause, the optional screenshot reader, import and export of the settings file, and deleting local data. |
Your settings are saved in a file on your Mac:
~/Library/Application Support/CleanSignals/deployment-config.json.
You can export it and import it on another Mac. It contains your webhook secret, so keep it private.
For companies#
The same app can be customised for large deployments: settings locked by the company, installation on many Macs at once, company-specific signals, and delivery straight into HR, analytics or AI platforms.