Turn a Linux box into your own coding agent.
Bring your own Linux box and CrazyToad makes it a safe, autonomous, cost-bounded coding agent: it reads, writes, runs commands, and runs full claude -p / codex exec loops on the host — confined to a workspace, dropped to an unprivileged user, behind a deny-list and an approval ladder. Drive many boxes at once from your local brain, alongside a Swarm (Lilly Pod) when the work is big.
At a glance
- A remote agent is a hardened, stdlib-Python program CrazyToad installs on a Linux box you own.
- Your local brain drives it to do real work on the host — read, write, run commands, run agentic loops.
- It coordinates many boxes at once, each running its own confined LLM agent.
- Autonomous but not unrestricted — non-root, cwd-locked, deny-listed, cost-capped, zero telemetry.

Chatbox, overview, live stream, daily log, and agent rail

Host setup with sensitive details redacted
What the agent can do on your box
The agent’s verbs fall into three classes — read-only, write/command, and orchestration — each with its own safety rung. The headline is the orchestration verb: claude -p and codex exec run as full agentic loops directly on the host.
git status, run tests — available even in observe/suggest.claude -p / codex exec loops, run confined as the non-root work user.gh CLI.Confined by the OS, then again in software
The load-bearing wall is the operating system: a dedicated unprivileged user, crazytoad-work, owns the workspace, and every write, command, and LLM loop drops to it — software guards layer defense-in-depth on top.
crazytoad-work user owns the workspace..., outside-absolute, and symlink escapes blocked..env / .ssh / keys / credentials / /etc refused at every rung.Three ways to install — on unlimited hosts
Every path runs the same idempotent provisioner: Node, the unprivileged work user, the workspace, a hardened systemd unit, and a locked-down box (UFW SSH-only, fail2ban, key-only SSH). The three routes:
- From the app over SSH — Remote Agents → add an SSH host → Install / Connect. CrazyToad deploys the agent, config, and systemd unit over SSH for you. Field-by-field setup is below.
- One-line, on the box — run the host-side bootstrap as root on the target Linux box:
curl -fsSL https://github.com/crazylegs-dom/crazytoad-releases/releases/latest/download/install.sh | sudo bash - Windows wrapper — from Windows, drive the install over SSH:
./install.ps1 -HostName <ip> -User root -KeyPath <key>
Add an SSH host
Click Add SSH host to open the “Add remote host” dialog. Auth is SSH private key only — no password field. On Save, CrazyToad verifies and pins the host key before any install is allowed. Saved keys live in the vault you manage in Manage.
22.-----BEGIN OPENSSH PRIVATE KEY-----.Install the CrazyToad Agent
Open the “Install CrazyToad Agent” dialog and choose a managed install (CrazyToad provisions the agent) or a generic log tail (read logs only). The managed agent streams health, answers Chatbox messages, exposes MCP listings, and self-tests before it connects. The driving account comes from Accounts.
/usr/local/bin/crazytoad-agent stream./usr/local/bin/crazytoad-agent chat -q {{message}}.{{message}} placeholder in the Message command — that’s where your Chatbox text is inserted.Set the run envelope
The run envelope is a four-rung safety ladder from least to most autonomy — start low, raise it as you trust the agent, and list Protected paths it must always pause on.
/etc/**, **/.env./etc/** and **/.env to fence off config and secrets.Install from a checkout (advanced)
You can also provision straight from a CrazyToad checkout — copy the agent and run the same hardened script by hand, replacing HOST and root with your own host and user.
- Copy the agent to the host —
scp deploy/remote-agent/agent.py root@HOST:/tmp/crazytoad-agent.py - Run the provisioning script —
ssh root@HOST 'bash -s' < deploy/remote-agent/provision.sh - Register the host — back in CrazyToad, add the host in the dialog (Add an SSH host) so CrazyToad can attach to the service you just provisioned.
crazytoad.remote-agent.v1 — newline-delimited JSON with a 15s heartbeat. Once attached, the Brain management panel catalogs the agent’s brain connections (MCP, API, Docs, Other) and shows each as live, planned, or error.