vt100

punchcard

A one-binary CI server that runs the same mise run ci you run on your laptop, on a machine that remembers.

go install github.com/vt100io/punchcard@latest View on GitHub →
punchcard tui: a build arrives and streams its log, a newer push replaces a queued one, and a failed build is opened

Why

Hosted CI runners start from nothing on every build: a fresh machine, fresh tool installs, cold caches. Punchcard keeps a workspace per repo on a machine I own. When I push, it fetches, resets to the exact commit and runs the repo's ci task.

There is no CI language. The pipeline is a mise task in the repo, so if it passes on my laptop it passes in CI, and a CI failure can be debugged on my own machine.

A GitHub App posts the checks. A repo opts in by having a ci task; there is no list of repos to keep.

Getting started

  1. Install the binary with go install.
  2. Create a GitHub App: contents read, commit statuses write, push and pull request events.
  3. Start it with the webhook secret and the App's key: punchcard.
  4. Make it reachable: tailscale funnel --bg 8081 on a laptop, or unit deploy on a server.
  5. Add [tasks.ci] to a repo's mise.toml and push.
  6. Watch it: punchcard tui.

Leans on mise, GitHub App.