Hunting for a window lost among dozens of others, with the mouse and Alt+Tab, is slow and annoying. goto fixes that: say where you want to go and the window jumps to the front. On Linux, fully offline.
Voice control for windows. Say what you want to focus:
"goto vscode myproject" -> focus the VS Code window for that project
"goto slack john doe" -> open the DM with that person
"goto chrome github" -> switch to the right Chrome tab
"goto terminal logs" -> focus the right terminal
Transcription runs 100% locally (Whisper via whisper.cpp). Nothing leaves your machine. No account, no API key on the default path.
microphone (malgo) -> VAD (drops silence) -> Whisper (speech->text, local)
-> wake word "goto" (accent-tolerant) -> dispatcher -> focus the window
- Per-program adapters (
internal/adapter): each app is an isolated plugin. Adding a new program is one file, no core changes. See docs/ADAPTERS.md. - Per-OS backends (
winfocus.Backend): X11 today; Wayland/Windows/macOS are just an interface to implement. - Accent-tolerant wake word: "goto", "go to", "good to", "gotchu", and even when the recognizer eats the start, goto still understands you.
| Mode | Account? | How |
|---|---|---|
| hotkey (default) | no | hold a key (e.g. ctrl+alt+space), speak, release |
| wake word "goto" | no | hands-free; say "goto ..." anytime |
| Porcupine | yes (free, BYOK) | opt-in, lower CPU when always-on (see docs/PORCUPINE.md) |
Switch modes from the tray menu.
goto runs in the system tray — click the icon and you get everything:
| Item | What it does |
|---|---|
| goto vX.Y.Z | the installed version (just a label) |
| Start / Stop listening | turn voice capture on or off |
| Mode: wake word "goto" | hands-free — always listening; say "goto ..." anytime |
| Mode: hotkey (push-to-talk) | hold the hotkey (ctrl+alt+space), speak, release |
| Language ▸ | recognition language: Português (BR) / English / Automatic. Pick the one you actually speak for the best accuracy |
| Precision ▸ | Normal = light, fast model (default). High = larger, more accurate model (downloads ~1.5 GB once, then fully offline). Switch back anytime |
| Start at login | launch goto in the tray on login (starts paused, mic off) |
| Calibrate mic | records 8s, then auto-tunes and saves the voice-detection sensitivity for your mic — use it if recognition is poor. The result shows as a desktop notification and the Mic sensitivity line updates live |
| Mic sensitivity: N | shows the active voice-detection threshold (lower = more sensitive). Updated by Calibrate mic |
| Show logs | opens the recent-activity log (what goto heard, errors, downloads) |
| Quit | exit goto |
Recognition not great? Do these two steps, in order:
- Calibrate mic — start here. One click auto-tunes and saves the voice detection to your microphone (no terminal needed). A poorly-matched mic level is the most common cause of bad recognition.
- Precision → High — downloads a bigger, more accurate model (~1.5 GB once, then fully offline).
Also make sure Language matches what you actually speak.
goto vscode backend # focus the BACKEND project window
goto vscode app config # open a file via Quick Open (Ctrl+P)
goto chrome github # switch to the matching Chrome tab (Ctrl+Shift+A)
goto slack john doe # open the Slack DM (Ctrl+K Jump to)
goto terminal logs # focus the right terminal
goto browser # focus the only open browser (does nothing if 2+)
curl -fsSL https://espigah.github.io/goto/install.sh | bashDownloads the latest goto, installs it to ~/.local/bin, and sets up the
system tray + login autostart. To update later, re-run the same line (or use
the apt/dnf repo below for automatic updates).
To uninstall (removes the binary, menu/autostart entries, icon, and the downloaded voice model + config):
curl -fsSL https://espigah.github.io/goto/uninstall.sh | bashIf you installed from source, make uninstall does the same.
Add the repo once; then apt upgrade / dnf upgrade (or the system's
automatic updater) keeps goto up to date.
# Debian / Ubuntu
curl -fsSL https://espigah.github.io/goto/apt/key.gpg | sudo tee /usr/share/keyrings/goto.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/goto.gpg] https://espigah.github.io/goto/apt ./" | sudo tee /etc/apt/sources.list.d/goto.list
sudo apt update && sudo apt install goto# Fedora / RHEL
sudo tee /etc/yum.repos.d/goto.repo >/dev/null <<'EOF'
[goto]
name=goto
baseurl=https://espigah.github.io/goto/yum
enabled=1
repo_gpgcheck=1
gpgcheck=0
gpgkey=https://espigah.github.io/goto/yum/key.gpg
EOF
sudo dnf install gotoFrom the Releases page:
# Debian / Ubuntu
sudo apt install ./goto_<version>_linux_amd64.deb
# Fedora / RHEL
sudo dnf install ./goto_<version>_linux_amd64.rpm
# Portable (tar.gz)
tar xzf goto_<version>_linux_amd64.tar.gz && ./gotoOne self-contained file that runs on most distros, it bundles the C/C++ runtime so you don't hit missing-library errors:
chmod +x goto_<version>_x86_64.AppImage
./goto_<version>_x86_64.AppImageThe Whisper model (~466MB) is downloaded on first use to
~/.local/share/goto/models/. goto runs in the system tray.
First thing to do: open the tray menu and click Calibrate mic (speak for 8s) — it tunes voice detection to your microphone. If recognition is still off, switch Precision → High. See The tray menu.
make install # installs to ~/.local/bin + tray autostart on login (no root)
make uninstall # removes itAutostart launches goto paused (it does not turn the mic on at login).
Requirements: Go 1.25+, gcc/g++, cmake (build only).
git clone <repo> goto && cd goto
make lib # build libwhisper once
make build-voice # binary with offline voice
./goto # tray app
# or window focus only, no voice (lighter):
make build && ./goto vscode myprojectgoto exposes its desktop actions as MCP tools, so Claude Code can focus windows, switch tabs and open conversations for you:
claude mcp add --transport stdio goto -- /path/to/goto mcpThen ask, in plain language: "focus the myproject VS Code and open the github
tab in Chrome", and Claude calls goto's list_windows / run tools.
Without voice, handy for scripts or to bind to an OS shortcut:
goto <app> [target]
goto vscode myproject
goto terminal logs
goto slack john doe~/.config/goto/config.json (mode, model, language, hotkey, wake word).
make test # pure-logic tests (wake, vad, dispatch, config)
make test-voice # includes real transcription (needs lib + model)
make vet
go run ./cmd/winls # list windows (backend debug)Adapter contribution guide: docs/ADAPTERS.md. Roadmap: docs/ROADMAP.md.
Audio and transcription never leave your machine. The only network access is the one-time Whisper model download on first use.
MIT
