Skip to content

Repository files navigation

Wink

Wink settings showing shortcut capture ready and three Hyper shortcuts

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 / 中文

Why "Wink"?

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.

Highlights

  • 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 .winkrecipe shortcut sets.
  • Launch at login, in-app Sparkle updates.
  • Available in English and Simplified Chinese (zh-Hans); see docs/localization.md for how to add a locale.

Requirements

  • 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.

Build

swift build
swift test
./scripts/package-app.sh
open build/Wink.app

Useful packaging commands:

./scripts/package-update-zip.sh
./scripts/package-dmg.sh
./scripts/e2e-full-test.sh

Always 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.

Automation

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 | insights

Use 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.

Technical Notes

  • 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.md for the platform trade-offs.
  • Runtime-sensitive behavior must be validated on macOS, not inferred from source inspection alone.

Documentation

About

Bind global shortcuts to apps on macOS — Hyper key, Thor-like toggle, lightweight insights

Topics

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages