Hear a short spoken line after your coding agent answers — on-device Supertonic ONNX through a tiny local HTTP daemon (models stay loaded; hooks stay fast).
Aftertone is not Cursor-only. Today it ships a Cursor afterAgentResponse integration; we want first-class paths for Claude Code / Claude Desktop and OpenAI Codex (CLI or IDE). If that excites you, read CONTRIBUTING.md and open a PR or design issue.
If you are searching for local text-to-speech, on-device assistants, AI coding agent tooling, agentic coding workflows, or Cursor IDE hooks that do not send your thread to a cloud API — Aftertone is a small open source developer tool: ONNX Runtime + Supertonic for optional voice feedback after the model answers, offline-friendly and privacy-minded.
Related GitHub topics: ai-agents · coding-agent · cursor · text-to-speech · onnx · local-first · developer-tools · open-source
- Cursor:
afterAgentResponse→ optional TTS from inline reply text (prefers<spoken_summary>…</spoken_summary>). speak_summary_prepare.py→ JSON forPOST /say;tts_daemon.py→ localhost server.- Optional
stophook trace for debugging. bash scripts/bootstrap.sh—uv sync, Hugging Face assets ifassets/onnx/is missing.
- uv
- Cursor (current adapter): Hooks on, trusted workspace,
.cursor/hooks.jsonwith"version": 1. - ONNX weights under
./assets(Supertone/supertonic-3— bootstrap downloads them).
git clone https://github.com/omarelkhal/aftertone.git
cd aftertone
bash scripts/bootstrap.shCursor: open this folder as the workspace root so project hooks load.
- Daemon:
cd py && uv run python tts_daemon_ctl.py status --repo-root .. - Smoke (needs assets + audio):
bash py/test_speak_summary_pipeline.sh - Diagnostics:
bash py/diagnose_speak_hooks.sh
Hooks and Python resolve the install root via AFTERTONE_REPO (preferred) or legacy SUPERTONIC_REPO.
Bring .cursor/ + py/ (or symlink). Keep speak_summary.toml paths consistent (../assets/onnx, etc.).
| Doc / file | Role |
|---|---|
.cursor/hooks/README.md |
Full reference: every speak_summary.toml key (including spoken_summary_max_chars, heuristic_max_chars, plain_excerpt_max_chars, only_speak_spoken_summary), valid lang codes, heuristics, quiet_hours, daemon start / stop / status / restart, logs, smoke test, when TOML changes need a restart, and sync_spoken_rule_lang.py after changing lang. |
.cursor/hooks/speak_summary.toml |
Port, voice, lang, speed, GPU, quiet hours, limits, heuristics, tag-only mode. |
.cursor/rules/spoken-summary.mdc |
When/how to emit <spoken_summary>; match TOML lang (synced blurb — run uv run --directory py python sync_spoken_rule_lang.py from repo root after edits). |
AGENTS.md |
Cursor TTS digest (flow, verify hooks, caps, “nothing speaks”). |
Disable speech: enabled = false in speak_summary.toml.
See CONTRIBUTING.md and the Code of Conduct. Issues: open one here — use a template (Bug report, Feature or idea, Adapter research). Starter ideas: .github/STARTER_ISSUES.md.
aftertone on GitHub Pages — static landing built from the docs/ folder. Enable in the repository (not your profile): aftertone → Settings → Pages → source Deploy from a branch, branch main, folder /docs. (Profile Settings → Pages only shows verified domains — that’s a different screen.)
MIT — LICENSE. Supertonic-derived code: NOTICE.
cd /path/to/aftertone
git remote add origin https://github.com/omarelkhal/aftertone.git
git push -u origin mainOr: gh repo create aftertone --public --source=. --remote=origin --push
