Jump to content

Talon Voice Control: Difference between revisions

From Archive
Reorganize: daily drivers cheat sheet up top, full reference below, add usage logging
Add prior art references
 
Line 378: Line 378:
[[Category:Voice]]
[[Category:Voice]]
[[Category:Configuration]]
[[Category:Configuration]]
== Community & Prior Art ==
[https://github.com/talonhub/community talonhub/community] is the canonical voice command set that our custom overrides build on. [https://github.com/cursorless-dev/cursorless Cursorless] is the breakthrough in spoken code editing — a grammar that decorates every token with a hat for rapid structural manipulation. [https://github.com/hands-free-vim/cursorless.nvim cursorless.nvim] brings it into Neovim. [https://github.com/fidgetingbits/talon-vim talon-vim] provides vim-specific voice commands. [https://github.com/fidgetingbits/fidgetingbits-talon fidgetingbits-talon] is one of the most comprehensive personal configs — good reference for a mature voice setup.

Latest revision as of 05:17, 24 February 2026

Talon Voice Control Setup

Custom voice control configuration for macOS using Talon.

Source code: github.com/ejfox/dotfiles/talon-overrides

Daily Drivers

The commands worth memorizing. Everything else is in the full reference below.

Category Say Does
Mode cmd / talk Switch between command and dictation
Enter go ahead / send it Press Enter
tmux mux one thru mux nine Jump to window N
tmux mux left / right / up / down Navigate panes
tmux mux zoom Toggle pane fullscreen
tmux mux split right / down Split pane
tmux mux close pane Close current pane
tmux mux new New window
tmux mux sessions Session picker
Terminal wipe Clear current line
Terminal cancel Ctrl-C
Terminal again Re-run last command
Terminal edit Open nvim
Terminal lazy Open lazygit
Terminal files Open yazi
Terminal run claude Launch Claude Code
Nav go code / go home / go dotfiles cd to directory
Git git status / push / pull / diff Git commands
Apps open ghosty / chrome / obsidian / slack Switch apps
Windows snap left / right / full Window positioning

Tip: Voice command usage is logged to ~/.local/share/usage-logs/talon/ — run usage-analyze after a week to see what you actually use most.

Overview

Voice-driven workflow for terminal (Ghostty + tmux), macOS app switching, and window management. All config lives in ~/.dotfiles/talon-overrides/ (symlinked to ~/.talon/user/ejfox-overrides/).

The TTS feedback script (claude-say) lives at github.com/ejfox/dotfiles/bin/claude-say and the symlink setup is in sync-dotfiles.sh.

Architecture

  • Community scripts: ~/.talon/user/community/ (talonhub/community clone)
  • Custom overrides: ~/.talon/user/ejfox-overrides/ (dotfiles-tracked)
  • Speech engine: Conformer (Talon's built-in, downloaded via Talon menu)

Files

File Purpose Source
settings.talon Global settings (tmux prefix, subtitle config) github
custom_keys.talon Mode switching (cmd/talk) and Enter aliases github
tmux.talon ~30 tmux voice commands (windows, panes, sessions) github
terminal_commands.talon Ghostty-specific: line editing, nav, git, launchers github
macos_nav.talon App switching, Rectangle Pro, Spaces, general macOS github
ghostty.talon Ghostty terminal detection (too new for community) github
cursor.talon Cursor IDE detection github
apps.py App definitions for newer apps not in community github
nato_alphabet.py NATO phonetic alphabet override (Python Context) github
mode_line.py 2px colored bar at screen bottom showing current mode github
ejfox_subtitles.py Right-aligned subtitles below sketchybar github
usage_logging.py JSONL command logger for usage analysis github
vocabulary.talon-list ~250 custom vocabulary terms github

Key Design Decisions

NATO Alphabet via Python Override

The community .talon-list file takes priority over user overrides. The only reliable way to replace the letter list is a Python Context override.

tmux Prefix Timing

tmux needs sleep(100ms) between the prefix key and the command key. Without it, the command fires before tmux registers the prefix.

Anchored Rules for Dictation Mode

Commands must use ^...$ anchors to work in dictation mode. Without anchors, the prose capture engine swallows the command and types it as text.

Custom Subtitles

Community subtitles plugin is center-aligned with no horizontal position setting. Custom ejfox_subtitles.py renders right-aligned text below sketchybar (38px from top).

Mode Line

2px colored line at screen bottom replacing default circle indicator:

  • Pink (#e60067): Command mode
  • Teal (#6eedf7): Dictation mode
  • Muted (#735865): Sleep mode

Usage Logging

Every recognized phrase is logged to ~/.local/share/usage-logs/talon/YYYY-MM-DD.jsonl with timestamp, phrase text, word count, and active app. Same format as shell and tmux usage logs — analyze with usage-analyze or jq.

Full Command Reference

Mode Switching

Source: custom_keys.talon

Say Does
cmd Switch to command mode
talk Switch to dictation mode
go ahead / go head / send it Press Enter

tmux Windows

Source: tmux.talon

Say Does
mux one thru mux nine Jump to window N
mux next / mux previous Next/prev window
mux last Last used window
mux new New window
mux rename Rename window
mux close Close window
mux alert / mux newest Jump to window with bell
mux workspace Session/window picker

tmux Panes

Source: tmux.talon

Say Does
mux left / right / up / down Navigate panes
mux move left / right / up / down Move pane in direction
mux next pane Cycle panes
mux split right / down Split pane
mux pane right / down / left / up Split + auto-focus new pane
mux close pane Close current pane
mux zoom Toggle pane fullscreen
mux sessions Session picker
mux scroll Enter scroll mode
mux detach Detach from session

Terminal

Source: terminal_commands.talon

Say Does
wipe Clear line (ctrl-u)
wipe word Delete last word (ctrl-w)
cancel / nope / bail Ctrl-C
again Re-run last command
clear Clear terminal
edit / run neovim Open nvim
lazy / run lazygit Open lazygit
files / run yazi Open yazi
run btop Open btop
run claude Launch Claude Code
run claude skip Launch Claude Code (skip hooks)
run codex Launch Codex CLI
tips Search tips with fzf
refresh Source .zshrc
list files ls
list all ls -la
note <text> Quick note to Obsidian daily

Directory Navigation

Source: terminal_commands.talon

Say Does
go home cd ~
go code cd ~/code
go smallweb cd ~/smallweb
go clients cd ~/clients
go dotfiles cd ~/.dotfiles
go back cd -
go up cd ..
go paperclip / website / coach / connectology / vulpes / subway / newswell / gem / ddhq Project directories

Git

Source: terminal_commands.talon

Say Does
git status / push / pull / log / diff Standard git commands
git add all git add -A
git stash / git pop Stash and pop

Dev

Source: terminal_commands.talon

Say Does
dev server npm run dev
yarn dev yarn dev
install npm install
connect VPS / connect SSH to VPS

App Switching

Source: macos_nav.talon

open ghosty, open chrome, open safari, open messages, open slack, open discord, open signal, open obsidian, open claude, open figma, open finder, open music, open OBS

Window Management

Source: macos_nav.talon

Say Does
snap left / right Half screen
snap up / snap full Fullscreen
snap down / snap bottom Bottom half
window bigger / smaller Resize
window grid Grid overlay (F1)
window cascade Cascade (F12)
space left / space right Switch Spaces

General macOS

Source: macos_nav.talon

Say Does
hide this / hide others Hide apps
quit this Quit (cmd-q)
close window / close tab Close (cmd-w)
new tab / new window New tab/window
next tab / previous tab Switch tabs
spotlight cmd-space
undo / redo cmd-z / cmd-shift-z
save cmd-s
select all / copy / paste / cut / find Standard shortcuts
screenshot / screen record cmd-shift-4 / cmd-shift-5

claude-say (TTS)

Script at ~/bin/claude-say lets Claude Code speak responses aloud:

  • Mutes mic input before speaking (prevents Talon feedback loop)
  • Restores mic volume after speaking
  • Prefixes with tmux window number for voice navigation
  • Uses macOS say -v Samantha

Lessons Learned

  1. .talon-list overrides don't reliably replace community lists — use Python Context overrides
  2. Ghostty is too new for community scripts — need custom app detection
  3. sleep(100ms) between tmux prefix and command key is essential
  4. ^...$ anchors required for commands to work in dictation mode
  5. Built-in Talon subtitle controlled by speech._subtitles setting (undocumented)
  6. Community subtitles are a separate plugin with their own settings
  7. macOS say triggers Talon — must mute mic first via claude-say wrapper

See Also

  • Dotfiles — full dotfiles setup
  • CLI — terminal workflow
  • Nvim — editor configuration
  • tmux — multiplexer setup

Community & Prior Art

talonhub/community is the canonical voice command set that our custom overrides build on. Cursorless is the breakthrough in spoken code editing — a grammar that decorates every token with a hat for rapid structural manipulation. cursorless.nvim brings it into Neovim. talon-vim provides vim-specific voice commands. fidgetingbits-talon is one of the most comprehensive personal configs — good reference for a mature voice setup.