PiTalk is a macOS menu bar app that acts as a local voice hub.
It's great with Pi, but it's not Pi-only any app can send text to PiTalk's local broker and have it spoken through the same centralized queue + playback system.
| PiTalk macOS menu bar app | PiTalk iOS companion app |
|---|---|
![]() |
![]() |
For the iPhone companion app docs, see:
apps/pitalk-ios/README.mdapps/pitalk-ios/SETUP.md
brew tap swairshah/tap
brew install --cask pitalkThen launch PiTalk from Applications (or via Spotlight) and start sending broker requests.
Install the pi-talk and pi-telemetry extensions:
pi install npm:@swairshah/pi-talk
pi install npm:@jademind/pi-telemetryRestart Pi after installation. The pi-talk extension sends <voice> content and live status events to the local PiTalk app.
This repository includes the ClaudeTalk plugin. From the pi-talk-app directory, install it with:
cd ~/work/projects/pi-talk-app
./scripts/setup-claude-talk.sh installStart this checkout's app with ./run-dev.sh, then restart Claude Code. ClaudeTalk connects to PiTalk on 127.0.0.1:18080 and 127.0.0.1:18081, so it works with the development app and the Homebrew app.
To remove the plugin without removing PiTalk:
./scripts/setup-claude-talk.sh uninstall- Runs a local speech broker on
127.0.0.1:18081(NDJSON over TCP) - Accepts
speak,health, andstopcommands from any local client - Queues and coordinates playback so multiple sources can share one voice pipeline
- Streams low-latency TTS audio
- Supports cloud providers (ElevenLabs / Google / Deepgram) and optional on-device local TTS
- Shows live status in the menu bar
- Supports instant stop (including global Cmd+.)
- Keeps request history (queued / playing / played / interrupted / failed)
- Optional remote WebSocket control API for iOS/phone clients (
ws://<host>:18082/ws)
Example broker call:
echo '{"type":"speak","text":"Hello from another app","sourceApp":"my-app","sessionId":"abc-123"}' | nc 127.0.0.1 18081Health check:
echo '{"type":"health"}' | nc 127.0.0.1 18081Stop all speech:
echo '{"type":"stop"}' | nc 127.0.0.1 18081PiTalk also includes a WebSocket remote API intended for an iPhone companion app.
Default endpoint:
ws://127.0.0.1:18082/ws
Use these env vars for tailnet exposure:
PITALK_REMOTE_BIND=0.0.0.0
PITALK_REMOTE_PORT=18082
PITALK_REMOTE_TOKEN=<strong-shared-token>Dev-only no-token override:
PITALK_REMOTE_BIND=0.0.0.0
PITALK_REMOTE_PORT=18082
PITALK_REMOTE_ALLOW_INSECURE_NO_AUTH=1Protocol docs:
docs/REMOTE_WS_PROTOCOL.mddocs/IOS_REMOTE_PLAN.md
Extensions/pi-talk- extracts<voice>tags from Pi responses and sends them to PiTalkExtensions/claude-talk- connects Claude Code to the same local PiTalk brokerSources/PiTalk- menu bar app + broker + playback coordinatorSources/ptts- CLI client for enqueueing/stopping speechSources/PiTalkClient- shared client helpersapps/pitalk-ios- iPhone companion app scaffold (WebSocket client + session UI)
./run-dev.sh./scripts/build-app.sh
open .build/PiTalk.app- macOS 13+
ffplayfor playback (brew install ffmpeg)- For cloud mode: ElevenLabs API key (
ELEVEN_API_KEY/ELEVENLABS_API_KEY), Google TTS API key (GOOGLE_TTS_API_KEY), or Deepgram API key (DEEPGRAM_API_KEY/DEEPGRAM_TTS_API_KEY) - For local mode:
pocket-tts-cliruntime plus model files (either bundled in full builds or downloaded on first use from the matching PiTalk GitHub release model asset)
pi-telemetry— structured runtime telemetry for Pi. PiTalk reads telemetry heartbeats to show live agent state in the menu bar.pi-statusbar— a free macOS status bar app for Pi built on top ofpi-telemetry. The menu bar status UX in PiTalk was directly inspired by this project.
- The menu bar status UX was inspired by
pi-statusbar. - In our Pi workflow, we use both the
pi-statusbarextension and this repo's pi-talk extension together.

