RunnerDeck logo RunnerDeck Community
View on GitHub
local-only · single machine · zero setup

A local dashboard for your
self-hosted GitHub Actions runners

See their real GitHub-reported status, see whether the local process is actually running, tail logs live, and start/stop/restart a whole pool, one at a time or all at once. No hand-editing pidfiles, no SSHing in to run ps aux | grep.

Plain PHP, no framework, no build step, no Composer dependencies. A bit of vanilla JS. That's it.

Screen recording of the RunnerDeck dashboard with a live runner pool
RunnerDeck dashboard in dark mode, showing stat cards, CPU/RAM history charts, and a table of runners Live log viewer in dark mode with search highlighting matching lines The Add Runner dialog in dark mode The Settings page in dark mode — GitHub, Pool, Alerts, Access, and Host as tabs

What it actually does

No agent, no cloud service, no telemetry. It reads the same files and calls the same GitHub API your terminal would.

Real local process state

Reads each runner's .runner config and runner.pid directly, with a live scan as a fallback: /proc on Linux, ps/lsof on macOS, CIM on Windows. A runner never goes silently "invisible" just because its pidfile went stale.

Zero manual pre-setup

Starting an unconfigured slot downloads the official runner package for your OS/arch, checksum-verifies it, requests a fresh registration token, and runs config.sh. The same flow you'd do by hand, done for you.

Fails closed, not open

Before any Stop, Rename, or Delete, it checks GitHub's busy flag and asks for confirmation if the runner is mid-job, or if that status can't be verified at all.

Add, rename, delete

Give a runner its own GitHub-registered name, rename it later (deregisters and re-registers cleanly), or delete it permanently. Binaries, config, and logs included.

Live CPU/RAM, honestly

Per-runner usage via ps, plus a rolling one-hour pool-wide history chart backed by a small local SQLite file. No fabricated trends. If there's no data, it says so.

Org or single-repo scope

Manage runners across a GitHub org you admin, or scope everything to one repo you own. No org access required, configurable straight from the UI with a first-run setup screen.

Optional login for remote access

Localhost-only with no login by default. Want to reach it from another device? bin/setup-totp.php adds an authenticator-app code gate — put a TLS-terminating reverse proxy in front and you're covered.

Crash-loop protection, with a heads-up

Auto-restart brings a crashed runner back up, backing off after a few failed attempts instead of retrying forever. An optional webhook — Slack and Discord URLs detected automatically — tells you the moment it happens, even with no dashboard tab open.

History, crashes, outbox, bundles

Host CPU/RAM history, per-runner crash counts, a webhook outbox that retries and then tells you it gave up, and a daily host bundle you can download if the machine dies. Same local files the dashboard already keeps.

Settings that fit on a laptop

GitHub, Pool, Alerts, Access, and Host are tabs, not one long scroll. Hover help on Drain, Pause AR, and the rest. The shell stays lined up from the sticky header down to a phone-width table.

Runs on what you're already on

Modern versions of Linux, macOS, and Windows, not every version ever shipped. See Getting started for the exact version floors.

PlatformSupportNotes
Linux Native PHP 8.1+ with posix/pcntl (Fedora/RHEL: install php-process). CI runs PHPUnit on Ubuntu latest and 22.04 (x64 + arm), distro apt PHP on Ubuntu 22.04 and Debian 12, distro dnf PHP on Fedora, Rocky 9, and RHEL UBI 9, plus an Alpine/musl boot smoke.
macOS Native Process liveness falls back to ps/lsof (no /proc on Darwin). CI unit-tests PHP 8.1 and 8.5 on macOS 15, 8.5 on macOS latest, and 8.5 on Intel (macos-15-intel). Homebrew sets the real macOS version floor.
Windows Native, or via WSL2 run.ps1 runs natively and manages Windows runners (config.cmd/run.cmd), so runs-on: windows jobs work. Needs PHP 8.1+ on PATH and gh; processes are controlled with PowerShell and taskkill, so posix/pcntl are not needed. Stop is always forced, the built-in server is single-threaded, and CI runs the Windows tests plus a real PowerShell/taskkill smoke on windows-latest and windows-2022 (not the full suite). run.ps1 -Wsl manages Linux runners inside WSL2 instead.
Docker docker compose up Alternative to installing PHP, or WSL2 on Windows, at all — docker compose up --build. CI builds the image and boots it on every push.

Community & Cloud

RunnerDeck itself is free and stays that way. Cloud is for teams who'd rather not run the dashboard themselves.

Free · open source

Community Edition

What's on this page. Self-hosted and local-only, MIT licensed. It runs on your own machine and talks to your own GitHub account — nothing leaves it.

  • Full runner lifecycle: add, start, stop, rename, delete
  • Live CPU/RAM, crash history, webhook outbox, host bundles
  • Org or single-repo scope, GitHub App or gh login
  • No telemetry, no account required
Get started
Paid · cloud-hosted

Cloud

A hosted version of RunnerDeck for teams managing runners across multiple machines, with nothing to install or keep running yourself.

  • Managed, always-on dashboard — no server to babysit
  • Multi-machine, multi-org runner fleets in one view
  • Early access is by direct conversation, not a signup form
Get in touch

Quickstart

No .env required to get started. The dashboard walks you through setup on first load.

# clone and run, no build step, no composer install needed
git clone https://github.com/AnikethTS/RunnerDeck.git
cd RunnerDeck
./run.sh                    # binds 127.0.0.1:8090

# open http://127.0.0.1:8090/, pick org or repo scope on the setup screen

# or, no PHP install needed:
docker compose up --build