jot-gemini-transcribe-macOS README

The project's README from github.com/google-gemini/jot-gemini-transcribe-macOS. As one markdown file: README.md.

Jot

Jot

Gemini 3.5 Transcribe Demo. Hold a key. Speak. It types.

Smart dictation for macOS that puts polished text wherever your cursor is.

Created by Ammaar Reshi · Apache 2.0 licensed

This is not an officially supported Google product.


What it is

Hold fn, say the thing, let go. A moment later your words are in the app you were already using — punctuated, filler words removed, cleaned up. No window to switch to, no transcript to copy, no account to make.

Jot preview

It is deliberately small: a menu bar icon, a pill at the bottom of your screen while you talk, and a History window that proves nothing was ever lost.

The three gestures

Gesture What happens
Hold fn Records while held. Release and the text lands at your cursor.
fn + tap Space Hands-free: keeps recording after you let go. Tap fn to finish.
Esc Cancels. Anything over 10 seconds is still kept in History.

The key is rebindable in Settings → General if fn is spoken for.

What makes it different

It follows a change of mind. Say "let's meet at 1pm — actually, no, make it 2pm" and Jot writes "Let's meet at 2pm." That is the whole pitch, and onboarding makes you do it once so you believe it.

It never loses your words. Audio goes to disk from the first millisecond, so a crash, a kill -9, or a flat battery costs you nothing — the recording is recovered on next launch. Offline, dictations queue and land when you reconnect. Every failure is retryable from History. Release the key mid-word and it keeps listening until you actually stop.

It is private by architecture. Your voice goes from your Mac straight to the Gemini API with your key. No middleman server, no account, no analytics, no screenshots, no keystroke logging — one network host, and you can read every line of the code that talks to it. See PRIVACY.md.

Your jargon, spelled right. Names and product terms go in the Dictionary and ride along with the audio, so the model hears "Kubernetes" instead of guessing "cooper netties" — corrected at the source, not patched afterwards. Tone matching for email vs. chat vs. code is available too, in Settings → Dictation.

Install

  1. Download the latest Jot-x.y.z.dmg from Releases.
  2. Drag Jot into Applications and launch it from there — apps run from a mounted disk image are sandboxed by macOS and the permissions you grant will not stick.
Drag Jot to Applications

Setup takes about two minutes and the app walks you through it:

  1. Paste a Gemini API key — get one at Google AI Studio. It is stored in your macOS Keychain and only ever sent to Google.
  2. Allow the microphone — say hello and it advances by itself.
  3. Allow Accessibility — macOS requires this for any app that types into another app.
  4. Hold fn and talk.

Cost: you pay Google for what you dictate at Gemini API pricing; a free tier exists and a typical dictation is a few seconds of audio. Jot itself is free and has no account.

Model: Jot runs on Gemini's specialist transcription model, gemini-3.5-transcribe. Your key needs access to it; setup tells you up front if it does not, instead of failing on your first dictation.

How it works

fn down ─▶ capture (CAF on disk from t=0) ─▶ fn up ─▶ FLAC ─▶ Gemini transcribe
                                                                    │
   cursor ◀─ insert (AX → paste → clipboard) ◀─ [validate ◀─ tone pass] ─┘
                                              (optional, off by default)
                                                    │
                                              History (SQLite)

A few decisions worth knowing about, because they are what make it feel solid:

The full design specs — including the failure matrix the reliability work is built from — are in docs/design/.

Development

Requires macOS 14+, Xcode 16+, and xcodegen. The .xcodeproj is generated, not checked in.

brew install xcodegen
./scripts/build.sh          # xcodegen generate + xcodebuild
./scripts/test.sh           # swift test on JotCore
open Jot.xcodeproj          # or work in Xcode

Debug builds sign ad-hoc, so a clean clone needs no Apple account, certificate, or team membership — ./scripts/build.sh works as-is. To build under your own team instead: ./scripts/build.sh DEVELOPMENT_TEAM=XXXXXXXXXX. Only release builds (scripts/release.sh) need a real Developer ID.

App/            menu bar item, HUD pill, windows, design tokens, icon + sounds
JotCore/        all engine logic, headless and testable
  HotkeyEngine/     CGEventTap + the pure hold/lock/cancel grammar
  AudioEngine/      crash-safe CAF capture, device changes, prewarming
  TranscriptionClient/  Gemini calls, timeouts, retries, FLAC
  FormattingPipeline/   cleanup prompt, validation gate, dictionary rules
  InsertionEngine/      the AX → paste → clipboard ladder
  HistoryStore/         GRDB index, recovery, retry queue, retention
scripts/        build, test, icon, DMG, release
docs/           privacy, releasing, design specs, research

Useful while hacking:

# every surface is reachable headlessly
open "jot://settings/about"      # or /general /dictation /privacy /advanced
open "jot://history"  "jot://dictionary"  "jot://onboarding/5"

# watch it work
log show --last 5m --info --predicate 'subsystem == "com.ammaar.jot"'

Transcript text is logged as private and never appears in those logs.

Releasing

./scripts/release.sh archives, signs with Developer ID, notarizes, staples, and builds the installer DMG. It refuses to produce a shareable DMG that is not notarized. See docs/RELEASING.md for the certificate setup.

License

Apache License 2.0 — see LICENSE. Bundled fonts (Google Sans Flex, Google Sans Code) are SIL OFL 1.1. The earcons are original works covered by the same Apache 2.0 license. Details in THIRD_PARTY_NOTICES.md.

jot-gemini-transcribe-macOS (google-gemini/jot-gemini-transcribe-macOS)

Searching Database…

What is this?Jot is a macOS app that turns your voice into clean, punctuated text right where your cursor is - hold a hotkey, speak, and it types the result using Google's Gemini transcription model.
Is this a standalone app or a library I'd integrate into my own project?Jot is a standalone macOS app with a menu bar icon and a small recording pill; there's no SDK to integrate, you just download, install, and hold a key to dictate.
How do I install and set it up?Download the Jot-x.y.z.dmg from the Releases page, drag Jot into Applications (running it straight from the mounted disk image breaks permissions), then paste in a Gemini API key, allow microphone access, and allow Accessibility - the whole setup takes about two minutes.
Do I need my own Gemini API key?Yes - you paste a Gemini API key from Google AI Studio during setup, and your key needs access to the gemini-3.5-transcribe model specifically; Jot checks this upfront instead of failing on your first dictation.
Does it work without an internet connection?Not for live transcription - your voice is sent to the Gemini API over the network. If you're offline, dictations are queued and sent once you reconnect, and anything that fails can be retried from History.
Where does my voice data actually go?Straight from your Mac to the Gemini API using your own key - there's no middleman server, account, analytics, or keystroke logging, and the code that talks to the API is readable.
How does it handle corrections like 'actually, no, make it 2pm'?Jot follows a change of mind during dictation - saying 'let's meet at 1pm — actually, no, make it 2pm' produces the final corrected text 'Let's meet at 2pm', and onboarding demonstrates this once so you trust it.
What happens if the app crashes mid-recording?Audio is written to disk from the first millisecond of recording, so a crash, kill -9, or dead battery doesn't lose anything - the recording is recovered automatically on next launch.
How does it avoid mangling technical jargon and names?You add terms to a Dictionary in Settings, and those entries ride along with the audio so the model hears the correct spelling (like 'Kubernetes') instead of guessing phonetically.
Size
5 MB
Stars
493
Age
1mo
Commits · 90 Days