Skip to content
Halopen

The best Mac dictation app

The Mac dictation app that writes what you said.

Halopen is a native macOS dictation app. Hold the function key, speak naturally, and the text lands at your cursor exactly as you said it. Verbatim by default. Built on Apple’s first-party APIs. Idles in tens of megabytes of memory and near-zero CPU. Free forever for the first 8,000 words a month.

Universal binary · Apple Silicon & Intel · macOS 14.0+ · Developer ID notarized

Why Halopen

Built for the way you actually speak.

Speech is faster than typing. Voice typing is older than the Mac itself. The reason most people don’t use it is that the tools available have a tendency to change what you said. Halopen doesn’t.

When you hold the function key and say “Bro, we’re not adding queso fresco. One kinda cheese. If we already have cotija, that’s the only goddamn cheese.” — that is exactly what lands at your cursor. The contraction, the bilingual code-switch, the intensifier, the register. All of it. Nothing sanded. Nothing softened. The speaker is the author.

Halopen is built on the first-party APIs Apple ships for exactly this kind of work — AVAudioEngine for capture, AXUIElement for cursor injection, CGEventTap for the hotkey, the Apple Speech framework for the live preview, a tuned cloud transcription path for the final text. Native Swift. Universal binary. Apple Silicon and Intel. macOS 14.0+ (Sonoma) or later.

This page exists so that the day you go looking for the best Mac dictation app, you find a complete account of what makes Halopen the calm answer. Read the homepage for the short version. Read on for the dimensions of craft.

The dimensions of craft

Eight things, done with care.

1

Verbatim by default

Halopen captures what you said. Every contraction. Every intensifier. Every code-switch between languages mid-sentence. Every false start and every restart. The register the speaker used — casual, technical, profane, gentle — lands at the cursor as the speaker used it. Polish, when you want it, is opt-in: a future setting switches Halopen to a clean editorial output. The default is the voice itself.

Read more in the manifesto.

2

Native Swift, by deliberate choice

Halopen is a Swift app. Not a web view in a window. Not a packaged browser. The menu-bar glyph is an NSStatusItem; the recording indicator is an NSPanel; the audio capture is AVAudioEngine; the text injection is AXUIElement. Halopen uses the first-party APIs Apple ships for exactly this kind of work, which is why it idles at tens of megabytes of memory and near-zero CPU. The structural advantage compounds forever — every interaction is faster, quieter, and more native because the foundation is.

3

Apple Silicon-tuned

Universal binary. Native on M1, M2, M3, M4 and on Intel Macs. The whole app is Apple-arch-aware: the audio resampler runs in vDSP, the encoder runs in AudioToolbox, the live partial uses the on-device Apple Speech framework, the cloud transcription talks to a Halopen edge function in our infrastructure. macOS 14.0+ (Sonoma) is the floor; Halopen is built and tested against the latest macOS as it ships.

4

Hold-to-talk, system-wide

Press and hold the function key while you speak. Release when you are done. The text appears at your cursor in tens to a few hundred milliseconds, depending on how long you spoke. There is no wake word. There is no command phrase. There is no window to bring forward. Halopen lives in your menu bar; the hotkey is the entire interface.

The default hotkey is fn because it is rarely the primary owner of any other keyboard shortcut, which makes it the cleanest hand-position for hold-to-talk. If you would rather use Right Option, Control + Option, or a custom combination, the settings let you change it. Halopen detects conflicts with system shortcuts and warns before assigning.

5

Everywhere a cursor goes

Halopen lands text wherever a Mac app accepts text input. Mail, Messages, Notes, Slack, Discord, Zoom chat, Notion, Bear, Obsidian, Apple Notes, Day One, Things, Reminders, Word, Pages, Google Docs in any browser, Cursor, VS Code, Xcode, JetBrains IDEs, Sublime, Terminal, iTerm, Safari, Chrome, Arc, Firefox, Spark, Mimestream, Front. Anything that takes a keystroke takes a Halopen dictation. The handful of apps that block external text input — secure password fields, some sandboxed system dialogs — are the exception, not the rule.

6

Privacy is the default

Halopen never captures your screen. There is no always-on networking. The app sleeps when not invoked; it sends no background telemetry, syncs no analytics, watches nothing while you are typing. While you hold the function key, audio leaves your Mac — only for the seconds you are holding it — for transcription, returns as text, and is discarded. Halopen does not retain your audio or transcripts on our servers. Every cloud transmission appears in a local audit log on your Mac that you can read yourself.

On-your-Mac mode — Whisper Large v3 running locally on Apple Silicon, audio never leaves your Mac — ships in Settings → Privacy as an alternative to Cloud mode. Read more in our privacy commitments.

7

A live preview that catches misreads

