roost

roost

Docker app from aronjanosch's Repository

Overview

A home for your remote coding agents, built for herdr. Claude Code, Codex, opencode and friends run in this container and you drive them over SSH with herdr (herdr.dev): close the laptop and they keep working; reattach from another machine or your phone. Pubkey-only SSH as user agent, no sudo, no Docker socket. Paste your public key(s) into Public keys (comma-separated), then connect: ssh -p 2222 agent@[Unraid-ip]. First start installs the tools (a few minutes, see the log).

roost

A home for your remote coding agents.
Built for herdr.

install · connect · set up · docs

image license stars

Deploying roost with docker compose on a NAS, then ssh roost and herdr from the laptop

roost is one Docker container for your NAS, homelab or VM. Claude Code, Codex, opencode and friends live in it, and you drive them from herdr. Close the laptop, and the agents keep working. Open herdr on another machine or your phone, and you are back in the same sessions.

  • A normal container: one compose file, one port, your public key. No scripts to run on the docker host.
  • Plain SSH in: pubkey-only, one user (agent). Works with ssh, herdr, VS Code Remote, SFTP, Termius, Heeler.
  • Agents ready on first start: harnesses, herdr, gh/glab, headless Chromium + Playwright MCP, all via mise.
  • Contained: no sudo, no Docker socket. Agents cannot add logins.
  • Persistent: logins, repos and tools live in one volume and survive updates.

Install

On the docker host, in an empty folder:

curl -fsSLO https://raw.githubusercontent.com/aronjanosch/roost/main/compose.yml
cat > .env <<'EOF'
PUBLIC_KEYS="ssh-ed25519 AAAA... laptop,ssh-ed25519 AAAA... phone"
GIT_USER_NAME="Ada Lovelace"
GIT_USER_EMAIL="ada@example.com"
EOF
docker compose up -d
docker logs -f roost      # first start installs tools; wait for "roost bootstrap done"

Only PUBLIC_KEYS is required. Everything else (port, paths, uid, harnesses, extra packages) is in .env.example. Change a value, then docker compose up -d again. On Unraid, use uid/gid 99:100 and paths under /mnt/user/appdata.

Connect

# ~/.ssh/config: pick any alias
Host roost
  HostName <docker-host>
  Port 2222
  User agent
ssh roost                              # shell in the box
herdr machine add roost --label roost  # sessions show up next to your local ones

From your phone: any SSH app works (Termius, Heeler, …). Same host, port 2222, user agent, the app's key in PUBLIC_KEYS. Run herdr to attach. Your phone needs to reach the host: same LAN, or a VPN such as Tailscale.

Set up inside

Start an agent in the box and ask it to set up roost. The built-in roost-setup skill walks you through what is still missing: git identity, gh login, agent logins, cloning your repos into ~/projects, tools your projects need, and how to connect more devices.

Already logged in on your laptop? Copy those logins across instead (never private keys):

git clone https://github.com/aronjanosch/roost
roost/bin/roost-migrate roost        # your ssh alias for the box; asks per group

Update

docker compose pull && docker compose up -d   # logins, repos and tools stay

Running agent sessions stop during the recreate.

Docs

Security

The box runs agents in bypass mode, so treat it as one trust zone. Don't expose port 2222 to the internet. See SECURITY.md.

License

MIT

Requirements

An SSH key pair on the device you connect from. Internet access on first start (tools install into the home folder, a few minutes).

Related apps

Details

Repository
ghcr.io/aronjanosch/roost:latest
Last Updated2026-10-18
First Seen2026-10-18

Runtime arguments

Network
bridge
Shell
bash
Privileged
false
Extra Params
--init --shm-size=1g --memory=6g --pids-limit=2048

Template configuration

SSH portPorttcp

Port your devices connect to (ssh -p 2222 agent@unraid). Keep it on LAN/VPN.

Target
22
Default
2222
Value
2222
Public keysVariable

SSH public keys allowed to log in as agent, comma-separated (laptop, phone, ...).

Target
PUBLIC_KEYS
HomePathrw

Logins, repos and tools. Survives updates.

Target
/home/agent
Default
/mnt/user/appdata/roost
Value
/mnt/user/appdata/roost
SSH identityPathrw

Host key (generated on first start) and extra authorized_keys.

Target
/etc/roost/ssh
Default
/mnt/user/appdata/roost-ssh
Value
/mnt/user/appdata/roost-ssh
PUIDVariable

User id that owns the home folder.

Default
99
Value
99
PGIDVariable

Group id that owns the home folder.

Default
100
Value
100
TZVariable

Timezone, e.g. Europe/Berlin.

Default
UTC
Value
UTC
Git user.nameVariable

Git identity for commits made in the box.

Target
GIT_USER_NAME
Git user.emailVariable

Git identity for commits made in the box.

Target
GIT_USER_EMAIL
GitHub tokenVariable

Optional. Logs gh in on start and lets git use it for HTTPS. Fine-grained, only the repos you need.

Target
GH_TOKEN
HarnessesVariable

Coding agents to install (mise ids, space-separated).

Target
HARNESSES
Default
claude codex opencode
Value
claude codex opencode
ToolsVariable

Extra tools (mise specs). herdr is required.

Target
TOOLS
Default
herdr uv gh glab npm:ccusage npm:playwright npm:@playwright/mcp
Value
herdr uv gh glab npm:ccusage npm:playwright npm:@playwright/mcp