Skip to content

Espigah/goto

Repository files navigation

goto

build status latest release downloads

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.

How it works

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.

Activation modes

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.

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:

  1. Calibrate micstart 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.
  2. Precision → High — downloads a bigger, more accurate model (~1.5 GB once, then fully offline).

Also make sure Language matches what you actually speak.

What you can do

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

Install

Quick install (one line)

curl -fsSL https://espigah.github.io/goto/install.sh | bash

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

If you installed from source, make uninstall does the same.

Via apt/dnf repository (recommended, auto-updates)

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 goto

Or download a single package

From 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 && ./goto

AppImage (single portable file, no install)

One 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.AppImage

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

Start with the system (autostart)

make install      # installs to ~/.local/bin + tray autostart on login (no root)
make uninstall    # removes it

Autostart launches goto paused (it does not turn the mic on at login).

From source

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 myproject

Use it as an arm of Claude Code (MCP)

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

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

Command line

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

Configuration

~/.config/goto/config.json (mode, model, language, hotkey, wake word).

Development

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.

Privacy

Audio and transcription never leave your machine. The only network access is the one-time Whisper model download on first use.

License

MIT


Visit the landing page

About

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.

Topics

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors