Jump to content

Talon Voice Control: Difference between revisions

From Archive
Create Talon voice control documentation with GitHub links
 
Add ALL voice commands: macOS nav, spaces, git, directory nav, launchers, line editing
Line 73: Line 73:
* '''Muted''' (<code>#735865</code>): Sleep mode
* '''Muted''' (<code>#735865</code>): Sleep mode


== Voice Command Reference ==
== Complete Voice Command Reference ==


=== Mode Switching ===
=== Mode Switching ===
''Source: [https://github.com/ejfox/dotfiles/blob/main/talon-overrides/custom_keys.talon custom_keys.talon]''


{| class="wikitable"
{| class="wikitable"
Line 85: Line 86:
| talk || Switch to dictation mode
| talk || Switch to dictation mode
|-
|-
| go ahead / send it || Press Enter
| go ahead / go head / send it || Press Enter
|}
|}


=== tmux Windows ===
=== tmux Windows ===
''Source: [https://github.com/ejfox/dotfiles/blob/main/talon-overrides/tmux.talon tmux.talon]''


{| class="wikitable"
{| class="wikitable"
Line 107: Line 109:
|-
|-
| mux alert / mux newest || Jump to window with bell
| mux alert / mux newest || Jump to window with bell
|-
| mux workspace || Session/window picker
|}
|}


=== tmux Panes ===
=== tmux Panes ===
''Source: [https://github.com/ejfox/dotfiles/blob/main/talon-overrides/tmux.talon tmux.talon]''


{| class="wikitable"
{| class="wikitable"
Line 115: Line 120:
! Say !! Does
! Say !! Does
|-
|-
| mux left/right/up/down || Navigate panes
| mux left / right / up / down || Navigate panes
|-
| mux move left / right / up / down || Move pane in direction
|-
|-
| mux next pane || Cycle panes
| mux next pane || Cycle panes
|-
|-
| mux split right/down || Split pane
| mux split right / down || Split pane
|-
|-
| mux pane right/down/left/up || Split + auto-focus new pane
| mux pane right / down / left / up || Split + auto-focus new pane
|-
|-
| mux close pane || Close current pane
| mux close pane || Close current pane
Line 130: Line 137:
|-
|-
| mux scroll || Enter scroll mode
| mux scroll || Enter scroll mode
|-
| mux detach || Detach from session
|}
=== Terminal Launchers ===
''Source: [https://github.com/ejfox/dotfiles/blob/main/talon-overrides/terminal_commands.talon terminal_commands.talon]''
{| class="wikitable"
|-
! Say !! Does
|-
| clear || Clear terminal
|-
| edit / run neovim || Open nvim
|-
| lazy / run lazygit || Open lazygit
|-
| files / run yazi || Open yazi file manager
|-
| run btop || Open btop system monitor
|-
| 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
|}
=== Terminal Line Editing ===
''Source: [https://github.com/ejfox/dotfiles/blob/main/talon-overrides/terminal_commands.talon terminal_commands.talon]''
{| class="wikitable"
|-
! Say !! Does
|-
| wipe || Clear line (ctrl-u)
|-
| wipe word || Delete last word (ctrl-w)
|-
| cancel / nope / bail || Ctrl-C
|-
| again || Re-run last command (up + enter)
|}
=== Directory Navigation ===
''Source: [https://github.com/ejfox/dotfiles/blob/main/talon-overrides/terminal_commands.talon terminal_commands.talon]''
{| class="wikitable"
|-
! Say !! Does
|-
| go home || <code>cd ~</code>
|-
| go code || <code>cd ~/code</code>
|-
| go smallweb || <code>cd ~/smallweb</code>
|-
| go clients || <code>cd ~/clients</code>
|-
| go dotfiles || <code>cd ~/.dotfiles</code>
|-
| go back || <code>cd -</code>
|-
| go up || <code>cd ..</code>
|-
| go paperclip || <code>cd ~/code/paperclip</code>
|-
| go website || <code>cd ~/code/website</code>
|-
| go coach || <code>cd ~/code/coach</code>
|-
| go connectology || <code>cd ~/code/connectology</code>
|-
| go vulpes || <code>cd ~/code/vulpes-theme-lab</code>
|-
| go subway || <code>cd ~/code/subway-builder</code>
|-
| go newswell || <code>cd ~/code/newswell</code>
|-
| go gem || <code>cd ~/code/gem</code>
|-
| go ddhq || <code>cd ~/code/ddhq</code>
|-
| list files || <code>ls</code>
|-
| list all || <code>ls -la</code>
|}
=== Git Commands ===
''Source: [https://github.com/ejfox/dotfiles/blob/main/talon-overrides/terminal_commands.talon terminal_commands.talon]''
{| class="wikitable"
|-
! Say !! Does
|-
| git status || <code>git status</code>
|-
| git push || <code>git push</code>
|-
| git pull || <code>git pull</code>
|-
| git log || <code>git log --oneline</code>
|-
| git diff || <code>git diff</code>
|-
| git add all || <code>git add -A</code>
|-
| git stash || <code>git stash</code>
|-
| git pop || <code>git stash pop</code>
|}
=== Dev Commands ===
''Source: [https://github.com/ejfox/dotfiles/blob/main/talon-overrides/terminal_commands.talon terminal_commands.talon]''
{| class="wikitable"
|-
! Say !! Does
|-
| dev server || <code>npm run dev</code>
|-
| yarn dev || <code>yarn dev</code>
|-
| install || <code>npm install</code>
|-
| connect VPS / connect || SSH to VPS
|-
| note <text> || Quick note to Obsidian daily
|}
|}
=== App Switching ===
''Source: [https://github.com/ejfox/dotfiles/blob/main/talon-overrides/macos_nav.talon macos_nav.talon]''
<code>open ghosty</code>, <code>open chrome</code>, <code>open safari</code>, <code>open messages</code>, <code>open slack</code>, <code>open discord</code>, <code>open signal</code>, <code>open obsidian</code>, <code>open claude</code>, <code>open figma</code>, <code>open finder</code>, <code>open music</code>, <code>open OBS</code>


=== Window Management (Rectangle Pro) ===
=== Window Management (Rectangle Pro) ===
''Source: [https://github.com/ejfox/dotfiles/blob/main/talon-overrides/macos_nav.talon macos_nav.talon]''


{| class="wikitable"
{| class="wikitable"
Line 138: Line 283:
! Say !! Does
! Say !! Does
|-
|-
| snap left / snap right || Half screen
| snap left / snap right || Half screen left/right
|-
| snap half left / snap half right || Half screen (alias)
|-
| snap up / snap full || Fullscreen
|-
|-
| snap full / snap up || Fullscreen
| snap down / snap bottom || Bottom half
|-
|-
| snap down || Bottom half
| window bigger || Grow window (cmd-ctrl-=)
|-
|-
| window bigger / window smaller || Resize
| window smaller || Shrink window (cmd-ctrl--)
|-
|-
| window grid || Grid overlay (F1)
| window grid || Grid overlay (F1)
|-
| window cascade || Cascade windows (F12)
|}
|}


=== App Switching ===
=== Spaces ===
''Source: [https://github.com/ejfox/dotfiles/blob/main/talon-overrides/macos_nav.talon macos_nav.talon]''


<code>open ghosty</code>, <code>open chrome</code>, <code>open safari</code>, <code>open slack</code>, <code>open discord</code>, <code>open signal</code>, <code>open messages</code>, <code>open obsidian</code>, <code>open claude</code>, <code>open figma</code>, <code>open finder</code>, <code>open music</code>, <code>open OBS</code>
{| class="wikitable"
|-
! Say !! Does
|-
| space left || Switch to left Space (cmd-ctrl-left)
|-
| space right || Switch to right Space (cmd-ctrl-right)
|}


=== Terminal (Ghostty) ===
=== General macOS ===
''Source: [https://github.com/ejfox/dotfiles/blob/main/talon-overrides/macos_nav.talon macos_nav.talon]''


{| class="wikitable"
{| class="wikitable"
Line 159: Line 319:
! Say !! Does
! Say !! Does
|-
|-
| wipe || Clear line (ctrl-u)
| hide this || Hide current app (cmd-h)
|-
| hide others || Hide other apps (cmd-alt-h)
|-
| quit this || Quit app (cmd-q)
|-
| close window || Close window (cmd-w)
|-
|-
| wipe word || Delete last word
| close tab || Close tab (cmd-w)
|-
|-
| cancel / nope / bail || Ctrl-C
| new tab || New tab (cmd-t)
|-
|-
| again || Re-run last command
| new window || New window (cmd-n)
|-
|-
| edit || Open nvim
| next tab / previous tab || Switch tabs (cmd-shift-]/[)
|-
|-
| lazy || Open lazygit
| spotlight || Spotlight search (cmd-space)
|-
|-
| files || Open yazi
| undo / redo || Undo/redo (cmd-z / cmd-shift-z)
|-
|-
| go home/code/smallweb/clients || Navigate directories
| save || Save (cmd-s)
|-
|-
| go subway/newswell/gem/paperclip || Project shortcuts
| select all || Select all (cmd-a)
|-
|-
| git status/push/pull/log/diff || Git commands
| copy / paste / cut || Clipboard (cmd-c/v/x)
|-
|-
| dev server / install || npm run dev / npm install
| find || Find (cmd-f)
|-
|-
| run claude || Launch Claude Code
| screenshot || Screenshot region (cmd-shift-4)
|-
|-
| connect VPS || SSH to VPS
| screen record || Screen recording (cmd-shift-5)
|}
|}



Revision as of 15:44, 19 February 2026

Talon Voice Control Setup

Custom voice control configuration for macOS using Talon.

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

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
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

Complete Voice 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 Launchers

Source: terminal_commands.talon

Say Does
clear Clear terminal
edit / run neovim Open nvim
lazy / run lazygit Open lazygit
files / run yazi Open yazi file manager
run btop Open btop system monitor
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

Terminal Line Editing

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 (up + enter)

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 cd ~/code/paperclip
go website cd ~/code/website
go coach cd ~/code/coach
go connectology cd ~/code/connectology
go vulpes cd ~/code/vulpes-theme-lab
go subway cd ~/code/subway-builder
go newswell cd ~/code/newswell
go gem cd ~/code/gem
go ddhq cd ~/code/ddhq
list files ls
list all ls -la

Git Commands

Source: terminal_commands.talon

Say Does
git status git status
git push git push
git pull git pull
git log git log --oneline
git diff git diff
git add all git add -A
git stash git stash
git pop git stash pop

Dev Commands

Source: terminal_commands.talon

Say Does
dev server npm run dev
yarn dev yarn dev
install npm install
connect VPS / connect SSH to VPS
note <text> Quick note to Obsidian daily

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 (Rectangle Pro)

Source: macos_nav.talon

Say Does
snap left / snap right Half screen left/right
snap half left / snap half right Half screen (alias)
snap up / snap full Fullscreen
snap down / snap bottom Bottom half
window bigger Grow window (cmd-ctrl-=)
window smaller Shrink window (cmd-ctrl--)
window grid Grid overlay (F1)
window cascade Cascade windows (F12)

Spaces

Source: macos_nav.talon

Say Does
space left Switch to left Space (cmd-ctrl-left)
space right Switch to right Space (cmd-ctrl-right)

General macOS

Source: macos_nav.talon

Say Does
hide this Hide current app (cmd-h)
hide others Hide other apps (cmd-alt-h)
quit this Quit app (cmd-q)
close window Close window (cmd-w)
close tab Close tab (cmd-w)
new tab New tab (cmd-t)
new window New window (cmd-n)
next tab / previous tab Switch tabs (cmd-shift-]/[)
spotlight Spotlight search (cmd-space)
undo / redo Undo/redo (cmd-z / cmd-shift-z)
save Save (cmd-s)
select all Select all (cmd-a)
copy / paste / cut Clipboard (cmd-c/v/x)
find Find (cmd-f)
screenshot Screenshot region (cmd-shift-4)
screen record Screen recording (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