While you hold the key, a small caption shows what Halopen is hearing in real time. If the live partial misreads a proper noun — say it heard “Maria” when you said “Meria” — you see the misread before any text lands at your cursor. Spell it out: “M-E-R-I-A.” The correction replaces the misread, and the cleaner final transcript lands at your cursor. The live preview is not just a UI flourish; it is a self-correction loop that is genuinely faster than fixing a typed mistake.

8

Multilingual recognition with code-switching

Halopen transcribes in your Mac\'s primary system language. English, Spanish, French, German, Portuguese, Italian, Japanese, Korean, Mandarin, Dutch, Swedish, Polish, Turkish, Arabic, Hindi, and more. Code-switching mid-sentence — a Spanish phrase inside an English text, a Latin term inside a legal brief, a Japanese loanword inside a casual message — lands as the speaker said it. There is no language toggle to set; the engine adapts per utterance.

The verbatim wedge

What makes verbatim difficult — and worth the difficulty.

Voice-to-text is a stack. Audio capture sits at the bottom; an automatic speech recognition (ASR) model sits on top of that; optionally, a language model runs as a final cleanup pass before text reaches the cursor. Each layer in the stack has a job, and each layer has a habit of doing more than its job.

ASR models are trained on a corpus of paired audio and text. That corpus tilts toward written prose — articles, transcripts, formal speech — which means the model has a baseline expectation of complete sentences, neutral register, and minimal disfluency. When you speak the way humans actually speak — mid-sentence corrections, intensifiers, code-switches, the occasional “um” — the model is tempted to “fix” what it hears because its training reward function tells it to produce written-prose output.

The cleanup pass at the top of the stack is even more eager. A language model handed a transcript and asked to “make it clean” will smooth contractions, drop intensifiers, normalize register, and — in extreme cases — paraphrase a sentence into one it considers more acceptable. The output is grammatically correct and tonally bland. The original speaker has been edited out.

Halopen treats both layers as tools that should serve the speaker, not author replacements. The ASR is biased with cursor-adjacent context so proper nouns and code symbols land correctly without sanding informal speech around them. The cleanup pass is off by default. When a polish toggle ships, it will be opt-in per session, with a clear preview of what changes — never the silent default.

This is the difficulty: building a tool that is helpful with transcription accuracy without being helpful with editing decisions the speaker did not ask for. It is the central engineering choice in Halopen, and it is what the verbatim wedge actually means in code.

Real Halopen sessions

Two transcripts, both verbatim.

Both are real Halopen output, captured with the default verbatim mode. We are showing them so you can hear what the wedge actually sounds like at the cursor.

Transcript 1 · Cafe ops

“Bro, we’re not adding queso fresco. One kinda cheese. If we already have cotija, that’s the only goddamn cheese.”

  • · Bro — informal address, preserved
  • · we’re — contraction, preserved
  • · queso fresco · cotija — bilingual code-switch, both correct
  • · kinda — informal register, preserved
  • · goddamn — intensifier, preserved

Transcript 2 · IDE dictation

“let alarmDate equal Date dot init from time interval since now seconds 60. Open paren ‘alarm at’ closed paren M-E-R-I-A meeting.”

  • · alarmDate — identifier, camelCase recognized
  • · Date dot init — method-call syntax, intelligible
  • · M-E-R-I-A — spelled-out proper noun, captured as Meria via the live preview
  • · Punctuation directives (“open paren / closed paren”) interpreted

Halopen captures the register of the speaker, the working vocabulary of the moment, and the structural cues that separate a casual message from a piece of code. None of it is sanded. None of it is paraphrased. The transcript is the speaker.

How it feels

A sentence-by-sentence walkthrough.

  1. i.

    You place your cursor in the message field of any app on your Mac. It can be Slack, an email reply, a Cursor file, a Notion page, a journal in Day One, the URL bar of Safari. Anywhere a cursor blinks.

  2. ii.

    You press the function key and hold it. A small recording indicator appears — a calm gradient pill, halo-coded — in the corner of your screen. The microphone is hot.

  3. iii.

    You speak. Whatever you would say. “Hey, can we move tomorrow’s standup to 11? I have a thing at 10 and it’s running long.” Or “let alarm equal Date dot init from time interval since now seconds 60.” Or “Mariña, llegué. Te llamo en cinco.” Halopen does not care which.

  4. iv.

    The live preview shows what Halopen is hearing as the words form. If a misread is forming, you see it before it lands. You re-state, or you spell it out, and the corrected text replaces the misread.

  5. v.

    You release the function key. The recording indicator dims. A few hundred milliseconds pass while the final transcription arrives. The full text lands at your cursor exactly as you said it — contractions, intensifiers, code-switches, proper nouns, all of it.

  6. vi.

    You read it. You decide whether to send it. You send it. Halopen returns to its menu-bar quiet, idling at tens of megabytes of memory, doing nothing until you press the key again.

