Teams calls, transcribed on your Mac
Nothing joins the meeting.
Nothing leaves your Mac.
Your meeting, transcribed in the languages you actually held it in, summarized as markdown in a folder of your choice.
How it works
Four things happen, all on your machine.
No bot, no calendar permission, no admin approval, no participant tile, no second service to manage.
- 01 Detect
Ghostie waits for a calling app to take over your microphone.
Today it watches for Microsoft Teams specifically — each app has its own evidence shape, and Teams was the first. Zoom, Meet, and Slack huddles will follow. A meeting window, the camera, or the other participants’ voices in the system audio confirm it’s a call rather than a notification chime. A 30-second grace covers mute, brief blips, and the moment between unplugging headphones and reaching for AirPods. Nothing ever connects to the meeting.
- 02 Record
Two local audio tracks, separately.
macOS gives Ghostie two clean streams: what you hear from the other people, and what your mic picks up from you. Both are saved as plain audio files on your Mac. No fake audio driver, no extra software, no cloud upload.
- 03 Transcribe
Whisper runs on your Mac.
Whisper is the speech-recognition engine. It never sends your audio anywhere. Both tracks are merged by timestamp, labelled Me and Participants, with a filter that catches Whisper’s usual mistakes — phrases looping when no one’s talking, training-data leaks like “Subtitles by the Amara.org community.”
- 04 Summarize
Two ways. Claude, or local.
Claude Code, signed into your own login (no API key, no monthly bill), writes the best summary. Or hand the transcript to a local Ollama model and nothing leaves your Mac at all. Same seven sections either way: context, participants, discussion points, decisions, action items, open questions & risks, and a one-paragraph summary.
Made for mixed-language calls
For everyone whose standups break into Swedish at the third bullet.
Two Whisper variants — Swedish and English — running locally. Models download once and stay on your Mac at ~/.ghostie/models/.
Most transcription tools commit to one language at session start, then politely guess for the other 40% of the call. Ghostie segments each track, detects the language of every segment, and routes it to the model that knows what to do with it.
The result: Swedish phrases stay Swedish in the transcript, English phrases stay English, and the summary reads naturally in both.
What you get
The note wrote itself
while you were talking.
Plain markdown. Same structure every time. Drops straight into your Obsidian vault — or any folder you point it at.
Linnea walked through the user research findings from last week. The onboarding redesign tested well, but the new pricing page is causing measurable drop-off in the signup funnel against the control variant.
- Marcus — product lead, ran the meeting.
- Linnea — user research, presented the findings.
- Elin — growth, owns the funnel data.
- Daniel — engineering, evaluating search vendors.
- Pricing-page drop-off: roughly 30% against control, in both test variants.
- Onboarding redesign tested well and is ready to roll out.
- Search rebuild: in-house index versus Algolia for v2.
- Pricing test A/B runs one more week with both variants live in parallel.
- Marcus owns the onboarding rollout starting next sprint.
- Search will use Algolia for the v2 release, not the in-house index.
| Owner | Action | Due |
|---|---|---|
| Marcus | Write up the onboarding rollout plan | Friday |
| Elin | Pull the funnel data for the pricing test | Tuesday |
| Daniel | Confirm the Algolia contract terms | Next sync |
- What’s the fallback plan if the Algolia migration breaks search relevance for the long tail?
- Should we hold the marketing push until the pricing test settles?
Sprint 24 planning centred on the pricing test and the onboarding rollout. The pricing A/B runs one more week before a call is made; Marcus takes the onboarding redesign into the next sprint, and v2 search will build on Algolia pending contract confirmation.
Written 14:51, two minutes after the call ended.
Privacy ledger
What leaves your Mac, and what stays.
An honest accounting. No marketing dressed up as a privacy policy.
Audio recordings
Captured locally by macOS. Deleted after processing unless you turn on “Keep audio” in settings. While they’re being processed they live at ~/.ghostie/recordings/.
The text transcript leaves, once — if you pick Claude
Sent through your own Claude Code login to be summarized, when Claude is the chosen summarizer. Pick the Ollama option in Settings and the transcript never leaves your Mac. Either way, never stored by Ghostie, never sent to a Ghostie server (there is no Ghostie server).
Whisper and KB-Whisper models
Fetched once, then run locally. No telemetry, no analytics, no error reporting. The only outbound traffic is fetching models from Hugging Face and checking GitHub Releases for an update — both to third parties, never to a Ghostie server.
Backlog of stalled calls
When processing can’t finish — Claude Code not logged in, Ollama not running, a model missing, you’re offline — the recording or transcript queues at ~/.ghostie/backlog/ and retries automatically. Notes upgrade in place.
Self-updating, verified
Every update is signed by Apple and double-checked by Ghostie before it installs. If you’re on a call when an update lands, it waits.
Audio capture, not a meeting client
Ghostie listens to what your speakers play and your mic captures, the way a screen recorder does. It never connects to Zoom, Meet, or Teams — so there’s nothing for them to show.
Platform
macOS 15 Sequoia or later
Built on the modern macOS audio APIs. Apple Silicon recommended.
Trigger app
Microsoft Teams, by design
Built on per-PID audio attribution that tells a real Teams call apart from any other mic use. Zoom, Meet, and Slack huddles aren’t supported yet — each needs its own evidence shape.
Summarizer
Claude Code, or local Ollama
Claude for the best summary, Ollama if you’d rather nothing leave the machine. Pick in Settings. Transcripts always work without either.
Install
Two paths.
Pick a summarizer in Settings afterwards: Claude Code (your own login, no API key) for the best notes, or a local Ollama model if you’d rather keep everything on your Mac.
A / The easy way
Drag and drop.
Signed, notarized .dmg with the CLI bundled inside. On first launch Ghostie opens Settings to download the Whisper speech model — a one-time ~140 MB fetch from Hugging Face.
- Download
Ghostie.dmg - Open it, drag Ghostie to Applications
- Launch. Grant Screen Recording and Microphone once when prompted
- For the Claude summarizer, run
claudeonce in a terminal to sign in. For the local one, install Ollama and pull a model
v1.1.0·13 July 2026·5 MB
B / The build-it way
From source.
Swift Package Manager, two shell scripts. Signs with your Developer ID if you have one, so granted permissions persist across rebuilds.
git clone github.com/sjunnesson/ghostie./scripts/setup.shto fetch whisper.cpp and the models./scripts/build-app.shto build, sign, and install to/Applicationsopen /Applications/Ghostie.appand grant permissions once
Prefer the app on your Mac? The default. Prefer headless on a server? ghostie run in a terminal. Both ship in the same binary.
Frequently asked
The questions everyone has.
Does Ghostie join the meeting as a bot?
No. macOS tells Ghostie when Teams specifically holds the microphone, and corroborates it with the meeting window, the camera, or the other participants' voices in the system audio. Nothing ever connects to the meeting, and Teams never sees a participant.
Where does my audio go?
Nowhere. Audio is captured to local WAV files in ~/.ghostie/recordings/, transcribed on-device with whisper.cpp, and deleted by default once processing finishes. The text transcript is sent to Claude for the summary — or, if you pick the local Ollama option in Settings, nothing leaves your Mac at all.
Do I need an Anthropic API key?
No. Ghostie uses the Claude Code app under your existing login. Or skip Claude entirely and pick the Ollama option in Settings — a local model on your Mac writes the summary instead, and the transcript never leaves the machine. Without either, you still get the full local transcript; only the AI summary is skipped, and it backfills automatically once a summarizer is reachable.
Can Ghostie run fully offline?
Yes. In Settings › Summary, switch the provider to Ollama (local)and point it at a model you’ve pulled with ollama pull. Detection, recording, transcription, and the summary then all run on your Mac; nothing reaches the network. The default is still Claude, because the notes are sharper — but a small local model is a real option if privacy is non-negotiable.
What about Swedish and English on the same call?
In Settings ▸ Transcription, switch the mode to Language switching. Ghostie chops each track into chunks, detects the language of every chunk, and transcribes Swedish ones with the Swedish-trained Whisper model and English ones with the English-trained one. Models live in ~/.ghostie/models/ and download from the same Settings pane.
Does it work with Obsidian?
Yes. The output is plain markdown — one .mdper call, timestamped — so any folder-based notes app picks it up. In Settings, point the notes folder at your vault (the default is ~/Documents/Teams Call Notes). Each call lands ready for [[wikilinks]], tags, and Dataview queries.
Can I run it headless on a server?
Yes. The same binary ships a CLI: ghostie run for the headless watch loop, ghostie install-service for a launchd service, ghostie doctor and ghostie selftest for diagnostics, and ghostie diagnose-detectfor a live readout of what the detector is seeing when a call doesn’t fire.
Is it really free?
Yes. Ghostie is MIT-licensed and open source. Bring your own Claude Code login for the summary step, or run a local Ollama model instead — everything else runs locally on your machine.
Give your next Teams call to Ghostie.
Drop the .dmg into Applications, grant the two permissions once, then forget about it.
v1.1.0·13 July 2026·5 MB