Last updated 2026-05-07
Runner Overview
The runner is a standalone Node.js server that reads
.github/workflows/*.yml, evaluates GitHub Actions
expressions, resolves marketplace actions, and executes workflows
locally. It exposes a REST API and an SSE stream so the CLI, the
web dashboard, or any HTTP client can trigger, monitor, and inspect
workflow runs in real time.
Why this exists
| Feature | GitHub Actions | act | @stax/runner |
|---|---|---|---|
| REST API for trigger / monitor | No | No | Yes |
| SSE real-time streaming | No | No | Yes |
| Sandboxed execution (worktree / CoW) | N/A | No | Yes |
| Secrets with encryption | Org-level | .env | SOPS + age from git, plus local mirror |
| Deployment ledger | Cloud history | No | Local JSONL + optional GitHub issue mirror |
| Matrix with fail-fast | Yes | Partial | Yes |
| Reusable workflows (local + remote) | Yes | No | Yes |
| Composite + Node + Docker actions | Yes | Docker only | Yes |
| Built-in shims (no Docker for shell) | N/A | N/A | Yes |
When to use it
- Instead of GitHub Actions: when you want fast iteration on CI workflows without pushing commits, or you need local-only execution (airgapped, private, cost savings).
- Instead of
act: when you need a REST API, SSE streaming, sandboxed execution, reusable workflow support, or Node.js action support without Docker.
Starting the runner
# Via the CLI (preferred)stax runner start --workspace /path/to/your/project --port 4800
# Directly (development)cd platform/runnerRUNNER_WORKSPACE=/path/to/your/project npm run devThe runner banner confirms its endpoints:
Local GitHub Actions runner started API: http://localhost:4800/api Events: http://localhost:4800/api/events Health: http://localhost:4800/health Workspace: /path/to/your/projectTrigger your first workflow
# List workflows the runner discoveredcurl http://localhost:4800/api/workflows
# Trigger onecurl -X POST http://localhost:4800/api/runs \ -H 'Content-Type: application/json' \ -d '{"workflow": "ci"}'
# With workflow_dispatch inputscurl -X POST http://localhost:4800/api/runs \ -H 'Content-Type: application/json' \ -d '{"workflow": "deploy", "inputs": {"environment": "staging"}}'Stream events
curl -N http://localhost:4800/api/eventsevent: pingdata: {}
event: run.starteddata: {"runId":"a1b2c3d4","run":{...}}
event: step.logdata: {"runId":"a1b2c3d4","jobId":"build","stepNumber":2,"line":"npm ci\n"}
event: job.completeddata: {"runId":"a1b2c3d4","jobId":"build","job":{"conclusion":"success",...}}What works out of the box
run:steps in bash, sh, python, or pwsh.-
uses: actions/checkout@v4— shimmed to a no-op since the workspace is already mounted. -
uses: actions/upload-artifact@v4/download-artifact— copies to / from$WORKSPACE/.artifacts/. -
uses: actions/cache@v4— filesystem cache at~/.local/share/local-runner/cache/. -
Setup actions (
setup-python,setup-java,setup-go,setup-ruby,setup-dotnet,setup-gradle,setup-xcode,flutter-action) — shimmed to detect system-installed tools. -
Matrix strategies with
include,exclude,fail-fast,max-parallel. -
Job dependencies via
needs:, conditionalif:, reusable workflows (local./and remoteorg/repo@ref), composite + Node + Docker actions, services viadocker compose. -
$GITHUB_OUTPUT,$GITHUB_ENV,$GITHUB_PATHfile protocols and the::set-output,::error,::warning,::group,::add-maskworkflow commands. -
Repo-backed SOPS + age secrets can be synced into the runner mirror and
consumed through
${{ secrets.NAME }}. -
Jobs with tracked
environment:names are written to a local deployment ledger and can be mirrored to a GitHub issue.
What's not supported
concurrencygroupspermissions/ OIDC tokensenvironmentprotection rules (environment names are parsed for logging only)workflow_runtriggerschedule(cron) trigger
Continue reading
- REST API — every endpoint, parameter, response.
- SSE events — every event type.
- Workflow compatibility — triggers, jobs, steps, expressions.
- Marketplace actions — caching, shims, private repos.
- Sandboxed execution — worktree / copy-on-write / copy / none.
- Secrets & backends — SOPS + age, local mirror, R2, GitHub.
- GitHub sync & deployment ledger — webhooks, issue sync, production logs.
- Matrix & reusable workflows.
- Configuration — every env var.
- Architecture — module diagram, execution flow.