Your meetings, recorded and transcribed on your own machine.
Captures your Mac's microphone and system audio as separate tracks, transcribes them locally, names the speakers it knows by voice, and matches every recording to the meeting it belongs to. The audio never leaves your machine.
git clone https://github.com/fondsdev/fonds && cd fonds
python3 -m venv .venv && source .venv/bin/activate
pip install -e .
MIT licensedmacOS 14.4+no account requiredsource on GitHub
Three commands, no hardware
fonds desktop record --duration 60
fonds rec transcribe
fonds rec show
Record a minute of this Mac, transcribe it, read it back. Transcription
needs one extra — pip install -e '.[transcribe]' — and a
Hugging Face token for the model download. Five of the six capabilities
need no PLAUD hardware at all; see
docs/install.md
for the full prerequisites.
Every byte that leaves your machine
ASR and diarization run locally. Speaker matching is arithmetic against stored voiceprints — it does not even load a model. Several commands do use the network, and this is all of them:
| When | Where | What goes out |
|---|---|---|
pin auth | PLAUD's developer API | your serial, client id and secret key — never a recording |
rec transcribe, first run per model | huggingface.co | a model download, authenticated with your HF_TOKEN |
calendar auth | Google's OAuth endpoints | the consent flow; grants read-only calendar.readonly |
calendar match | googleapis.com | a read of your calendar for the days you recorded on |
--llm only | Anthropic's API | opt-in, and the only path that transmits anything derived from a recording |
--llm is used only when the clock and the local transcript
cannot separate two overlapping meetings. It sends candidate meeting titles,
their local times, attendee first-name tokens, and up to ~4000 characters of
the transcript covering the stretch those meetings span. Never email addresses,
never audio, never transcript outside that stretch. Without it, an unresolved
conflict is simply reported as unresolved.
docs/security.md has the field-by-field version, every file written and its mode, and what each credential grants.
Separate tracks are the quality argument
When you record your own Mac, your microphone and the far end land in different files, so the "me versus them" split is physical rather than inferred — no diarization error at all on the distinction that matters most. Remote participants arrive already close-mic'd and noise-suppressed by their own devices, at 48 kHz instead of a wearable's 16 kHz.
What it does
Five of the six capabilities need no PLAUD hardware at all.
| Command | Needs | Guide | |
|---|---|---|---|
| Record this Mac — mic and system audio as separate tracks | fonds desktop record | macOS 14.4+ | mac.md |
| Notice a call starting and offer to record it | fonds desktop watch | macOS 14.4+ | mac.md |
| Transcribe and split it by speaker | fonds rec transcribe | [transcribe] extra, HF token | transcripts.md |
| Name the voices you have enrolled | fonds speakers identify | a transcript | transcripts.md |
| Say which meeting a recording was | fonds calendar match | [calendar] extra, Google auth | transcripts.md |
| Sync recordings off a PLAUD NotePin S | fonds pin download | the device, PLAUD partner credentials | pin.md |
And the pin, if you have one
Existing open-source PLAUD clients target the older PLAUD Note
and do nothing on a NotePin S: the device accepts your writes and answers nothing at
all, including commands that need no authentication. The reason is an
RSA pre-handshake the Note never had. Until it completes the
device ignores everything; after it completes the whole BLE link is
ChaCha20-Poly1305 encrypted, and the recordings themselves are individually
encrypted at rest. fonds implements all three layers.
The full protocol is in docs/protocol.md; how it was worked out, dead ends included, is in docs/discovery.md.
Limits
- Only tested on a NotePin S. The NotePin, NotePro and Note are recognised by serial prefix but unverified.
- No WiFi fast transfer — BLE runs at 20–30 KB/s, so a long recording takes a while to pull off the device.
- Transcription is local only. The backend interfaces are built for cloud providers, but none is implemented.
- Calendar matching is Google only. The
CalendarSourceprotocol is built for others; macOS EventKit is the obvious second. - Speaker identification names clusters, it does not fix them. A person the diarizer split across two clusters gets named twice.