A native macOS app switcher for people who want faster window switching.
⬇ Download for macOS · Releases · Features · Roadmap · Contributing · 简体中文
App Intro / Welcome — hold Option, choose an app, and release to switch.
Hold a modifier key and every running app appears in a ring around your cursor. Flick toward the one you want and release. No list to scan, no Command-Tab cycling, no window hunting. Orbit is a menu bar app built in SwiftUI and AppKit, with no third-party dependencies and no network access — everything stays on-device.
Source-available, not open source. Orbit's source is public for transparency, review, issue discussion, and personal reference. The official compiled app is free for personal use — including on your work machine. Deploying it across an organization, copying or modifying the source, redistributing, rebranding, or selling requires written permission. See LICENSE.
- Download
Orbit-macOS.zipand unzip it. Requires macOS 14.0 or later; the release is a Universal 2 build for Apple Silicon and Intel Macs. - Move
Orbit.appto/Applications. On first launch, Control-click it and choose Open — the build is ad-hoc signed, not Apple-notarized, so a regular double-click is blocked. - Grant Accessibility permission when asked, then hold Option (⌥) anywhere to summon the ring.
If the Control-click Open option is unavailable, clear the quarantine flag:
xattr -dr com.apple.quarantine /Applications/Orbit.app
open /Applications/Orbit.appScreen Recording permission is requested only if you turn on window previews.
The current Xcode project reports version 1.5.1 (build 6). See the
1.5.1 release notes for the changes since v1.5.0.
- A stable first target. If the current app has another actionable window, that recent window destination anchors the ring at 12 o'clock; otherwise the previous app does. The first keyboard target never moves when card count or preview settings change.
- Switch to a window, not just an app. With previews on, arrow left/right picks the exact window of the selected app before you release.
- Recent when it matters, stable when you want it. Orbit chooses the visible app set from recent activation history, then lets you arrange those cards by Recently used or By name.
- The center is a drop target. Drag an app card in to quit it; the optional Orbit card safely cleans up ordinary apps with no open windows, while Orbit and Finder stay protected. Drag a file in to AirDrop it, or hold to send it to the Trash.
- Nothing leaves your Mac. No accounts, no telemetry, no network calls. Native SwiftUI/AppKit with zero third-party packages.
Switching
- Radial app switcher summoned by holding a modifier key (default: Option ⌥).
- Arrow-key navigation enabled by default; optional letter and number shortcuts can be turned on in Settings.
- Optional window previews beside the ring. Enable Show window previews under Settings → Appearance and grant Screen Recording permission; macOS requires an Orbit restart after granting it.
- When Orbit opens is selectable in Settings. Start at Cancel is the safe default; Quick switch preselects the 12-o'clock target so releasing immediately switches to the most recent sibling window or, when none exists, the previous app.
- A pending summon is canceled if another key, mouse button, or scroll gesture arrives before the hold completes, preventing accidental ring openings.
Center target actions
- Drag an app into the center to quit it, with a pixel-dissolve animation.
- Orbit can appear as an optional special card; drag it to the center to request a normal quit for eligible windowless apps. Orbit and Finder are never candidates.
- Drag files into the center to AirDrop them, or keep holding to move them to the Trash.
Configuration
- Interface language, recent/alphabetical card order, Cancel/Quick switch opening behavior, preview size (70%–150%), trigger and clear-selection keys, optional letter/number shortcuts, long-press threshold, ring placement, card size and material, and launch-at-login.
- The language picker includes English, Simplified Chinese, Traditional Chinese, Japanese, Korean, German, French, Russian, Danish, Norwegian Bokmål, and Esperanto. Orbit asks to restart after a language change so the whole interface reloads consistently.
- Preview capture uses the display where Orbit was summoned, which keeps mixed-resolution and multi-display setups sharp and predictable.
- Hold the trigger modifier to open Orbit near the cursor.
- Hover or click a card to select it; release the trigger or press Enter to confirm.
- Press Escape to cancel. Clicking the center does whatever it currently says it does: Cancel when nothing is selected, Confirm when an app is selected.
- Use the arrow keys (and Tab) to navigate by default. From a neutral ring, either arrow enters the 12-o'clock target: the current app's most recent other window when available, otherwise the previous app. Continued presses follow MRU order. Settings can enable number keys
1–9or first-letter matching as additional shortcuts. - When previews are enabled and the selected app has multiple windows, use left/right to choose a window; release the trigger or press Enter to activate it.
- Press the clear-selection key (Shift by default) to remove the highlight; releasing the trigger then closes Orbit without switching.
- Drag an app card into the center and release to quit it.
- While the ring is open, drag a file onto the center target and release for AirDrop; keep it over the target for 0.9 seconds until it changes to Trash, then release to move it to the macOS Trash. The file interaction keeps Orbit open until it finishes.
- Click the menu bar icon for settings, permissions, and quit.
Ring, file actions, window previews, and settings (8 screenshots)
| Orbit Ring | File Share | File Delete |
|---|---|---|
![]() |
![]() |
![]() |
| App Exit | Settings | Welcome |
|---|---|---|
![]() |
![]() |
![]() |
| Window Preview | Window Selection |
|---|---|
![]() |
![]() |
These screenshots show the current Orbit flows on macOS. They are cropped to the
product canvas with the macOS menu bar and desktop chrome removed, then normalized
to 1556×900 for consistent documentation. The source PNGs live in photos/ so the
README stays aligned with the checked-in product captures.
Directional, not a commitment — order and scope will change based on what people actually run into. Open an issue to argue for something.
- Apple-notarized signed builds, so the first launch needs no workaround
- Homebrew Cask distribution
- Pinned favorites that are independent of recent-use membership
- More ring layout and appearance options
- Translation review and additional locale coverage
- Full keyboard and accessibility coverage across every flow
Issues and pull requests are welcome — bug reports with your macOS version and Orbit version are the most useful thing you can send.
- Read CONTRIBUTING.md for the build, test, and PR conventions.
- New here? Start with a good first issue.
- Please open an issue before a large change. Orbit is source-available rather than permissively open source, so proposed code contributions need maintainer review before they can be accepted — see LICENSE.
macOS says Orbit "cannot be opened because the developer cannot be verified"
The release build is ad-hoc signed and not Apple-notarized, so Gatekeeper blocks
a plain double-click. Control-click Orbit.app and choose Open, or run
xattr -dr com.apple.quarantine /Applications/Orbit.app. Notarized builds are on
the roadmap.
Why does Orbit need Accessibility and Screen Recording permission?
Accessibility is required for the global modifier-key trigger — without it, macOS will not tell Orbit that you are holding the trigger key outside its own windows. Screen Recording is requested only when you enable window previews, because live window thumbnails are screen content. macOS requires an Orbit restart after you grant it. Nothing captured is stored or transmitted — see the privacy policy for exactly what Orbit reads and keeps.
Screen Recording also covers window titles, so it buys more than thumbnails: with it, Orbit can offer sibling windows on other Spaces as targets and can find the right entry in an app's Window menu. Without it, window-level switching is limited to windows currently on screen, and exact-window switches in browsers reach the Apple Events fallback more often. App switching itself is unaffected.
Automation is not required for normal switching. Orbit normally uses Accessibility, including an app's Window menu, to reach the chosen window. Only if those paths cannot complete an exact switch does Orbit try an Apple Events fallback; macOS asks at that moment, and declining simply falls back to opening the app normally.
How do I change Orbit's interface language?
Open the menu bar icon, choose Settings → General → Language, and select Follow System or one of Orbit's bundled languages. Orbit shows a restart prompt after the selection changes; restart it for every view and menu to use the new locale.
How do I uninstall Orbit?
Quit Orbit from the menu bar icon, then move /Applications/Orbit.app to the
Trash. To also remove its preferences:
defaults delete app.orbit.localYou can revoke the permissions under System Settings → Privacy & Security → Accessibility / Screen Recording / Automation.
Does Orbit send anything over the network?
No. There are no accounts, no analytics, and no third-party packages. AirDrop transfers are handed to macOS and never touch an Orbit-controlled server.
Requirements, build commands, and test commands
Requirements:
- macOS 14.0 or later for the current reconstructed Xcode project.
- Universal 2 release artifacts contain both
arm64andx86_64; the downloadable release supports Apple Silicon and Intel Macs. - Xcode 26 or later.
- Accessibility permission for the global modifier-key trigger.
- Screen Recording permission if live window previews are enabled.
The repository's Code → Download ZIP action gives you the source tree, while
the link in the Quick start section gives you a ready-built .app. You can also
build with Xcode (or the command below), then choose your own Team if you need a
normally signed app for local use or distribution. There are no third-party
package dependencies.
Open Orbit.xcodeproj in Xcode, choose My Mac, and press Run. The
shared project does not contain a developer Team ID. If Xcode asks for
signing, choose your own Team and replace the local bundle identifiers with
identifiers unique to your account.
To verify a build without using a signing identity:
xcodebuild -project Orbit.xcodeproj -scheme Orbit -configuration Debug \
-destination 'platform=macOS' -derivedDataPath .build/xcode \
CODE_SIGNING_ALLOWED=NO buildTo run the full test suite, including unit and UI tests:
xcodebuild -project Orbit.xcodeproj -scheme Orbit -configuration Debug \
-destination 'platform=macOS' -derivedDataPath .build/xcode clean test \
CODE_SIGNING_ALLOWED=NO CODE_SIGNING_REQUIRED=NOFor a faster unit-test-only loop:
xcodebuild -project Orbit.xcodeproj -scheme Orbit -configuration Debug \
-destination 'platform=macOS' -derivedDataPath .build/xcode \
CODE_SIGNING_ALLOWED=NO CODE_SIGNING_REQUIRED=NO test -only-testing:OrbitTestsThe repository intentionally excludes generated build products, DerivedData, Xcode user state, local environment files, secrets, logs, and local workflow state. The source files, assets, tests, project file, workspace data, and public documentation remain tracked.
Release verification, including Universal 2 checks and the clean-machine
installation/permission regression checklist, is documented in
docs/release-checklist.md. GitHub Actions runs the
metadata check, Debug build, and 61 OrbitTests tests on every push and pull request.
Orbit/— app source, configuration, resources, and asset catalog.Orbit/Config/AppLanguage.swiftandOrbit/Settings/— language and user preference behavior.Orbit/Services/AppActivationHistory.swift— recent activation history used to build the ring.OrbitTests/— unit tests for interaction and selection behavior.OrbitUITests/— UI test targets.Orbit.xcodeproj/— shared Xcode project and workspace data.photos/— README screenshots, the App Intro artwork, and supporting images.scripts/— install, release packaging, and demo GIF helpers.docs/decisions/— product and engineering decision records.
Orbit is an independent native macOS project built around a radial, gesture-first workflow. This repository provides:
- The complete SwiftUI/AppKit source, resources, tests, and shared Xcode project.
- Portable placeholder bundle identifiers under
app.orbit.local. - No developer Team ID, signing certificate, or machine-specific Xcode state.
- English-first documentation with a separate Simplified Chinese version.
- Current source build:
1.5.1 (build 6). - English is the default app localization; the in-app picker ships English, Simplified Chinese, Traditional Chinese, Japanese, Korean, German, French, Russian, Danish, Norwegian Bokmål, and Esperanto.
Orbit's core idea — hold a modifier and your running apps appear in a ring around the cursor — was inspired by yuzeguitarist/Orbit by Yuze Pan (潘禹泽). I came across that project in 2026 and liked the concept enough to want a version shaped around my own habits.
I asked the author before starting. They were clear that their code is not open for reuse, and equally clear that they welcomed an independent take on the idea. This project was built on exactly those terms: a separate implementation written from scratch, sharing the concept and not the source. Thanks to Yuze Pan for the idea and for the generous answer.
Orbit uses a source-available license rather than an OSI-approved open-source license:
- The official compiled app is free for personal use, on any machine you personally use — a machine your employer gave you included. Using Orbit while doing your job is fine.
- Organizational deployment — installing or managing Orbit across a company's or institution's machines — needs a separate written license, whether or not that organization is for-profit.
- The source is available for viewing and reference.
- Copying, modifying, redistributing, sublicensing, selling, rebranding, or distributing a derivative work of the source requires written permission.
- The Orbit name, logo, and Orbit's own screenshots and artwork are not granted for rebranded or competing distributions.
See the complete terms in LICENSE. For commercial licensing or redistribution requests, contact the copyright holder through the GitHub profile associated with this repository.








