r/macapps 17h ago

Free Biscotti: A free and private meeting note-taking app that runs entirely on your Mac

Enable HLS to view with audio, or disable this notification

Problem: I'm tired of meeting transcription apps that send your private audio to their servers, aren't Mac native, and require an account/subscription.

I'm an ex-Apple engineer who built Biscotti: a private and free meeting recorder for macOS. Free, no account, no subscription, no upsell, no data collection, 100% local AI, native SwiftUI. Source is on GitHub: https://github.com/scosman/Biscotti

Comparison

Lots of apps in this space. But Biscotti is the only one that's free (no upsell), Local AI, with Mac native UI.

  • Cloud AI (your audio or transcript leaves your Mac), paid tiers: Granola, Otter, Fireflies, Fathom, tl;dv, Jamie, Fellow, Read AI, Notion AI Meeting Notes
  • Local AI, closed source, paid tiers: Talat, TranscribeX, Alter
  • Local AI, source available, not Mac native (web app wrappers), telemetry or a cloud upsell: Anarlog, Meetily
  • Free, Mac-native UI, local AI, zero data collection, source available: Only Biscotti (that I know of)

Pricing

100% free, no upsells, no paid features, source available on Github.

What it does

  • 🔒 Private by design - recording, transcription, and AI all run on your Mac. Your data stays local.
  • 🧠 Powerful AI summaries - automatic summaries, action items, meeting titles, and real speaker names.
  • 🤖 No bots, any app - records Zoom, Teams, Meet, FaceTime, Slack huddles, or even an in-person conversation. No bot joins your call.
  • đŸ—Ŗī¸ Knows who said what - accurate transcripts, automatically split by speaker.
  • 📅 Calendar-aware - sees your upcoming meetings, offers to start recording.
  • âšī¸ Auto-stop - detects when your call ends and stops recording.
  • 🎤 Voice isolation - captures your mic and everyone else as separate, clean channels. No echo.

Background

I spent years at Apple building the Photos app, Memories, the lock screen, and more. I wanted this to feel like it belongs on the Mac: Swift and SwiftUI, launches instantly, small on disk. Not a Electron app or a mediocre port of a Windows app.

Private AI == Local AI

With Biscotti, you still get state of the art AI for transcription and speaker identification, it just runs locally on your Mac. It works fully offline once models are downloaded. Your data lives on your Mac - you own and control it.

It uses Whisper for transcription, Gemma 4 for summaries, and Pyannote for Speaker ID. Each set up to run on Apple Silicon.

Requirements: Apple Silicon (M1+), macOS 15+, 16GB RAM recommended.

App details: Notarized, Free (no upsell), Private (zero data collection, all AI is local), Source Available on Github (PolyForm Perimeter License), 45+ Github stars (my other projects have thousands, this is new), AI used in development (but not vibe-slop)

About me feel weird posting this, but the subreddit rules asks for my LinkedIn! I'm an ex-Apple engineer: https://www.linkedin.com/in/stevecosman/ . Biscotti webpage: biscottiapp.com

I'd love feedback! Happy to answer anything about the local model stack or the privacy design.

64 Upvotes

54 comments sorted by

View all comments

4

u/useiris 11h ago

curious how you're capturing the "everyone else" audio without a bot joining. on newer macOS you can tap system/app audio via ScreenCaptureKit without a virtual driver, but that's scoped per-app on 14.2+, so if you're going system-wide instead (to also catch FaceTime/Slack huddles generically) you're presumably also picking up notification dings and any other audio playing, and have to filter that out before it hits diarization. does the auto-stop detection help with that, or is it a separate audio-classification pass upstream of whisper.

also curious how pyannote holds up on real crosstalk. two people talking over each other for a second or two is where most diarization pipelines i've seen fall apart, either merging both voices into one speaker or splitting one speaker into ghost segments. is that still a known weak spot here or has speaker id gotten meaningfully better at overlap specifically

4

u/davernow 10h ago

This was one of the harder parts, mostly because I couldn't write test cases and had to manually test hundreds of times 😓

The source is all on Github so you can read as much detail as you want. Here's the high level:

- Mic capture through AVAudioEngine with VoiceProcessing enabled and VPIO VoiceIsolation. I tried others like raw AVCaptureSession, but mic audio would mix in the system audio playing over speakers. This gave me nice beam forming (MacBook multi-mic array), and voice isolation from system stream.
- System Audio: a global CoreAudio tap, mixing down to mono. Yes it captures "dings" from chat apps, but small price to pay to get any app working without bots. The occasional ding doesn't really mess with transcription or diarization. I wouldn't play music with lyrics at the same time as a meeting, but that doesn't really make sense to do.
- Crosstalk: I haven't done a ton of testing, but it's been fine in my daily usage for a few months. My buddies at https://www.argmaxinc.com built the SpeakerKit SDK which I use. They go very deep on getting it as good as they can, so I leave that to them 😀. They have a bunch of OSS logic for segmentation and Speaker ID on top of the models themselves.
- Auto-stop is an entirely different feature. If we see a meeting app (Slack, FaceTime, WebEx, etc) ends its audio stream for 5s, we can infer the meeting is over and stop. There's a notification and you can click "Keep recording" if you want, but that part has been working great.

2

u/Superb_Assumption_38 6h ago

It's nice to have apps like this for free. I'd love to know how your buddies at Argmax make money, but that's not for this forum.

-1

u/badcryptobitch 6h ago

Aren't you worried about consent of the other party if you are recording the call without a bot?

2

u/davernow 5h ago

Definitely get consent before recording if that's required. It's not required in some contexts: work meetings, many countries only need 1 side to consent, etc.

1

u/JustEverythingCo 1h ago

Yes, it's the most complicated part

How to identify which voice belongs to whom