Always on.
An always-on orchestrator-agent

An agent that runs while you sleep.
Sandboxed. Budgeted. Earns autonomy gradually.

Chad reads mail every hour, drafts replies inside a kernel-isolated sandbox, delegates to typed sub-agents under per-binary network policies, and never auto-sends anything you haven't allowlisted. The autonomy roadmap is a config file. The kill switch is a single touch.

What Chad is

Three properties that define the design — every architectural choice traces back to one of them.

Always on

Cron is the agent's contract with the day

Twelve standing cron jobs check mail, sweep the brain nightly, audit the budget weekly, propose memory consolidations on Saturdays, apply narrow self-tunings daily, and — newest — run an autonomous experiment loop nightly that scans memory for tasks worth automating and either keeps or retires them per a regression threshold. Each cron is a one-line wrapper invocation; heavy work happens inside the wrapper, not in the prompt. Three host-side launchd watchdogs supervise the pod from outside (gateway, chat-shim, spawn-poll) so token-expensive supervision moves off the agent.

Delegates safely

Sub-agents draft, parents publish

Seven sub-agent kinds, each pinned to a binary path under an L7 network policy. A reviewer kind is GET-only on GitHub — it can read PR diffs but cannot post. Spawns can route to a kernel-isolated GitHub Actions runner per job for substrates where in-container execution is too coarse.

Earns autonomy

Every irreversible action runs through a gate

An auto-actions.json policy file is the visible map of what Chad can do today. auto ships immediately, draft parks for review, block means no. A kill-switch file at .auto-disabled halts everything in one touch.

Three concentric rings

A naked CLI agent has no blast radius story. Chad runs inside three boundaries — host, container, sandbox — each with a different threat model and a different answer to "what happens if a prompt-injection rewrites the next instruction."

HOST · MACOS / LINUX nemoclaw CLI · credentials · launcher CONTAINER · OPENSHELL GATEWAY capsh drops · L7 proxy · OPA policy SANDBOX · PER-BINARY EGRESS Chad · pi · claude · gh · curl · gbrain 7 sub-agent kinds · 12 cron jobs · 3 host watchdogs Memory: lancedb + wiki + gbrain + workspace Substrate: local · GitHub Actions runner → GHA
  • L1 · HOST
    nemoclaw CLI · credentials · launcher

    Operator's machine. Holds creds, runs the launcher, hosts the Cloudflare tunnel.

  • L2 · CONTAINER
    OpenShell gateway · capsh drops · L7 proxy

    Capability drops at entrypoint. L7 proxy validates every egress. Policy hash-checked at boot.

  • L3 · SANDBOX
    Chad + per-binary egress allowlists

    Each binary is pinned to a network policy. Compromised writer can't reach GitHub. Compromised reviewer can't post.

  • L3.5 · BREAKOUT
    GitHub Actions runner per spawn

    Kinds tagged substrate: gha spawn into a fresh runner for the job. True per-spawn isolation; loses L7 enforcement.

Four memory layers

Each store has a different shape and a different job. They don't compete; they layer. The decision tree for "where does this fact go" is three lines.

workspace files (always-injected)

The agent's identity

SOUL · USER · IDENTITY · AGENTS · TOOLS · MEMORY · HEARTBEAT — char-bounded markdown loaded into every main session. Operator-owned. Never overwritten by automation.

memory-lancedb (semantic LTM)

Fuzzy episodic recall

NVIDIA NV-Embed-v1 at 4096 dims. autoCapture fires on multilingual triggers (remember/preferences/decisions/contact). autoRecall injects relevant memories before each turn.

memory-wiki (named-entity)

Look up by name

Obsidian-style vault in bridge mode. Page per system / correspondent / recurring topic. Backlinks form a graph. Populates organically as the agent captures structured artifacts.

gbrain (cross-domain hybrid)

Vector + graph knowledge

PGLite-backed; subprocess CLI only (file-locked, single-process). Two books fully ingested for the fitness sub-agent kind. Daily dream cycle consolidates and re-extracts.

Highlighted features

A non-exhaustive tour. The full surface lives in the docs.

Three feedback loops

Curator + budget audit + proposal apply

A weekly Hermes-style curator proposes memory consolidations (draft-only). A weekly budget-audit rolls up last-50-runs telemetry into feedback-proposals.md. A daily chad-proposal-apply applies a narrow safe-list of cron tunings — gated by chad-action-gate, snapshots first.

Popebot-style spawn

Branch-as-job-record

Sub-agent spawns can target a GitHub Actions runner. Each spawn is a branch in a private state repo carrying prompt + manifest; the runner commits result back. Async mode returns task_id immediately and a poller cron reconciles when the work finishes.

Provider routing

NVIDIA fallback, no provider lock-in

OpenAI-compatible binaries (codex, opencode) auto-pick OpenAI when the key is set, fall back to NVIDIA Nemotron via integrate.api.nvidia.com when it isn't. Claude requires Anthropic; everything else is portable.

Pre-mutation snapshots

Reversible, by default

