A minimal, keyboard-driven application launcher for macOS. Built for tiling window manager workflows with yabai and skhd.
When you use Spotlight to open an app that's already running, it switches you to the existing window on another desktop. This breaks tiling window manager workflows where you want to spawn a new instance in your current workspace.
Blink fixes this. Inspired by Hyprland + Walker on Linux, Blink launches applications in your current desktop by default, opening new windows instead of switching contexts.
blinkdemo.mov
- Launch, don't switch: Opens new app instances in your current desktop
- Tiling WM native: Designed for yabai, Amethyst, and similar setups
- Keyboard-first: No mouse required
- Configurable: Aliases, exclusions, and custom shortcuts
- Smart search: Fuzzy matching finds what you need
brew tap jpcerone/blink
brew install --cask blink-launcher- Download
Blink.zipfrom Releases - Extract and drag
Blink.appto/Applications
git clone https://github.com/jpcerone/BlinkLauncher
cd BlinkLauncher
xcodebuild -scheme Blink -configuration ReleaseAdd to your ~/.config/skhd/skhdrc:
alt - space : open -a BlinkReload skhd:
skhd --reload- Press your hotkey (e.g.,
Option + Space) - Type to search
Up/Downto navigateEnterto launchEscapeto cancel
While Blink is open:
| Shortcut | Action |
|---|---|
Cmd + , |
Open config file |
Cmd + R |
Rescan applications |
Cmd + S |
Mark selected app as single-instance |
Config files are located at ~/.config/blink/.
# Custom applications in non-standard locations
[[custom_apps]]
name = "My Script"
path = "~/scripts/deploy.app"
# Search aliases - type shortcuts to find apps faster
# App name must match exactly as shown in Blink
[[aliases]]
app = "Code"
shortcuts = ["vsc", "vscode", "editor"]
[[aliases]]
app = "Google Chrome"
shortcuts = ["chrome", "browser", "gc"]
# Hide apps from search results
exclude_apps = ["Migration Assistant", "Boot Camp Assistant"]
# Pattern-based exclusions (supports * wildcard)
exclude_patterns = ["*Helper*", "*Uninstaller*"]
# Keyboard shortcuts (modifier+key)
[shortcuts]
preferences = "cmd+,"
refresh = "cmd+r"
mark_single_instance = "cmd+s"
# Launch behavior
always_new_window = false # Always open new instances
close_on_blur = true # Quit when window loses focus
quit_after_launch = true # Quit after launching an appApps listed here activate existing windows instead of opening new ones:
# Lines starting with # are comments
Finder
System Settings
Activity Monitor
Blink uses Spotlight (MDQuery) to find all installed applications, plus any custom apps defined in your config.
Unlike Spotlight, Blink defaults to launching new instances so apps open in your current desktop:
- Default behavior: Opens new window with
-nflag (stays in current desktop) - Single-instance apps: Apps like Finder that can't have multiple instances activate the existing window
- Configure exceptions via
single-instance-apps.configor pressCmd + Son any app
| Match Type | Score |
|---|---|
| Exact match | 1000 |
| Alias match | 950 |
| Starts with query | 900 |
| Partial alias match | 850 |
| Contains query | 500 |
| Fuzzy match | Variable |
- macOS 13.0+ (Ventura or later)
- skhd (recommended for hotkey binding)
App doesn't launch
- Ensure Blink is in
/Applications - Check skhd is running:
brew services list
Missing apps
- Press
Cmd + Rto rescan - Or add as
[[custom_apps]]in config
Wrong window behavior
- Add app name to
~/.config/blink/single-instance-apps.config - Or select the app and press
Cmd + S
Alias not working
- App name must match exactly as shown in Blink's search results
- Check with
Cmd + Rto refresh after config changes
git clone https://github.com/jpcerone/BlinkLauncher
open Blink.xcodeprojBlink/
├── BlinkApp.swift # App lifecycle
├── LauncherView.swift # UI and keyboard handling
├── LauncherViewModel.swift # Search, filtering, and launch logic
├── ConfigManager.swift # Config file parsing
└── CacheManager.swift # Single-instance app management
MIT License - see LICENSE for details.