Skip to content

sonpiaz/pheme

Repository files navigation

Pheme

Pheme

AI meeting notes for macOS — real-time transcript & auto-summary, Vietnamese-optimized.

Powered by Kyma API — one key, every model. Free credit on signup.

License Stars macOS 14.2+ Swift 5.9


Features

  • 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

Pheme Screenshot

Install

Homebrew

brew tap sonpiaz/tap https://github.com/sonpiaz/homebrew-tap
brew install --cask pheme

Build from source

git clone https://github.com/sonpiaz/pheme.git
cd pheme
brew install xcodegen    # if not installed
make run

Quick Start

  1. Launch Pheme
  2. Grant microphone permission when prompted
  3. Grant Screen Recording permission in System Settings → Privacy & Security
  4. Enter your Kyma API key in Settings (⌘,) — free credit on signup. One key powers everything.
  5. Click Record — speak, and watch the transcript appear in real-time

How It Works

┌─────────────┐     ┌──────────────┐     ┌──────────────────┐
│  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.

Requirements

  • 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)

Your Data: Files, Not a Database

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.

MCP Server (for developers & agents)

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

Privacy

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.

Development

make generate    # Generate Xcode project
make build       # Build via xcodebuild
make run         # Build and run
make release     # Build release DMG
make clean       # Clean build artifacts

Project Structure

Sources/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

Tech Stack

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

Contributing

Contributions are welcome! See CONTRIBUTING.md for guidelines.

Related

  • Kapt — macOS screenshot tool with annotation & OCR
  • Yap — Push-to-talk dictation for Mac
  • hidrix-tools — MCP server for web & social search

License

MIT — see LICENSE for details.

Why "Pheme"?

Named after Pheme (Φήμη) — the Greek goddess of fame, rumor, and voice. She heard everything and spread the word.

About

AI meeting notes for macOS — real-time transcript & auto-summary, Vietnamese-optimized

Topics

Resources

License

Contributing

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors