Browse by type
One-click GitHub Actions self-hosted runners for macOS & Windows
HomeRun replaces the manual GitHub self-hosted runner setup process with a unified desktop app and terminal UI. Authenticate with GitHub once, pick a repository, and launch runners with a single click. HomeRun handles download, registration, process management, log streaming, and resource monitoring — everything the official docs make you do by hand.
HomeRun runs on macOS and Windows, with Linux support planned.
homerun --no-tui commands with colored output for automationcargo fmt, cargo clippy, conventional commits, and Prettier on every commit┌──────────────┐ ┌─────────┐
│ Tauri App │ │ TUI │ (thin clients)
└──────┬───────┘ └────┬────┘
└────────┬────────┘
│ IPC (REST + SSE + WebSocket)
┌────────┴────────┐
│ homerund │ (daemon — Unix socket or Windows named pipe)
└────────┬────────┘
│ spawns / monitors
┌─────────┼─────────┐
│ │ │
┌──┴──┐ ┌──┴──┐ ┌──┴──┐
│Run 1│ │Run 2│ │Run N│ (GitHub Actions runner processes)
└─────┘ └─────┘ └─────┘
Runners are native child processes of the daemon — not Docker containers. Each runner is an instance of the official GitHub Actions runner binary. All GitHub communication is outbound HTTPS. No inbound ports needed.
For the full architecture deep-dive (runner lifecycle, state machine, process management, auth flow), see docs/ARCHITECTURE.md.
New to self-hosted runners? See How Self-Hosted Runners Work for a primer on runner communication, permissions, security considerations, and what HomeRun automates.
.dmg for your architecture from Releases:HomeRun_<version>_aarch64.dmgHomeRun_<version>_x86_64.dmg.dmg and drag HomeRun to Applicationssh
xattr -cr /Applications/HomeRun.app
The .dmg bundles the homerund daemon inside the app. Releases are automated via release-please — every merge to master with conventional commits triggers a Release PR with version bumps and changelog.
brew tap aGallea/homerun
# CLI tools (homerun + homerund)
brew install homerun
# Desktop app (not code-signed — remove quarantine after install)
brew install --cask homerun
xattr -cr /Applications/HomeRun.app
HomeRun_<version>_x64-setup.msi from Releaseshomerund daemonPrerequisites: Rust 1.75+ (rustup.rs), Node.js 20+. On macOS: Xcode Command Line Tools (xcode-select --install). On Windows: Visual Studio Build Tools with C++ workload.
git clone https://github.com/aGallea/homerun.git
cd homerun
macOS:
make setup # checks prerequisites, builds daemon + TUI, installs frontend deps
Windows:
# Daemon + TUI (release binaries)
cargo build --release -p homerund -p homerun
# MSI installer (copies the daemon sidecar, builds the frontend, and packages the MSI)
copy target\release\homerund.exe apps\desktop\src-tauri\binaries\homerund-x86_64-pc-windows-msvc.exe
cd apps\desktop
npm install
npx tauri build
# Output: apps\desktop\src-tauri\target\release\bundle\msi\HomeRun_<version>_x64_en-US.msi
Any platform (manual build):
# Daemon + TUI
cargo build --release -p homerund -p homerun
# Desktop app (requires Node.js — builds DMG on macOS, MSI + NSIS on Windows)
cargo build --release -p homerund
cp target/release/homerund$(rustc -vV | grep host | cut -d' ' -f2 | sed 's/^/-/') apps/desktop/src-tauri/binaries/
cd apps/desktop && npm install && npx tauri build
# Start the daemon (required by both the TUI and desktop app)
make dev # or: ./target/release/homerund
# Launch the TUI (in another terminal)
make tui # or: ./target/release/homerun
# Launch the desktop app (in another terminal)
make desktop # or: cd apps/desktop && npm run tauri dev
# CLI mode (no interactive UI — useful for scripts)
homerun --no-tui list
On Windows (PowerShell):
.\target\release\homerund.exe # start daemon
.\target\release\homerun.exe # launch TUI
.\target\release\homerun.exe --no-tui list # CLI mode
Note: The desktop app release bundles the daemon inside the app (DMG on macOS, MSI on Windows). When building from source, start the daemon separately before launching the desktop app.
Run make help (macOS) to see all available commands.

Runners dashboard — live status, CPU usage, and job progress at a glance

Repository scanning — find repos that use self-hosted runners across local and remote sources

Runner detail — live job steps, log streaming, and full job history

Daemon view — child processes, resource usage, and live daemon logs

Menu bar with runner status | Mini view for quick monitoring

TUI — k9s-inspired keyboard-driven interface with runner details and job history
The --no-tui flag disables the interactive terminal UI and prints plain text output instead. This is useful for scripting, automation, and quick status checks.
# List all runners with status, mode, and CPU usage
homerun --no-tui list
# Show overall status (daemon, auth, runner counts, system metrics)
homerun --no-tui status
# Scan a local workspace for repos using self-hosted runners
homerun --no-tui scan ~/workspace
# Scan your GitHub repos remotely (requires authentication)
homerun --no-tui scan --remote
# Combine local and remote scanning
homerun --no-tui scan ~/workspace --remote
# Manage the daemon
homerun --no-tui daemon start
homerun --no-tui daemon stop
homerun --no-tui daemon restart
| Component | Technology |
|---|---|
| Daemon | Rust + Axum (async HTTP/SSE/WebSocket over Unix socket / Windows named pipe) |
| TUI / CLI | Rust + Ratatui + Clap |
| Desktop app | Tauri 2.0 + React + TypeScript |
| Process management | tokio::process + sysinfo |
| GitHub API | octocrab crate |
| Auth token storage | File-based (~/.homerun/auth.json) |
| Log streaming | Server-Sent Events (SSE) |
| Real-time updates | WebSocket |
| Auto-start | macOS launchd / Windows Task Scheduler |
| Notifications | macOS native (mac-notification-sys) |
| Feature | Description | Issue |
|---|---|---|
| Live log streaming | Capture runner step logs locally for fully real-time job progress | #44 |
| Docker runners | Run runners inside containers — isolated environments, resource limits, ephemeral mode | #84 |
| Kubernetes backend | Manage runners as pods in a K8s cluster | #89 |
| Cross-platform (Linux) | Extend to Linux (systemd auto-start, packaging) | #112 |
| Organization-level runners | Manage runners at the GitHub org level, not just per-repo | — |
Priorities depend on user interest — if a feature would be useful to you, drop a thumbs-up on the issue.
macOS:
Windows:
Both platforms:
Daemon won't start / "socket already exists"
macOS/Linux: A stale socket file may exist from a previous crash. Remove it and try again:
rm ~/.homerun/daemon.sock
homerund
Windows: Named pipes are cleaned up automatically when the process exits. If the daemon reports the pipe is active, another instance may still be running. Check with tasklist | findstr homerund.
Authentication fails / "token expired"
Re-authenticate by running the
$ claude mcp add homerun \
-- python -m otcore.mcp_server <graph>