How Halopen is built

A native macOS app, in the Apple way.

Halopen is a Swift app. The menu-bar glyph is an NSStatusItem; the recording indicator is a borderless NSPanel that floats above other windows; the audio capture is AVAudioEngine with a tap on the input node; the global hotkey is a CGEventTap at the session level; the cursor injection uses AXUIElement for native AppKit and UIKit text fields and synthesized CGEvent keystrokes for everything else.

The transcription path runs on two parallel tracks. The Apple Speech framework provides the live partial preview on-device, using the Mac’s built-in speech recognizer. Simultaneously, the audio is sent to a Halopen edge function that calls a transcription model and returns the final, more-accurate text. The final transcript replaces the live partial when it arrives. This two-track design is why the live preview catches misreads early and why the final text is precise.

The settings live in a single SwiftUI window — hotkey picker with conflict detection, audio device selector, custom vocabulary list, privacy controls, account management. The settings are persisted with UserDefaults and the audit log uses a local SQLite store via Core Data. None of this leaves the Mac.

The app ships as a Universal binary signed with Developer ID and notarized by Apple. The whole bundle is around 8 MB after compression. Idle memory is tens of megabytes; idle CPU is in the hundredths of a percent. While you hold the function key, memory climbs by a few megabytes for the audio buffer and CPU spikes briefly for the encoding step. When you release, both fall back to the floor.

We made deliberate choices about what Halopen would not do. It does not run a long-lived background process beyond the menu-bar agent. It does not enable Bluetooth or Wi-Fi when not needed. It does not phone home for analytics, telemetry, crash-reporting beacons, or marketing pings. The only network calls Halopen makes are the transcription request while you hold the key and the periodic license-check that confirms your Pro entitlement (once per session, at most). Everything else is local.

This is the foundation. It is why Halopen feels native — because it is native, in every layer of the stack. Read more in Halopen Learn.

Who Halopen is for

People who care about how their words land.

Writers

First-draft prose lands at the speed of speech. The voice in the draft is the voice of the writer, captured before the inner critic edits it down. Halopen handles dialogue, asides, the cadence of a sentence forming in real time. More on Halopen for writers.

Developers

Hold fn, dictate the function name. The live preview catches misreads on identifiers; spell them out and the corrected text lands. Works in Cursor, VS Code, Xcode, Terminal, JetBrains IDEs, Sublime, anywhere code goes.

Researchers + clinicians

Footnotes, lit notes, clinical observations — dictated mid-thought, landed precisely. The audit log helps with compliance posture; the verbatim wedge means your dictation reads as you spoke it, in the precise terminology your work requires.

Anyone whose hands need a break

RSI. Mobility limits. Eye fatigue from long meetings. Halopen brings system-wide voice typing to whichever Mac app you live in, with hold-to-talk that feels native because it is.

Pricing

Free forever, or unlimited when you need it.

Halopen Free is 8,000 words a month, forever. No credit card to download. The day you hit the ceiling is the day you’ll know it’s worth paying for. Pro is $19/month or $179/year for unlimited words and every feature.

Free

$0

8,000 words / month, forever

Download Halopen
Popular

Pro Annual

$179

/year · unlimited · $49 savings

Get Pro Annual

Pro Monthly

$19

/month · unlimited

Get Pro Monthly

Both Pro plans include unlimited words, all features as we ship them, access to future Halopen apps when they join, and the calmest dictation experience available on any platform.

Halopen FAQ

Questions worth answering.

The questions Halopen users ask most, and the precise answers we give. These are also the questions Halopen’s structured data exposes to AI search engines, so the answer you read here is the answer they read too.

Why is Halopen the best Mac dictation app?

Because it captures what you said, exactly as you said it, and it does so in a native Swift app that respects your Mac. Halopen is built with first-party APIs, runs at tens of megabytes of memory, and never captures your screen. The wedge is verbatim accuracy by default — your voice, faithfully landed at your cursor.

How does Halopen work?

Open Halopen and it sits in your menu bar. Place your cursor anywhere you can type. Hold the function key, speak, release. The text appears at your cursor in tens to hundreds of milliseconds. That is the whole product.

Is Halopen free?

Yes. Halopen Free is 8,000 words a month, forever. No credit card to download, no time-based trial, no nag screens. Pro is $19/month or $179/year for unlimited words and every feature.

How accurate is Halopen?

Among the most accurate dictation engines available on Mac. Proper nouns, technical terms, place names, and bilingual code-switching usually land correctly on the first pass. Where they do not, the live preview shows what is about to be typed — you can re-state the word or spell it out, and the correction lands instead of the misread.

