Pitwall
Self-hosted · no telemetry

Write a ticket.
Get a pull request.

Pitwall drives headless Claude Code agents through a fixed pipeline on your own machines, and only asks you when a human is needed.

Quickstart · any Linux host with Dockercoming soon
$ curl -fsSL https://get.pitwall.dev/docker-compose.yml -o docker-compose.yml \
  && docker compose up -d
One image plus Postgres. Open localhost:8080 and add your first runner.
How it works

Four stages, every ticket.

No prompts to babysit. Each step has one job, a gate it has to pass, and a limit on how often it can send work back.

  1. 01

    Write a ticket

    Say what you want and attach the files the agents should read. The plan writes the acceptance criteria.

    ticket → enrich → plan
  2. 02

    A runner picks it up

    A small Go binary on the machine that holds the repo checks out a branch and starts Claude Code headless.

    pitwall-runner · linux-01
  3. 03

    Agents run the pipeline

    Implement, review, check every criterion. A failed check sends the run back, up to its limit, then the run blocks and tells you.

    implement → code-review → qa-code
  4. 04

    You test and merge

    Pitwall writes the manual test steps, you tick them off, and the pull request is ready to merge.

    manual tests → PR #48
What you get

Small to run. Quiet until it needs you.

One image plus Postgres

The core is a single Docker image and a Postgres database. The web UI, the pipeline and the runner gateway all live in it.

Runners on your machines

Your code is checked out and changed only on your runners. A runner is a small Go binary that dials out; no inbound ports.

A deterministic pipeline

Same steps, same order, same gates. Every step is logged with its tokens and its time.

Questions only when needed

Agents ask when a fact is missing; a loop limit blocks the run. Everything else waits in the log, not your inbox.

An inbox that fits a phone

Answer a question, tick off a test or merge a PR from your phone. Telegram pings are optional.

No telemetry

Pitwall phones home to nobody. The only outbound calls are the ones you configure: GitHub and Telegram from the core, Claude from your runners.

The board

Every ticket, every step, one screen.

amber = needs you
localhost:8080/board
Board9 tickets · 4 projects1 agent running · 1 pausedNew ticket C
Backlog 2
PIT-34 · pitwallShow runner disk usage in statusfeature
PG-151 · puzzle-gameLevel select scroll jumps on iPadbug
Queued 1
BP-92 · billing-portalProration on mid-cycle plan downgradewaits for BP-88
Running 2
BP-88 · billing-portalSeat-based pricing for Team planimplement · 11m
PIT-29 · pitwallRunner heartbeat after laptop sleep‖ limit · 18:30
Needs you 2
PG-142 · puzzle-gameScore resets after app resume on iOSTest · 7 steps
MA-17 · mobile-apiRate limit headers missing on 429Answer
Done 2
PIT-27 · pitwallRetry runner jobs on SSH disconnectmerged · #47
PG-139 · puzzle-gameHaptics toggle in Android settingsmerged · #45
Swipe to see all five columns →

Run it on a box you already have.

One image plus Postgres for the core, and a runner on the machine that holds your code.