Stack256 · 001

Describe the task. Review the pull request.

Paco runs coding agents on your own hardware. Each one works in an isolated sandbox until the job is done — editing files, running the app, committing, and opening a pull request you review. No vendor account, no API key.

What makes it different

Most of these are consequences of one decision: run it yourself, on a real machine, with real git.

  • Your Claude subscription

    The agent is the Claude Code CLI, driven headlessly. It signs in with the subscription you already pay for — there is no API key to buy and no per-token bill from us.

  • A sandbox per session

    Work happens in a Docker container against a workspace directory on the host. Because the workspace is a real directory, state survives container restarts without snapshots.

  • Real git, not a diff view

    A session is a repository; a chat is a worktree on its own chat/<id> branch. Two chats can touch the same file without colliding, and each ends in its own pull request.

  • Destructive actions ask first

    Reads, in-worktree edits and ordinary dev commands run untouched. rm -rf, force pushes, sudo and writes outside the worktree stop and wait for you.

  • Runs survive restarts

    Each step is persisted to Postgres by the durable workflow engine, so a run outlives a reboot and can be resumed or cancelled rather than lost.

  • Work is tiered across models

    An Opus-class model orchestrates while Sonnet and Haiku subagents do the mechanical work — which is where most of the token volume goes.

How it fits together

The agent runs on the host, with the chat’s worktree as its working directory. The container is where the generated app runs — so a dev server has to be started inside it to be reachable.

Browser  →  Next.js + durable workflow  →  Claude Code (host)  →  Docker sandbox

Installing it

One command on a Linux host running systemd. It adds the signed Stack256 APT source and installs the paco package.

  1. Run one command

    Docker, PostgreSQL, nginx, a bundled Node runtime and a bundled Claude Code CLI all come with it — installed, configured and started before the command returns. There is nothing to wire together afterwards.

    curl -fsSL https://apt.stack256.org/paco/install.sh | sudo sh
  2. Sign it into Claude

    The one step an installer cannot do for you, because it needs your account. Until it is done, every turn fails with nothing to run.

    sudo paco auth
  3. Open it

    First run walks you through creating the admin account, confirming the address, and optionally setting up outgoing mail.

    http://<this host’s address>/

The sandbox image is fetched for you. The first chat pulls ghcr.io/stack256org/paco-sandbox, which is a few gigabytes and happens once. Pre-pull it with docker pull ghcr.io/stack256org/paco-sandbox:latest if you would rather not wait at that moment.

What it needs

Host Linux with systemd, and root access
Architectures amd64 and arm64
Ports 80 and 443, free — nginx owns both, and there is no flag to move them
Database PostgreSQL, installed with the package and reached over a Unix socket — no TCP listener, no password
Containers Docker, for chats — installed and wired up by the installer, not something you set up first
Model access An existing Claude subscription, via paco auth
Updates apt upgrade, like everything else on the host
Licence Open source — every line readable in the repository

Have a look at the code

Paco is the first of 256. If something here is wrong, or missing, the issue tracker is the right place for it.