OmniRouteTray
July 6, 2026 · View on GitHub
A cross-platform (macOS-first) menu-bar tray app that supervises, monitors, and auto-updates the OmniRoute AI router. It replaces the manual workflow of starting omniroute serve, keeping it running across reboots, and updating it by hand.
Built with Tauri v2 (Rust backend + web popover UI).
Features
- Tray-only — a rich menu-bar popover, no dock icon.
- Supervised server — spawns and keeps
omniroute serverunning, adopting an already-running instance instead of spawning a duplicate. - Bundled Node runtime — ships its own signed Node 24.x LTS and manages an app-owned OmniRoute install; does not depend on your global
bun/npm. - Live usage — provider quota bars, Claude Session/Weekly limits with reset countdowns (
% left/% usedtoggle), and a 30-day cost breakdown. - Auto-update — detects new OmniRoute releases and updates in place (staged install, atomic swap, rollback on failure).
- Start on login — optional launch at login.
- Doctor & logs — one-click diagnostics and server log access.
Install
Homebrew (recommended)
brew install --cask zoispag/tap/omniroute-tray
Homebrew clears the quarantine flag automatically, so the app launches cleanly.
Manual (.dmg)
Download the latest .dmg from Releases, open it, and drag the app to Applications.
Because public builds are ad-hoc signed (not notarized — that requires a paid Apple Developer account), Gatekeeper blocks the first launch. Clear the quarantine flag once:
xattr -dr com.apple.quarantine /Applications/OmniRouteTray.app
Or right-click the app → Open → Open.
How it works
- On first launch the app installs OmniRoute into
~/Library/Application Support/dev.omniroute.tray/omniroute-prefix/using its bundled Node runtime. This requires a network connection on first launch only. - It shares your existing
~/.omniroute/config and database, so it is continuous with any OmniRoute you already run. - Server data (quotas, cost) is read via the OmniRoute CLI (
--output json) and HTTP API on127.0.0.1:20128.
Development
Prerequisites: Rust (stable), Node 22+, Xcode command-line tools.
npm install
bash scripts/fetch-node.sh # download the bundled Node runtime
npm run tauri dev # run in development
npm run tauri build # produce a release bundle
Run the Rust test suite:
cargo test --manifest-path src-tauri/Cargo.toml
Signing & notarization
Release builds are ad-hoc signed by default. If you have an Apple Developer ID, set these repository secrets and the release workflow will Developer-ID-sign and notarize automatically:
APPLE_SIGNING_IDENTITYAPPLE_ID,APPLE_APP_SPECIFIC_PASSWORD,APPLE_TEAM_ID
Homebrew tap automation
On each tagged release the workflow updates the Cask in the homebrew-tap repo (new version + DMG checksum). Cross-repo pushes use a GitHub App token (short-lived, scoped to the tap), not a personal token.
To enable it:
- Create a GitHub App (Settings → Developer settings → GitHub Apps) with Repository permissions → Contents: Read and write.
- Install the App on the
homebrew-taprepository. - Generate a private key for the App.
- In the
omniroute-trayrepo, add secrets:TAP_APP_ID= the App's ID.TAP_APP_PRIVATE_KEY= the generated.pemcontents.
If these are absent, the release still publishes; only the Cask auto-update step is skipped.
License
MIT