Skip to main content

punt-tts

Voice for your AI coding assistant.

License CI PyPI Python Working Backwards

When Claude Code finishes a task, hits an error, or needs your approval --- you hear it. No need to watch the terminal. Keep working; your assistant will tell you what happened.

Platforms: macOS, Linux

Quick Start

curl -fsSL https://raw.githubusercontent.com/punt-labs/tts/2d8922f/install.sh | sh

Restart Claude Code, then:

/notify y     # hear when tasks complete or need input
/recap        # spoken summary of what just happened
Manual install (if you already have uv)
uv tool install punt-tts
tts install
tts doctor
Verify before running
curl -fsSL https://raw.githubusercontent.com/punt-labs/tts/2d8922f/install.sh -o install.sh
shasum -a 256 install.sh
cat install.sh
sh install.sh

Features

  • Notification layer --- spoken summaries when tasks finish, chimes when Claude needs input
  • Session vibe --- /vibe sets the mood for all speech. Auto-mode reads session signals (test results, lint, git ops) and adapts the voice. Manual mode lets you set it yourself. ElevenLabs expressive tags ([weary], [excited], [sighs]) color every utterance.
  • Five providers --- ElevenLabs, OpenAI, AWS Polly, macOS say, and Linux espeak-ng. The full experience (natural voice, expressive tags, /vibe) requires ElevenLabs.
  • Opt-in only --- no audio until you enable it, no surprises
  • Voice or chime --- /speak n switches to audio tones, no TTS API calls
  • Graceful absence --- if punt-tts isn't installed, Claude Code works exactly as before
  • MCP-native --- runs as a Claude Code plugin with slash commands and hooks

What It Looks Like

Enable notifications

> /notify y

Notifications: enabled (voice)
You will hear spoken summaries when tasks complete and chimes when Claude needs input.

Get a recap

> /recap

Speaking: "I refactored the authentication module into three files, added
comprehensive tests for the token refresh flow, and fixed a race condition
in the session middleware. All 47 tests pass."

Set the vibe

> /vibe banging my head against the wall

Vibe: banging my head against the wall → [frustrated] [sighs] [manual]

Auto-mode (default) reads session signals and adapts automatically --- after a string of test failures the voice sounds [weary], after a successful release it sounds [excited].

Switch to chime-only

> /speak n

Speak: off (chime only)
Notifications will use audio tones instead of voice.

Commands

Command Purpose
/notify y Speak on task completion and permission prompts
/notify c Continuous --- also speak milestone updates during long tasks
/notify n Off
/speak y Notifications are spoken (default when /notify is on)
/speak n Notifications are a chime --- no words
/recap Spoken summary of Claude's last response
/say "text" Speak arbitrary text aloud
/vibe <mood> Set session mood --- voice adapts to match
/vibe auto Auto-detect mood from session signals (default)
/vibe off Disable vibe --- neutral voice
/voice on | /voice off Enable/disable voice mode

Providers

The full experience --- natural voice with expressive tags that respond to /vibe --- requires ElevenLabs. The other providers are fallbacks for environments where ElevenLabs isn't available.

Provider API Key Default Voice Best For
ElevenLabs ELEVENLABS_API_KEY matilda Recommended. Natural voice, expressive tags via /vibe
OpenAI OPENAI_API_KEY nova Fallback. Fast notifications, low latency
AWS Polly AWS credentials joanna Fallback. Cost-effective, no API key needed
macOS say — fred Fallback. Zero-config on macOS, offline
espeak-ng — en Fallback. Zero-config on Linux, offline

Auto-detection order: ElevenLabs > OpenAI > say (macOS) / espeak (Linux) > Polly.

CLI

punt-tts is also a standalone TTS tool, independent of Claude Code.

tts synthesize "Hello world"                  # Synthesize with default provider
tts synthesize "Hello" --provider elevenlabs  # Use specific provider
tts doctor                                     # Check setup
tts install                                    # Install Claude Code plugin (marketplace)
tts uninstall                                  # Remove plugin and clean up
tts install-desktop                            # Register MCP server with Claude Desktop
tts serve                                      # Start MCP server (stdio)

Environment Variables

Variable Description Default
TTS_PROVIDER Force a specific provider auto-detect
TTS_MODEL Model override provider default
TTS_OUTPUT_DIR Output directory ~/tts-output

Roadmap

Shipped

  • Notification layer: /notify, /speak, /recap, Stop + Notification hooks
  • Multi-provider TTS engine: ElevenLabs, AWS Polly, OpenAI
  • Claude Code plugin: marketplace install, MCP server, slash commands
  • CLI: synthesize, batch, pair, pair-batch, doctor
  • Ephemeral output mode (.tts/ in cwd)
  • Two-channel display: ♪ panel summaries with voice/provider context
  • Playful stop hook phrases: randomized vocalization-themed messages ("Speaking my thoughts...", "Saying my piece...")
  • Natural notification phrasing: randomized phrases for permission and idle prompts
  • Audio playback serialization via flock --- concurrent utterances queue instead of overlapping
  • ElevenLabs streaming API for lower time-to-first-audio
  • Dev/prod namespace isolation for plugin testing (claude --plugin-dir .)
  • /vibe with auto, manual, and off modes --- ElevenLabs expressive tags color every utterance
  • Auto-vibe signal accumulator: test pass/fail, lint, git ops feed mood detection
  • set_config MCP tool for atomic config mutations (replaces file-tool pattern)
  • System fallback providers: macOS say and Linux espeak-ng for zero-config offline speech

Coming Soon

Feature What It Does
Per-session voices Each Claude Code session gets its own voice from a pool --- no more five matildas talking at once. /voice to audition and pick.

Documentation

Design Log | Changelog

Development

uv sync --all-extras                           # Install dependencies
uv run ruff check src/ tests/                  # Lint
uv run ruff format --check src/ tests/         # Format
uv run mypy src/ tests/                        # Type check (mypy)
uv run pyright src/ tests/                     # Type check (pyright)
uv run pytest tests/ -v                        # Test

License

MIT

Metadata

Release files for punt-tts 0.9.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for punt-tts 0.9.0
File Size Uploaded
punt_tts-0.9.0.tar.gz 41.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for punt-tts 0.9.0
File Interpreter ABI Platform
punt_tts-0.9.0-py3-none-any.whl Python 3 none any Details

Total release size: 95.8 kB

Release files / punt_tts-0.9.0.tar.gz

Download URL punt_tts-0.9.0.tar.gz
Size 41.8 kB
Tags Source
SHA-256 checksum
How to use checksums
c3e6d0988138adde011b9d5b17379318e76f12fdacbee388b24af74d3070684d
BLAKE2b-256 checksum
How to use checksums
1e8b075e359e521116806fe0f2b38ac46f385fc20403e2e8c8ff372ab7f217bb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Mar 1, 2026.

Transparency log

Release files / punt_tts-0.9.0-py3-none-any.whl

Download URL punt_tts-0.9.0-py3-none-any.whl
Size 54.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
987aafba4282205f5ef2e0316e7f0e72df95b9d1d4930bf22c128173115e029d
BLAKE2b-256 checksum
How to use checksums
2a59599d70041b12ff5f1ea83e83822bb1e59691d8e17a167d43560f8911aea6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Mar 1, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.9.0 This release

2 release files

0.8.1

2 release files

0.8.0

2 release files

0.7.1

2 release files

0.7.0

2 release files

0.6.1

2 release files

0.6.0

2 release files

0.5.0

2 release files

0.4.0

2 release files

0.3.6

2 release files

0.3.5

2 release files

0.3.4

2 release files

0.3.3

2 release files

0.3.2

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.0

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page