Privacy
Your voice stays yours.
Halopen is a dictation tool, not a data collection platform. Here is exactly what it does with what it hears.
Last updated: 2026-10-07
TL;DR
The short version
- While you hold the hotkey, your microphone is on.
- In Cloud mode, audio is sent to a transcription service. In On-device mode, speech recognition runs on your Mac. Cloud processing and provider retention are explained below.
- On-device mode (Settings → Transcription → On your Mac): On-device transcription processes speech on an Apple Silicon Mac after the model is downloaded. It does not send that recording to the cloud transcription service. Account, licensing, and update checks have separate network behavior. Usage reporting and enabled diagnostics can also use the network outside a local dictation.
- Halopen does not record continuously. It does not transcribe in the background. It does not capture your screen.
- Halopen stores a small amount of operational metadata on the server — your account, your subscription state, and per-device data so your /account/ page can show you which Macs you’ve signed into. No transcripts, no audio.
- Your dictation text lives in the local audit log on this Mac, controlled by you. While the log is on, transcripts of your dictations (and, if Polish or Editorial cleanup ran, the cleaned text) are kept in
~/Library/Application Support/Halopen/audit-log.jsonwith owner-only file permissions, so you can copy a past dictation back if it went somewhere unexpected. Some failed takes are not recorded. Halopen never uploads this file. You control retention from Settings → Privacy (default: Keep everything; you can pick 7 / 30 / 90 days, or Off to clear everything and stop recording). - Halopen uses service providers for cloud transcription, accounts, payments, and diagnostics. The sections below describe what those services receive and the controls available to you.
00
The two transcription modes
Halopen now ships two transcription pipelines, and the privacy posture is different in each. Pick the one that fits the moment.
- Cloud (default) — Cloud mode streams audio to OpenAI’s gpt-4o-transcribe while you speak (“Transcribe while you speak”, on by default), over two connections to the same model: one reads it phrase by phrase, the other reads the whole dictation once you let go, so the punctuation comes from the whole sentence. A take the stream cannot fully account for, or every take with that setting off, is sent after you let go to gpt-4o-mini-transcribe, or gpt-4o-transcribe when a dictation carries vocabulary hints (on by default): entries from your personal dictionary, the optional context sources, or the hint Halopen adds when you dictate into Slack or Mail. Streamed audio goes straight to OpenAI over a session opened with a short-lived credential our endpoint issues for that take; audio sent after you let go goes through our transcription endpoint, which returns the text and discards the audio. On Cloud dictations of 90 words or more in Verbatim, the take’s sentences (text, never audio) go to OpenAI’s gpt-5.4-mini, which answers only where paragraphs and lists begin. Halopen lays out your own sentences, so no word changes. On by default: Settings → Transcription, “Break long dictations into paragraphs”. When a Cloud dictation in Verbatim is transcribed while you speak and you pause, the text either side of that pause (never audio) can go to OpenAI’s gpt-5.4-mini, which answers only whether the sentence carried on. Halopen then keeps or drops the full stop at the pause, so no word changes. On by default: Settings → Transcription, “Check punctuation at pauses”. Polish and Editorial are optional Pro modes. When you choose one, the text of that dictation (never the audio) goes to Anthropic: Claude Haiku 4.5 for Polish, Claude Sonnet 5.5 for Editorial. Provider retention is described under Subprocessors. Local history records transcripts and supported app events; it does not enumerate every network request.
- On your Mac (optional, opt-in) — audio is
transcribed on Apple Silicon via WhisperKit. The model file
(~600 MB) lives at
~/Library/Application Support/Halopen/Models/. The recording is processed locally. The audit log records the dictation with “(local)” as the endpoint so you can identify the transcription route and copy the transcript later. Requires an M-series Mac.
You can switch between the two at any time from Settings → Transcription. The choice is local to your Mac; it doesn’t affect billing.
A “(local)” dictation entry identifies the transcription route. The audit log is not a monitor of every network request made by your Mac or the app.
01
What is collected
To dictate text, Halopen needs to hear what you say while you hold the hotkey and to know that you held the hotkey. Specifically, when the hotkey is held:
- Microphone audio — captured through the microphone and written to a temporary local WAV file during the take. The normal processing path deletes the temporary file; eligible failed takes can be copied to local recovery storage, limited to seven days or 20 entries. See the storage section below.
- Hotkey state — when you start and stop holding the key.
In Cloud mode, audio is sent while you speak (streaming, on by default) and, when a take needs it or streaming is off, after release through the batch path. On-device recognition processes the recording locally. After successful transcription, Halopen attempts to insert the completed text into the intended input field.
When the hotkey is not held, the microphone is not active. Halopen does not stream audio continuously. There is no “always-on” mode.
01b
Vocabulary and context sent with transcription
Halopen can supply recognition hints alongside audio. In Cloud mode, available hints can be sent to the transcription service. The controls are in Settings → Transcription:
- Personal dictionary. The vocabulary-biasing switch is on by default. Dictionary entries you added can be included in the prompt.
- Foreground-app label and routing hint. When vocabulary biasing is enabled, the prompt can also identify the app or its kind (for example, a terminal) and include a per-app recognition hint. An unrecognized app can contribute its displayed app name. These hints do not depend on the separate clipboard/selection switch.
- Selected text, clipboard text and cursor-adjacent text. The switch labeled “Also bias with clipboard and selected text” is off by default. When enabled with vocabulary biasing, it also permits text immediately before the cursor to be read through Accessibility. The source limits are up to 300 characters of selected text, 200 of clipboard text and 200 before the cursor, before the combined prompt limit.
Learning names from your corrections. Separately from the hints above, and in both modes, Halopen can watch for you correcting a name it got wrong. For twelve seconds after it types, it can read back that stretch of the field through Accessibility — the text it wrote, plus 48 characters either side — and compare. If you replaced a word with something that is not an ordinary English word, that replacement is added to your dictionary and a pill on screen names it, with one click to remove it; a term you remove is never added again. The comparison happens on your Mac and is not sent anywhere, the text read is not stored or logged, and only the term you typed is kept. Password fields are not read, nothing is read while Secure Input is active, and a stretch that trips the credential filter is discarded. The switch is in Settings → Vocabulary, on by default.
Clipboard and cursor-context reads use a heuristic credential filter; selected text does not use that same filter. None of these limits or filters guarantees that confidential material is excluded. Enable optional context only when the material in those sources is appropriate for the selected processing route.
Turn off “Bias transcription with your personal dictionary” to disable this composed bias prompt, including app/routing hints. Turning off only the clipboard/selection switch leaves dictionary and app/routing hints available. On-device recognition keeps its processing local; account, licensing, updates, enabled diagnostics and your destination app have separate network behavior.
02
Where it goes
In Cloud mode, hotkey-bounded audio is sent to our hosted transcription endpoint. The endpoint forwards the clip to a third-party automated speech recognition service, returns the text to your Mac, and discards the audio. Halopen does not retain the audio on the server. Our transcription provider does not train on it, and may hold it briefly for abuse monitoring — the exact terms are in Subprocessors below, stated plainly rather than summarised optimistically here.
The hosted transcription path does not retain audio or transcript content in its application logs. Operational logs are limited to operational metadata (timestamps, anonymous request IDs, response times) used for monitoring uptime, with no transcript content recorded.
02b
Optional live preview
The live transcription preview uses Apple Speech Recognition with your permission. It requires on-device recognition when Apple reports that support; otherwise Apple Speech may use its service. Halopen disables this preview in its On your Mac transcription mode. You can also turn the preview off in Settings → Transcription.
Preview text is provisional and is not the final transcription or a fallback transcript. The completed stream or selected transcription pipeline supplies final text. The preview has a separate data path from Halopen’s hosted transcription endpoint.
03
What is stored on your Mac
Halopen keeps more on your Mac than it used to, and on purpose: the history and recovery features retain information locally. These records are separate from cloud processing. Retrying a retained recording in Cloud mode can send that recording for transcription again.
Preferences, in the standard macOS user defaults database:
- Your chosen hotkey, recording-pill preference, and sound-cue preference.
- A monthly transcription-minutes counter so the menu can show you usage.
- The license token associated with your subscription, after you sign in.
And in ~/Library/Application Support/Halopen/, readable only
by your account:
- Your dictation history and audit log
(
audit-log.json) — transcripts of your dictations, alongside recorded transcription and diagnostic activity. It lets you copy back a dictation that landed in the wrong window and identify the transcription route used for that take. It is not a complete network log. You choose how long it is kept in Settings → Privacy: keep everything, 7, 30 or 90 days, or Off, which erases it and stops recording. - Saved audio from failed takes
(
audio-recovery/) — when a dictation cannot be transcribed, the audio is held so the words are not simply gone. It is kept for up to 7 days or the latest 20 takes, whichever limit comes first; the current version removes older audio when Halopen starts or saves another take. Nothing is sent anywhere unless you press “Retry transcribe & copy”, which currently transcribes through Cloud, including audio recorded in On your Mac mode. If a recording must stay on your Mac, clear it under Stored on this Mac instead of retrying it. - Recovered text (
recovery.json) — transcripts that could not be typed into the app you were using, held so you can paste them yourself. - Audio of recent dictations (
take-audio/) — only if you turn on “Keep the audio of my last 50 dictations on this Mac” (Halopen 1.8.45 or later; off by default). The recordings never leave your Mac, the oldest is deleted when a new one arrives, and turning the setting off deletes them all. - A crash-safety log (
transcript-wal/) — when text recovery is enabled, Halopen attempts to save completed transcripts before insertion. Writes can fail. Entries are cleared when processing completes or text is preserved elsewhere; a cleared entry does not prove that the destination app accepted a paste. Remaining entries are offered on the next launch. This reduces some recovery risks but cannot guarantee survival from every crash, Force Quit or power loss. With recovery off, nothing is written here. See Settings for retention controls. - The on-device model (
Models/) — about 600 MB, only if you have downloaded it for on-device mode.
To see it and erase it: open Settings → Privacy → Stored on this Mac (Halopen 1.8.21 or later). It shows what is actually on your disk right now, with live counts and sizes, a Clear beside each one, and Show in Finder if you would rather look yourself — which is the point: this page tells you what we keep, and that pane lets you check whether it is true.
Erase all Halopen data… removes your dictation history and audit log, saved audio, audio of recent dictations, recovered text and the crash-safety log in one action. It deliberately leaves three things: you stay signed in, your settings and personal dictionary are kept, and the on-device model stays installed (remove that from Settings → Model, since re-downloading it is about 600 MB). Deleting the app alone removes none of this, and neither does deleting its preferences file.
04
Screen, keyboard, and optional context
- Your screen. Halopen does not capture, share, or analyze your display.
- Your typing. Halopen does not log keystrokes apart from detecting whether the hotkey is currently held.
- Other applications. Halopen identifies the foreground app for delivery and can include an app label and routing hint in the bias prompt. The optional context switch also permits selected and cursor-adjacent text as described above.
- Your clipboard. Halopen uses the clipboard when inserting text. If you enable clipboard context, a snippet can also be used for vocabulary biasing as described above.
04b
Usage and error diagnostics
Halopen includes usage and error diagnostics. You can turn off app analytics and crash reporting in Settings → Privacy. This does not turn off account, licensing, or update requests.
App diagnostics use PostHog for explicit usage events and Sentry for error reporting when those services are configured and diagnostics are enabled. The event interface records operational properties such as counts, durations, and outcomes; it is not intended to collect your dictated text.
The website also uses analytics to understand page visits and actions such as trial and download clicks. Website PostHog tracking uses tab-scoped session storage and disables session recording. The footer provides a PostHog opt-out. Cloudflare, which serves the site, separately counts page loads without cookies (Cloudflare Web Analytics); the footer opt-out does not affect that count. Website and app controls are separate.
04c
Website acquisition attribution
On public pages, Halopen can retain the first referring website, landing-page path and recognized campaign parameters in this browser. When you are signed in on a public page, this attribution may be attached to your account. The server also records a capture time and a hash of the request IP address.
Account and checkout-return pages do not run this capture. Landing-page query strings and fragments are excluded; only recognized campaign fields are kept separately. Referrers are reduced to their website origin. Legacy browser attribution bags are discarded before forwarding. Previously saved server records are not changed by this update.
If you arrive from a Google ad, this browser keeps Google’s click identifier for 90 days. When you land and when you start the download, Halopen stores that identifier with your IP address. If a Halopen account is first signed in from the same IP address within 72 hours, we tell Google that the ad led to a trial, and later to a purchase. Google receives the click identifier, the kind of conversion, its time and the amount paid, never your email or name. The IP address is deleted after 7 days and the click record after 90. The site runs no Google advertising script, and nothing is stored for visitors who did not come from an ad.
04d
Withdrawal and refund requests
When you use the form at halopen.com/withdraw, Halopen stores the name, the email address you bought with, the plan you chose, the address for the confirmation, the time you submitted it and a hash of the request IP address (used only to limit repeated submissions). We keep it as the record of your request and of what we did about it, and email you a copy.
05
Subprocessors
Halopen relies on the following hosted services to function. None receive identifying information beyond the minimum required for operation.
- Supabase — hosts our transcription endpoint, account database, and edge functions. Stores account email, subscription state, and per-device records so /account/ can list signed-in Macs.
- Anthropic — performs the optional Polish and Editorial cleanup (Claude Haiku 4.5 and Claude Sonnet 5.5). Only when you choose one of those modes, the text of that dictation is sent to Anthropic’s API and the cleaned text returned; audio is never sent. Anthropic states that it does not use inputs or outputs from its commercial API to train its models by default, and that it deletes API inputs and outputs within 30 days, except where it must keep them longer to enforce its Usage Policy or comply with the law (retention, training).
- OpenAI — performs the speech-to-text transcription and, for Cloud dictations of 90 words or more in Verbatim, the paragraph grouping (the sentences’ text, never audio). OpenAI may briefly retain audio and text for abuse monitoring per their standard API policy (up to 30 days, then deleted). OpenAI does not train on API data sent through this endpoint. We have not negotiated a Zero Data Retention agreement; if that ever changes, this line gets updated.
- Cloudflare — serves halopen.com and the download, and counts page loads without cookies (Cloudflare Web Analytics). Sees IP addresses (anonymized in our analytics).
- Stripe — processes payments and manages subscriptions. Stripe sees the billing details you provide at checkout (name, billing address, card last-4); Halopen receives only the subscription-state events back via webhook.
- Resend — sends transactional email (sign-in confirmations, purchase confirmations, renewal notices, comp-grant notifications, withdrawal acknowledgements). Sees the recipient email address and the transactional content of each message.
- Google Ads — receives, for visitors who came from a Google ad, that ad’s click identifier and whether it led to a download, trial or purchase (with the amount paid), as described under Website acquisition attribution.
- PostHog and Sentry — provide usage analytics and error diagnostics as described above. Availability depends on the relevant app or website configuration and your opt-out settings.
06
Children
Halopen is not directed at children under 13 and we do not knowingly collect personal information from them. The product is offered to general audiences.
07
Changes
If we change this policy in a way that materially expands what we collect or retain, we will email subscribers and post the change at the top of this page before it takes effect. The previous version remains available on request.
08
Contact
Questions, deletion requests, or anything else: email hello@halopen.com. We answer in person, usually within a day.