The short version
- Coding CLI traffic follows the CLI’s provider configuration. That includes the Daintree Assistant, which is Claude Code or Codex on your own account. While a session runs, the Assistant also searches Daintree’s documentation and, with Follow runbooks on (the default), a Daintree-hosted runbook service, which receives a one-sentence summary of each task.
- App telemetry, voice input, the GitHub integration and the MCP server are all off by default and opt-in. When telemetry is on, it applies path and known-secret redaction before sending; pattern matching cannot guarantee that arbitrary sensitive text is removed.
- Voice input is optional and uses your own OpenAI or Deepgram API key. Audio goes directly to the selected transcription provider; optional transcript correction uses OpenAI separately.
- Core app credentials such as forge, voice and external MCP keys use local configuration storage. Plugin secret settings use OS-backed encryption when available. See the storage reference for scope and fallback behavior.
- For Microsoft Store installations, Microsoft handles your Store account, download, and install data under its own privacy statement.
- The website uses Vercel Web Analytics, which is cookieless and does not track you across sites.
- The newsletter is optional, double opt-in, and only collects your email address. Unsubscribe at any time.
- The site sets no first-party tracking cookies. There are no logins or user accounts.
- Fonts are served from our own domain, with no third-party font CDN.
- Daintree itself is free to download and Apache 2.0 licensed.
Who is responsible for your data
Daintree is developed and maintained by Greg Priday in South Africa, and has been since 2025 (originally under the name "Canopy"). Greg Priday is the responsible party and the designated Information Officer for the purposes of POPIA Section 56.
For privacy questions, data requests, or anything in this policy, email privacy@daintree.org. A postal address for formal correspondence is available on request via the same address.
This page is the canonical privacy policy submitted to Microsoft Store Partner Center for the Daintree desktop app listing. It describes the data the app and website collect. Personal data that Microsoft processes when you find, buy, download, or update the app through the Store (your Microsoft account, purchase and install records, ratings and reviews, and Store diagnostics) is handled by Microsoft as an independent controller under the Microsoft Privacy Statement. Daintree does not receive those identifiers.
The website (daintree.org)
The website is a marketing and documentation site. It has no logins, no user accounts, no comment system, and no contact forms. The newsletter accepts an email address, and search accepts the query text you enter. Avoid putting credentials or private project content into public site search.
Analytics
We use Vercel Web Analytics to count page views and basic engagement. Vercel Analytics is cookieless and does not build advertising profiles. To distinguish unique visits within a single day, Vercel computes a hash from the request IP, user agent, and a per-project salt; that hash resets every 24 hours and the raw IP is not stored. The data we see is aggregate: pages visited, referrers, approximate country, OS family, browser family, and device type.
Newsletter signup (MailerLite)
If you choose to subscribe to the newsletter at /newsletter, your email address is sent to MailerLite, which manages the subscriber list and sends the emails. We collect only your email: no name, no phone number, no other fields. MailerLite stores subscriber data on Google Cloud infrastructure in the European Union.
Subscriptions use double opt-in: MailerLite sends a confirmation email, and your address is only added to the list if you click the link inside it. As part of that flow, MailerLite logs the IP address and timestamp of your signup and your confirmation; this is standard anti-abuse and consent-record practice and is governed by MailerLite's privacy policy. Newsletter emails include open and click tracking by default. Every email includes an unsubscribe link, and you can also email us to be removed.
Bot protection (Cloudflare Turnstile)
The newsletter form is protected by Cloudflare Turnstile to prevent automated abuse. Turnstile is loaded only when you visit /newsletter; it does not run on any other page. The widget processes browser signals to assess automated requests. Cookie behavior depends on the configured Cloudflare features: pre-clearance can issue a cf_clearance cookie. Loading Turnstile alone is not evidence that every Cloudflare bot cookie is set. We rely on legitimate interest in keeping the newsletter form free of automated abuse as the basis for processing here.
Site search
The site search is powered by SearchSocket with an Upstash Search backend. When you submit a query, the query text is sent to Upstash to retrieve matching pages. Queries may be logged for service operations and product improvement, but they are not associated with any user identifier: there is no account or session linking searches to a person.
Caching
We use Upstash Redis on the server to cache release metadata. Release-cache entries contain release metadata. The separate webhook event log stores repository event payloads, which can contain contributor names and email addresses. Search also sends query text to its configured backend. These server-side calls do not forward a visitor IP explicitly, but the text a visitor submits can itself contain personal information.
Hosting and server logs
The site is hosted on Vercel. Like any web host, Vercel keeps standard request logs (timestamps, request paths, IP addresses, user agents) for periods controlled by the deployed plan and logging configuration to operate the platform and protect against abuse. Daintree's own application code does not write IP addresses or other user-identifying data into application logs.
Browser storage
The site stores interface preferences in your browser:
- sessionStorage remembers animation state and documentation navigation state in the current tab.
- localStorage remembers your documentation operating-system preference.
None of this data identifies you. Clearing your browser storage removes it.
Embedded media
Fonts are served from our own domain. There is no third-party font CDN in the page. Some blog and documentation pages embed YouTube videos. Some players open after a click, while blog embeds use a lazy-loaded YouTube iframe that may load as it approaches the viewport, before playback. YouTube applies its own data practices when the player loads.
The desktop app (Daintree)
Daintree is an Electron desktop app that runs entirely on your machine. It is a workspace around AI coding CLIs you already have: Claude Code, Codex, Antigravity, OpenCode and others. The workspace and ordinary coding CLI processes run locally. Optional connected features send the data needed for their work, and the Assistant’s two search services are described below. Coding CLIs, voice providers and forge integrations use their own configured credentials. Everything in this section is opt-in and disabled by default unless stated otherwise.
The Daintree Assistant
The Daintree Assistant is Claude Code or Codex, launched by Daintree in its assistant sidebar and signed in with your own account or API key. Its model traffic goes from the CLI to that CLI’s provider under your terms, exactly as described under AI agent traffic below. Daintree does not relay it, and the Assistant has no Daintree account, sign-in or model service.
Each Assistant session is also connected to two search services that Daintree hosts. The CLI connects to them itself, as MCP servers over HTTPS. Daintree adds no authentication token, account ID or device ID to either connection: a request carries what the CLI’s MCP client sends by default (such as its name and version), and the server sees your IP address, as with any web request.
- Documentation search (
https://daintree.org/api/mcp) receives the search queries the Assistant writes when it looks something up in the Daintree docs. Those queries come from your question, so they can contain what you asked about. It is the same search index described under Site search, and is subject to the same query handling and hosting logs. The Search documentation setting, on by default, controls it. - Runbook search (
https://assistant.daintree.org/v1/daintree/mcp) is connected while Follow runbooks is on, which is the default. Before acting on a request, the Assistant sends a one-sentence summary of the task, and its instructions tell it to leave out specifics: numbers, branch, file, repository and people’s names, pasted output and prompt text. That is an instruction to the model, not a filter. Daintree does not inspect or redact the summary before it is sent, so treat it as able to carry whatever your request contained. The service returns matching procedures from a fixed catalog; it makes no model call and takes no action. Its application log records the type of request, its status, the number of results and the time taken, not the query text. For clients that open an MCP session, it issues a random session ID, held in memory for at most 12 hours so it does not resend procedures the session already has. It runs on Google Cloud, whose platform keeps its own request logs.
Both settings are under Settings → Assistant → Daintree Assistant → Behavior. Turning one off removes that server from the next session, so the CLI never connects to it. Runbook search also goes off with Daintree control, since runbooks drive Daintree’s own tools. Neither service is contacted until you start an Assistant session.
Distribution via the Microsoft Store
When you install or update Daintree through the Microsoft Store, Microsoft processes your Store account, download and install records, update delivery, ratings and reviews, and Store-level diagnostic data as an independent controller under the Microsoft Privacy Statement. Daintree does not receive your Microsoft account identifier or those Store records. The app's own update check (described under Auto-updates below) is a separate mechanism that talks to updates.daintree.org, independent of Store-managed updates.
AI agent traffic
Daintree launches AI coding tools as local subprocesses. The CLI talks to its provider (Anthropic, Google, OpenAI, etc.) directly using your credentials and your terms with that provider. Daintree does not relay model traffic for any of them, the Assistant included. The Assistant’s separate documentation and runbook searches are described above. If you have privacy questions about what an agent sends to its provider, those answers belong to the provider, not Daintree.
GitHub integration (optional)
The GitHub integration is optional and inactive until you supply a GitHub personal access token in Settings. When configured, the app uses your token to query the GitHub API for repository statistics, issues, pull requests, vulnerability alerts, and pull-request review threads tied to the projects you work on. This traffic goes directly from your machine to GitHub under your token and your GitHub terms; Daintree has no server in between. The token is stored locally (see Local data on disk) and is never transmitted to Daintree. Remove the token at any time to disable the integration.
MCP server (optional, off by default)
Daintree includes a built-in MCP server that is disabled by default. When you enable it, it exposes app capabilities to external AI agents that connect to it, which changes the local security surface of your machine. Only enable it if you understand and want that. The MCP server auto-generates a bearer API key on first start; that key is stored locally in the same config file as other credentials. The MCP server keeps a local audit log of activity (on by default when the server is configured, capped at 500 records by default and configurable in Settings); the audit log stays on your machine and is not transmitted to Daintree.
Telemetry: off by default
The app has three telemetry levels, set in Settings → Privacy & Data. The default is off, and nothing is sent until you explicitly choose otherwise:
off: no events are transmitted. This is the default.errors: scrubbed error events are sent to Sentry, with file paths and credential patterns removed first.full: adds a small set of named onboarding and activation events (for exampleonboarding_step_viewed,onboarding_completed,onboarding_abandoned,activation_first_agent_task_started,activation_first_agent_task_completed,activation_first_parallel_agents).
Before any event leaves the app:
- Home directory paths are replaced with
~in stack traces and breadcrumbs. - API keys, OAuth tokens, JWTs, and PEM blocks are matched against a scrubber pattern list (GitHub, Anthropic, OpenAI, AWS, Google, Stripe, Slack, npm, Azure, and generic Bearer tokens) and redacted.
- URL query strings are stripped of
access_token,refresh_token,client_secret, andcode. - Scrubbing walks supported event fields up to ten levels deep, including extra data, tags, user fields and contexts. Deep traversal and known-pattern matching reduce disclosure risk; they do not recognize every possible secret.
There is no sampling: once telemetry is enabled, every event that passes the scrubber is sent (the Sentry SDK's default 100% capture rate). The scrubber runs first, so events it cannot safely process are dropped before transmission. Native crash dumps (minidumps) are never sent to Sentry. The minidump integration is filtered out and Electron's crash reporter runs with uploadToServer: false, so any crash dump is written locally only.
The Sentry SDK does not transmit your IP address or any user identifier with events; no device identifier, install ID, or anonymous user ID is generated by Daintree for telemetry. Sentry's servers receive the connection's network IP at HTTP transport time (this is unavoidable for any internet request), and the Daintree project in Sentry is configured to discard IP addresses at the storage layer. Sentry retains accepted events for 30 days on the free tier we use. Settings → Privacy & Data also includes a preview view that shows you what would be sent without actually sending it.
Auto-updates
Daintree checks updates.daintree.org at startup and roughly every four hours to see if a new version is available. The check is an HTTP request for a release manifest; the only data sent is what's in standard request headers (your IP address, the app version, your operating system family, and a user agent). The server necessarily sees the network connection address. You can switch between stable and nightly channels in Settings. Store-managed builds use their separate update mechanism.
Voice input (completely optional)
Voice input is disabled by default. In Settings you choose OpenAI or Deepgram for transcription and supply that provider’s API key. The voice guide describes setup, controls and provider-specific options.
When recording, the desktop app streams microphone audio directly to the selected provider’s WebSocket endpoint: wss://api.openai.com/v1/realtime or wss://api.deepgram.com/v1/listen. Recognition hints can include your dictionary, project name, branch and identifiers gathered from terminal context, alongside the configured language. Voice correction is a separate toggle, disabled by default. Enabling it sends transcription text, recent/right-hand text context when supplied, project and dictionary context, and correction instructions to OpenAI’s Responses endpoint using your OpenAI key, including when Deepgram handled transcription. When file-reference resolution needs an AI tie-break, it also sends the spoken description and candidate repository file paths to OpenAI. These requests do not pass through a Daintree backend. The desktop app handles the returned text and places it in your input; if you submit it to an agent or Assistant, that feature’s data path then applies. Provider processing and retention depend on your agreement and account settings with the selected service.
Local data on disk
The app’s user-data directory is normally ~/Library/Application Support/Daintree/ on macOS, ~/.config/Daintree/ on Linux, or %APPDATA%\Daintree\ on Windows. Global settings and core forge, OpenAI, Deepgram and external MCP credentials use local configuration storage. Project state and local project settings use separate files under this directory; shared project configuration and plugin files can also live in the repository’s .daintree/ directory. See the storage reference for the individual locations and encryption boundaries.
Core app credentials are stored as plain-text JSON. The app attempts owner-only file permissions on macOS and Linux; that is not encryption and cannot guarantee every filesystem enforces those permissions. Plugin secret settings have a different OS-backed storage path and fallback behavior. Chromium’s --use-mock-keychain flag must not be read as a promise that no feature uses OS credential storage. Protect local configuration and review it before sharing files or diagnostics.
The app keeps local logs in its user-data directory. Log retention is configurable in Settings → Privacy & Data (7, 30, or 90 days, or kept indefinitely) and defaults to 30 days. The MCP server's audit log (when the server is enabled) is stored separately and capped at 500 records by default. Daintree's built-in crash reporter runs with uploadToServer: false, so any native crash dumps are written locally and never uploaded. You can clear the app's HTTP cache, reset all stored data, or uninstall the app at any time.
For the deeper technical reference, see Security & Privacy in the docs and the Trust & Security page.
Your controls in the desktop app
The only request Daintree makes on its own is the update check. The Assistant’s documentation and runbook search are on by default but connect only while you run an Assistant session. Every other feature that sends data off your machine is off until you turn it on. Two records are kept locally by default and never leave your machine: the app's own logs, for 30 days, and the MCP server's audit log whenever that server is configured. These are the settings that decide what the app collects, transmits, or keeps on disk, and where to change each one.
- Telemetry level
- Off / Errors / Full: controls what is sent to Sentry. Default: Off. Settings → Privacy & Data.
- Telemetry preview
- View-only. Shows the exact scrubbed payload that would be sent, without sending it. Settings → Privacy & Data.
- Log retention
- How long local app logs are kept: 7, 30, or 90 days, or indefinitely. Default: 30 days. Settings → Privacy & Data.
- Voice input
- Streams microphone audio and recognition hints to your selected OpenAI or Deepgram transcription provider using your own API key. Default: Off. Settings → Voice Input.
- Voice correction
- Separate toggle. Sends transcription text to OpenAI's responses API to clean it up. Default: Off. Settings → Voice Input.
- GitHub integration
- Fetches repo stats, issues, PRs, vulnerability alerts, and review threads using a token you supply. Default: Off. Inactive until you add a token. Settings → Code Forge.
- MCP server
- Exposes app capabilities to external AI agents. Default: Off. Settings → MCP Server.
- MCP audit log
- Local-only record of MCP activity, capped at 500 records by default. Default: On when the MCP server is configured. Settings → MCP Server.
- Search documentation
- Lets an Assistant session query the Daintree docs index at daintree.org. Default: On, used only during an Assistant session. Settings → Assistant → Daintree Assistant → Behavior.
- Follow runbooks
- Lets an Assistant session send a one-sentence task summary to Daintree’s runbook search. Default: On, used only during an Assistant session. Settings → Assistant → Daintree Assistant → Behavior.
- Newsletter
- Email list via MailerLite. Default: not subscribed. Unsubscribe link in every email, or email us.
- App data reset
- Action. Clears the HTTP cache and resets all locally stored data and settings. Settings, or uninstall the app.
For voice input, voice correction, the GitHub integration, and the MCP server, you also retain account-level controls at the respective provider (including OpenAI, Deepgram and GitHub) over how that provider handles the data it receives.
Third-party services we rely on
Daintree depends on a small number of third-party services. Each one has its own privacy policy, linked below.
- Vercel
- Website hosting and Web Analytics. VercelPrivacy policy
- Cloudflare
- Turnstile bot protection on the newsletter form. CloudflarePrivacy policy
- MailerLite
- Newsletter list and email delivery. MailerLitePrivacy policy
- Upstash
- Server-side cache and site search backend. UpstashPrivacy policy
- Google Cloud
- Hosts the Assistant’s runbook search service in the United States. Receives the task summaries described under The Daintree Assistant while Follow runbooks is on. Google CloudPrivacy notice
- Sentry
- Opt-in app telemetry: scrubbed error events, plus a few anonymous onboarding/activation events at the Full level. Off by default; native crash dumps are never sent. SentryPrivacy policy
- OpenAI
- Optional voice transcription when OpenAI is selected, and optional voice correction even when another provider transcribes. Uses your own OpenAI API key. OpenAIPrivacy policy
- Deepgram
- Optional voice transcription when selected. Receives microphone audio and configured recognition hints using your Deepgram API key. DeepgramPrivacy policy
- GitHub
- Repository hosting. Public repo statistics are fetched ahead of time and published as part of the site, so viewing a page makes no request to GitHub for them. The optional desktop integration uses your token to fetch issues, PRs, vulnerability alerts, and review threads. GitHubPrivacy policy
- Microsoft Store
- App distribution. Microsoft processes Store account, download, install, update, and ratings/review data under its own statement. Microsoft StorePrivacy statement
This list covers the services described here, but is not an exhaustive network allowlist: installed plugins, browser pages, other forge providers, CLI update sources, and MCP servers you add to the Assistant yourself can introduce other destinations. There is no advertising network, no data broker, and no analytics vendor beyond what's listed here. Separately, the AI coding CLIs you launch through Daintree communicate directly with their own providers (Anthropic, Google, OpenAI, and so on) under your credentials and those providers' terms. Daintree is not in that data path.
What we don't do
A short, deliberate list of things you might reasonably expect a website privacy policy to mention, and which simply don't apply here:
- No advertising network, retargeting pixel, or marketing analytics vendor.
- No behavioral profiling, fingerprinting, or building of visitor profiles. (Cloudflare Turnstile inspects browser-level signals on the newsletter page only, strictly to score bot vs. human.)
- No selling or sharing of personal data with third parties beyond the providers listed above.
- No cross-site tracking. The site sets no first-party tracking cookies, and Vercel Analytics resets its identifier hash daily.
- No user accounts, no logins, and no authentication flow on the website.
- The workspace reads local files and terminal output to provide its features. Coding CLIs, the Assistant included, use their configured providers; connected features and the Assistant’s searches send the data described above. Optional telemetry applies redaction, but diagnostics and tool results can contain sensitive content.
- No automated decision-making or scoring that produces legal or similarly significant effects.
Lawful basis for processing
For each processing activity described above, this is the lawful basis we rely on under POPIA Section 11 and GDPR Article 6. Providing personal information to Daintree is always voluntary; the only consequence of declining is that the relevant feature does not work for you (you don't receive the newsletter, telemetry stays off, voice input doesn't activate).
- Newsletter signup: your consent (POPIA s11(1)(a) / GDPR Art 6(1)(a)).
- App telemetry, when you enable it: your consent. Off by default; you can withdraw at any time in Settings.
- Voice input, when you enable it: your consent, plus your direct contractual relationship with the selected voice provider.
- GitHub integration, when you enable it: your consent, plus your direct contractual relationship with GitHub.
- MCP server, when you enable it: your consent. Off by default; enabling it is an explicit, reversible choice in Settings.
- Assistant documentation and runbook search: our legitimate interest in giving the Assistant session you start accurate documentation and procedures. Both run only during a session you start, and each can be turned off in Settings.
- Microsoft Store distribution: Microsoft acts as an independent controller under its own privacy statement for Store account, download, and install data; our basis for distributing through the Store is our legitimate interest in delivering the app.
- Vercel Web Analytics: our legitimate interest in understanding aggregate site usage (POPIA s11(1)(f) / GDPR Art 6(1)(f)). The processing is cookieless and uses no cross-site identifiers, which we believe makes the impact on your privacy minimal.
- Cloudflare Turnstile bot protection: our legitimate interest in keeping the newsletter form free of automated abuse.
- Server-side caching, hosting, and standard request logs: our legitimate interest in operating and securing the website.
- Auto-update checks: our legitimate interest in delivering a working, secure desktop app. This is the one request the app makes without being asked; telemetry itself is consent-based, as above.
Your rights
Daintree is operated from South Africa and is therefore subject to the Protection of Personal Information Act (POPIA). If you are in the European Union, the United Kingdom, or another jurisdiction with similar data-protection rules, those rules apply to your data as well.
You have the right to:
- Access the personal information we hold about you (in practice this is essentially your newsletter email address, if you've subscribed).
- Correct any information that is inaccurate.
- Delete your information: for the newsletter, you can do this yourself via the unsubscribe link or by emailing us.
- Object to processing or withdraw consent at any time. Withdrawing consent does not affect the lawfulness of past processing.
- Lodge a complaint with the South African Information Regulator or your local data-protection authority.
To exercise any of these rights, email privacy@daintree.org. We aim to respond within 30 days.
The South African Information Regulator can be contacted directly at:
- Email (general enquiries): enquiries@inforegulator.org.za
- Email (POPIA complaints): POPIAComplaints@inforegulator.org.za
- Postal: JD House, 27 Stiemens Street, Braamfontein, Johannesburg, 2001
- Web: inforegulator.org.za
Children
Daintree is a tool for software developers. It is not directed at children, and we do not knowingly collect personal information from anyone under 13 (or under 16 in the EU/UK). If you believe a child has provided personal information through the website, please contact us and we'll delete it.
International data transfers
The third-party services we use are operated from a small set of jurisdictions, primarily the United States and the European Union. Where personal information is transferred to one of those providers, we rely on the corresponding mechanism that the provider itself maintains:
- US-based providers (Vercel, Cloudflare, Sentry, Upstash, Google Cloud, OpenAI, GitHub, Microsoft) rely on the transfer mechanism each provider maintains: participation in the EU-U.S. Data Privacy Framework and its UK Extension where applicable, and/or Standard Contractual Clauses through their published Data Processing Agreements.
- EU-based providers (MailerLite stores subscriber data on Google Cloud in the EU) operate under GDPR directly.
Voice providers receive recording data when you use the enabled voice feature, and the optional forge integration uses its configured credentials. Coding CLIs, including the Claude Code or Codex session behind the Assistant, send conversation and tool context to the providers you have configured for them. For purposes of POPIA Section 72, we rely on the published privacy commitments and DPAs of these providers, all of which afford a level of protection that is substantially similar to POPIA's principles.
Security
The Daintree desktop app's security model (Electron sandboxing, IPC validation, code signing, telemetry scrubbing, and so on) is documented in detail on the Trust & Security page and in the security reference. Core Daintree feature credentials live in local configuration files with best-effort owner-only permissions (0o600 on macOS and Linux); plugin secret settings use the separate storage mechanism described above; native crash dumps are written locally and never uploaded. The website combines prerendered SvelteKit pages with server handlers for search, newsletter and release data. Server credentials include MailerLite, Turnstile, Upstash and webhook access; these are read from private environment variables. The optional privileged search MCP key is also server-side.
Changes to this policy
This page carries two dates. Effective is the date the current policy took effect. Last updated is the date its text was last substantively revised, so you can tell whether anything has changed since you last read it. A revision that changes what we collect, or who receives it, moves the effective date as well. For substantive changes (new third parties, new categories of data collected) we'll also note the change in a release announcement or in the newsletter, where applicable.
Contact
Privacy questions, data requests, or general feedback: privacy@daintree.org. To report a security issue, use security@daintree.org.