AI meeting notes for macOS — real-time transcript & auto-summary, Vietnamese-optimized.
Powered by Kyma API — one key, every model. Free credit on signup.
- Dual-stream recording — captures your mic (Me) and system audio (Them) simultaneously
- Real-time transcript — live speech-to-text as you speak, not after you finish
- Auto-generated summaries — structured notes with key points, decisions, and action items
- Multi-speaker support — extensible speaker model (Me, Them, Speaker C, D...) with color-coded pills
- Vietnamese-first — optimized for Vietnamese and mixed Vietnamese/English meetings
- Pause / Resume — pause recording without ending the meeting
- Privacy-first — no bot joins your calls, audio is never stored
- Menu bar controls — start, stop, and monitor from the macOS menu bar
- Search — full-text search across all meeting titles and transcripts
- Auto-cleanup — empty test meetings are purged on launch
brew tap sonpiaz/tap https://github.com/sonpiaz/homebrew-tap
brew install --cask phemegit clone https://github.com/sonpiaz/pheme.git
cd pheme
brew install xcodegen # if not installed
make run- Launch Pheme
- Grant microphone permission when prompted
- Grant Screen Recording permission in System Settings → Privacy & Security
- Enter your Kyma API key in Settings (⌘,) — free credit on signup. One key powers everything.
- Click Record — speak, and watch the transcript appear in real-time
┌─────────────┐ ┌──────────────┐ ┌──────────────────┐
│ Microphone │────▶│ AudioChunker │────▶│ Kyma STT │
│ (AVAudio) │ │ (24kHz PCM) │ │ (Me transcript) │
└─────────────┘ └──────────────┘ └────────┬─────────┘
│
┌─────────────┐ ┌──────────────┐ ┌─────────▼────────┐
│ System Audio │────▶│ AudioChunker │────▶│ Kyma STT │
│ (CoreAudio) │ │ (24kHz PCM) │ │ (Them transcript) │
└─────────────┘ └──────────────┘ └────────┬─────────┘
│
┌────────▼────────┐
│ Kyma API │
│ (Titles+Summary) │
└─────────────────┘
Audio capture uses AVAudioEngine for mic and Core Audio Taps (CATapDescription) for system audio — capturing all other apps without joining your call.
Transcription groups speech into natural utterances client-side (silence detection on 24kHz PCM16), then sends each utterance to Kyma /v1/audio/transcriptions (whisper-v3-turbo with automatic server-side failover). Transcripts appear sentence-by-sentence, a couple of seconds behind live speech.
Summaries & titles are generated via Kyma API (the best model alias) in the same language as the transcript.
- macOS 14.2+ (Sonoma)
- A Kyma API key (free credit on signup) — one key for transcription, titles, and summaries
- Microphone permission
- Screen Recording permission (for system audio capture)
Every meeting is archived as plain Markdown in ~/Pheme/<year>/ — YAML
frontmatter, the summary, and the full timestamped transcript. Your notes
stay readable in any editor, greppable, and syncable for years, with no
lock-in. ~/Pheme/index.json provides fast lookup for tooling.
Query your meeting archive from Claude Code — or any MCP client — without opening the app:
cd mcp && bun install
claude mcp add pheme -- bun run /path/to/pheme/mcp/server.ts| Tool | What it does |
|---|---|
pheme_list |
Recent meetings with ids, titles, dates, durations |
pheme_get |
Full summary + transcript of one meeting (by id or fuzzy title/date) |
pheme_search |
Full-text search across every transcript |
Pheme sends audio to the transcription backend and the transcript to Kyma API for summaries — nothing else leaves your Mac. No audio is stored. API keys are stored in UserDefaults on your Mac. Meeting transcripts and summaries are stored locally via SwiftData.
make generate # Generate Xcode project
make build # Build via xcodebuild
make run # Build and run
make release # Build release DMG
make clean # Clean build artifactsSources/Pheme/
├── App/
│ ├── PhemeApp.swift — App entry, menu bar, onboarding
│ └── AppState.swift — Shared state, recent meetings, cleanup
├── Audio/
│ ├── MicRecorder.swift — 24kHz mono mic capture via AVAudioEngine
│ ├── SystemAudioRecorder.swift — System audio via Core Audio Taps
│ ├── AudioChunker.swift — Float32 → PCM16LE → base64 chunks
│ └── DualStreamMixer.swift — Routes mic + system to separate chunkers
├── Transcription/
│ ├── KymaTranscriber.swift — Utterance-chunked STT via Kyma API
│ └── TranscriptionSession.swift — Orchestrates dual-stream transcription
├── Summary/
│ ├── SummaryGenerator.swift — Title + summary via Kyma ('best' alias)
│ └── SummaryPrompts.swift — Bilingual prompt templates
├── Storage/
│ ├── Meeting.swift — SwiftData model with formatted transcript
│ └── TranscriptSegment.swift — Speaker enum (Me, Them, multi-speaker)
├── UI/
│ ├── MainContentView.swift — Split view: list + detail + transcript
│ ├── MeetingListView.swift — Sidebar with search and date grouping
│ ├── DesignSystem.swift — Editorial design tokens + components
│ ├── RecordingControlView.swift — Record/pause/stop buttons
│ ├── MenuBarView.swift — Menu bar controls
│ ├── SettingsView.swift — API key, preferences
│ └── OnboardingView.swift — First-launch permission wizard
└── System/
├── SoundFeedback.swift — Start/stop audio cues
├── LaunchAtLogin.swift — Auto-start at login
├── PermissionManager.swift — Permission checks
└── CustomDictionary.swift — User-defined terms for transcription
| Technology | Purpose |
|---|---|
| Swift 5.9 | Language |
| SwiftUI + SwiftData | UI framework + persistence |
| AVFoundation | Microphone audio capture |
| Core Audio | System audio capture (CATapDescription) |
| Kyma API | Transcription (whisper-v3-turbo) + summaries ('best' alias) |
| XcodeGen | Project generation |
Contributions are welcome! See CONTRIBUTING.md for guidelines.
- Kapt — macOS screenshot tool with annotation & OCR
- Yap — Push-to-talk dictation for Mac
- hidrix-tools — MCP server for web & social search
MIT — see LICENSE for details.
Named after Pheme (Φήμη) — the Greek goddess of fame, rumor, and voice. She heard everything and spread the word.

