Privacy
Covers the Keepace Mac app and the “Keepace · AI status” browser component · Last updated 6 October 2026
In one line: Keepace reads the names of a few buttons beside an AI's input box (and, on Codex's website and in the ChatGPT desktop app, the running markers in the task list) to tell whether it is busy. On the Mac, to find AI windows, input boxes and conversations and tell them apart, it also reads a few other things: the position and size of AI windows, input boxes and those buttons, and the input box's own ID and class names; the address of the page each Safari (or other browser) window is showing, only to tell whether it is an AI site and which conversation, so one click takes you back to that conversation (any other site's address is dropped on the spot); and from 2.7.0, AI windows' numbers and whether they are on the current desktop (when checking desktops, only the numbers of other apps' windows), plus, in the Claude desktop app, the address of the page in its window and the class name of the frame around its input box (see “What the Mac app stores” below). Codex / Claude Code terminal sessions started from Keepace also hand their official events to Keepace: it keeps only things like the session ID and the project folder, and drops the prompts, commands and output those events carry on the spot (see below too). Beyond that, your conversations, what you type, page titles and accounts are never read, never recorded and never uploaded. Your to-dos and plans live on your own Mac. From 2.8.0, on a Mac with Apple silicon that doesn't have the on-device organizing model yet, Keepace downloads it on its own from ModelScope (modelscope.cn) or Hugging Face when conditions are right; to decide whether and where to download it, it reads on this Mac how much disk space is free, whether the network is metered or in Low Data Mode, whether Low Power Mode is on, and the system's region and time zone, without recording or uploading any of it (see “When it goes online” below).
What the browser component reads
The component runs only on the AI sites you have open (listed below), and there it does one thing: it looks at whether a button near the input box is marked Stop or similar, and from that tells whether the conversation is generating, waiting for you, or finished; on Codex's website it also counts how many tasks in the task list are running (see below).
- It reads: the accessibility names and tooltips of buttons (aria-label, title), their identifiers (stop-button, for instance), whether those controls are enabled, and whether a button is the submit button of the form the message box is in (in the component that comes with Keepace from 2.5.0, and in the Chrome Web Store version from 2.6.0). To find the message box it only checks whether a box is editable and whether it sits in a form; it never reads what is in the box. On Codex's website it also reads the accessibility name of the small icon that marks a task as running, the loading markers in the task list and the names of "Stop task" buttons, to count how many tasks are running; the addresses of the links they sit in are used only inside the page to tell whether a marker belongs to a task and to which one (so none is counted twice), and are not sent: the only address sent to the app is that of the page you are on, as described below (the component has always done this; this sentence was added on 29 September 2026).
- It does not read: conversation content, the text in your input box, the visible text on buttons (which may be a question the site suggests), page titles, cookies, sign-in state or browsing history.
- All that reaches the local app is: one status word (generating / waiting for you / idle / unknown), a random browser instance number, a tab number, how many tasks are running on a Codex web page (a single number from 0 to 50), the component's own version number and the version numbers of the button-name list it has received and is using (three numbers, component 2.6.0 and later), and one conversation address filtered through an allow-list — only the domain and the conversation ID, so that one click takes you back. For sites whose addresses can contain the question itself (Perplexity, for example), only the home page is kept.
The sites it runs on: ChatGPT, OpenAI Codex, Claude, Gemini, Grok, DeepSeek, Perplexity, Copilot, Mistral, Kimi, Doubao, Qwen, Yuanbao and Poe. It does not run anywhere else.
Where that goes
To exactly one place: the Keepace app running on this computer, handed over directly through Chrome's native messaging channel without touching the network. That channel accepts only Keepace's own component; other extensions cannot connect. The status lives in memory and is gone when the app closes.
Only two things travel the other way: a receipt saying whether Keepace received the message (the component's pop-up uses it to show whether it is connected to Keepace on this Mac), and, from component 2.6.0, the AI button-name list: the Keepace app fetches it from the website, checks its signature, and hands it to the component over the same local channel. The component only compares the list exactly (ignoring case and extra spaces) with button names and IDs and with the name of Codex's small “running” icon, and never uses it to read anything else; the component never goes online itself and never runs anything from the list — the list is text only, no code.
No server receives any of it. There is no analytics, no third-party SDK and no advertising. This website carries no tracking code or third-party scripts either.
What the Mac app stores
| What | Where | Uploaded? |
|---|---|---|
| To-dos, plans, mind maps, the words you dictated, work records | Your Mac: ~/Library/Application Support/Keepace | No |
| Dictation | Prefers on-device macOS recognition; the local sorting model runs entirely offline | No |
| AI status observations (what is seen in desktop apps and on web pages) | In memory; after a restart they count as unknown. A “Progress to check” reminder you haven't dealt with is noted on this Mac with the AI's name, whether it was the desktop app or a web page, and the time (desktop-return-checkpoints.json), and after a restart it is still under “All AI” for up to a day; older ones are removed the next time Keepace opens (added here in October 2026. Before 2.7.0, a single reminder from a web AI such as Gemini made the whole record unreadable, and it was no longer cleaned up; the first time 2.7.0 opens, it reads the record and cleans it up). Terminal sessions: see the next row | No |
| Codex / Claude Code terminal sessions started from Keepace (optional: you turn this on yourself under More › AI Session & Connection… › “Advanced: precise events for terminal sessions”. It has always been this way; added here in October 2026): when a session starts or ends, a turn starts, a tool finishes, it needs your OK, or a turn ends, Codex / Claude Code hands an official event (a hook) to a small helper that comes with Keepace. The event may carry your prompt, commands and their output; the helper takes only what it needs to tell the state (such as the event type, the session and turn IDs, which tool it is waiting on, and the project folder) and drops the rest in memory on the spot | Your Mac: ~/Library/Application Support/Keepace. The same database as your to-dos keeps the session ID, turn ID, linked task, project folder path, Codex's session link (codex://threads/…), status and times; if the linked task has no project folder yet, this folder is noted for it too. In the same place, bridge-state/ holds a small file per session (turn, last event, the name of the tool it is waiting on), launchers/ keeps the script of each launch (with the project folder path and the task ID); events are first written to events/ and deleted once read. Prompts, commands and output are never stored | No |
| What the Mac app reads through Accessibility to tell whether an AI is busy and to find AI windows and conversations (it has always been this way; added here in October 2026): about every 2 seconds, the position and size of AI windows and input boxes, the accessibility names, IDs, enabled state and position of the buttons beside an AI's input box, and the input box's own ID and class names (never the text in it); in the ChatGPT desktop app and on Codex's website, it also looks across the whole window (page) for “running” markers to count running tasks: the names of elements marked as a status (only compared with “running”) and the class names of images inside links (only looking for the spinner; the rest are dropped on sight); and the address of the page each Safari window is showing, whether or not it is an AI site (likewise in Chrome, Edge and Brave when the browser component isn't installed or isn't reporting) | The buttons, running markers, the position and size of windows and input boxes, and the input box's ID and class names are used in memory only: to tell whether the AI is busy and how many tasks are running, and to make sure it is an AI's input box and find the buttons beside it. Page addresses are used only to tell whether this is one of the listed AI sites and which conversation. An address may carry words you searched for or a question you asked (a search results page, or a question on Perplexity, for example). For a site that isn't on the list, the whole address is dropped on the spot; for a listed AI site, only the domain and conversation ID are kept, by the same allowlist as the browser component (only the home page for Perplexity), in memory only, so one click takes you back to that conversation. Apart from what an address itself carries, Keepace never reads page titles, the conversation or what you type | No |
| With the floating status beside the notch: where the pointer is on the screen, and which trackpad a pointer or scroll movement came from (from 2.4.0) | Used in memory only, to tell whether you are pointing at the notch and which trackpad to give a light tap; never recorded, no history kept. What you click or type is never looked at | No |
| When the ChatGPT desktop app's window contents can't be read (from 2.5.0): Keepace asks it, the way screen readers do, to open its window contents to Accessibility, at most once every 15 seconds and no more once they can be read. Once opened they stay open until ChatGPT quits, even if Keepace quits first | This only turns on ChatGPT's own accessibility mode; nothing is clicked, typed or read from the conversation. ChatGPT may use more CPU while writing long answers, and window-management tools may move its windows a little more slowly | No |
| The address of the page in the Claude desktop app's window (from 2.7.0): nearly every time Keepace checks a Claude window (about every 2 seconds), it reads the address of the web page holding the input box; when only a Send button sits beside the input box and the address can't tell whether this is a Code session, it also reads the class names of the few elements around the input box (style names the page gives its elements) | Used in memory only: the address only tells whether this is a chat, a task in Home or a Code session, and which conversation it is — the conversation ID is scrambled with a random value that changes at every launch and used only to tell conversations apart; the address itself is never kept. The class names are only searched for the one that marks Code's input box, then dropped. Window titles, the conversation and what you type are never read | No |
| To find AI windows on other desktops or in full screen (from 2.7.0): whenever the Claude or ChatGPT desktop app is open, every check (about every 2 seconds) also asks these apps which window they used last; at launch, when you switch desktops or switch to one of these AI apps, and when a window is missing from the app's own window list or none can be reached at all (on another desktop, minimized or all closed, say), Keepace asks the system for two lists of window numbers, every app's: the windows placed on any desktop, and those on the current desktop (numbers only; not which desktop each is on), and looks up the numbers of the windows not listed; when an AI app has no window Keepace can reach, it also asks the system for these AI apps' window numbers, which process each window belongs to, its layer, transparency and size, and whether it is on screen (more often while the detection log is on, to record the counts); and it gets the system's notice when you switch desktops | Used in memory only: once a window is found, the buttons beside its input box are read as usual (the same things as on the current desktop); if none can be found, Keepace says plainly that the app is on another desktop or in full screen. The desktop-switch notice is only used to look again right away and is not recorded. The system hands over its window list whole, with every app's name in it (Keepace does not ask for Screen Recording permission, so the system leaves out other apps' window titles): Keepace takes only the items above, and only from these AI apps' rows, never takes out a window title or an app name, and drops the rest on the spot; what it takes, and the desktop lists, are kept for at most 10 seconds | No |
| An optional detection log (off by default, for troubleshooting) | Your Mac: ~/Library/Caches/Keepace — control names, times and a few counts only, never conversations or what you type (a button beside the input box that Keepace doesn't recognise is noted by its name: a short one as it is, which may carry a name of your own such as a folder's; a long one, or one that looks like a file name or path, only as a scrambled code from 2.7.0 — earlier versions noted those as they were too, up to 60 characters each. What is already in the log isn't rewritten; to clear it, delete detection-log.jsonl there. This was added here on 2 October 2026); from 2.7.0 it also notes, in the Claude desktop app, whether this is a Code session and whether the input box holds text not yet sent (never the text), and how many AI windows on other desktops were found (numbers and reason codes only) | No |
| AI button-name list fetched from the website (from 2.6.0) | Your Mac: ~/Library/Application Support/Keepace/detection-rules.json, only button names, IDs and a version number; the browser component keeps it in memory only | No (it is a public file from the website to begin with) |
| To decide whether to download the on-device organizing model on its own, and where from (from 2.8.0, only on a Mac with Apple silicon that doesn't have the model yet): how much space is left on this disk; whether the network is available, metered (like a phone hotspot) or in Low Data Mode; whether Low Power Mode is on; and the region and time zone in System Settings | Used on this Mac, in memory only, for this decision; not recorded, not uploaded. Keepace's settings also note whether you chose “Not now” or paused the download, how many times in a row it failed and when it last failed, how many times it had to start over because the network couldn't resume (and whether resuming worked again after those tries ran out), which download address a half-finished file last came from, and whether the last downloaded file failed the check and which address to avoid next time (each just the ModelScope or Hugging Face address itself). A half-finished download is kept in ~/Library/Caches/Keepace/LocalModelDownloads, and the installed model in ~/Library/Application Support/Keepace/LocalModel | No |
| When you click “Organize plan” and the local model is about to be used (from 2.7.0): this Mac's memory situation, as three numbers from the system (memory pressure level, percentage available, total memory) | Read once, in memory only, to decide whether to warn you first that memory is tight; not recorded | No |
When it goes online
- Checking for updates: 4 seconds after launch and then every 12 hours (with “Check for updates automatically” off, only when you click “Check for Updates”), Keepace requests a version manifest file from keepace.win; from 2.6.0 it also requests the AI button-name list (see the next item). Both are public files, the same for everyone. From 2.6.0 these two requests carry only the file address and fixed headers (the User-Agent says “Keepace”): no Keepace or macOS version, no language settings, no cookies and none of your content. The site is hosted by Cloudflare: as with any website, Cloudflare sees the IP address a request comes from and the time; we have turned off the site's own per-request logs and don't use request records for statistics.
- Updating the AI button-name list (from 2.6.0): together with the update check, Keepace requests one public file of at most 128 KB,
/download/detection-rules.json, from keepace.win. It holds only the names of the buttons next to AI message boxes (such as “Stop generating” in each language), the name of Codex's small “running” icon, and a few button IDs (such as stop-button); no program code. When ChatGPT and others rename their buttons, Keepace can recognise them without waiting for a new version. The file must carry Keepace's release signature (the same key that signs the update manifest) and must not be older than the list in use; otherwise it is not used and the current list stays. It can only teach Keepace more names, or make a name (including a built-in one) no longer count as any signal; it cannot change what Keepace reads, which sites it runs on, or what it sends. It only fixes renamed buttons: when ChatGPT changes the structure of its page, a new Keepace version is still needed. - Downloading a new version (only after you click “Update and Restart”): Keepace downloads the new installer from keepace.win and checks its release signature, size and SHA-256 on this Mac. This request uses the system's default headers, which include the Keepace and macOS versions and your language settings; it carries none of your content.
- Trial and activation: it sends the license service a fingerprint computed from this device (an irreversible hash containing no name, email or hardware serial) in exchange for a license token. Activating also sends the redeem code you typed. Opening “Activate or buy”, or opening “Contact the seller” on an activated Mac, asks the license service for the price and the seller's WeChat QR code (only the product name is sent). These requests use the system's default headers, which include the Keepace and macOS versions and your language settings. The license service is a separate service (shared with WordTypist and also hosted by Cloudflare), and the “we have turned off the site's own per-request logs” above does not cover it: it records, per device fingerprint, how many trial days have been used and which redeem code activated it; to prevent abuse it counts requests per IP address, each count lapses after an hour to a day, and lapsed counts are deleted during later requests, so when there is little traffic they can stay a few days longer; and it keeps Cloudflare's per-request logs, each recording the IP address a request comes from and the approximate location Cloudflare derives from it, the time, which endpoint was called, and the request headers (including the Keepace and macOS versions and language settings mentioned above). The device fingerprint and redeem code travel in the request body and are not in these logs. The logs are used to troubleshoot licensing and kept by Cloudflare for a few days.
- Downloading the on-device organizing model (from 2.8.0, on its own when conditions are right): On a Mac with Apple silicon that doesn't have the on-device organizing model yet, Keepace downloads it in the background on its own when conditions are right (Qwen3-4B, about 2.5 GB, a fixed version; once downloaded, its size and SHA-256 are checked on this Mac, and it isn't used if they don't match). Conditions are right when the network is available, isn't metered (like a phone hotspot) and isn't in Low Data Mode, the Mac isn't in Low Power Mode, and the disk will still have at least 10 GB free afterwards. Development builds, copies not in the Applications folder (for example still on the installer disk, in Downloads or on the desktop), and copies whose trial has ended don't download it on their own; if the trial ends partway through, a download Keepace started by itself stops too. After 3 tries in a row that couldn't move the download forward (each kept less than 5 MB of new data; data deleted because the download had to start over doesn't count), or if a downloaded file fails the check, it doesn't download again on its own either: the top right only reminds you, and it downloads only if you click it (the one exception: a fully downloaded file left by an earlier version and not yet checked, whose download address is unknown, is downloaded again from the start once on its own if it fails the check). If the network (or a proxy on it) can't resume downloads, so each try has to start over, Keepace starts over on its own at most 2 times, and after that only when you click. When conditions aren't right, the top right of the window only shows “Download model”, and it downloads only if you click it. Download progress also shows at the top right; you can pause at any time, or choose “Not now”, after which it won't download on its own again.
- Where the model comes from: two addresses for the same file: Alibaba's ModelScope (
modelscope.cn) and Hugging Face (huggingface.co), both Qwen's official repositories; they hand the download over to their own download servers (for examplecdn-lfs-cn-1.modelscope.cn). Which one is tried first depends on this Mac's system region and time zone: ModelScope first if the region is mainland China or the time zone is a mainland China one such as Shanghai, Hugging Face first otherwise; if one can't be reached or is too slow, it switches to the other and carries on from what's already downloaded. The region and time zone are read only on this Mac and never sent anywhere. These requests carry only fixed headers (the User-Agent says “Keepace”) — no Keepace or macOS version, no language setting, no cookies, and none of your content; as with any website, ModelScope and Hugging Face can see the IP address a request comes from and when. The model's licenses come bundled with the app and are no longer fetched separately. Up to 2.7.0, it was downloaded from Hugging Face only after you clicked “Download”, with the system's default request headers.
Nothing else goes online. There is no account, nothing to register, and we collect no name, email or contacts.
What you can do
The data is on your own computer. Settings › Data exports all of it to a single file in one click, and you can delete single items, clear the list, or simply delete the folder above (if you started a terminal session from Keepace without choosing a folder, the AI works in the Workspace folder inside it by default, so move out anything you want to keep first). To uninstall, drag the app to the Trash; remove the browser component on your browser's extensions page. We hold no copy of your to-dos, plans or other data, so there is nothing to ask us to delete; the license service keeps only what “Trial and activation” above describes.
Children
Keepace is a productivity tool for adults. It is not directed at children under 13, and we do not knowingly collect their information — apart from what is described under “Trial and activation”, we collect no one's.
If this changes
Any change updates the date at the top of this page; if a change means reading anything new, the app's release notes will say so plainly.
Contact
Questions and comments: open the activation card from the More menu or Settings › Activation (or, while not activated, the trial label at the top of the window) and scan the seller's WeChat code; once activated, open “Contact the seller” on the card.