aarondfrancis / fleet
git clone https://github.com/aarondfrancis/fleet.git
macOS app for a fleet of GitHub Actions self-hosted runner machines on a tailnet
+0
stars, 24h · #40,242
+~0
stars, 7 days · #45,137
+144
stars, 30 days · #5,200
144
★ total
16
forks · 1 open issues
Star history (as recorded here)
LanguageRust
License—
Created2026-10-09 (13d ago)
Last push4d ago
Watchers0
OwnerUser
Links
README excerpt
# Runner Dashboard A macOS app for watching GitHub Actions self-hosted runners across the machines on your Tailscale tailnet. It answers three questions per runner: is it installed, is it connected to GitHub, and is it doing work right now? **Personal project:** This is completely vibe coded for my own personal use case. I won't be accepting feature requests, but you're welcome to fork it and make it your own. - **Mac app** (Tauri 2 + React). Machines come from your tailnet. The sidebar lists each runner machine with its runners nested under it, below a fleet overview. A machine's pane shows its status, SSH health, diagnostics, inventory configuration, runner checks and pending changes. A runner's pane shows its GitHub and service state, its jobs, and how it compares with the inventory. - **SSH monitoring** reads CPU, load, memory, free disk, uptime and runner configuration from the machines. Nothing is installed on the machines. - **Event history and alerts** keep observed connections, reboots and runner service changes on this Mac, with offline and low-disk alerts and optional desktop notifications. Monitoring is read-only. Changes go through Runner Fleet's desired-state rules, ported to Rust: the app installs, reconciles, retires, decommissions or restarts runners only through reviewed plans against your inventory, `inventory/fleet.toml`. ## Requirements - macOS, with its built-in OpenSSH. - Tailscale, signed in to your tailnet. The app reads machines through the Tailscale CLI. - The GitHub CLI (`gh`), logged in as an organization owner. Monitoring can use a pasted token instead; changes always use the `gh` login. - Rust 1.93+, Node 22 and pnpm, to build. - python3, only for `scripts/fleet-parity.sh`. ## Quick start [code] Tests, lints, generated bindings and fixtures: see AGENTS.md. ## Demo data **View ▸ Toggle Demo Data** (⇧⌘D), or the button on the empty state, swaps in a fictional fleet (`acme-demo`, `*.demo.ts.net`) that runs through the same derivation as live data. A **DEMO DATA** banner shows while it's on, and live polling pauses. The browser-only preview always uses demo data. ## First live setup 1. Create your inventory: see Setup in the operating guide. The browser preview and tests work without one. 2. **Settings (⌘,) ▸ GitHub ▸ Add organization…**. By default it uses your GitHub CLI login: the app asks `gh` for its token when it needs one and keeps it in memory only. Listing an organization's runners needs an organization owner and the `admin:org` scope. If your login lacks the scope, Settings shows the fix: `gh auth refresh --hostname github.com --scopes admin:org`. For monitoring, you can paste a fine-grained token instead (organization permission **Self-hosted runners: Read**, repository permission **Actions: Read**), which is stored in your Keychain. Access is checked before anything is saved. 3. Machines come from your tailnet; there's no Add step. Machines in the inventory or with runners on GitHub are lis