Developer Tools
Summon
A tiny macOS CLI that makes application switching instant, deterministic, and keyboard-native.
2026
Rust · macOS · CLI

Summon is a tiny macOS command-line tool for people who want application switching to feel instant, deterministic, and keyboard-native.
The idea is simple: bind a name like terminal, browser, or editor to a macOS application, then call that binding from your preferred hotkey tool. One command decides what should happen next: launch the app if it is not running, focus it if it is running in the background, or cycle to the next window if it is already focused.
That gives repeated keypresses useful behaviour instead of making them redundant.
Why I built it
I like keyboard-driven workflows, but macOS app switching often feels more ambiguous than it should. Existing tools can launch applications, and macOS can switch between windows, but the behaviour is not always the same across apps, launch states, window states, and focus states.
I wanted something boring and predictable:
- press the hotkey for my terminal, and I get my terminal
- press it again, and I move through terminal windows
- press the hotkey for my editor, and I get my editor
- if the app is not running, it launches
- if it is running, it focuses
- if it is already focused, it cycles
Summon is built around that small loop.
How it works
Summon reads a TOML configuration file from ~/.config/summon/summon.toml, where each binding maps a friendly name to an application. Applications can be configured by bundle identifier, app name, or path, although bundle identifiers are the most reliable option.
A typical configuration might define bindings like:
- terminal → Ghostty
- browser → Brave
- editor → Zed
Those bindings can then be wired into whatever tool already owns your keyboard shortcuts: skhd, Raycast, Karabiner-Elements, Hammerspoon, Alfred, AeroSpace, or even plain shell aliases.
The core command stays the same:
summon terminal
summon browser
summon editor Summon handles the decision logic behind the scenes.
Design goals
Summon is intentionally small. It is not trying to be a window manager, launcher, automation platform, or full productivity environment. It is a focused utility for one specific interaction: getting to the app you meant to get to, as quickly and predictably as possible.
The design goals are:
- fast enough to disappear into muscle memory
- deterministic enough to trust
- simple enough to keep in dotfiles
- flexible enough to work with any hotkey tool
- native enough to respect how macOS applications actually behave
That last point matters. App switching on macOS is not just a matter of launching a process. A useful tool needs to understand whether the target app is already running, whether it is frontmost, and what should happen when multiple windows are involved.
Configuration-first workflow
Summon is designed for users who manage their environment deliberately. Configuration lives in a normal file, can be versioned, and can travel with the rest of a dotfiles setup.
Instead of building a graphical preferences interface or inventing a new hotkey system, Summon composes with the tools people already use. That keeps the project small and makes it easy to slot into an existing workflow.
For example, with skhd you can bind a hyper-key shortcut directly to a Summon command. With Raycast, you can wrap Summon in script commands. With shell aliases, you can use short commands like st, sb, or se.
What I like about it
The project is deliberately unglamorous in the best way. It solves a small daily irritation with a tool that is easy to understand, easy to configure, and easy to keep around.
It also reflects the kind of software I enjoy building: precise tools that remove friction without becoming a new system to manage. Summon does not try to own the whole desktop. It just makes one interaction better.
Open. Focus. Cycle.