Desktop App
roots is built with Tauri 2 and runs as a native macOS application. The desktop version is the recommended way to use roots.
Why Desktop?
- No CORS proxy — connects directly to service APIs
- Native performance — lightweight Rust backend
- OAuth deep linking —
roots://protocol for seamless Microsoft sign-in - Persistent storage — credentials stored in Tauri's secure store
- Small footprint — typically under 15 MB
Installation
Homebrew (recommended)
bash
brew tap konradmichalik/tap
brew install --cask rootsUpdate with brew upgrade --cask roots. Homebrew automatically removes the macOS quarantine attribute.
Manual Download
- Download from GitHub Releases
- Open the
.dmgand drag to Applications - Remove the quarantine attribute so macOS allows the unsigned app:bash
xattr -cr /Applications/Roots.app
macOS Gatekeeper
roots is not notarized through Apple. When installing manually, you must remove the quarantine attribute with the command above. Homebrew handles this automatically.
Building from Source
Prerequisites: Node.js 18+ and Rust toolchain.
bash
git clone https://github.com/konradmichalik/roots.git
cd roots
npm install
npm run tauri:buildThe built app is located in src-tauri/target/release/bundle/.
Tauri Backend
The desktop app uses these Tauri plugins:
| Plugin | Purpose |
|---|---|
plugin-http | HTTP requests without CORS restrictions |
plugin-store | Persistent key-value storage |
plugin-shell | Open external URLs in the browser |
plugin-deep-link | Handle roots:// OAuth callbacks |
There is one custom Tauri command (http_post_form) used for OAuth token exchange. It sends application/x-www-form-urlencoded POST requests, which the plugin-http module doesn't natively support.