Privacy-first meeting notes for macOS — recording, transcription, and summarization all run locally. Nothing ever leaves your Mac.
Records the mic and system audio (the remote side of a Teams/Zoom/Meet call), transcribes both on-device with Apple's SpeechAnalyzer (macOS 26+), and summarizes the transcript with a local LM Studio model into a folder you choose. Nothing — audio, transcript, or summary — touches the network.
Two front-ends over the same engine (MeetnoteCore):
MeetNote.app— a menu bar app: click the icon → topic → Start; while recording it shows elapsed time, segment count and the last transcribed line; Stop → notes are written and opened. Settings (model, your name, output folder, system-audio self-test, start-at-login) sit behind the gear icon.meetnote— the CLI (usage).
Using an AI agent? Copy this prompt into Claude Code (or any agent that can run shell commands) on the target Mac:
Install and set up MeetNote (https://github.com/Livin21/meetnote), a fully
local meeting note-taker for macOS, on this Mac.
1. Verify requirements: macOS 26+, Apple Silicon, ~10–20GB free disk.
Stop and tell me if any are missing.
2. Ensure Xcode Command Line Tools are installed (xcode-select --install).
3. Ensure LM Studio is installed (https://lmstudio.ai — or
`brew install --cask lm-studio` if Homebrew is available). Download a
summarization model: google/gemma-4-26b-a4b if this Mac has 32GB+ RAM,
else google/gemma-4-12b-qat (via the LM Studio UI or `lms get`). Start
the server: `lms server start`.
4. Clone the repo and run ./scripts/make-app.sh — it builds and installs
/Applications/MeetNote.app. Then `open /Applications/MeetNote.app`.
Optionally symlink the CLI:
ln -sf "$PWD/.build/release/meetnote" ~/.local/bin/meetnote
5. You cannot grant macOS permissions yourself — walk me through them:
I'll click the MeetNote menu bar icon, press "Start recording" once, and
allow the Microphone prompt. Then I'll add MeetNote in System Settings →
Privacy & Security → Screen & System Audio Recording → "System Audio
Recording Only" tab → "+". There is no automatic prompt for that one;
without it system audio records as silence.
6. Have me verify with "Test system audio" in the panel's settings (gear
icon), and set my name and output folder there too.
Or set it up manually:
Requirements: macOS 26+, Apple Silicon, ~10–20GB free disk. 16GB RAM works with the small model; 32GB+ is comfortable with the recommended one.
- Install Xcode Command Line Tools:
xcode-select --install - Install LM Studio (free) and download a model:
google/gemma-4-26b-a4b(best, needs 32GB+ RAM) orgoogle/gemma-4-12b-qat(good, fine on 16GB). Start the server:lms server start. - Build and install:
git clone <this repo> && cd meetnote ./scripts/make-app.sh # menu bar app ln -sf "$PWD/.build/release/meetnote" ~/.local/bin/meetnote # CLI (optional) open /Applications/MeetNote.app
- Permissions (one-time): click Start once and allow the Microphone prompt, then add MeetNote to System Audio Recording Only — details in App permissions. Verify with the panel's Test system audio button.
- In the panel's settings (gear icon), set your name and pick an output
folder. If your meetings aren't in English, set the locale via CLI
(
--locale ja_JPetc. — supported: en/de/es/fr/it/ja/ko/pt/zh/yue variants; the speech model downloads automatically on first use).
meetnote start weekly sync # record; Ctrl-C to stop → transcript + notes
meetnote start standup --no-summary
meetnote summarize <transcript.md> [topic words…]
meetnote doctor # check permissions, models, LM StudioOutput goes to the configured folder (see Settings below):
YYYY-MM-DD-topic.md— summarized notes (TL;DR, decisions, action items, open questions, discussion timeline)transcripts/YYYY-MM-DD-HHMM-topic.md— raw timestamped transcript
Speaker labels: Me = your mic, Them = system audio (everyone else on the call, merged — individual remote speakers are not distinguished).
The menu bar app's settings (behind the gear icon) cover your name (what
notes call "Me"), the output folder, and the summarization model. They're
stored in a shared defaults suite (dev.livin.meetnote.shared) that the CLI
reads too. Environment variables override everything:
| Variable | Default |
|---|---|
MEETNOTE_DIR |
panel setting, else ~/Documents/MeetNote |
MEETNOTE_OWNER |
panel setting, else your macOS account name |
MEETNOTE_NAMES |
panel setting; comma-separated teammate names — hints the summarizer to repair names the speech recognizer misheard |
MEETNOTE_LMSTUDIO_URL |
http://localhost:1234 |
MEETNOTE_MODEL |
panel pick, else auto: google/gemma-4-26b-a4b → qwen → first chat model |
The menu bar app is its own TCC identity — grant it permissions once:
- Microphone — prompted automatically on first Start.
- System Audio Recording — manual add (no automatic prompt): System
Settings → Privacy & Security → Screen & System Audio Recording →
System Audio Recording Only tab →
+→ add MeetNote. Without it the tap is created but delivers silence (no error).
make-app.sh, re-toggle MeetNote in that pane.
Use the app's "Test system audio" button to confirm (it plays a sound and
checks the tap hears it; on silence it opens the right Settings pane).
macOS attributes the CLI's permissions to the app that launched it — i.e.
your terminal app, not meetnote itself. Grant your terminal the same two
permissions (same Settings pane as above). meetnote doctor detects the
silent-tap case by playing a test sound through the tap. If you launch
meetnote from a different terminal app, that app needs the same grants.
meetnote start expects LM Studio's server to be up (lms server start); the
model is JIT-loaded on the first request. If the server is down, the transcript
is still saved and the command tells you how to summarize it later. Long
transcripts are map-reduced in ~16k-char chunks.
scripts/make-app.sh builds everything in release mode and installs the app;
swift build -c release alone builds the CLI (CLT only, no Xcode/Homebrew/deps
needed). Resources/Info.plist is embedded into the CLI binary
(__TEXT,__info_plist) for the TCC usage descriptions. Debug logging:
MEETNOTE_DEBUG=1.
Tell people they're being transcribed. Recording laws vary by jurisdiction.
