free · open source · MIT

beckon.

A keyboard launcher for macOS. Zero dependencies. No subscription.

No account, no telemetry, and zero network calls in the shipped build. Two std-only Rust crates and hand-rolled Objective-C FFI. Press the hotkey, a panel appears, you type, things happen.

option + space to summon
install with homebrew
brew install --cask jonathanpopham/tap/beckon

Or the install script, or build from source. Add --no-quarantine to skip the Gatekeeper prompt for this ad-hoc-signed build.

The panel, drawn in CSS. Same layout, same colors, same font as the default theme.

what it does

One text field, most of your Mac behind it

Everything below ships in the one binary. Nothing phones home, nothing upsells, nothing needs an extension store.

launch

Launch and switch apps

Fuzzy search that learns your habits: integer frecency with a 14 day half-life, and a strong match always wins. saf is Safari by day two.

windows

Window management

Halves, thirds, quarters, maximize, center, move between displays. Type window left half, or alias it to lh.

switcher

Window switcher

win lists every window of every app. Return focuses it, wherever it lives.

menus

Menu item search

menu export finds "File > Export as PDF" in the frontmost app and presses it for you.

clipboard

Clipboard history

clip searches everything you copied; Return pastes it into the app you came from. Password manager secrets are never captured: concealed pasteboard types are respected.

paths

Path browser and Quick Look

Paste any path, even quoted, shell-escaped, or file:// forms, and get Open, Reveal, Quick Look, Copy Path. Return drills into folders, so ~/ge walks the tree without Finder.

files

File search

file report ranks a fast local index of your directories; Spotlight backfills what the index misses.

calculator

Exact math, inline

Type 0.1 + 0.2 and get exactly 0.3: fixed point, no float drift. Units (5 km in mi), bases (255 in hex), percent (200 * 15%).

snippets

Snippets

snip expands text with {date}, {time}, {clipboard}, and {cursor} placeholders, pasted where you were typing.

quicklinks

Quicklinks

go google rust launcher opens the search, properly percent-encoded. Parameterized URLs with {query} placeholders.

emoji

Emoji and symbols

emoji fire pastes the glyph where you were. Plus arrows, math, currency, and mac key glyphs.

dev utils

Developer utilities

uuid, b64, sha256, json pretty-print, epoch, count. Return copies the answer.

system

System commands

Sleep, lock, empty trash, toggle dark mode, volume, quit frontmost, restart Finder.

scripts

Script commands

Drop an annotated executable in ~/.beckon/scripts/ and it becomes a command. Any language with a shebang.

plugins

Plugins, no SDK

A plugin is any executable speaking JSON-RPC 2.0 over stdio, in any language. Three methods, forty lines of stdlib Python in the example. The protocol ↗

walkthrough

First-run walkthrough

On a fresh install, Return on the blank panel starts a guided tour: seven steps, one Return each, taught inside the launcher itself. Type anything to skip.

the bet

The launcher you press a hundred times a day should be a program you can read

Not a subscription, not a webview, not an npm tree. Same inputs, same ranking, byte for byte, forever.

zero dependencies

Two Rust crates, std only. No wrapper crates, no webview, no JS runtime, no build.rs. The dependency audit is part of the gate.

hand-rolled FFI

The macOS shell talks to AppKit, Carbon, CoreGraphics, and the Accessibility APIs through hand-rolled Objective-C and C FFI. The engine underneath builds and tests anywhere, including Linux CI.

deterministic ranking

No floats in ranking paths. Fixed-point integers, no clock reads outside injected parameters, and golden tests for every ranking behavior.

airgap pure

Zero network calls in the shipped build, enforced by a no-network audit. No telemetry, no account, no update pings. std::net is forbidden in both crates.

your data

Clipboard history, snippets, frecency, and settings are plain files in ~/.beckon/. Readable, greppable, syncable, yours.

no LLM in the build

Nothing model-backed ships in the default binary, ever. Anything that wants the network sits behind a cargo feature that is off by default.

One gate: 350+ tests behind a single verify script (fmt, clippy with denied warnings, the full suite, a zero-dependency audit, a no-network audit). CI is a thin wrapper around it.

make it yours

One config file is the truth

Everything lives in plain files under ~/.beckon/. This is config.json, and every key is optional.

~/.beckon/config.json
{
  "aliases":     { "lh": "window.left-half" },
  "hotkey":      { "key": "space", "modifiers": ["opt"] },
  "max_results": 9,
  "theme":       { "background": "#1C1C21", "foreground": "#FFFFFF",
                   "accent": "#5AC8FA", "font_size": 22 },
  "triggers":    { "v": "clip" }
}
prefer ⌘⇧space? change the summon shortcut
{"hotkey": {"key": "space", "modifiers": ["cmd", "shift"]}}
  • aliases point any shorthand at any command id, or rewrite into any trigger. lh becomes "window left half".
  • hotkey is the summon shortcut: a key plus modifiers (opt, cmd, ctrl, shift). The example on the left moves it to Cmd+Shift+Space.
  • theme sets background, foreground, accent, and font size. The defaults are the colors of this page.
  • triggers rename the keyword sources (clip, win, file, menu, emoji, snip, go), so v can be your clipboard.

install

Three ways in

Homebrew · recommended

terminal
brew install --cask jonathanpopham/tap/beckon

Add --no-quarantine to skip the Gatekeeper prompt for this ad-hoc-signed build.

Install script

terminal
curl -fsSL https://raw.githubusercontent.com/jonathanpopham/beckon/main/scripts/install.sh | sh

From source

terminal
git clone https://github.com/jonathanpopham/beckon
cd beckon
scripts/bundle.sh
open dist/Beckon.app
autostartAdd Beckon.app to System Settings > Login Items to start it at login.
permissionWindow management and paste ask for one Accessibility grant. beckon offers the prompt when a feature first needs it and degrades gracefully until then.
first runPress Option+Space, then Return on the blank panel for the built-in walkthrough.