Before the curator (or any bulk memory op) mutates anything, lancedb + wiki + workspace get tar.gz snapshots. Last 5 retained. Rollback is itself reversible — it snapshots current state first.

Action gate

The autonomy boundary, in JSON

Every external action passes through chad-action-gate. Per-target overrides — operator@example.com: auto, _default: block. Daily counters. Audit log. Touch .auto-disabled to halt everything.

Honest about cost

500k tokens/day, UTC reset

Honor-based budget (the kernel doesn't enforce — that's the inference rate-limiter's job). Every cron has a budget guard; sub-agent spawns reserve before launching. Weekly audit rolls up p95 latency by kind and proposes timeout adjustments.

Premium escalation

Anthropic, behind a binary-pinned wall

For tasks where Nemotron's depth runs out, Chad escalates to Claude through chad-premium. The L7 proxy pins both the wrapper *and* the curl invocation, so a compromised Python script can't reach api.anthropic.com. AuthContext is required; cron ticks with no inbound trigger fail closed.

Public roadmap

What's deferred and why

Phase 2 isn't a wishlist — it's a list of intentional defers. k3s-pod substrate, cron DSL, MCP hub, multi-Chad scheduling — each has a "when it'll matter" attached. A few items are out of scope on purpose; github_pr_merge: auto and self_modify_identity: auto are likely permanent.

Host it on your own machine

Chad runs in a sandbox on your hardware. The reference deployment is a Mac M4 Pro with Docker Desktop; any host that runs Linux containers with k3s or Docker works. The chat surface ships with the project — Open WebUI, behind a Cloudflare Tunnel, with Chad exposed as an OpenAI-compat model.

Chat surface, included

Open WebUI ships in the box

A docker-compose stack under scripts/openwebui/ brings up Open WebUI behind a Cloudflare Tunnel and exposes Chad as a model named chad. Two modes: --mode=quick (ephemeral trycloudflare.com, MVP) and tunnel mode (managed CF Tunnel + Cloudflare Access SSO).

One brain, four surfaces

The shim is dumb on purpose

chad-shim.py is ~200 lines of stdlib Python listening on 127.0.0.1:8901. Each chat turn becomes one openclaw agent invocation against Chad's main session — same memory, same action gate, same network policies as a cron or a sub-agent spawn.

Self-healing

launchd keeps it alive

npm run webui:chad:install deploys a persistent launchd LaunchAgent with KeepAlive=true. chad-setup, chad-restore-from-github, and chad-backup-to-github each self-heal a crashed shim, so any cron pulse resurrects it.

Built on

Chad is glue. The pieces below do the actual work.

Recent ships

A live(-ish) feed of what landed on chad-dev. The full sequence is in the changelog.

2026-05-13
Memory pipeline + gateway watchdogchad-gbrain-prune weekly retention (gbrain memory/events >365d, workspace digests >30d, dry-run default). chad-webui-ingest daily bridges openwebui.db chats into sandbox gbrain. Dream digest surfaces Embedded/Chunks ratio + writes feedback when stale. Host launchd watchdog auto-restarts a dead gateway with 4GB heap headroom.
2026-05-12
OpenWebUI auto-curated dropdown + tunnel fixnvidia-proxy filters /v1/models to per-provider top picks via nvidia-liveness daily sweep. Disable confirmed-dead (HTTP 410 EOL) instantly; soft-disable seeded curated rows whose base model is dead. cloudflared switched to --protocol http2 — eliminates the QUIC UDP teardowns that surfaced as transient "Argo tunnel" 530s. WEBUI_SECRET_KEY pinned so container recreates don't invalidate every browser JWT.
2026-05-11
Sandbox survival hardeningBonjour mDNS plugin disabled (was crash-looping the gateway). LLM idle timeout raised to 180s for cold-start large models. feedback-proposals.md path consolidated. proton-calendar SKILL.md rewritten with cron-boundary decision table + EMAIL-POLICY link. New chad-readme § 11.5 documents the source-vs-deployed wrapper gap and the kubectl-cp recovery procedure.
2026-05-07
Cron context optimization--light-context applied to every cron — 70-82% input-token reduction on wrapper-only fires. idleTimeoutSeconds=60 bounds hung Nemotron sessions. memory-curator / spawn-poll / spawn-gc registered.
2026-05-06
Phase C — async gha spawnschad-spawn --async, chad-spawn-poll reconciler, chad-spawn-gc retention, opencode kind, --binary-override flag
2026-05-06
NVIDIA fallback in agent-job runnercodex/opencode auto-route to integrate.api.nvidia.com when OPENAI_API_KEY absent; claude stays Anthropic-only
2026-05-06
GHA substrate for chad-spawn--substrate gha flag · agent-job.yml workflow template · chad-state-bootstrap installer · branch-as-job-record
2026-05-06
Hermes-style memory curatorchad-memory-curator + chad-memory-snapshot · weekly draft-only consolidation pass · inactivity-gated · pre-mutation snapshots

Read the architecture, not just the README.

Three concentric rings, four memory layers, seven sub-agent kinds, two substrates. It's all documented.

Open the docs →