undertone
talk it. type it. ship it.
Voice typing for Linux that actually works.
Hold a key, speak, release -- your words appear wherever you're typing.
Demo
$ undertone
╭────────────────────────────────────────╮
│ UNDERTONE │
│ talk it. type it. ship it. │
╰────────────────────────────────────────╯
Status: vibing
Hotkeys: Right Ctrl (hold) | F8 (toggle)
undertone> _
Quick Start
# Install
pipx install undertone
# Run (interactive setup on first launch)
undertone
# Upgrade to latest version
pipx upgrade undertone
That's it. 30 seconds to voice typing.
Features
| Feature | Description | |
|---|---|---|
| Speed | < 1 second latency | Groq's Whisper API is blazing fast |
| Smart | Grammar + filler fix | LLM fixes grammar, punctuation, removes filler words |
| Free | No credit card | Groq's free tier is generous |
| Offline | Local fallback | Works without internet via faster-whisper |
| Private | Privacy mode | Keep voice 100% on your machine |
| Auto | Runs on login | Always ready when you are |
How It Works
┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Hold Key │ -> │ Speak │ -> │ Release │ -> │ Text Appears│
│ (Right Ctrl) │ naturally │ │ key │ │ at cursor │
└─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘
|
v
┌─────────────────┐
│ Groq Whisper │
│ + LLM cleanup │
└─────────────────┘
- Press hotkey (Right Ctrl = hold, F8 = toggle)
- Speak naturally
- Release -- text appears in < 1 second
Works everywhere: browser, terminal, IDE, Slack, Discord, anywhere you type.
Commands
Run undertone to open the interactive CLI:
| Command | Description |
|---|---|
/setup |
Configure API key & hotkeys |
/start |
Start voice typing |
/stop |
Take a break |
/status |
Check the vibe |
/logs |
View receipts |
/config |
Tweak settings |
/help |
Get backup |
/quit |
Peace out |
Requirements
- OS: Linux (X11, Wayland, or XWayland)
- Python: 3.10+
- API Key: Free from console.groq.com
System dependencies (auto-detected and installed during setup):
X11:
sudo apt install xclip xdotool
Wayland:
sudo apt install wl-clipboard wtype # wlroots (Sway, Hyprland)
sudo apt install wl-clipboard ydotool # GNOME, KDE, others
Undertone auto-detects your display server and uses the right tools.
Text Cleanup
Undertone uses a two-stage cleanup pipeline:
- Regex filler removal -- instantly strips "um", "uh", "like", "you know", etc.
- LLM grammar fix -- sends text to Groq's llama-3.1-8b-instant for grammar, punctuation, and capitalization fixes (~160ms extra latency)
Toggle LLM cleanup on/off:
undertone> /config
# Select "LLM grammar fix on/off"
When LLM is off or fails, regex cleanup runs as fallback.
Privacy Mode
By default, audio goes to Groq for fast transcription. Want to keep it local?
undertone> /config
# Select "Privacy mode" -> "local"
Local mode uses faster-whisper on your CPU. Slower (~3-5s) but your voice never leaves your machine.
Troubleshooting
No audio input detected
- Check your mic is connected
- Run
arecord -lto list audio devices
Text not appearing
- X11:
sudo apt install xclip xdotool - Wayland (Sway/Hyprland):
sudo apt install wl-clipboard wtype - Wayland (GNOME/KDE):
sudo apt install wl-clipboard ydotool - Check logs with
/logsto see which tools were detected
Service won't start
- Check logs: run
undertonethen/logs - Verify API key at console.groq.com
Uninstall
# Stop service
undertone
# > /stop
# > /quit
# Remove package
pipx uninstall undertone
# Remove config (optional)
rm -rf ~/.config/undertone
rm ~/.config/systemd/user/undertone.service
systemctl --user daemon-reload
Tech Stack
- STT: Groq Whisper API / faster-whisper
- Cleanup: Regex filler removal + LLM grammar fix (Groq llama-3.1-8b-instant)
- Audio: sounddevice
- Hotkeys: pynput
- CLI: Rich
Contributing
PRs and issues welcome!
Report Bug
License
MIT - do whatever you want with it.
Built with caffeine and voice commands
Metadata
Release files for undertone 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| undertone-0.3.0.tar.gz | 34.5 kB | Without provenance | Details for undertone-0.3.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| undertone-0.3.0-py3-none-any.whl | Python 3 | none | any | Details for undertone-0.3.0-py3-none-any.whl |
Total release size: 62.7 kB
Release files / undertone-0.3.0.tar.gz
| Download URL | undertone-0.3.0.tar.gz |
|---|---|
| Size | 34.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
9dba8ae3e23f685a8ab23b19b965ad9816c5ca985c0869a41d0b312104e183a6
|
|
BLAKE2b-256 checksum How to use checksums |
7d71b7fae27636de95080fd74f9491426b01286ec6ded551124813548f8fec81
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Release files / undertone-0.3.0-py3-none-any.whl
| Download URL | undertone-0.3.0-py3-none-any.whl |
|---|---|
| Size | 28.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
9b7e2c23aacfca0bd59c51dc93abd6239e25478c9e2dc6e63c27b233f80e841d
|
|
BLAKE2b-256 checksum How to use checksums |
705cc5ac1d8615064016688bf7a1e09d918863041f73df03f14b749c97afa912
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Security for undertone 0.3.0
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.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.