A tiny Mac menu-bar app. Wear AirPods, sit better, and run shortcuts with your head.
Download AirPoise 1.0.0 — open the DMG and drag the app onto Applications.
AirPoise reads the motion sensors already inside AirPods (the same ones Spatial Audio uses). It does two jobs:
- Posture — reminds you when your chin drifts forward or your head tilts.
- Head shortcuts — nod, shake, glance, or tilt to play/pause, switch desktops, run a Mac shortcut, open a link, and more.
No camera. No account. No internet. It lives in the menu bar, not the Dock.
This is the Mac app. It is not the sitting cushion sold at airpoise.com.
- Install from the DMG (or build from source below).
- Put on AirPods Pro / 3 / 4 / Max or Beats Fit Pro, and set them as the Mac’s sound output.
- Allow Motion & Fitness when asked.
- Sit the way you want to sit, look at the screen, and Calibrate upright.
- Click the menu-bar icon for the live readout. Right-click for Pause / Calibrate / Settings / Quit.
If macOS blocks the app: right-click AirPoise → Open.
Everything is in Settings (right-click the menu-bar icon → Settings).
Open Settings → Actions. Tap a gesture, then choose what it should do.
| You can bind a gesture to… | Examples |
|---|---|
| Keyboard shortcut | Record ⌘⇥, media keys, anything you type |
| Apple Shortcuts app | Run a Shortcut by name |
| Open a link or an app | URL, or pick an .app |
| Media / volume / brightness | Play-pause, next, mute, brighter |
| Mac system stuff | Mission Control, Spaces, screenshot, lock, Spotlight, sleep |
| Notification, speak, or paste text | A ping, a spoken line, clipboard paste |
| Shell or AppleScript | Only if you write that command yourself |
| Nothing | Leave it unassigned |
Out of the box
| Head move | What it does |
|---|---|
| Double nod | Play / Pause |
| Look left / look right | Switch Space (desktop) |
| Hold left tilt | Mission Control |
| Double shake | A small ping notification |
| Everything else | Off until you assign it |
Turn a gesture off by setting its action to Do nothing, or disable Head-gesture shortcuts under Settings → Gestures.
Custom keyboard shortcuts need Accessibility (Settings → General → Grant). Play/pause and volume usually do not.
Settings → Gestures
- Master on/off for all head shortcuts
- Sensitivity — easier or harder to trigger
- Cooldown — wait between triggers so you don’t double-fire
- Hold duration — how long to hold a tilt
- A list of all 16 moves with a short how-to for each: nod, double nod, shake, look left/right/up/down, tilt, hold-tilt, lean, roll
A shortcut fires when you move and come back. Sitting still in a slouch is not a nod.
Settings → Posture
- Turn the coach on or off
- How many degrees of forward lean count as good vs “nudge me”
- How long you must stay there before a reminder
- Overlay card, notification, sound, or spoken cue
- Ignore you while walking
Calibrate again any time from the menu bar if your chair or desk changes.
Launch at login, menu-bar style, Motion & Accessibility status, and invert an axis if a direction feels backwards on your buds.
- macOS 14 Sonoma or later
- AirPods with head tracking: Pro, 3, 4, Max, or Beats Fit Pro, worn and selected as Mac audio output
- Original AirPods / AirPods 2 will not work (no motion sensor). The menu bar will say “No head-tracking buds”
- It sees head pose, not your whole spine. A level head on a rounded back still reads “good”.
- About 25 samples a second. Fine for sitting and discrete gestures, not a VR headset.
- Intel Macs on Sonoma may run. Apple Silicon is what we test.
Nothing is uploaded. No analytics. Settings stay in ~/Library/Application Support/AirPoise/. See SECURITY.md.
AirPoise-1.0.0.dmg — drag onto Applications.
Always run the .app, not the raw swift build binary. macOS needs NSMotionUsageDescription in the app bundle.
./scripts/build-app.sh
open dist/AirPoise.app./scripts/make-dmg.sh # disk image
swift test --package-path . # testsApple already fuses the AirPods accelerometer + gyro for Spatial Audio. AirPoise does not invent a second compass. It reads CMDeviceMotion (~25 Hz).
Headphone frame: x = right ear, y = nose, z = crown. Relative pose is ref⁻¹ · q. Gyro: turn = ωz, nod = ωx, ear tilt = ωy. Invert any axis in Settings → General if firmware feels backwards.
| Field | Used for |
|---|---|
attitude |
Gestures (yaw / pitch / roll vs calibrate) |
gravity |
Posture (chin-forward and side tilt). Survives taking the buds out |
rotationRate |
Flick energy, hold-still, walk rejection |
userAcceleration |
Ignore tracking while you walk |
sensorLocation |
Which bud is the motion source |
Smoothing is a 1€ filter. A watchdog re-subscribes after idle/wake. Ear detection connect/disconnects as you put buds in or take them out.
| Path | What |
|---|---|
Sources/AirPoiseCore |
Math, pose, gestures, posture, settings. No AppKit |
Sources/AirPoise |
Menu bar, first-launch window, overlays, Settings |
Tests/AirPoiseTests |
Unit tests |
scripts/build-app.sh |
Build the .app |
Quit AirPoise, delete the app, and optionally:
rm -rf ~/Library/Application\ Support/AirPoiseTurn off Login Items if you enabled launch-at-login.
MIT © 2026 Jaskirat Singh
Onboarding fonts: Bangers and Archivo Black (SIL OFL), in Resources/Fonts/.