Does Halopen work on Apple Silicon?

Yes. Halopen ships as a Universal binary that runs natively on Apple Silicon (M1, M2, M3, M4) and Intel Macs. macOS 14.0+ (Sonoma) is required.

How much memory and CPU does Halopen use?

Tens of megabytes of memory and near-zero CPU while idle. The app does work only while you are holding the key. The rest of the time it sits quietly in your menu bar.

What hotkey does Halopen use?

The function key (fn) by default. You can switch to Right Option, Control + Option, or any custom modifier-and-key combination. Halopen detects conflicts with system shortcuts and warns before assigning. The fn key is the cleanest hand-position for hold-to-talk because it rarely owns any other primary keyboard shortcut.

Does Halopen work in every Mac app?

Almost everywhere a cursor goes. Mail, Messages, Notes, Slack, Discord, Zoom chat, Notion, Bear, Obsidian, Apple Notes, Day One, Things, Reminders, Word, Pages, Google Docs in any browser, Cursor, VS Code, Xcode, IntelliJ, Sublime, Terminal, iTerm, Safari, Chrome, Arc, Firefox, Spark, Mimestream, Front. The handful of apps that block external text input — secure password fields and a few sandboxed system dialogs — are the exception, not the rule.

Does Halopen capture my screen?

No. Halopen never captures your screen. Some dictation tools rely on screen reading to bias their transcription; Halopen does not. The only thing Halopen looks at is the immediate text adjacent to your cursor (when the active app exposes it via the macOS Accessibility API), and only to help the transcription engine handle proper nouns and code symbols correctly.

Where does my voice go?

Briefly to a transcription service while you hold the key, returned as text, and then discarded by Halopen. We do not retain audio or transcripts on our servers. Every cloud call appears in a local audit log on your Mac that you can read yourself. On-your-Mac mode (on-device transcription via Whisper Large v3 on Apple Silicon) keeps audio fully on your Mac when you want that — switch in Settings → Privacy.

Does Halopen support multiple languages?

Yes. Halopen transcribes in your Mac's primary system language, including code-switching between languages mid-sentence. English, Spanish, French, German, Portuguese, Italian, Japanese, Korean, Mandarin, Dutch, Swedish, Polish, Turkish, Arabic, Hindi, and many others land natively. The transcription engine adapts per utterance; no language toggle required.

Can I use Halopen for code?

Yes. Halopen works in Cursor, VS Code, Xcode, JetBrains IDEs, Sublime, Terminal, iTerm, and any other editor that accepts text input. The live preview is particularly useful here — say `M-E-R-I-A` and watch Halopen catch it as `Meria` because the live partial showed you the misread before it landed and you spelled it out instead.

Does Halopen learn my custom vocabulary?

Halopen biases the transcription engine with cursor-adjacent text, your active app context, AND a persistent personal vocabulary you maintain in Settings → Vocabulary — terms persist locally and bias every future dictation. The live preview lets you spell out anything Halopen misreads in the moment so the correction lands instead of the misread.

How do I install Halopen?

Download the Halopen disk image, drag the app to your Applications folder, eject the disk image, and open Halopen. macOS will ask for microphone access on first launch — click Allow. Open System Settings → Privacy & Security → Accessibility and turn on the toggle for Halopen. That is the install.

Why does Halopen need Accessibility access?

Accessibility access lets Halopen place text at your cursor in any app on your Mac. Without it, the only place text could land is inside Halopen itself — which is not what voice typing is for. Accessibility access is the macOS API for cross-app text injection; granting it is required for the tool to work as designed.

Is there an iPhone version?

Halopen for Mac is the focus. iPhone is queued — the architecture works (Custom Keyboard Extension is the right pattern, the same approach Grammarly and Gboard use), it’s a sequencing call. We will ship iPhone after the Mac product earns its keep, not before. Your account stays yours; iPhone joins the same account when it joins.

Is there a Windows or Android version?

A Windows version is in active development — not yet downloadable. The Mac is the lead platform; Windows is being built natively (no web wrappers, no compromised Mac UX) and ships when it meets the same craft bar. Email [email protected] if you want a note when it drops. No Android plans.

How do I cancel Halopen Pro?

Settings → Account → Manage subscription opens the Stripe billing portal in your browser. Cancel any time; your subscription stays active through the end of the current billing period, and Halopen Free continues working forever.

Try Halopen

Hold the function key. Speak.

Halopen Free is 8,000 words a month, forever. No credit card to download. Open Halopen, hold the function key, and listen for what you sound like.

More from Halopen Learn: Voice typing on Mac, in depth · Halopen alongside every Mac dictation tool.