| 1 | Cloud LLM (Anthropic): parse memory, translate keywords, rerank shortlist | POST https://api.anthropic.com/v1/messages | A search runs with the cloud brain ON (localOnly: false, OFF by default; the first enable shows the exact payload and must be acknowledged) AND an Anthropic key is present AND the hourly deep-search meter allows AND paranoid mode is off. The outbound indicator is shown before the search. | parse-memory: claude-haiku-4-5, ≤1024 output tokens, once per search, only when no local brain is installed or its output failed validation. Field: memory translate-keywords: claude-haiku-4-5, ≤512 tokens, only for words not in the local cache. Field: words ≤12 chars rerank: claude-haiku-4-5 (claude-sonnet-5 from round 2), ≤2048 tokens, only when round 1 was not confident, ≤20 candidates. Fields: memory, items[].title ≤120, uri ≤200, snippet ≤200, author ≤80, timestamp Secrets redacted before sending. Never sent: file contents beyond the capped excerpt, folders, index, audit log, recall profile, credentials. Base URL pinned; ANTHROPIC_BASE_URL is ignored. | Opt-in Opt-in (default localOnly: true; key required; first-enable acknowledgement) |
| 2 | Validate an Anthropic key | GET https://api.anthropic.com/v1/models?limit=1 | The user pastes a key in setup or Settings → Models → Validate & store. One call per click. | Header x-api-key with the pasted key; no body. | User action User action |
| 3 | Slack: message search, people lookup, connection check | POST https://slack.com/api/search.messages POST https://slack.com/api/users.list POST https://slack.com/api/auth.test (connect check) | A search runs while a Slack USER token is configured and Slack is neither disabled nor paused; users.list only during identity resolution; auth.test once on connect. | search.messages: a query of ≤6 keywords, ≤3 person-name variants, from:, after:/before: day bounds, has:link; ≤4 calls per search, ≤2 pages each users.list: ≤3 pages of 200 (no query text) auth.test: the token only | Opt-in Opt-in (connect a token) |
| 4 | Google Drive: file search, Google Docs excerpt, token refresh | GET https://www.googleapis.com/drive/v3/files GET https://www.googleapis.com/drive/v3/files/{id}/export (text/plain) POST https://oauth2.googleapis.com/token (access-token refresh) | A search runs while the keychain holds Drive OAuth tokens and a Google client is configured, and Drive is neither disabled nor paused; identity resolution reads the owners of the 100 most recently modified files. | files.list q= built from ≤6 keywords / person variants / media hints / owner email / time bounds files.export text/plain of ≤5 Google Docs under 1 MiB per search (20 KiB read) Token refresh: the refresh token + client credentials | Opt-in Opt-in (OAuth consent) |
| 5 | Gmail: message search, metadata/body fetch, token refresh | GET https://gmail.googleapis.com/gmail/v1/users/me/messages GET https://gmail.googleapis.com/gmail/v1/users/me/messages/{id} POST https://oauth2.googleapis.com/token (access-token refresh) | A search runs while the keychain holds Gmail OAuth tokens and a Google client is configured, and Gmail is neither disabled nor paused; identity resolution runs one list (10 results) + ≤6 metadata gets. | messages.list q= with ≤6 keywords, a from:/to: group, filename:/domain group, after:/before:; ≤25 ids messages.get metadata for ≤12 candidates; full text/plain body (20 KiB cap) for the first 5 only Token refresh: the refresh token + client credentials | Opt-in Opt-in (OAuth consent) |
| 6 | Google OAuth consent (Drive, Gmail): code exchange and account label | https://accounts.google.com/o/oauth2/v2/auth — opened in the SYSTEM BROWSER, not by this process redirect to a loopback listener http://127.0.0.1:<port>/callback (this process listens, never dials out) POST https://oauth2.googleapis.com/token (authorization-code exchange) GET …/drive/v3/about or …/gmail/v1/users/me/profile (account email for the confirmation line) | Connect Drive or Gmail from setup or Settings → Sources → Sign in with Google. The listener closes when the flow ends. | Consent URL: client_id, scope drive.readonly or gmail.readonly (incremental), random state Code exchange: the one-time code + client id/secret. Tokens go to the OS keychain, never to disk or logs | User action User action |
| 7 | Notion: page search, people lookup, connection check | POST https://api.notion.com/v1/search GET https://api.notion.com/v1/users GET https://api.notion.com/v1/users/me (connect check) | A search runs while a Notion integration token is configured and Notion is neither disabled nor paused; /v1/users only during identity resolution; /v1/users/me once on connect. | search.query for ≤3 sub-searches (≤4 keywords / person / media hint), filter: page. No page content is ever fetched: titles and metadata only /v1/users: ≤3 pages of 100 (no query text) | Opt-in Opt-in (token) |
| 8 | GitHub: code / issue / repo search, own gists, starred repos, people lookup, connection check | GET https://api.github.com/search/code, /search/issues, /search/repositories GET https://api.github.com/gists, /user/starred, /user/repos GET https://api.github.com/search/users, /users/{login} GET https://api.github.com/user (connect check) | A search runs while a GitHub token is configured and GitHub is neither disabled nor paused (≤3 requests in flight); people routes only during identity resolution; /user once on connect. | q= of ≤3 keywords (+ the next 3 as a fallback), author:/user: login when resolved; per_page ≤50 | Opt-in Opt-in (token) |
| 9 | Download the local brain (Qwen3 1.7B default / Qwen3 4B Instruct upgrade, Q4_K_M GGUF) | GET https://huggingface.co/unsloth/Qwen3-1.7B-GGUF/resolve/main/Qwen3-1.7B-Q4_K_M.gguf GET https://huggingface.co/unsloth/Qwen3-4B-Instruct-2507-GGUF/resolve/main/Qwen3-4B-Instruct-2507-Q4_K_M.gguf | The user clicks Download (Settings → Models, or onboarding step 2). Never automatic. An interrupted download resumes with an HTTP Range request. | GET only, plus Range: bytes=<offset>- on resume. sha256 and size pinned; a mismatch is discarded. Hugging Face redirects to its LFS CDN inside the same call. | User action User action |
| 10 | Download the embedding model (multilingual-e5-small, int8 ONNX, ~135 MB) | GET https://huggingface.co/Xenova/multilingual-e5-small/resolve/main/onnx/model_quantized.onnx GET …/tokenizer.json, …/config.json, …/tokenizer_config.json | AUTOMATICALLY, once, right after onboarding completes: the semantic index of the ticked folders starts in the background and needs the model. Onboarding states this (size, checksum, disk budget) before the user finishes. Never re-downloaded once verified. | GET only. Four files, each sha256-pinned; the model is used only after every hash matches. | Automatic after onboarding Automatic after onboarding (disclosed there); otherwise user action |
| 11 | Download a voice model (whisper.cpp ggml base / small) | GET https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-base.bin GET https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-small.bin | The user clicks Download voice model (Settings → Hotkey & voice / Models, or onboarding step 2). Never automatic. Resumable. | GET only, plus Range: on resume. sha256 and size pinned. | User action User action |
| 12 | Desktop app update check and signed download (Tauri updater) | GET latest.json from the app update feed (the host is not published on this website yet) GET the signed artifact URL named in latest.json, only after a second click | The user clicks Settings → About → Check for updates. Never on launch, never on a timer. Download and install is a separate, second click; the install is minisign-verified against the public key shipped in the app. | GET only. The updater sends its User-Agent and the current version/target; nothing about the user or their data. Each check/install is written to the audit log. | User action User action (manual button) |