Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 34 additions & 16 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -83,8 +83,9 @@ utterance.
stays on the clipboard instead of vanishing.
- **One key, no chords** β€” dictation is triggered by a single lone modifier
(right ⌘ by default; right βŒ₯ and `fn` also available). Tap to toggle, hold
for push-to-talk. The event tap swallows nothing: a lone modifier types
nothing anyway, and combos like ⌘C pass through untouched.
for push-to-talk β€” or narrow it to tap-only or hold-only in Settings. The
event tap swallows nothing: a lone modifier types nothing anyway, and combos
like ⌘C pass through untouched.
- **Polished in one step** β€” each utterance rides to AssemblyAI's dictation API
with a little context and nothing more; the same call runs a server-side LLM
cleanup (disfluencies out, punctuation fixed), so the text comes back already
Expand All @@ -93,6 +94,14 @@ utterance.
your cursor β€” and nothing else about your screen goes with it: not the app, not
the window title, not the field, not your selection. See
[Privacy](#privacy).
- **Styles** β€” save up to four custom styles, each a short set of free-text
instructions ("always write in lowercase"), and switch between them from the
**Style** menu in the main window; the selected style shapes that same
server-side cleanup. Turn off **Enhanced transcripts** in Settings β†’ Styles to
paste the verbatim transcript instead.
- **Your vocabulary** β€” key terms bias the spelling of names and jargon, and text
shortcuts swap a spoken phrase for saved text (say "personal email", get the
address) on your Mac before the paste. Both live in Settings β†’ Vocabulary.
- **Fast** β€” transcription and cleanup share one round trip that typically
finishes in about a second. Blurt pre-warms the HTTPS connection while
you're still speaking and flips to "transcribing" at key-up, so polished
Expand All @@ -106,12 +115,13 @@ utterance.
meter and the pipeline phase; a menu bar indicator mirrors it from anywhere.
- **Actual synth cues** β€” start and stop can be cued by real Yamaha DX7 or
Roland Juno-106 sounds, or turned off.
- **Guided setup** β€” a first-run wizard walks through Microphone permission,
Accessibility trust, and your API key; the same window later hosts settings
for the trigger key, key terms, and sound pack. Settings β†’ Advanced also has a
**Reset** that deletes the key, the settings and the permission grants, then
restarts Blurt into first-run setup β€” so an install whose permissions have got
stuck can start clean.
- **Guided setup** β€” on first launch a single setup screen takes your API key
and walks through the Microphone and Accessibility permissions. Everything else
β€” trigger key, microphone, cue sound, styles, vocabulary β€” lives in the
Settings window. Settings β†’ Advanced also has a **Reset** that deletes the
key, the settings and the permission grants, then restarts Blurt into
first-run setup β€” so an install whose permissions have got stuck can start
clean.
- **No surprises** β€” installing an update is always yours to do: Blurt looks for
a newer release once a day (and whenever you ask) and, if there is one, offers
to open the DMG β€” it never replaces itself. There's no telemetry of any kind.
Expand Down Expand Up @@ -139,8 +149,8 @@ From a fresh install to dictated text in your editor:
3. **Tap right ⌘ and speak** β€” the overlay pill shows the live mic level. Tap
again to stop, or hold the key and release for push-to-talk.
4. **Read what you said** β€” the polished transcript is pasted at your cursor.
5. **Tune it** β€” open Settings to change the trigger key or pick a synth sound
pack.
5. **Tune it** β€” pick a style from the main window's **Style** menu, or open
Settings to change the trigger key, microphone, or synth sound pack.

## Privacy

Expand All @@ -152,16 +162,19 @@ came before: your recent dictations from this session, and a short run of the te
immediately before your cursor β€” never the contents of a password field, which
Blurt refuses to read. Anything you dictate _into_ a password field is likewise
never kept as context. Your key terms from Settings ride along too, to bias
spelling. Nothing else about your screen is sent: not the app you are in, not the
spelling, as do the instructions of the style you have selected, if any. Text
shortcuts are expanded on your Mac after the response arrives and are never
sent. Nothing else about your screen is sent: not the app you are in, not the
window title, not the field you are typing in, not what you have selected.

That recent-dictation history lives in memory only β€” it is never written to disk,
it is cleared when you quit Blurt, and it is capped (100 dictations, and about
4096 characters per request, oldest dropped first). Note what it means while Blurt
is running: text you dictated in one app can be sent as context with a later
dictation in another. Quit and reopen Blurt to clear it. Blurt stores no audio and
no transcripts, and sends no telemetry β€” no crash reporting, no analytics, no
usage tracking.
no transcripts (the one exception is the opt-in **Developer mode** in Settings β†’
Advanced, off by default, which keeps a local log of each dictation on your Mac),
and sends no telemetry β€” no crash reporting, no analytics, no usage tracking.

Requests do say which app is asking: every call to AssemblyAI carries a
`User-Agent` naming Blurt, its version, and your macOS version β€” so a problem on
Expand All @@ -178,11 +191,15 @@ that audio.

## Build from source

Blurt is MIT-licensed and needs only Xcode and Homebrew to build:
Blurt is MIT-licensed. To build it you need a Mac with full **Xcode 26+** (not
just the Command Line Tools), [Homebrew](https://brew.sh), and an Apple
Development certificate β€” adding any Apple ID under Xcode β†’ Settings β†’ Accounts
gets you one for free. Then:

```bash
scripts/bootstrap.sh # install the local toolchain
scripts/bootstrap.sh # one-time: install the toolchain from Brewfile
scripts/dev-build.sh # build + install "Blurt Dev" to /Applications
open -a "Blurt Dev" # run it
scripts/check.sh # full repo health check β€” the same script CI runs
swift test # engine unit tests only
```
Expand Down Expand Up @@ -214,7 +231,8 @@ Sources/BlurtEngine/ Swift 6 package owning the pipeline β€” no external dep
Injection/ KeyInjector: save clipboard β†’ paste via synthesized ⌘V β†’ restore
FocusCapture/ Accessibility reads of the focused app/window/field, kept local:
paste spacing and the developer-mode log
Config/, Update/ Keychain API-key store, key terms, download-only release check
Config/, Update/ Keychain API-key store, key terms, styles, text shortcuts,
download-only release check

App/Blurt/ AppKit/SwiftUI shell (Xcode project generated by XcodeGen)
AppCoordinator.swift the one place the engine is composed for the real app
Expand Down
Loading