A native macOS app for the ZSA Voyager.
Edit your layout on your Mac, build and flash the firmware locally, and watch the keyboard live.
Install · Guide · Releases · Safety · Privacy
Note
Sextant is an independent project, not affiliated with or endorsed by ZSA Technology Labs. ZSA, Voyager, Navigator, Oryx and Keymapp are trademarks of their owners, used here only to describe compatibility.
- Every key, with undo: tap, hold, double tap and tap-then-hold actions, chords, labels, per-key colors and tapping terms.
- Search every keycode from the key, or find any command, key or setting with ⌘K.
- Layers, macros, combos, firmware settings and the Navigator, with each layer showing what it inherits.
- Import from Oryx by pasting a layout link. It's read-only: no login, and nothing changes in your Oryx account.
- History and export: revisions you can compare and restore; export JSON, QMK source, firmware, PNG or PDF.
- On your Mac, with a pinned, sandboxed QMK toolchain that's downloaded once.
- A careful flasher that writes only the application region and checks every image first (see Safety).
- One keyboard, two Macs: optionally store the layout in the firmware, so Sextant on your other Mac reads it back.
- The board follows the keyboard: the active layer and the keys you press.
- An overlay of the layer you hold, over any app, placed where you like.
- Layer switching from the menu bar or global shortcuts, and App Layers that follow the app you're in.
- Lighting and heatmap: paint a layer's LEDs and preview them on the keyboard, and see which keys you actually use.
| The layer overlay, over any app | The menu bar |
|---|---|
![]() |
![]() |
The guide walks through each feature.
brew install --cask afrase/tap/sextantOr download the zip from Releases. Sextant tells you when a newer version is out.
- Requirements: macOS 26 on Apple silicon. Editing works without a keyboard.
- Tested on a Voyager with the STM32 bootloader. Images for the GD32 bootloader are refused, and the Navigator trackball is untested.
- Signing: releases are signed ad hoc, not notarized. The Homebrew cask clears the quarantine flag for you; a zip you download yourself needs System Settings › Privacy & Security › Open Anyway on first launch.
- The flasher writes only the application region,
[0x08002000, 0x08042000), and can't mass erase, so the bootloader is never touched. - Every image is checked before the first write: its DFU suffix must match the connected bootloader and its md5 the build. Sextant asks first before replacing a different layout.
- Generated firmware keeps the Navigator working, and builds run in a sandbox with no network and no access to your files.
- Nothing is sent to the keyboard unless you ask: the live view, layer moves and lighting previews start only when you turn them on.
- If a flash goes wrong, the Voyager's reset button puts it back in its bootloader, and you can flash again.
- No accounts, analytics or telemetry.
- Sextant goes online only to import from Oryx, to download the build tools on the first build, and once a day to ask GitHub whether a newer Sextant is out. Settings › General turns that check off; GitHub sees your IP address and Sextant's version.
- The live view sees key positions, never characters, and pauses in password fields.
- The heatmap is off until you turn it on. It keeps only hourly counts per key, saved in batches of at least 100 presses, in files only your account can read, and it stays on your Mac.
Needs Xcode 26 (Swift 6.2 or later).
git clone https://github.com/afrase/Sextant.git
cd Sextant
scripts/bundle # release build at .build/Sextant.app
open .build/Sextant.appscripts/check is the quality gate: formatting, lint, layer rules, a warnings-as-errors build and the tests. See CONTRIBUTING.md. The README's stills are rendered offscreen by scripts/readme-images.
- docs/guide.md: using Sextant.
- docs/architecture.md: the code design. It's a clean (hexagonal) architecture with one SwiftPM target per layer, so a wrong import fails to compile.
- docs/decisions.md and docs/adr/: every significant decision and why.
- docs/design/ui-spec.md: the UI specification.
- docs/research/00-overview.md: how Oryx, the firmware, the flasher and the live protocol work.
- docs/progress.md: what's done and what's next. Sextant is built with Claude Code, and this is its working log.
To report a vulnerability, follow SECURITY.md rather than opening an issue.
MIT.
Third-party software
-
QMK firmware (GPL-2.0-or-later) is downloaded at build time, pinned by checksum, and compiled on your Mac. It is not bundled with Sextant. The Arm GNU toolchain, Python and GNU make are downloaded the same way.
-
Swift packages, pinned to exact versions:
Package License Used for swift-async-algorithms Apache-2.0 The app swift-subprocess Apache-2.0 The app swift-system Apache-2.0 The app (via swift-subprocess) swift-collections Apache-2.0 The app (via swift-async-algorithms) KeyboardShortcuts MIT The app (global layer shortcuts) MenuBarExtraAccess MIT The app (closing the menu bar panel) swift-argument-parser Apache-2.0 The snapshot tool swift-clocks MIT Tests swift-snapshot-testing MIT Tests swift-issue-reporting, swift-concurrency-extras MIT Tests (via swift-clocks) swift-custom-dump MIT Resolved for swift-snapshot-testing, not built swift-syntax Apache-2.0 Resolved for swift-snapshot-testing, not built SwiftLintPlugins MIT Linting Periphery MIT Unused-code report ( Tools/) -
docs/research/oryx-examples/holds the author's own Oryx layout and Oryx's generated source for it, used as golden test data. The zip includes a QMK-built firmware binary, which is GPL-2.0-or-later. -
The screenshots and the tour are rendered offscreen from the author's own layout and contain no ZSA artwork.


