Privacy Policy
Effective date: 24 August 2026 (last materially updated 17 October 2026) · Controller: Borago Soft Limited, a New Zealand limited company (NZ company number 9428048, NZBN 9429053662910), 7a Garner Place, Glenfield, Auckland 0629, New Zealand · Privacy contact: privacy@boragosoft.com.
The Borago Board desktop app is local‑first: by default your data stays on your device and Borago Soft Limited does not receive it. This policy explains what is stored locally, what leaves your device, and to whom.
1. Data stored locally on your device
The app stores the following on your device (a local SQLite database and app files), not on our servers:
- Board content — projects, tasks (including task descriptions and the AI's output/history), comments, and file/image attachments.
- Configuration — app settings, Docker/project configuration, log files (
borago.log). Your board, its attachments and its log are stored per account: if more than one account signs in on this device, each gets its own directory and they are never mixed. - Secrets, encrypted at rest (AES‑256‑GCM) — AI API keys, Git tokens/SSH keys, and project environment variables. The key is held via your operating system's secure storage where it offers one (macOS Keychain, Windows DPAPI, a Linux Secret Service); on a Linux session with no such store the app warns you that the key is stored unprotected. When you sign in to cloud sync it is replaced by your account's data key, which is itself sealed with a key derived from your password.
- If you enable cloud sync, these secrets are synced as ciphertext unless you turn them off. Each one has a "keep on this device only" setting per project; turning it on deletes that secret from the cloud on the next sync and keeps it here. See the Web Privacy Policy §1a.
- Environment variables have two extra per-variable controls, both off unless you turn them on. Keep on this device stores that one variable separately and it is never sent to the cloud at all - only the fact that a variable of that name exists travels, so your other devices can tell you what to fill in. Hide the value stops the app showing it back to you (or to anything else reading the board over your network); it can be replaced but not read. Neither changes what your containers receive: a task always gets the real value.
- Previous versions of your secrets ("credential history"). So that a credential cannot be lost for good by a bug, a bad sync, or a mis-click, the app keeps the earlier values of the secrets above in a file on your device, in the same encrypted form as the live value (never in plaintext). Up to 10 versions per credential per project are kept, and you can restore or erase them from the project's settings. This file is never synced and never leaves your device. See §5 for how long it is kept.
- Photos, screenshots and drawings you attach. The attachment buttons can take a photo with your camera, capture a screenshot of your screen, or open a drawing canvas. The camera and screen are accessed only while you use that button, behind your operating system's own permission prompt where it has one, and never in the background or without your action: you always see what is being captured before anything is attached, and the AI has no access to your camera or screen. The result is stored as an ordinary attachment on the task, nothing else is kept, and it leaves your device only as any attachment would (to the AI provider if the task uses it, and to the cloud service if you sync attachments on a plan that includes them).
- Recoverable deletions. Deleting a project, and (when cloud sync removes a credential) removing a secret, do not erase the data immediately — see §5.
- Restore points. Before an app update is allowed to change the local database, the app saves a complete copy of it, together with the credential history file described above. Each copy therefore contains all of your board content and your encrypted secrets as they stood at that moment. Copies are stored on your device only, and are never synced.
We do not collect or transmit this local data to ourselves unless you enable an optional feature below.
2. Data that leaves your device
Data leaves your device only through the features below. Each entry says when it runs. Most run only when you use the feature; three run on their own: the update check (on by default, with a switch in Settings → Application), the provider status check after a failed run, and the image pull when a project container is built. The diagnostics report you can send by hand is described in §3.
- AI provider (always, when you run a task). To execute a task, the app sends the task prompt and related content — which may include project context, task descriptions, prior output, and code — to the AI provider you configured for that project, via that provider's API, using your API key. The providers the app can connect to are Anthropic (Claude), OpenAI, xAI (Grok), and Google (Gemini); you choose which, per project. A task run may also use the provider's own web search feature (Anthropic, OpenAI, Google), which sends the agent's search queries to that provider and is billed to your key, and the provider's own web page retrieval feature (Anthropic, Google), which has the provider fetch, on its own infrastructure, web addresses that appear in your task content or in search results and return the page content into the run. Each provider's handling of your data (including any use for training) is governed by their privacy policy — review and configure your provider account settings directly. If you instead configure a self‑hosted model server you run yourself, task content goes only to that server and no AI provider is involved.
- MCP servers (a project option this app does not act on). Project settings include an MCP servers option. This version of the app has no MCP client, so the option loads no tool servers and causes no data to be sent anywhere. If a future version acts on it, this policy will be updated to say what is loaded and where data may go.
- Git hosts (if configured). Clones/pushes send data to the Git remote you set.
- Cloud sync (optional, off by default). If you enable cloud sync and sign in, the app synchronizes your board content — projects; tasks including their text/output and the archived output of each run; comments; chat conversations with the planning assistant; notes; flow definitions (not their run logs); notifications and whether you have read them; account settings; and the names and addresses of any self‑hosted model servers you registered — and, on a plan that includes attachments, attachment metadata and file bytes, to the hosted service (the full list is in the Web Privacy Policy §1). Device‑local fields are never synced. Your project secrets — including your Git credential — DO sync, as ciphertext, unless you switch them off per project (§1 above and the Web Privacy Policy §1a); the credential history, restore points and held removals described in §1 are device‑local and never sync. Your source code is not uploaded by sync (it lives in your containers/Git), although task text/output you sync may contain code snippets. Cloud handling is described in the Web Privacy Policy.
- Cloud terminal relay (optional, with cloud sync). If you open a project terminal from the hosted web/mobile board, your keystrokes and the terminal output are relayed through the cloud service over an authenticated tunnel to your desktop. The stream is forwarded transiently and not stored by the Service (see the Web Privacy Policy).
- Setting a secret remotely (optional, with cloud sync). The same tunnel carries one more thing: if you enter a project credential or environment variable on the hosted web/mobile board, the value is relayed to this app, which encrypts and stores it — because only your device holds the key. A saved (vault) key or a self‑hosted service key can be entered only in this app. This direction is inbound, so nothing additional leaves your desktop; but the value does pass through the Service in readable form on its way here. See the Web Privacy Policy §1a.
- LAN / web exposure (optional, off by default). If you enable "expose to web", the app serves your board over HTTP on your device/network. The LAN interface has no login: anyone who can reach that address on your network can view and control your board (tasks, output, comments — and through it, the AI agent). Enable it only on networks you trust; remote access is what the optional cloud sync is for.
- Dictation (optional). The chat composer has a microphone button that turns speech into text on your device, using a small speech model that runs inside the app; no audio and no transcript is sent to us or to any AI provider by dictating, and nothing is sent until you press Enter on the text you have read. The microphone is on from the press that starts dictation until the press that stops it, or until the text box it belongs to closes, behind your operating system's permission prompt. The model (about 43 MB) is not bundled: the first time you use the button, the app asks before downloading it once from a public model repository (Hugging Face), which sees your IP address as any download would. If you use the board from a browser on your own network, the recording travels over your network to this app to be transcribed; the hosted cloud board has no dictation.
- Docker setup and container images (only when you ask, and when a project container is built). "Set up Docker" downloads Docker's packages or Docker Desktop's installer from Docker's servers, and on Linux gVisor from its publisher. Building a project container pulls the base image its Dockerfile names (Docker Hub by default) from that registry. On an Apple silicon Mac without Rosetta 2, the same setup can install Rosetta through Apple's software update, which contacts Apple. These downloads expose your IP address to those hosts. Nothing about your board is sent.
- Update checks (on by default; Settings → Application). The app contacts our update feed at launch and once a day to learn whether a newer version exists; this exposes your IP address and app version to the update host. Nothing about your board is sent.
- Provider status check (only when a task run fails). To tell an outage at the provider from a problem on your side, the app reads the provider's public status page once (Anthropic, OpenAI, or Google Cloud; xAI publishes none). The request carries nothing about your task or key; the status host sees your IP address, as any web page would.
3. What we (the app publisher) collect directly
By default, nothing. The desktop app contains no automatic analytics or telemetry — we receive only what you choose to send us.
Diagnostic reports (optional, user‑initiated). Settings → Diagnostics lets you send us a bug or error report. Nothing is ever sent automatically: you write the message, you choose per checkbox whether to attach a log excerpt and/or system information (OS, architecture, app version), and the dialog shows you the exact payload before you send it.
Two things worth being precise about, because they are easy to assume wrongly:
- What scrubbing does. Secrets — API keys, tokens, and password‑shaped values — are removed before the excerpt leaves your device. That is all it removes. The excerpt is your app log, so what remains is ordinary board content: project and task names, file paths, and any email address that appears in a log line. None of that is a secret, so none of it is scrubbed. It is shown to you in full before you send, which is why the preview exists — please read it.
- Whose log it is. The excerpt is taken from the log of the account you are signed in to. Logs are kept per account, so a report cannot contain another account's work even if several people use the same device.
We attach no account or device identifiers to a report, and we do not store your IP address with it (it is used only transiently for abuse rate‑limiting). Anything identifying in a report is content you saw and chose to send.
How we read reports, and who else does. Borago Board is developed and maintained with AI coding assistants. When we investigate a report we may put its content — your message and any log excerpt or system information you attached — in front of such an assistant, which transmits that content to the assistant's provider (currently Anthropic, PBC, United States) for processing under that provider's terms, including its retention rules. This is the one case in which something you gave us reaches an AI provider through us rather than from your own device under your own key, and it is why Anthropic is listed as a sub‑processor for this single purpose in the Web Privacy Policy §4. Sending a report is your consent to that handling; the way to avoid it is not to send one.
Reports are deleted automatically 30 days after they arrive. Because a report carries no identifier, we cannot look up your reports by account, and we have deliberately not built a way to, because doing so would mean re‑introducing a means of singling out one user's data. If you tell us what you sent and when, by writing to privacy@boragosoft.com, we can find it by its content and time and delete it; otherwise the 30‑day window is how it is erased.
Lawful basis: consent (each send is a fresh, explicit choice); withdraw it by simply not sending.
If you contact us at privacy@boragosoft.com or https://www.boragosoft.com/contact-borago-soft, we process what you send to respond.
4. Legal bases (EEA/UK)
Where local processing involves us at all (cloud sync, support), our bases are performance of a contract (providing the feature you enabled) and legitimate interests (security, support). Provider and Git‑host processing rely on your relationship with them.
5. Retention
Local data persists on your device until you delete it. Uninstalling the app does not necessarily remove your local data. Depending on your platform and how you uninstall, the local database, project files, log files, cached keys, and the Docker containers, images, networks, and volumes the app created may remain on your device after the app is removed. To erase them you must delete the app's data directory and remove the associated Docker resources yourself (see the EULA §10). Cloud‑synced data retention is covered in the Web Privacy Policy.
Deleting something in the app does not erase it straight away
Several features exist so that data cannot be destroyed by accident or by a defect. The trade‑off is that deleted items remain on your device, recoverable, for a period — and you should know the windows and how to cut them short:
| What | Kept | Then | How to erase it now |
|---|---|---|---|
| Deleted projects (with their tasks, comments and attachments) | 30 days | permanently deleted automatically | Settings → Recycle bin → Delete or Empty now |
| A secret removed by a sync from another device | 7 days by default | permanently deleted automatically | the notification, or Settings → Removed credentials → Delete permanently |
| Previous versions of a secret you changed or replaced | until you erase them, or until displaced by newer versions (10 per credential) | — | the project's Git or Environment tab → Forget this history |
| Restore points (full copies of the local database) | the last 2; older copies are deleted when a newer one is taken | — | delete the app's data directory (see above) |
The window for removed secrets is configurable in Settings → Application (setting it to 0 keeps them until you choose). Restoring or permanently deleting is always your decision; where a window expires without one, the value is permanently deleted, not kept.
Three consequences worth stating plainly:
- A restore point is a full copy of your board at that moment. Content you delete afterwards still exists inside it until that copy is displaced.
- The credential history holds superseded secrets in encrypted form. If you rotate a credential because it may have been exposed, revoke it at the provider (GitHub, Anthropic, OpenAI, …) — as you should anyway. Removing it from Borago, here or anywhere, cannot revoke it.
- If you connect a repository by signing in to GitHub or GitLab, the app adds a deploy key to the repository you choose and stores the private half like any other credential. The sign‑in itself is used once and not kept, so there is no Borago session at your Git host to sign out of. The key, and the app's access to your account, are managed and revoked in your Git host's own settings — not here. The permission the Git host asks you to grant is wider than what the app does: GitHub's "Administration: read and write" is the only permission that can add a deploy key and also covers repository settings and deletion, and GitLab's
apiscope is broad. The app is built to make no such call — its sign‑in can list the repositories you have made reachable and add one deploy key, and nothing else — and you can limit the reach yourself by installing the GitHub App only on the repositories you intend to connect.
6. Security
Secrets are encrypted at rest and handed to containers at runtime through their environment rather than written to disk in plaintext; the one exception is an SSH key, which is written to a temporary file inside the container for the duration of each SSH connection git makes (a clone, fetch or push in a run, a terminal, a script or a flow) and removed when that connection ends. A credential synced to the cloud is encrypted under your account's data key, which Borago Soft never stores (the Web Privacy Policy §1 and §8 say exactly when it is opened in memory), and you can stop any individual secret syncing at all. Board content such as task text, comments and run output syncs readable, as the Web Privacy Policy §1 describes. However, ambiently configured Git credentials may be readable inside a running container for its lifetime, and container isolation (gVisor) may be unavailable on your system. Use dedicated least‑privilege credentials. No method of storage or transmission is perfectly secure.
7. Your rights
For data you sync to the cloud, you have the rights described in the Web Privacy Policy (access, deletion, portability, etc.). For purely local data, you control it directly on your device. Contact privacy@boragosoft.com with questions.
8. Age
The app is a developer tool and is not directed to children. By default it collects nothing (see §3), and we do not knowingly collect personal data from children. The AI providers the app connects to (Anthropic, OpenAI, xAI, Google) each set their own minimum age — for example, Anthropic requires its users to be 18 or older — and the app asks you to confirm, when you connect each provider (at the API‑key step), that you are 18 or older and meet that provider's requirements. You must not connect or use any provider whose age requirement you do not meet. Any optional cloud account is subject to the age requirements in the Web Terms.
9. Changes & contact
We will update this policy as needed and revise the effective date. Contact: Borago Soft Limited · privacy@boragosoft.com · 7a Garner Place, Glenfield, Auckland 0629, New Zealand.