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).
- 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.
brew install --cask zoispag/tap/omniroute-trayHomebrew clears the quarantine flag automatically, so the app launches cleanly.
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.appOr right-click the app → Open → Open.
- 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.
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 bundleRun the Rust test suite:
cargo test --manifest-path src-tauri/Cargo.tomlRelease 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
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.
MIT