Last updated 2026-05-07

stax

A local-first toolchain for shipping software fast. Three components, one developer experience: a stacked-diff CLI, a GitHub-Actions-compatible runner that executes workflows on your machine, and a web dashboard for review, triage, repo-backed secrets, and deployment visibility.

What is stax?

stax replaces the GitHub-only feedback loop with a local one. Your workflows run on your laptop the same way they would in CI, your diffs are reviewable before they ever touch the network, and your dashboard streams every job in real time. Secrets can live in git as SOPS-encrypted files, and production deployment records can be mirrored to a GitHub issue. Nothing is locked behind a SaaS — every component runs on your machine.

The repository ships:

  • CLI — a single stax binary (Go, with a legacy TypeScript implementation) that wraps git in a stacked-diff workflow. Cobra-powered, no git surface area exposed unless you ask.
  • Runner — a Node.js server (Express + TypeScript) that parses .github/workflows/, evaluates GitHub Actions expressions, resolves marketplace actions, and runs the whole pipeline on your machine. Exposes a REST API on :4800 and an SSE event stream. It can mirror repo-backed SOPS secrets into the local runner store and maintain a structured deployment ledger.
  • Web dashboard — a Next.js app that lists workflows, streams logs, browses runs and artifacts, and renders code reviews in a Monaco-backed diff viewer. The dashboard also exposes secrets status, recipients, verify/sync actions, GitHub sync, and deployment log configuration.
  • Built-in actions — like actions/video-capture, a Playwright-based action that records walkthrough videos for your web/iOS/Android apps.

Why a local runner?

  • Iteration speed. No more pushing a commit to test a workflow change. Edit the YAML, hit stax run, watch the SSE stream.
  • Cost. Long matrix builds, big test suites, video capture — all free on hardware you already own.
  • Air-gapped. Run private CI without sharing your code with a hosted provider.
  • Sandbox. Each run gets an isolated worktree (or APFS copy-on-write clone on macOS) so concurrent runs never stomp each other's working tree.
  • Compatibility. Workflows written for GitHub Actions Just Work — including matrix strategies with fail-fast and max-parallel, reusable workflows (local + remote), and composite/Node/Docker actions from the marketplace.
  • Secrets. Keep infra/secrets/prod.enc.yaml in git, encrypt it to each developer or CI recipient, and let Stax decrypt/export/sync it for local and production workflows.
  • Auditability. Production runs with tracked environment: values are written to .stax/deployments.jsonl and can be mirrored to a GitHub issue as deployment-log comments.

The lifecycle

1. Clone and start a feature

stax clone myorg/my-app
cd my-app
stax feature "user auth"

2. Save logical changes as stacked diffs

# edit code...
stax diff "Add login form"
# edit more code...
stax diff "Add JWT validation"
stax diffs # see the stack
# D1 Add login form (3 files)
# D2 Add JWT validation (2 files)

3. Run CI locally

# In one terminal
stax runner start
# In another
stax run ci
stax runs
stax runs logs <run-id>
# Or watch live in the browser
stax dashboard

4. Add repo-backed secrets when deployments need them

brew install sops
stax secrets keygen
stax secrets init --env production
stax secrets edit --env production
stax secrets verify
stax secrets sync runner

5. Submit and land

stax submit # opens a PR with the stacked diffs
# ... reviews / iterations ...
stax land # squash-merges to main

How the components fit together

┌──────────────────┐ HTTP / SSE ┌────────────────────┐
│ stax CLI │ ─────────────────▶ │ stax runner │
│ (Go binary) │ ◀───────────────── │ (Node REST :4800) │
└────────┬─────────┘ └─────────┬──────────┘
│ │ spawns
│ gh CLI / gh API ▼
▼ ┌────────────────────────┐
┌───────────┐ │ Workflow engine │
│ GitHub │ │ parser → scheduler → │
│ remote │ │ matrix → step-runner │
└───────────┘ └─────────┬──────────────┘
│ event bus
┌────────────────────────┐
│ stax web dashboard │
│ (Next.js app on :3000) │
└────────────────────────┘

Where to next