Privacy by architecture
Privacy Policy
Your workspace stays yours. Here’s exactly where Copse keeps data and when it leaves your machine.
Last updated: 1 October 2026
Copse has no hosted backend and sends no product telemetry. Your prompts and code leave your machine only when you use a feature that talks directly to another service, such as a cloud model, remote agent, MCP server, or website. Copse also makes a few automatic checks — for updates, for usage on coding plans you have set up in Settings → General, and for public model information — listed under Automatic Checks.
The Short Version
- No Copse account or backend. The desktop app talks directly to other services; Copse does not operate an intermediary service for your prompts or code.
- No telemetry. No analytics, no crash reporting, no usage data collection. Maintainers do not automatically receive diagnostics.
- External features send data. Cloud models, remote agents, MCP/ACP, SSH workspaces, browser sessions and web search, custom tools, hooks, the Mobile Companion, and the automatic checks have the data flows described below.
- Local does not mean encrypted. Conversations are stored as ordinary files. API keys use OS secure storage when available; otherwise plaintext storage requires explicit consent.
Data Sent to Services You Choose
Model providers
A cloud model request can include your prompt and images, earlier conversation, system instructions, tool definitions, tool calls and results, and source or file content included in context. Requests go directly from the app's main process to the configured provider. Local providers remain local only when their configured endpoint is local.
Provider-key validation and model-list refreshes also contact the provider. The provider's privacy, retention, logging, and training policies apply after it receives the data.
By default Copse asks each provider for the most protective request-level handling it
offers: OpenRouter traffic is restricted to zero-data-retention, non-training upstreams,
and direct OpenAI requests send store: false. Every request also carries
the same app-attribution headers (HTTP-Referer: https://copse.dev/ and
X-Title: Copse). Those name the application, not you. Optional on-device
PII redaction can redact the text you typed before it leaves the machine; it is off by
default and does not cover repository files or tool output.
Remote agents
Selecting a Cursor or Anthropic remote agent sends the current prompt and images. The first handoff can also include prior user/assistant conversation and the current Git branch. A repo-backed session sends the repository URL and branch so the service can clone or mount the project; Claude's repo-backed flow also sends the configured GitHub token to the service for that mount. The remote service may modify a branch or open a pull request according to the selected settings.
MCP and ACP
MCP servers receive tool arguments, which may contain paths, file content, prompt-derived text, or other workspace data. Results return through Copse and are stored in the thread. An MCP server can be a local process or remote HTTP service and controls its own networking, logs, and retention. Project MCP configuration is workspace-trust gated; server and tool approvals apply according to your settings.
An ACP agent is an external program, normally on the same machine. Copse gives it the prompt, workspace path, selected MCP configuration, and any tools exposed through the optional localhost bridge. Copse strips its provider keys from the inherited base environment, but values explicitly configured for the agent are passed to it. The ACP program may have its own credentials, storage, and network behavior. When you open the ACP agents settings, Copse asks the npm registry for the latest version of each agent's adapter package, and an adapter you approve is installed through npm.
SSH workspaces and remote agents over SSH
Both are off by default (Settings → SSH). An SSH workspace runs file, shell, terminal, Git, and search operations on the host you configure, through your system OpenSSH, so that host receives the commands and file content they involve. With agents on the remote machine turned on, the ACP agent itself runs on the SSH host: it receives your prompts and makes its own model calls from there. Copse forwards the agent's configured keys to that host only after you approve it in a dialog, and installs a missing adapter there only with your approval. SSH passwords and passphrases you ask Copse to remember are stored encrypted on this machine.
Mobile Companion
Off by default (Settings → Experimental). When you turn it on, Copse listens on your
local network — on the private address you choose, never the internet — so a phone you
pair can follow your work. Pairing needs a code shown on the phone and your approval on
the desktop. A paired phone can read project names, thread titles and status, recent
messages, and pending approvals and questions; one you allow to control Copse can also
answer approvals and questions, stop runs, and send messages, which then run against
your model. Copse keeps its local certificate authority and the list of paired phones
(with hashed tokens) in ~/.copse/lan/. You can revoke a phone or turn the
companion off from the same settings.
Browser and web tools
Websites opened in Copse receive normal browser requests and any data entered into them. The interactive browser and agent automation use separate persistent profiles, so the agent does not inherit the user's interactive logins. Agent snapshots, screenshots, and interaction results may be sent to the selected model as tool results and are stored in the thread. Browser cookies and site storage remain in their local profiles.
The agent's web search sends its search query to DuckDuckGo. DuckDuckGo is an approved origin by default, so a search runs without asking unless you set the web tools to ask first. Fetching a page sends a normal request to that site, and only to approved origins. Two optional services need your own API key and are off until you add one: Parallel search sends the agent's search objective and queries to Parallel, and Artificial Analysis model data is downloaded from Artificial Analysis with your key.
Custom tools and hooks
User-installed custom tools and configured hooks run code on the device and can read or transmit whatever their implementation and permissions allow. Review them as code, not as passive configuration.
Automatic Checks
These run without a separate action from you. None of them sends your prompts or code.
Updates
The packaged macOS app checks its update feed on GitHub
(copse-dev/copse-releases) on launch and when you choose Check for Updates.
When an update is available, Copse also fetches the release notes from the GitHub API to
show what changed. Copse asks before downloading an update. Once downloaded, the update
installs when you restart or next quit. Development builds do not use the feed.
Coding plan usage
To show how much of your coding plans you have used, and to choose a default model that
makes the best use of them, Copse can read the sign-in another tool on this Mac already
holds — but only for a provider you have set up in Settings → General: Claude Code or
Codex once you have added and enabled that agent, Cursor once you have added its agent
or saved a Cursor key, and Hugging Face once you have saved a Hugging Face key in Copse.
For those, it reads Claude Code's Keychain item or
~/.claude/.credentials.json, Codex's ~/.codex/auth.json,
Cursor's Keychain item or local app state, or your Hugging Face token, and sends each
token only to the service that issued it — Anthropic, OpenAI's ChatGPT service, Cursor,
or Hugging Face — to read that plan's usage. Nothing is read for a provider you have not
set up. This runs when you open Settings → Usage, and when Copse resolves the default
“best value” chat model as a thread opens or an agent runs, at most every five minutes.
Copse keeps recent usage samples locally. macOS may ask before Copse reads another app's
Keychain item.
Model information
The value chart in Settings → Usage checks which models have published model cards by requesting public pages on Hugging Face and on model vendors' sites. These requests carry a model name and your network address, nothing else, and their results are cached locally.
Credentials and Environment Scanning
Keys entered in Settings are written to
~/.copse/user-data/settings.json (or the profile
COPSE_DIR selects). They are encrypted with AES-256-GCM under a random data
key that Copse keeps as a single item in the operating system's keyring — the macOS
Keychain, Windows Credential Manager, or a Linux Secret Service keyring. That key
belongs to the OS user account, not to the Copse profile. Keys sealed by earlier
versions with Electron secure storage are still read, and are rewritten in the new
format the first time they are used. If no keyring is available, Copse refuses to
persist the key until you explicitly approve base64 plaintext storage. Base64 is
recoverable by anyone who can read the file.
Environment-only keys are not written to settings. The environment-key scan runs only
when you choose it. It reads process.env and a fixed allow-list of shell
startup files in the main process and shows the renderer only masked previews. Importing
a detected key turns it into a stored key.
Local Storage
Copse stores data locally, including:
- settings, credentials, provider configuration, projects, and UI preferences;
- conversation messages, reasoning, tool calls/results, images, hooks, and subagents;
- separate browser profiles and agent-browser screenshots;
- semantic-search indexes;
- cached model-card checks and coding plan usage samples, and remembered SSH passwords and passphrases (encrypted);
-
when the Mobile Companion has been set up, its certificate authority and paired phones
in
~/.copse/lan/; and - short-lived Git worktree backup refs inside opened repositories.
Conversations are integrity-hashed but are not encrypted by Copse. Disk encryption and OS account permissions protect them at rest. Deleting a local record does not delete copies already retained by an external provider, agent, server, or website.
Telemetry, Exports, and Diagnostics
Copse includes no product analytics, crash reporter, or automatic diagnostic upload. The built-in thread export is deliberately complete, not secret-redacted: it can include prompts, source code, paths, attachments, tool data, reasoning, and nested agent transcripts. Inspect and redact a copy before sharing it through GitHub or email. Never share settings, environment dumps, shell startup files, or browser profiles.
More Detail and Source Code
The complete feature-by-feature data-flow and storage inventory is maintained with the source code:
Read the data-flow documentation · View source code on GitHub
Contact
For privacy questions and ordinary bugs, use GitHub Issues without including sensitive data. Report suspected vulnerabilities privately to security@copse.dev.
For privacy questions, ordinary bugs, and suspected vulnerabilities, write to security@copse.dev without including sensitive data.