Register the repositories a self-hosted runner watches, then run the daemon that builds an ephemeral devcontainer for each queued GitHub Actions job.
pks github runner <command> [options]$ pks github runner register owner/repoRegister a repository for the daemon to poll
$ pks github runner listShow every registration and its labels
$ pks github runner startPoll all enabled repos and run queued jobs
$ pks github runner pruneDelete duplicate registrations, keeping the newest
pks github runner runs GitHub Actions jobs on your own machine, one devcontainer per job, instead of on a GitHub-hosted or permanently installed self-hosted runner.
The runner is a foreground daemon plus a small local registration store. Registrations name the repositories to poll and the labels to claim jobs under; the daemon polls GitHub for queued workflow jobs on those repositories and builds a container through the devcontainer CLI for each one. Nothing is installed into the repository, and no runner service is left behind — when you stop the daemon, the machine stops taking work.
register, unregister, list, and prune operate purely on the local store, with no long-running process.start runs the daemon; status and stop inspect and signal it.devcontainer-runner unless --labels says otherwise.devcontainer CLI, then goes away.start runs a git-credential server over a Unix socket, scoped to the first enabled registration, so containers can git push without the GitHub token being written into them.--max-jobs on start is persisted into the runner configuration, not applied only to that run.~/.pks-cli/runner.log and stay out of the on-screen table.Registration is the gate. pks github runner register owner/repo refuses to store anything unless the authenticated identity has Admin permission on the repository, because GitHub issues just-in-time runner registration tokens only to admins. It also verifies that the Agentics Live GitHub App can see the repository, polling for up to five minutes while you grant access. What it writes is a local record — GitHub is not told about a runner until a job is claimed.
pks github runner start is the only command that talks to GitHub continuously. It refreshes the stored token, verifies Docker and the devcontainer CLI, starts the credential socket, and then polls every enabled registration — or a single repository, if you name one. It holds the terminal with a live status table until Ctrl+C, which triggers a graceful shutdown that waits for active jobs to finish.
register, unregister, list, prune.start.register · unregister · list · start · status · stop · prune
Every argument, flag, and default is listed on the pks github reference.
Note.
statusandstopread and signal an in-memory daemon inside their own process. Invoked from a second terminal, they report a daemon that was never started, and they change nothing. Stop a running daemon with Ctrl+C in its own terminal.
| Setting | Value |
|---|---|
| Runner labels | devcontainer-runner |
| Concurrent jobs | 1 |
| Registration store | ~/.pks-cli/runners.json |
| Daemon log | ~/.pks-cli/runner.log |
No environment variables configure this group. The GitHub App client ID, app slug, scopes, and endpoints are compiled into the CLI, and the rest of the state lives in the files above.
Add a repository to the pks runner store: admin-permission check, Agentics Live app access polling, custom labels, and duplicate replacement.
pks github runner register <REPO> [options]
Run the pks runner daemon in the foreground: pre-flight checks, a git-credential socket for containers, and one devcontainer per queued Actions job.
pks github runner start [REPO] [options]