OneSwitch

One hotkey for every window, browser tab, and app.
Press Control+Tab, type, Enter — you're there.

why

Alt-Tab isn't enough

Alt-Tab cycles apps, not the browser tab you actually want.
Launchers launch, switchers switch — two tools for one intent.

OneSwitch has one key with one meaning: take me there — window, tab, or an app that isn't even running yet.

how it works

Three steps

⌃ Tab
type to filter
Enter

A Spotlight-style popup lists everything most-recently-used first.
The previous window is preselected, so Control+Tab, Enter
bounces between your two most recent windows.

one list

Windows, tabs, apps

WindowsEvery app's windows individually, MRU-first, with app icons
Chrome tabsListed individually with per-page favicons
Firefox tabsListed individually, one keypress to switch
Installed appsNot running? Appears while searching — Enter launches it
search

Orderless fuzzy search

Type space-separated tokens in any order — every token must match the title or app name. Results are ranked: title matches, prefix and word-boundary matches, and shorter titles score higher.

mail gmail  # finds "Inbox — Gmail — Google Chrome"
code one   # finds "OneSwitch — Visual Studio Code"
command mode

> runs shell commands

Type > and your shell history appears as you type — on GNOME, matching $PATH executables too. Enter runs the selected entry; Ctrl+J runs exactly what you typed. Output shows in the panel and lands on your clipboard in full. Esc kills a running command.

> git status
── output (exit 0) ──
On branch main
nothing to commit, working tree clean
web search mode · gnome

? searches the web

Type ? followed by a query; Enter opens a Google search for it in your default browser. When there's no window or tab to go to, the answer is one keystroke away anyway.

? gnome shell docs
# Enter → Google search in the default browser
platforms

macOS + GNOME

macOS

  • Swift + AppKit + SwiftUI
  • Menu bar accessory app
  • Accessibility API windows
  • Pid-addressed Apple Events
  • Carbon global hotkey
  • macOS 13+

Linux

  • GNOME Shell extension (GJS)
  • GNOME 47–50, Wayland
  • NixOS flake install
  • WebExtension tab bridge
  • Panel indicator + prefs
  • Title bar management
macOS internals

macOS architecture

ComponentRole
WindowManagerEnumerates windows + tabs, activates the selection
ChromeScriptingPid-addressed raw Apple Events to the real Chrome
WindowHistoryMRU tracking by CGWindowID for recency + Enter toggle
AppCatalogScans app directories for launchable bundles
FaviconCacheTwo-tier favicon cache (memory + disk)
HotKeyManagerGlobal Control+Tab hotkey (Carbon)
SwitcherPanel/View/ModelPopup panel, SwiftUI view, observable state
linux internals

GNOME architecture

ModuleRole
extension.jsHotkey, popup panel, wiring
lib/model + queryItem list, filtering, ranking (pure, unit-tested)
lib/historyMRU window ordering, persisted across sessions
lib/browserReads tabs from the native-host Unix socket
lib/commandShell-history command mode
lib/panel-titleFocused window title + buttons in the top panel
native-host/GJS bridge: browser native messaging → Unix socket
webext/Chrome/Firefox extension streaming the tab list
browser tabs on linux

The tab bridge

browser tabs
WebExtension
native host (GJS)
Unix socket
Shell extension

GNOME Shell can't see inside browsers, so a WebExtension streams the tab list over native messaging to a tiny GJS host, which exposes it on a socket in $XDG_RUNTIME_DIR. Tabs appear inline with favicons; without the bridge everything else still works.

gnome extra

Title bar management

Optionally hide window title bars on maximized or tiled windows, Unite-style — CSS injection for GTK/Wayland apps, Motif hints for XWayland. The focused window's title (and optional window buttons) moves into the top panel.

When maximizedDefault — reclaim space only when it matters
When tiled or maximizedAlso covers half-tiled windows
AlwaysNo title bars, ever
get started · macOS

macOS quick start

# 1. One-time: stable signing identity
# (permission grants survive rebuilds)
scripts/setup-signing.sh

# 2. Build and install
scripts/build-app.sh
cp -R OneSwitch.app /Applications/
open /Applications/OneSwitch.app

# 3. Grant Accessibility + Automation permissions

# Press Control+Tab to switch
get started · nixos

NixOS quick start

# flake.nix
oneswitch.url = "github:oneness/OneSwitch";

# configuration.nix
programs.gnome-shell.extensions = [
  { package = oneswitch.packages.${pkgs.system}.extension; }
];

# rebuild, log out and back in
sudo nixos-rebuild switch

Open source

Swift for macOS, GJS for GNOME, Nix for packaging.
Diagnostics-first design: headless logs, --dump CLI modes,
and pure unit-tested core modules.

github.com/oneness/OneSwitch