Cross-platform speech-to-text application for instant voice transcription through global keyboard shortcuts. Press and hold FN (macOS) or Right Ctrl (Windows) to record, transcription is processed locally using Whisper models and automatically pasted into app with focus.
# Build and run
./build.sh
./build/bin/yakety-cli
# Build debug version
./build.sh debug
# Build release version
./build.sh release- Entry Point:
src/main.c- Application lifecycle and transcription workflow - Platform Layer:
src/mac/,src/windows/- OS-specific implementations - Build Config:
run.sh- Build script with whisper.cpp integration - Audio:
src/audio.c- MiniAudio-based recording (16kHz mono) - Transcription:
src/transcription.cpp- Whisper.cpp integration - Models:
src/models.c- Model loading with fallback system
- macOS: 14.0+, Apple Silicon, accessibility permissions
- Windows: Visual Studio or Ninja, optional Vulkan SDK
- Dependencies: whisper.cpp (auto-downloaded)
Yakety requires three permissions on macOS to function properly:
- Accessibility - For global keyboard event monitoring (detecting hotkey press/release)
- Input Monitoring - For capturing keyboard events system-wide
- Microphone - For recording audio
yakety-cli from within another application (like VS Code's terminal), the CLI inherits the parent app's permission status.
Example scenarios:
- Running
yakety-clifrom VS Code terminal → VS Code needs accessibility/input monitoring permissions - Running
yakety-clifrom iTerm2 → iTerm2 needs the permissions - Running
yakety-clifrom Terminal.app → Terminal.app needs the permissions
# Check current permission status
./permissions.sh
# Clear all permissions (requires sudo)
./permissions.sh clear-
"Permission NOT GRANTED" despite adding yakety-cli to System Settings
- Check which app you're running the CLI from
- Grant permissions to the parent app (e.g., VS Code, iTerm2)
- Or run directly from Terminal.app with its permissions
-
Permissions work for GUI app but not CLI
- GUI app (Yakety.app) has its own bundle ID:
com.yakety.app - CLI inherits permissions from its parent process
- They are tracked separately in macOS
- GUI app (Yakety.app) has its own bundle ID:
-
Permission dialogs not appearing
- Some permissions (like Input Monitoring) cannot be requested programmatically
- Must be granted manually in System Settings
- Yakety will guide you through the process with dialogs
- Open System Settings → Privacy & Security
- Navigate to the relevant section:
- Accessibility → Add your terminal app or Yakety.app
- Input Monitoring → Add your terminal app or Yakety.app
- Microphone → Grant when prompted or add manually
When debugging permission issues:
- The app logs which permissions are granted/denied
- Parent process detection helps identify inheritance issues
- Use
./permissions.shto verify TCC database entries - Run from different terminal apps to test various scenarios
# Package for distribution
./run.sh release
# Outputs in build/bin/: CLI tools, app bundles with embedded Whisper models