MLXRead

macOS 14+ · Apple Silicon · MIT

Read anything aloud, on your Mac.

MLXRead replaces macOS Speak Selection with a local MLX voice. Select text in any app — Safari, Notes, Xcode, a PDF — press esc, and hear it in about a second. Nothing is uploaded. Nothing is logged.

Universal · macOS 14+ · Apple Silicon · signed · ~40 MB

Safari — Essay

The kettle clicked off. She read the last paragraph twice, then let the words settle before answering. Outside, the street was already awake.

Idle1.0×
idlecapturegeneratespeak

How it works

One shortcut, four honest steps.

No cloud round-trip, no queue on someone else's server. The whole loop runs between your selection and your speakers.

  1. 01

    Capture the selection

    MLXRead reads the frontmost app's selected text through the macOS Accessibility API. When an app doesn't expose it, a clipboard-copy fallback steps in — and restores your clipboard exactly, only if nothing else touched it.

  2. 02

    Normalize and chunk

    The text is cleaned and split into sentence chunks deterministically, so the reader can start speaking the first sentence while the rest is still being prepared.

  3. 03

    Synthesize locally

    A native MLX model — Kokoro or Soprano — turns each chunk into audio on the Apple-Silicon GPU. The model loads once and stays warm between reads.

  4. 04

    Stream, then stop on a dime

    Playback begins on the first chunk. Press ⌥⎋ again and generation is cancelled, the queue is cleared, and audio stops in tens of milliseconds.

Private by construction

Your words stay on your Mac.

This isn't a promise bolted on afterward — it's how the app is built. Synthesis runs in-process on the local GPU, so there is nowhere for the text to go.

  • Selected text lives in memory only while it's being read — never written to disk.
  • Selected text is never logged. Logs record lengths and timings, never content.
  • No analytics, no crash-reporting SDK, no accounts.
  • The network is used exactly once — to download a voice model — then never again.
your Mac
selectionMLX modelaudio
network: model download only

Fast, and real speech

Latency you can live with.

Kokoro brings 54 natural voices across nine languages; Soprano is a lean, English, low-latency reader. Both stay warm so the second read is instant.

~0.9swarm time to first audioSoprano, measured
18×faster than real timeSoprano synthesis
34–46msstop latencysecond ⌥⎋ to silence
2local voicesKokoro 82M · Soprano 80M

Measured on Apple Silicon, 488-character passage, warm model. Numbers are the app's own, not estimates.

Everywhere you read

If you can select it, you can hear it.

Accessibility first, clipboard fallback second. Standard AppKit and SwiftUI text controls, WebKit content, and text-layer PDFs are all fair game.

Open, and yours

Download it, or build it yourself.

MLXRead is MIT-licensed and signed with a Developer ID. Updates ship through Sparkle with EdDSA-signed appcasts — every update is verified before it installs.

Download MLXRead.app

Unzip, drag to Applications. First launch: right-click the app → Open (signed, not yet notarized, so Gatekeeper asks once).

zsh — build from source
# macOS 14+, Apple Silicon, Xcode
$ git clone https://github.com/rogu3bear/mlxread
$ brew install xcodegen && xcodegen generate
$ script/build_and_run.sh --verify
==> Verify OK — MLXRead is running

First launch

Grant Accessibility access when asked — it powers both the esc tap and reading the selection. MLXRead never changes your system settings for you.

System voice

MLXRead also installs a Speech Synthesis Provider — its voice appears in AVSpeechSynthesisVoice.speechVoices() and to the say command.

Auto-updates

Once installed, MLXRead keeps itself current through Sparkle — signed updates pulled from the same GitHub releases, verified before install.

View source ↗

Stop reading with your eyes when you don't have to.

Select. esc. Listen. Entirely on your Mac.

Build MLXRead