Replace the host-group-membership workaround in entrypoint.sh with a real UID/GID sync — on boot the sandbox user's UID/GID is rewritten to match the bind-mounted repo's owner, so anything the sandbox creates in-container is owned by the host user on the host (no chown handoff). Delete the 11 in-tree compose overlays (claude/codex/deepagents/opencode/ pi-host.yml, ssh.yml, ssh-generate.yml, sshd.yml, git.yml, postgres.yml, cloudflared.yml), the /cloudflared-tunnel skill, install/cloudflared-tunnel.sh, the SANDBOX_PASSWORD plumbing, the *_HOST_BIND_MOUNT skip-clauses in entrypoint.sh, the git-worktree resolver block, and the host-UID overlay-stripping block in scripts/install.sh. config.json's composeOverrides[] stays as the extension point for downstream packs. Doc / skill text references to deleted things are deferred to a follow-up PR. Closes #283 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
🏗️ Open Harness
Open Harness is a Docker-based agent harness for one project, agent-tended over time. One docker compose up gives you a long-lived sandbox where Claude (or another agent of your choice) runs against a single repo, branch, and identity — not a multi-tenant comparison rig.
- One project, one sandbox. A single container scoped to a single repo. The agent owns its branch and its workspace; you keep your laptop clean.
- Agents that work while you sleep. A tiny croner runtime reads
crons/*.mdmarkdown and wakes the agent on a schedule. - Only host dependency: Docker. No Node, no Python, no toolchain rot on your laptop.
- Composable infra. Cherry-pick Postgres, Cloudflare tunnels, SSH, Caddy gateway via Compose overlays.
- Slack-ready. The in-tree Pi extension at
.pi/extensions/slack/bridges Slack to a Pi agent — see docs/integrations/slack.md. - Multi-agent? Add a pack. Other multi-agent setups ship as separate packs — see
@ryaneggz/mifune.
📦 Install
curl -fsSL https://oh.mifune.dev/install.sh | bash
The installer clones into ~/.openharness, offers to share your host
gh token, writes .devcontainer/.env, and builds the image (~10 min
cold, ~30s warm). Only host dependency: Docker.
🚀 Use it
cd ~/.openharness
make shell # enter the isolated sandbox
# inside the sandbox, launch any core agent:
# claude # Claude Code (default)
# codex # OpenAI Codex CLI
# opencode # OpenCode
# pi # Pi Coding Agent
# deepagents # LangChain DeepAgents (multi-provider)
make destroy # stop and remove the sandbox
make help # all targets
Prefer VS Code or remote SSH? Use the Dev Containers extension's "Attach to Running Container" against openharness, or SSH into your host first and then attach.
⚙️ Configure (optional)
.devcontainer/.env is generated with safe defaults during install. Open
it any time to change SANDBOX_NAME, set a different GH_TOKEN, change
TZ, set SANDBOX_PASSWORD (sshd overlay), or set SLACK_* tokens for
the Pi Slack extension. Apply with make destroy && make sandbox.
Manual setup (no installer)
git clone https://github.com/ryaneggz/open-harness.git && cd open-harness
make sandbox
make shell
✨ What you get
| Core agents | Claude Code, Codex, OpenCode, Pi |
| Runtimes | Node 22, pnpm, Bun, uv (Python) |
| DevOps | Docker CLI + Compose, GitHub CLI, cloudflared, tmux, croner |
| Browser | agent-browser + Chromium (headless) |
| One project, one sandbox | A single container scoped to a single repo and branch |
| Crons | Markdown-defined schedules in crons/*.md driven by the in-container croner runtime |
| Multi-agent | Install a harness pack such as @ryaneggz/mifune for additional multi-agent setups |
📚 Where to go next
- Quickstart — full step-by-step
- Crons — markdown-defined autonomous tasks
🧹 Cleanup
make destroy
🤝 Contributing & community
Issues and PRs welcome at github.com/ryaneggz/open-harness. If Open Harness is useful to you, please give us a star.
📄 License
MIT.