Wink is a macOS menu bar app for opening, focusing, and hiding apps with global shortcuts. It keeps the interaction deliberately small: press a shortcut once to bring an app forward, press it again to get it out of the way.
Website: wink.aixie.de · User guide: English / 中文
Wink suggests a quick, subtle signal: something that happens almost instantly and then gets out of the way. That is the feeling Wink aims for when switching apps.
- Bind letters, function keys, arrows, or Space to target apps, with normal modifier shortcuts or a Hyper shortcut path based on Caps Lock.
- Launch missing apps, focus running apps, or hide the frontmost target with Thor-like toggle semantics.
- Or set a shortcut to cycle through its target's windows on repeat presses — minimized ones included, with a HUD showing where you are — or to open a window picker on hold.
- Target "the frontmost app" to cycle whatever you are working in, without a per-app binding.
- Summon a search palette from its own trigger shortcut, type a few letters, and land on any installed app.
- Hold the Hyper key to see a cheat sheet of every bound shortcut.
- Review usage in the Insights tab — trends, a weekly heatmap, and shortcut suggestions for apps you switch to often. All of it stays on your Mac.
- Exception rules auto-pause capture while a VM or remote desktop is frontmost, and Secure Input degradation is surfaced in the menu bar instead of failing silently.
- Apply a chosen shortcut Profile, pause shortcuts, or both from macOS Focus Filters; each Focus is configured explicitly in System Settings and restores your latest manual Profile afterward.
- Import and export
.winkrecipeshortcut sets. - Launch at login, in-app Sparkle updates.
- Available in English and Simplified Chinese (zh-Hans); see
docs/localization.mdfor how to add a locale.
- macOS 15 or later.
- Accessibility permission for global shortcut routing.
- Input Monitoring only when Hyper-routed shortcuts are enabled.
- Swift 6 when building from source.
swift build
swift test
./scripts/package-app.sh
open build/Wink.appUseful packaging commands:
./scripts/package-update-zip.sh
./scripts/package-dmg.sh
./scripts/e2e-full-test.shAlways launch the packaged app with open build/Wink.app when testing permissions. macOS ties Accessibility and Input Monitoring grants to the app identity, signature, and bundle path; launching the raw binary is not equivalent.
Wink publishes four localized actions in Apple's Shortcuts app: Pause Wink, Resume Wink, Show Wink Search Palette, and Open Wink Settings (optionally to Shortcuts, General, or Insights). They launch Wink when needed, and only report success after the requested state or UI is actually active. Pause and Resume change only the manual-pause bit, so exception-rule auto-pause remains independent.
Wink also embeds a separate Wink Focus Filter App Intents extension. In System Settings > Focus, choose a Wink Profile by its stable identity and/or enable Focus-owned pause. The extension works while Wink is not running; on the next launch Wink reads the durable state, applies it through the normal atomic Profile switch, and restores the latest manual Profile when the Focus overlay ends. Manual, exception-rule, and Focus pauses remain independent.
The existing URL surface remains available for tools that cannot invoke App Intents:
Wink exposes a small, non-destructive wink:// URL surface, so Raycast, Karabiner, BetterTouchTool, Stream Deck, or plain shell scripts can drive it — including the SkyLight forced activation that scripts cannot perform themselves:
open -g "wink://toggle?bundle=com.google.Chrome" # toggle an installed app
open -g "wink://focus?bundle=com.google.Chrome" # focus; never hide or cycle
open -g "wink://pause" # pause all shortcuts
open -g "wink://resume" # resume
open -g "wink://search" # show Search Palette
open -g "wink://open-settings" # open Settings
open -g "wink://open-settings?tab=insights" # shortcuts | general | insightsUse open -g (background): a plain open activates Wink to deliver the URL, which makes the target count as "not frontmost" and turns every toggle into an activate.
Custom URL schemes do not authenticate their caller. Wink therefore accepts only the grammar above, validates app bundle identifiers against installed applications, and ignores malformed URLs, unknown parameters, unsupported tabs, and uninstalled bundles with bounded diagnostics. There are no callback, x-success, or other completion-callback parameters: URL delivery does not prove that an asynchronous app activation completed. Toggle requests respect the per-bundle cooldown; URL-triggered app actions never count toward Insights usage.
- Standard shortcuts use Carbon hotkeys.
- Hyper-routed shortcuts use an active event tap.
- Reliable activation for an accessory app depends on SkyLight, a private macOS API. See
docs/architecture.mdfor the platform trade-offs. - Runtime-sensitive behavior must be validated on macOS, not inferred from source inspection alone.
- User guide (中文)
docs/README.mddocs/architecture.mddocs/github-automation.mddocs/privacy.mddocs/localization.mddocs/signing-and-release.mdVERIFYING_RELEASES.md— check a downloaded DMG or update ZIP against its signed build provenance