Stop hunting.
Start summoning.

Hold ⌘⌥⌃, tap an app's letter, and it's in front of you — launched first if it wasn't running. A resident macOS tool in ~100 lines of Swift.

✓ No Accessibility permission. No prompts. Ever.

One file. No dependencies. No network. MIT licensed.

App screenshot

browser focused.

+

How it works

Focus if running, launch if not

01 · bind

Pick your letters

A tiny dictionary in the source maps letters to apps: "b" for your browser, "s" for Spotify — whatever mnemonics fit your head.

02 · chord

Hold ⌘⌥⌃, tap the letter

Three modifiers means it collides with almost nothing — no screenshot shortcuts, no app menus. The daemon sits resident, so it fires in milliseconds.

03 · summon

The app appears

Running? It's unhidden and focused. Closed? It's launched. Either way, same keystroke — you never think about which state it's in.

The differentiator

Zero permissions — genuinely

App switchers and launchers usually demand the Accessibility permission — the broad one that lets an app control your whole screen. AppFocus doesn't move windows around; it activates and launches whole apps, which macOS treats as ordinary, ungated operations.

Typical launcher / switcher

  • Accessibility permission — can observe and control everything on screen

  • Sometimes Input Monitoring too — reads all keystrokes

  • Permission upkeep — re-grants after updates, mystery breakage

✓ AppFocus

  • No permission prompts at all — install to working hotkeys with zero trips to System Settings' privacy list

  • Public, ungated APIs only — NSWorkspace and NSRunningApplication, the same calls the Dock makes

  • Rebuild freely — change a binding, recompile, relaunch. Nothing to re-grant, ever

Configure

Your whole config is one dictionary

No preference panes, no dotfiles, no sync. The bindings live at the top of the source — edit, rebuild, done. Find any app's bundle ID with osascript -e 'id of app "Spotify"'.

One source file, ~100 lines. Compiled by you, with Apple's toolchain.

Only Apple frameworks. Cocoa and Carbon — nothing fetched, nothing bundled.

Duplicate letters won't compile. The dictionary itself guards against double-booking a key.

No network, no files, no logging. There's no code path for any of it.

// letter -> app. That's the whole config.
let appBindings: [Character: String] = [
  "b": "com.brave.Browser",
  "t": "com.googlecode.iterm2",
  "o": "md.obsidian",
  "s": "com.spotify.client",
]

// focus if running, launch if not:
if let app = running(bundleID) {
  if app.isHidden { app.unhide() }
  app.activate()
} else {
  NSWorkspace.shared.openApplication(at: url)
}

Install

Compile it yourself — it takes two minutes

Needs only Apple's command line tools (xcode-select --install). The README walks through bundling it as a background .app and starting it at login.

# clone, edit your bindings, build
git clone https://github.com/Neilos-Thumm/AppFocus && cd AppFocus
swiftc appfocus.swift -o appfocus -framework Cocoa -framework Carbon
# then follow the README: bundle, launch, login item — no permission steps

And that's genuinely it: no privacy-list visits, no re-granting after rebuilds. Sibling project WindowFocus jumps between named windows inside a browser — the two run happily side by side.

AppFocus gets you to the app. WindowFocus gets you to the exact browser window — same maker, same ~100 lines.