Live captions · translation · speaker recognition · a markdown second-brain — running entirely on your Mac.
Hark listens to your microphone and your meeting's system audio, transcribes it on-device with WhisperKit, labels who spoke with FluidAudio diarization, and writes clean markdown notes into a vault folder you own and control.
No cloud speech-to-text. No account. No telemetry. No background sync.
Important
Your meeting content never leaves your Mac unless you explicitly invoke an action that sends it somewhere. Transcription, speaker recognition, and storage are 100% on-device. The two sensitive features — keeping audio and remembering voices — are off until you turn them on. See Your data & privacy below.
- 🎧 Live captions while you record — your mic and the meeting's system audio, mixed and transcribed in near real-time. Tap your meeting audio even while listening on Bluetooth headphones, without forcing the room to hear it.
- 🌍 Translation — caption languages you don't speak (quality modes in progress).
- 🗣️ Speaker labels — after you stop recording, an accurate offline pass labels each line ("Speaker 1", "Speaker 2", …). Name them once; with Remember speakers on, Hark recognizes those voices automatically in future meetings.
- 📝 A markdown vault — every meeting is a plain
.mdfile with front-matter, transcript, and bookmarks. Yours to grep, link, back up, and own forever. - 🔖 Bookmarks — mark a moment mid-meeting and jump back to it later.
Privacy and trust are the product. Hark is built so that lawful, private use is possible — everything stays on your machine, and the sensitive bits are opt-in.
Hark keeps three kinds of data, and you control each one:
| What | Why it exists | Stored? | Leaves your Mac? |
|---|---|---|---|
| 📄 Transcript (markdown) | your meeting notes — the product | ✅ always, in your vault | only if you sync your vault |
| 🎵 Audio recording | re-listen / verify-by-ear review | ⛔ off by default — opt-in | ⛔ off by default |
🧬 Voiceprints (.speakers/) |
recognize known voices across meetings | ⛔ off by default — opt-in | ⛔ off by default |
| Location | Contents |
|---|---|
~/Documents/vault/hark (configurable) |
Your transcripts. Audio + voiceprints only if you enable them. Hark never auto-deletes or silently rewrites this folder, and every change goes through git so your history is recoverable. |
~/Library/Application Support/Hark/ |
Model cache + preferences. No transcripts, no audio, no personal content. |
~/Library/Logs/Hark/ |
Local-only logs. Never uploaded. |
The two sensitive features are off until you turn them on, and you're asked to choose during onboarding:
- 🎵 Keep audio — save the meeting's audio so you can re-listen later. Off by default.
- 🧬 Remember speakers — when you name a speaker after a meeting, store a voiceprint (a mathematical fingerprint of their voice) so Hark can auto-recognize them next time. Off by default.
Change them any time in Settings → Privacy, which shows exactly what's stored and where.
Audio recordings and voiceprints are excluded from your vault's git history (.gitignored),
so they never travel through a git remote. If you keep your vault in a folder-syncing service
(iCloud Drive, Dropbox, …), remember those copy whole folders — so if you've enabled
audio/voiceprints and want them to stay on this Mac only, exclude them there. Settings → Privacy
spells this out.
Warning
A note on consent — this is not legal advice. Recording conversations and storing voiceprints may require the consent of the other participants under your local laws — you are responsible for obtaining it. Hark keeps everything on your Mac, and keeps these features off by default, to support that.
Full rationale: ADR-0027 — Privacy & data-control model.
- No cloud speech-to-text. Transcription is 100% on-device.
- No telemetry, analytics, or content-exfiltrating crash reporters.
- No auto-join of Zoom / Teams / Meet, and no calendar integration.
- macOS only — no Windows, Linux, iOS, or Android.
These are intentional, locked decisions — see the ADRs for the reasoning.
Diarizing a mixed, compressed meeting stream live (everyone blended into one system-audio track) isn't reliably solvable on-device today — even the accurate offline pass struggles on that audio. So speaker labels appear after you stop recording, where they're accurate, rather than showing confidently-wrong labels live. See ADR-0025.
┌─────────────────────────┐ ws://127.0.0.1 (loopback only) ┌──────────────────────┐
│ harkd (Swift daemon) │ ◄───────────────────────────────────────────► │ Electron + Angular │
│ │ │ front-end │
│ mic ─┐ │ │ │
│ ├─ mixer ─ VAD ─ WhisperKit ─ segments ──► (over the socket) ──► │ live captions, tray, │
│ sys ─┘ │ │ settings, vault view │
│ │ │ │
│ on stop: FluidAudio │ │ │
│ diarization + enrollment│ │ │
└──────────┬───────────────┘ └──────────────────────┘
│ writes
▼
~/Documents/vault/hark/*.md
A Swift sidecar daemon (harkd) does capture + ASR + diarization and exposes a
loopback-only WebSocket. The Electron + Angular front-end connects over ws://127.0.0.1.
The daemon binds only to localhost, writes its port to app-data, and never opens an outbound
socket. Full design rationale: meetingmind-handoff.md.
Pre-v1 — there's no released binary yet. Apple Silicon + macOS 14.4+ required. Prerequisites: Xcode + the Swift toolchain (engine), Node 20+ (front-end).
git clone git@github.com:tuanda2912/hark.git
cd hark
# 1. Build the engine the UI spawns (do this first)
cd engine && swift build -c release && cd ..
# 2. Run the full dev stack — Angular + Electron; Electron spawns harkd itself
cd ui && npm install && npm run devFirst launch downloads + ANE-compiles the model (~90 s, ~626 MB), and macOS prompts for Microphone + System Audio Recording — grant them to Electron, then relaunch. Subsequent launches are seconds.
Packaging (arm64-only): npm run pack builds an unpacked .app; npm run dist builds a signed .dmg + .zip. A free Apple Development cert runs
locally; a paid Developer ID cert is needed to notarize for other Macs.
📖 Full runbook — local dev, packaging, code signing, notarization & stapling, and troubleshooting: docs/BUILDING.md.
hark/
├── engine/ Swift daemon — WhisperKit ASR + FluidAudio diarization + WS server
│ └── scripts/ dev signing helper
├── ui/ Electron + Angular 21 front-end
├── docs/
│ ├── decisions/ Architecture Decision Records (the "why")
│ └── BACKLOG.md deferred-work ledger
├── CLAUDE.md operating manual / project conventions
├── STATUS.md current-state snapshot (start here when resuming)
└── meetingmind-handoff.md full design rationale
- docs/BUILDING.md — run from source, package, sign & notarize.
- STATUS.md — what's done, what's next, the dev loop. Start here.
- docs/decisions/ — every non-trivial decision, with reasoning.
- meetingmind-handoff.md — the original design rationale.
- docs/BACKLOG.md — deliberately deferred work.
MIT © 2026 Dang Anh Tuan