Privacy Policy
Last updated: 2026-10-26 (Spool v0.7.4). This English translation is provided for convenience; the Chinese original is authoritative.
The one-sentence version
Spool keeps your data on your computer, and Spool's own process never opens a network connection. Capture, filing, packing, and search all happen on your machine. No account, no telemetry. The app's content-security policy (CSP) structurally forbids all external network connections from the webview, and the Spool binary contains no HTTP client at all.
One route does reach a model provider, and Spool is the one that starts it. If you switch the API engine on (by pasting a key of your own under Settings → AI engine → API key — it is off until you do), Spool runs a small bundled subprocess that makes the request, using a key you gave it and your own quota. That route and the three hand-offs you perform yourself are all listed below; nothing else leaves this machine.
What we collect
Nothing. Spool has no server. There is no account system, no usage analytics, no crash reporting, no advertising identifiers. The developer cannot see any of your content.
One exception, and it is a link rather than a part of the app. The feedback section of the website offers a short survey hosted by SurveyMars, a third-party form service. If you follow that link and fill it in, your answers are stored on their servers under their privacy policy — they do not pass through spoolapp.org and they never touch the Spool application. This site contacts them only if you click; nothing is loaded from them otherwise. Email and GitHub remain available if you would rather not involve a third party at all.
Where your data lives
- All content (workspaces, projects, blocks, annotations, attachment index) lives in a local
SQLite database:
~/Library/Application Support/com.oceanjin.spool/spool.db - Interface settings live in
settings.jsonin the same directory. Your API-engine key is not in it: on macOS it is stored in the system Keychain, on Windows in a separate0600file in the same directory. It is never written to a log or an error message. - Files you add to a project are never copied or uploaded. Spool records three things: the path; a small piece of identity the system recognises the file by (so that Spool can follow it when you move or rename it); and, optionally, text extracted locally. PDF/Word text extraction happens entirely on your machine. When a file cannot be found and you press “Find it”, Spool asks this machine's Spotlight for files of that name and shows the results only to you.
- Pictures you put into a block (pasted, dragged in, or a captured screenshot) are copied
into the database, so a picture stays in its block after the original is deleted. When a
Pack is made, or an AI reads a block with pictures, Spool writes a copy into the
image-cachefolder in the same directory so the receiving program has something to point at; deleting that folder loses nothing. A photo from an iPhone (HEIC) is first turned into a JPEG on this machine, by the system's own converter. - Spool keeps, on this machine, how long you focused each day: time at the computer (keyboard
or mouse used within 15 minutes), whether or not Spool is in front. One number per day, in
focus.jsonin the same directory. It is not in the database, is not exported with the library, and never leaves this computer; deleting the directory clears it. - Text you have typed but not finished — in a block's editing panel, or in a project's input
box — is saved as you type to
drafts.jsonin the same directory, so quitting or updating Spool does not lose it; it is deleted once you press Done or send it. Likefocus.json, it is not in the database, is not exported with the library, and never leaves this computer. - What you have knitted in the knitting panel (which item, and the day it was made) is kept in
knit.jsonin the same directory. Stitches and patches are not stored — they are counted from your blocks each time. It is not in the database either, is not exported with the library, and never leaves this computer. - How far you have looked at what AIs added to each project — one time per project, used only
to decide whether that project's dot in the left rail lights up green — is kept in
ai-seen.jsonin the same directory. It is not in the database either, is not exported with the library, and never leaves this computer. - The results of the out-of-date check — whether you ran it or it ran once a month by itself —
and the monthly switch are kept in
stale.jsonin the same directory, so they are still there after you quit and reopen Spool. It is not in the database either, is not exported with the library, and never leaves this computer. - You can link a workspace to a folder on your computer (a code repository, a thesis folder;
none by default, and a private project cannot be linked). Once linked, Spool looks locally at
which files are in that folder, which changed since the last sync (names, sizes and modification
times only) and the titles of git commits, and reads the text of the up to three
“state files” you chose; it does not read the contents of any other file. Spool writes to
that folder in four places only, each shown to you when you link it:
SPOOL.mdat its root (only Spool's own section, never one you edited; private projects are never written into it), one line in.git/info/excludeif you chose “keep it on this computer”, and one line each inCLAUDE.mdandAGENTS.mdif you ticked them. The originals are backed up infolder-backupsin the same directory, and unlinking can take these lines out again. - Before any database schema upgrade, a snapshot backup is saved automatically in the same directory.
Deleting that directory removes all Spool data completely; “Settings → Clear all data” inside the app does the same.
When data can leave your computer
Content can reach another program in four ways, and every one of them is off until you turn it on. In the first three you hand the content over, and the receiving program — not Spool — decides whether it then reaches a network service. The fourth is the API engine: there the request is made on your behalf, by a subprocess Spool starts:
| Feature | Where data goes | Notes |
|---|---|---|
| Pack and paste | The app or service where you paste the Pack | Spool assembles the Pack locally and places it on your clipboard. Copying stays on your own machine; pasting into another program is your deliberate hand-off, and that program's privacy terms apply from there. |
| MCP service (Settings → MCP, off by default) | The AI client you installed and configured yourself (Claude Desktop, Codex — including a Codex conversation inside the ChatGPT desktop app — Cursor, …) | Your AI client reads project content over local inter-process communication; Spool listens on no network port. A file you added to a project yourself can be read by an AI by default — the text Spool extracted from it, not the file itself. Each file has its own switch you can turn off at any time; after that an AI can only ask you for it. An AI can also be handed the pictures in a block themselves (to read what a screenshot says). Private projects (right-click a project in the sidebar to make it private) do not exist for an AI connected through Spool: it cannot read them or see them in any list, files and pictures included. It can still write into one (a project it created as private, say), but cannot read back what it wrote. Spool's own AI features (weekly review, follow-up, compression, the out-of-date check) leave private projects alone too. Private covers the route through Spool only: an AI that can already read files on your computer directly (a command-line tool given file access, say) is not stopped from reading the database file. If a workspace is linked to a folder, an AI can also read where that folder is, the text of the state files you chose, and the names of files changed and the commit titles since the last sync; Spool hands over no other file's contents. A client that has its own file tools can still read that folder directly — Spool cannot control that. Where those clients send content is governed by that client and your agreement with its provider. |
| Follow Up, Weekly Review, drafting follow-up goals, compression, or the out-of-date check (Settings → AI engine → Local CLI; requires a supported CLI installed and logged in, plus the required MCP permissions) | The command-line AI you installed and logged into yourself (Claude Code, Codex CLI, or Gemini CLI — or, when you have no Codex of your own, the copy built into the ChatGPT desktop app; Gemini does not run Follow Up) | Spool starts that CLI as a local subprocess and hands it the relevant project content. The network request happens inside that subprocess, on your own account's quota — on this route Spool stores no API key, and its own process makes no HTTP request. When compression or the out-of-date check runs this way, the CLI gets no tools at all and no connection to Spool: one piece of text goes in, one comes out. If a workspace is linked to a folder, it can also read the folder information described in the row above. |
| Weekly Review, Follow Up, drafting follow-up goals, compression, or the out-of-date check (Settings → AI engine → API key, none until you paste one) | The provider your key belongs to (one of OpenAI, Claude, Gemini, DeepSeek, Kimi, Qwen, Zhipu GLM or OpenRouter), or an HTTPS endpoint you entered yourself | This is the one route Spool runs itself. The project content involved
is sent to that provider, and the run is billed to your own key — including a run you
cancel partway, because the provider still charges for what it already produced. Following
up this way uses that provider's own web search (OpenAI, Claude, Gemini, Kimi and Qwen have
one; the others cannot be used for Follow Up). The request is made by a bundled subprocess
(spool-ai) that Spool starts and that exits when the run ends; Spool's own
process still makes no HTTP request. Plain http:// endpoints are refused. It
changes nothing you already have: follow-up findings wait in the review queue, and
compression and out-of-date results take effect only when you approve them on screen. |
⚠️ Follow up is the one action that deliberately searches the web. It takes the lines you wrote yourself describing what to watch for, and hands them to the route you chose — your CLI, or your API provider's own web search — to go look for news, so those lines and the context it needs reach that provider. Weekly Review, drafting follow-up goals, compression and the out-of-date check do not receive web-search tools, but the project content they need is still handed to the CLI or API provider and may reach it. Follow up runs only when you press it, unless you switch on Search once a week by itself for a project in its follow-up editor — then Spool runs it for that project once a week, on the route Follow Up is set to and on your own quota, and only something new reaches your review. The switch is per project and off by default. Likewise, when the out-of-date check covers a whole workspace you can switch on Check all of “…” once a month: Spool then hands that workspace's unfinished, non-private projects (sub-workspaces included) to the route the out-of-date check is set to, about every 30 days, and the results only appear on the out-of-date tab for you to look at. That switch is per workspace and off by default. Both run only while Spool is open.
In other words: content leaves this machine only along a route you switched on — a manual paste, an MCP client you enabled, a CLI action you ran, or the API engine you gave a key to (including a weekly follow-up you switched on for a project, or a monthly out-of-date check you switched on for a workspace). With the API engine off, Spool makes no network request at all; with it on, the request comes from a separate subprocess, on your own key and quota, to the provider you picked.
The other direction — an AI writing into your library — only arises once you have turned the MCP server on. The “allow AI writes” switch underneath it is on by default and can be turned off at any time; what an AI writes can only be added, never edited over anything you wrote, and every entry carries a source label (“Claude · MCP”, say) so it reads as theirs, not yours. If an AI thinks something already there needs correcting, it can only propose the correction, which waits for you in the review queue; it cannot retire a note for you. Three more kinds of proposal work the same way, taking effect only when you approve them there: attaching a file from your computer to a project (the AI names its full path; system folders, hidden folders and the like are refused outright), replacing an older version of a file with a newer one (the old one is kept, folded under the new), and splitting a long project into sub-projects (a finished project has to be reopened by you first).
System permissions
| Permission | Purpose | If declined |
|---|---|---|
| Input monitoring (double-tap ⌥ capture) | Detecting the Option-key double-tap gesture | Double-tap ⌥ unavailable; a custom capture shortcut can be set in Settings |
| Accessibility (optional) | Two things: keeps the capture gesture exclusive to Spool — when a capture fires, the second ⌥ press is removed from the event stream so other apps using the same gesture (such as Claude Desktop) don't pop up alongside — and hands the confirmation the keyboard, so the note box can be typed into without clicking it first | Capture works exactly the same; other apps using the same gesture fire together with Spool, and the note box has to be clicked before it takes typing |
| Automation (browser) | Reading the current tab title as a source label | Source falls back to the application name |
| Clipboard | Reading the clipboard's text, picture, or copied picture files at capture time | Capture unavailable |
| The folder screenshots go to (the Desktop by default) | When you double-tap ⌥ right after a screenshot (⌘⇧3, ⌘⇧4, ⌘⇧5), reading the one just written; macOS asks the first time | Screenshots saved as files cannot be captured; ones sent to the clipboard (⌃⌘⇧4, say) still can |
Permissions are used only when the corresponding feature fires — no background monitoring. The clipboard is read exactly once, at the moment you press the capture shortcut; the screenshot folder is looked at only when you double-tap ⌥ to capture, for the picture just taken.
Contact
Questions or concerns: open an issue on GitHub, or write to jinhz0531@gmail.com.