Real-time captions that highlight and define the jargon you don't know — live, on-device, private.
lexed.app · macOS 13+ · Swift / SwiftUI
Lexed listens to the person across the table (or on the call), turns their speech into live on-screen captions, and the instant they say a term from your glossary — a technical acronym, a piece of company jargon, a buzzword — it highlights the word and shows you its definition. No more nodding along to "we need this to be idempotent behind the SLA" and quietly panicking.
Built for job interviews, sales calls, standups, and meetings where you want to follow every word without breaking eye contact to Google an acronym.
Privacy first. Lexed uses Apple's on-device
Speechframework and is sandboxed with no network access, so the audio never leaves your Mac — nothing is recorded, uploaded, or sent to any server. See docs/PRIVACY.md.
- 🎧 Captures system audio from any app — Zoom, Google Meet, Teams, Slack huddles — via
ScreenCaptureKit. No virtual audio device needed. (Or switch to the microphone for in-person meetings.) - 🎯 Per-app capture — scope to a single app (e.g. only Zoom) so music, notifications, and other apps are ignored.
- 🎙️ Live transcription using Apple's
Speechframework, with continuous (unlimited-length) recognition. - ✨ Inline keyword highlighting — glossary terms light up the moment they're spoken.
- 📖 Instant definitions — a "current definition" card plus a running list of every term heard this session, with counts and timestamps.
- 🔒 On-device only — no network entitlement, no recording, sandboxed; audio never leaves the Mac.
- 📝 Editable glossary — add/edit terms, aliases ("k8s" → Kubernetes), categories, and source links; import/export as JSON.
- 🖱️ Click any highlighted word in the transcript to pull up its definition.
- 🔤 Adjustable caption size, auto-scroll, and selectable text.
- 🌍 Multi-language recognition (any locale with an installed on-device model).
Requires macOS 13 (Ventura) or later and Xcode 15+.
git clone https://github.com/ServerWrestler/Lexed.git
cd Lexed
open Package.swift # opens the package in XcodeIn Xcode, select the Lexed scheme and press Run (⌘R). The app launches with its Dock icon and menu bar.
You can also build/test from the command line with
swift buildandswift test. Running via Xcode is recommended so the macOS permission prompts behave correctly.
The first time you press Listen, macOS asks for permission:
- Speech Recognition — always (Lexed transcribes).
- Screen Recording — when the audio source is System audio (ScreenCaptureKit captures app/call audio through this permission). macOS may require you to relaunch Lexed after granting it the first time.
- Microphone — when the audio source is Microphone.
On-device model required. Lexed is on-device only — it will not start until your language's offline dictation model is installed. Add it in System Settings ▸ Keyboard ▸ Dictation (this downloads the offline model), then pick that language in Lexed's Settings. This is what guarantees the audio never leaves your Mac.
- Pressed Listen and nothing happens? Read the orange status line in the window — it says exactly what's wrong. The usual cause is the on-device model not being installed: System Settings ▸ Keyboard ▸ Dictation ▸ add your language, wait for it to download, then try again.
- Permissions: check System Settings ▸ Privacy & Security ▸ Speech Recognition (and Microphone or Screen Recording for your source) and make sure Lexed is enabled. After granting Screen Recording, macOS usually requires you to quit and relaunch Lexed.
- Settings: Lexed ▸ Settings… in the menu bar, or press ⌘,.
- Pick your audio source. Open Settings (⌘,):
- System audio (apps & calls) — captures the audio your Mac plays, so it hears the other person on a Zoom/Meet/Teams call or Slack huddle. Needs Screen Recording permission.
- Microphone (in person) — captures the mic, for face-to-face meetings.
- Set up your glossary. Click Keywords in the toolbar. Lexed ships with 28 common tech/business terms (API, SLA, CI/CD, OKR, Kubernetes, …). Add the acronyms and jargon specific to the company you're interviewing with.
- Position the window where you can glance at it during the conversation.
- Press Listen (⌘L). Captions stream in real time.
- When the speaker says a glossary term, it highlights in the transcript and its definition appears on the right. Click any highlighted word to re-focus its definition.
- Clear (⇧⌘K) between conversations.
- Before a specific interview, export your glossary, tweak it for that company's stack, and import it back — or keep multiple JSON files.
- For remote interviews, use System audio so you caption the interviewer through Zoom/Meet. For in-person, use Microphone.
This is built in — no virtual audio device required. In Settings, choose
System audio (apps & calls). Lexed uses ScreenCaptureKit to read the audio
your Mac is playing (excluding Lexed's own output) and transcribes it on-device.
- Requires Screen Recording permission (System Settings ▸ Privacy & Security ▸ Screen Recording). macOS may ask you to relaunch Lexed after you grant it.
- Capture just one app. In Settings, the App menu lists running apps. Pick Zoom (or Meet/Teams/Slack) to transcribe only that app and ignore music, notifications, and everything else. Leave it on All audio to capture everything you hear. Hit the refresh button if you opened the app after Lexed.
The glossary is a plain JSON array. Each entry:
{
"term": "SLA",
"definition": "Service Level Agreement — a commitment about how reliable or fast a service will be.",
"aliases": ["service level agreement"],
"category": "Operations",
"source": "https://en.wikipedia.org/wiki/Service-level_agreement"
}| Field | Required | Notes |
|---|---|---|
term |
✅ | Canonical term shown in the UI. |
definition |
✅ | Plain-language explanation. |
aliases |
— | Other spoken/written forms that should also match. |
category |
— | Optional grouping label shown as a chip. |
source |
— | Optional "Learn more" URL. |
id |
— | Optional UUID; auto-generated if omitted. |
Your editable copy lives at
~/Library/Application Support/Lexed/keywords.json. The bundled starter set is
Sources/Lexed/Resources/keywords.json.
Lexed/
├── Package.swift # SwiftPM manifest (executable + test target)
├── Sources/Lexed/
│ ├── LexedApp.swift # @main App, scenes, menu commands
│ ├── Models.swift # Keyword, DetectedTerm
│ ├── Glossary.swift # load/save/import/export keyword store
│ ├── KeywordIndex.swift # compiled regex matcher (the matching engine)
│ ├── AudioCapture.swift # system-audio (ScreenCaptureKit) + microphone backends
│ ├── SpeechRecognizer.swift # SFSpeechRecognizer, on-device, live + rotating
│ ├── LexedViewModel.swift # ties speech + glossary → highlighted transcript
│ ├── Views/ # SwiftUI: transcript, sidebar, glossary editor, settings
│ ├── Resources/keywords.json # starter glossary
│ ├── Resources/AppIcon.png # app icon (set at runtime for Dock/About)
│ ├── Info.plist # TCC usage strings, bundle metadata
│ └── Lexed.entitlements # sandbox + audio-input (for signed release builds)
├── Tests/LexedTests/ # unit tests for the matching engine
└── docs/ # ARCHITECTURE, PRIVACY
See docs/ARCHITECTURE.md for how the pieces fit together.
- System-audio capture via
ScreenCaptureKit(caption the far side of a call without a virtual device). - Per-app audio selection (capture a single app, e.g. only Zoom).
- Floating always-on-top caption overlay / picture-in-picture mode.
- Per-context glossary profiles (switch between "interview", "standup", …).
- Transcript export (Markdown /
.txt) with detected terms appended. - Adopt
SpeechAnalyzer/SpeechTranscriberon macOS 26+ for lower-latency streaming. - Optional definition lookups for unknown words via a local dictionary.
- Signed & notarized release builds + Homebrew cask.
PRs welcome — see CONTRIBUTING.md. Run swift test before
submitting; the matching engine is covered by unit tests and should stay green.
MIT © Lexed contributors.
Built with Apple's on-device Speech framework. Not affiliated with Apple Inc.