Privacy
Last updated 19 August 2026.
What Bunso does with your words, where each thing goes, and how to check rather than trust.
The short version. Out of the box, nothing leaves your Mac. Speech recognition and cleanup both run on-device. There is no telemetry, no analytics, no crash reporting, and no account. The only network access in a default install is downloading model weights the first time you use a model, checking for updates when you click “Check for Updates”, and — if you buy a license — one request when you activate a Mac.
There are two optional exceptions, both off by default. Since v0.4.0 you can supply your own API key and have the cleanup step run at OpenAI, Anthropic, Google, OpenRouter, or any OpenAI-compatible endpoint you choose. And you can mirror your spoken tasks into Apple’s Reminders app, which then syncs wherever your Reminders already sync — your iCloud account, not ours. This page explains exactly what each one changes.
What never leaves your Mac, under any setting
- Your audio. Recording and transcription are always on-device. No recording is ever uploaded, kept, or written to disk beyond the moment it is transcribed. There is no cloud speech recognition option.
- Your API key. It is stored in your Mac’s Keychain and sent only to the provider it belongs to, as an authentication header.
- Anything about you. No telemetry, no identifiers and no crash reports. Bunso keeps a running count on your own Mac of how much you have dictated, so it can show you the time you saved; it is a set of numbers with no text in it, it is never sent anywhere, and there is a Reset button. Nothing about how, when or how often you dictate reaches us or anyone else, and the app never contacts us on its own — see Activating a license for the single request it makes, which happens because you pressed a button and never again afterwards.
What can leave your Mac, and only if you turn it on
Every item below requires both turning off “Local only” and choosing “With my API key” in Settings → Cloud. Each extra item is then its own separate toggle, and all of them ship off.
| Data | Sent when | Default |
|---|---|---|
| The text you dictated | Cloud cleanup is on for that app | Off |
| Text you had highlighted | You dictate while text is selected, and cloud cleanup is on for that app | Off |
| Text on screen near your cursor | Plus the separate “Text on screen near your cursor” toggle | Off |
| Your dictionary of names and terms | Plus the separate “Your dictionary of names and terms” toggle | Off |
Nothing else is transmitted — not the app you are dictating into, not timestamps, not your dictionary unless asked, not your learned corrections.
Three notes worth reading rather than skimming:
Screen context is read locally either way
Bunso reads a short excerpt near your cursor to help spell names correctly. That happens on-device regardless of this setting; the toggle controls whether that excerpt is sent to your provider. It is off by default because that field may contain an email, a document, or someone else’s message.
Highlighted text is treated exactly like what you dictated
If you select text and then dictate, Bunso rewrites the selection according to what you said — so the selected passage is the thing being worked on, and it travels under the same rule as your transcript rather than as a separate opt-in. It is covered by every protection above: with “Local only” on it never leaves, and in an app you marked sensitive, or one set to verbatim, it is never sent no matter what else is configured. Bunso reads your selection only while a dictation is running, never in the background, and never in a password manager.
Your dictionary is a social graph
It names your colleagues, clients and products. Its corrections are already applied to your transcript before anything is sent, so sending the list itself only helps with spelling variants — which is why it defaults to off.
Where cloud cleanup is never used
Even with everything switched on, these stay on-device, by construction:
- Terminals and editors. They are verbatim apps, so they skip the cleanup step entirely — there is no request to make.
- Password managers and credential interfaces. Marked sensitive by default: 1Password, Bitwarden, KeePassXC, Keychain Access, Enpass, Dashlane, LastPass, Proton Pass, NordPass and Apple Passwords. Bunso also never reads screen context in these apps.
- Any app you mark sensitive in Settings → Words → App Profiles.
- Any app macOS cannot identify. An app with no bundle identifier cannot have been opted in, so it is treated as not opted in.
- Anything over about 6,000 characters, so a runaway recording cannot be uploaded or burn your credit.
The rules live in one file, CleanupPolicy.swift, as a single pure function you can read in a minute. They are exhaustively tested in CleanupPolicyTests.swift, including that “Local only” beats every other setting in every combination.
Your provider is your relationship, not ours
When you use your own key, your text goes from your Mac to a company you chose and pay directly. Bunso takes no cut, runs no proxy, and never sees the request. What that provider does with your text — how long they keep it, whether they train on it — is governed by their terms and your account settings with them, not by anything Bunso can promise. Business and enterprise API tiers commonly exclude training by default; consumer tiers sometimes do not. Check before sending anything you care about.
Gemini specifically applies safety filters that will refuse some legitimate dictations, including medical, legal or profane content. Bunso falls back to your raw words when that happens.
How to verify all of this
Do not take the paragraphs above on faith:
- Leave “Local only” on (the default) and watch with Little Snitch,
nettop, or Activity Monitor while you dictate. There will be no connections, because no code path builds a request: the switch is checked in the transport itself, before a request object exists. - Read the source. There is exactly one place in first-party code that performs a cleanup network request:
CloudTransport.swift. Two other files can reach the network at all, and neither has anything to do with what you dictate:ActivationClient.swift, which runs when you press Activate or Remove License, and the update check inmain.swift. - Trust the test, not the claim.
NetworkCallSiteTests.swiftfails the build ifURLSessionappears anywhere else in the source tree. If someone adds a second call site, that test breaks first. - Read the log.
~/Library/Logs/Bunso/bunso.logrecords one line per cloud request: provider, model, character counts, HTTP status and duration. It deliberately never records the text — provider error responses echo the request, so logging bodies would put your dictation on disk.
An honest caveat
Bunso is not sandboxed, because the Accessibility and Input Monitoring permissions it needs are incompatible with the App Sandbox. So “it cannot transmit” is a claim about the source code, verifiable by reading it and by watching the network — it is not enforced by the operating system. If you need an OS-level guarantee, the available escalation is a sandboxed build without the com.apple.security.network.client entitlement, which would make transmission impossible rather than merely absent. Ask if you need it.
For managed Macs
A configuration profile can pin local-only so it cannot be turned off:
defaults write app.mybunso.Bunso LocalOnlyEnforced -bool true
Deployed as a managed preference, Settings shows the switch disabled and labelled “Managed by your organisation”. This is intended for the case where an administrator needs to attest that the app will not transmit, rather than trusting each user to leave a toggle alone.
Data stored on your Mac
| What | Where |
|---|---|
| Settings | ~/.config/bunso/config.json |
| Your dictionary | ~/.config/bunso/dictionary.json |
| Learned corrections | ~/.config/bunso/learned.json |
| Dictation history and saved keywords | ~/.config/bunso/history.json (owner-readable only) |
| How much you have dictated (counts only) | ~/.config/bunso/stats.json (owner-readable only) |
| Your spoken tasks | ~/.config/bunso/todos.json (owner-readable only) |
| Your spoken notes | Markdown files in your notes folder (~/Documents/Bunso Notes unless you chose another) |
| Tasks you chose to mirror | Apple’s own Reminders database on this Mac |
| Per-app behaviour | ~/.config/bunso/app_profiles.json |
| Logs (no dictation text) | ~/Library/Logs/Bunso/bunso.log |
| Model weights | Hugging Face, WhisperKit and FluidAudio caches |
| API keys | macOS Keychain, service app.mybunso.Bunso.apikey |
Deleting the app leaves all of it in place until you remove those files yourself.
About the history file
history.json is the most sensitive file Bunso writes: a plain-text record of what you have dictated, which before this feature existed only for as long as one paste took. So:
- It never leaves your Mac. There is no upload path for it, and saved keywords expand after cleanup — so with cloud cleanup on, what is sent is the keyword you spoke, never the paragraph it stands for.
- It is readable only by you (
0600), the same as your license. - Rewrites are never recorded. When you dictate over highlighted text, the result is your own document rather than something you said, and it is not written to history.
- It is capped — at your chosen size with a license, or your last 10 dictations and 5 keywords without one. Entries you gave a keyword are exempt from the count, so a saved snippet cannot be pushed out by ordinary dictation, and a license expiring never deletes a keyword you saved — it only stops you adding new ones until you are under the limit.
- You can switch it off, in Settings → Words → History. Switching it off deletes the file rather than merely stopping new entries.
- Clear History removes your dictations and keeps the entries you deliberately gave a keyword.
About your notes and tasks
If you give a hotkey the job of capturing, what you say on that key is written down instead of typed at your cursor. Which list it lands in is decided from your first words, on this Mac, by a fixed set of rules — “remind me…” and “to-do…” make a task, anything else makes a note.
- Your tasks stay in a file only you can read (
0600), with no upload path of its own. - Your notes are ordinary Markdown files in a folder you choose, so you can open, search and edit them in anything. Choosing a folder that syncs — iCloud Drive, Google Drive, Dropbox — takes your notes wherever it syncs. The default folder is local to this Mac.
- Saved keywords are never expanded into either. A keyword stands for a whole stored paragraph, and a to-do item is meant to be the words you said.
- A license lapsing never deletes a note or a task. The feature is part of Go, but nothing about your license can remove something you wrote down.
One thing to be plain about: a spoken to-do is cleaned up exactly like a dictation, by the same rules. So if you have cloud cleanup switched on for the app you happened to be in when you pressed the key, the words you spoke for that to-do go to your provider, the same as a dictation would. Every protection above still applies unchanged — “Local only” keeps it home, and an app you marked sensitive or set to word-for-word never sends anything.
About Apple Reminders
This one is off, and it is the only setting in Bunso that deliberately copies what you said into another company’s app. It is worth being exact about.
- Nothing happens until you switch it on, in Settings → Words → Apple Reminders. macOS then asks your permission, and if you say no, nothing breaks.
- What is copied: the wording of a task, its time, and whether it is done. Nothing else — not your notes, not your dictation history, not your dictionary.
- Where it goes is Apple’s business and yours, not ours. Bunso writes to the Reminders database on this Mac. If your Reminders sync to iCloud — most people’s do — then your tasks sync with them, to Apple, under Apple’s terms. Bunso sends nothing anywhere itself and gains no new way to reach the network.
- You choose the list, and it can be one you already keep. Bunso only ever changes reminders it made itself, so anything you added to that list by hand is left alone.
- Switching it off deletes nothing. What is already in Reminders is yours and stays. The same is true if your license lapses: Bunso stops copying, and takes nothing back.
About the counts
So Bunso can tell you how much typing it saved you, stats.json holds a running total: how many dictations, how many words, how long you spent, and a per-day tally capped at 90 days. It holds numbers only — there is no dictation text anywhere in it, day is the finest granularity it records, it is readable only by you, it is never transmitted, and Settings has a Reset button that empties it.
Data stored when you buy a license
Buying is the one part of Bunso that involves a server of ours, and it involves it exactly twice: once when your payment provider tells us you paid, and once when you activate a Mac. After that the app never contacts it again — a license is verified on your Mac, offline, forever.
| What we store | Why |
|---|---|
| Your email address | To send you the key, and to send you a new one if you lose it |
| A one-way hash of your license key | So a database leak yields no working keys |
| A one-way hash of a hardware identifier, per Mac you activate | To count how many Macs are using one license |
| The payment id, amount and currency from your provider | To match our records to theirs, and to handle refunds |
| When each of those happened | The same reason |
We store a one-way hash of a hardware identifier to count seats. We cannot reverse it and we cannot identify your machine from it.
Activating a license
This is the only request the app itself ever makes to us, and it happens because you pressed Activate in Settings → License.
It sends three things: your license key, that one-way hash, and the app’s version number. Not your email address — the key is what identifies the license — and nothing about your dictation, your settings or your Mac beyond the hash. The hash is computed on your Mac before the request is built; the hardware identifier itself never leaves.
What comes back is a small signed file which Bunso stores and checks locally from then on. After that the app never contacts us again — not at launch, not before a dictation, and not when it checks for updates. That is why it works on a plane, and it is also why a refund cannot switch off a Mac that has already activated.
Pressing Remove License sends the same two values once more, to free the seat so you can use the license on a different Mac. If you are offline it removes the license locally anyway.
Your IP address is visible to us during those requests, as it is to any server you connect to. It is not stored: the limit on repeated attempts counts against a salted hash, and there is no column anywhere that holds an address.
If you would rather the app never made this request at all — an air-gapped or compliance install — ask us, and we will issue a license file you paste in directly. That path involves no network access from the app at any point.
Who else sees your email address
Two companies, both only because buying something requires them, and neither ever receives anything you dictated:
- Your payment provider, which handles the payment itself. We never see your card details; they never reach our server.
- Resend, the service that sends you the email carrying your license key. It receives your address and the key in transit, because that is what delivering an email means. It is not used for newsletters, announcements or anything else — there is no mailing list to be on. The only emails we ever send you are your key, and a replacement key if you ask for one.
That is the complete list. Nothing about your use of the app reaches either of them, because the app never talks to either of them.
What is not stored, and has no column to be stored in: anything you dictated, how often you dictate, which apps you use, your IP address, or any usage telemetry at all. Rate limiting keeps a hashed counter, not an address.
A refund revokes a license for future activations. It cannot reach a Mac that has already activated, because that Mac never asks — which is the same property that makes the app work on a plane.
This website
Separate from the app, and stated here because it changed on 15 August 2026: this website counts pages read and downloads started. Before that date it counted nothing.
How it is counted matters more than that it is:
- There is no analytics script on any page. No cookies, no localStorage, no pixel, no fingerprint. Nothing is stored on your device by this site, and there is no banner to dismiss because there is nothing to consent to.
- No third party is contacted by your browser. Open the network inspector on any page here: every request goes to this domain and no other. The counting happens on our server, after the page has already been sent to you.
- No profile is built. Events are recorded with a flag that tells the analytics service not to create a person record.
- Your IP address is never sent. Because the counting happens on our server rather than in your browser, the only address the analytics service ever sees is our own — the same one for every visitor. Its geolocation is switched off too, so that address is not turned into a location either. The country recorded is the one our own edge server already knows from routing your request, and it is the only thing about your location that is kept.
- You are not followed between visits. To avoid counting one reader ten times, requests are grouped by a one-way hash of your IP address and browser, salted and rotated every day. It is never stored, cannot be reversed into an address, and is a different value tomorrow.
| Event | What is recorded |
|---|---|
| A page is read | The path, the referring page or site, and the country |
| A download is started | The version, the page it was started from, and the country |
| A purchase completes | The amount, the currency and what was bought — never your email address, name, or order reference |
| A license is activated | That an activation happened, which tier, and whether it used a new seat — never your email address, your license key, or the identifier for your Mac |
The download link goes through this site’s own server, which counts the click and immediately redirects you to the file. It is a redirect, not a script, and it never sees anything except that a download of a given version began.
The app still has no telemetry. It sends no analytics, it does not know this website exists, and it does not report anything about how or how often you dictate. That is unchanged and it is the sentence that matters.
The activation row above is the one item on this list that involves the app at all, so it is worth being exact about. Activating a license is the app contacting us once, because you pressed a button — the single request described in Activating a license. What is new since 15 August 2026 is that our own server also counts that an activation occurred. It adds no request, no schedule, and no reason for your Mac to contact us ever again. A Mac that has activated still never checks in, which is what lets the app work on a plane, and the count carries nothing that identifies you, your license or your machine.
Your rights over that data
The only personal data we hold is what the table above lists, and the only identifier in it is your email address. You can:
- Ask what we hold for your address, and we will tell you.
- Ask us to delete it. Deleting your record deletes the license along with it — the key stops activating new Macs, though a Mac already activated keeps working offline, because it never asks us again.
- Correct your address if the one you paid with was wrong.
Deleting your email address is irreversible, and it ends key recovery. Your email address is the only thing that connects you to your license. Your key itself is stored as a one-way hash, so we cannot read it back or look you up by it — the address is the only handle there is.
So if you ask us to delete your record and later lose your key, we cannot issue you a new one, and we cannot prove you ever bought it. There is no other record to fall back on. That is the direct cost of not keeping more data than we need, and we would rather say it plainly than surprise you with it later.
Before requesting deletion: keep a copy of your key somewhere you trust. Any Mac already activated keeps working regardless — it never contacts us again — but a future Mac, a reinstall, or a wiped disk would leave you with nothing to paste.
Send any of those to [email protected].
Nothing on your Mac needs a request — the files listed above are yours, and deleting them is deleting them.
Changes to this document
The date at the top of this page is the date it last changed. When something material changes, that date moves and the change is described here, so you are not left comparing two versions from memory.
Two commitments about how changes happen, which matter more than the notice itself:
- Anything that widens what may leave your Mac ships off by default, exactly as the cloud cleanup option did. A new setting cannot start sending something on your behalf because you did not read a policy update.
- A change here never applies retroactively to data already collected under the previous version.
If a future change is significant enough that continuing to use Bunso would mean accepting something materially different, we will say so in the release notes for the version that introduces it — not only here.