A crew of AI agents,
working out of one Safehouse.
Big Smooth runs the crew. The Smooth Operators pull the jobs. They all work out of one hardware-isolated microsandbox microVM — every CLI pre-installed, credentials brokered by a fixer on the host, every move watched by the family rat.
this the single ~10 MB Rust binary that runs it all — no Docker, no Node runtime, no per-project setup ritual. th up boots the Safehouse by default; th up direct runs the same crew on the host when you're already in a trusted environment (CI runner, devbox).
$ curl -fsSL https://raw.githubusercontent.com/SmooAI/smooth/main/install.sh | sh
$ th upth up — boots the Safehouse by default.
Smooth has exactly two ways to run. th up boots the entire crew inside the Safehouse — a hardware-isolated microsandbox microVM (libkrun on Linux, HVF on macOS). th up direct runs the same crew as host processes for environments that are already sandboxed — CI runners, dedicated devboxes, nested-virt VMs. Same agents, same tools, same surveillance; just a different blast radius.
Hardware-isolated microVM
The default. Boots a microsandbox microVM with its own kernel, its own network namespace, its own filesystem view. Boots in seconds; tears down cleanly with th down.
Project cache, not persistent disk
The microVM itself is ephemeral. Per-project caches (pnpm, cargo, mise toolchains) live on the host under ~/.smooth/project-cache/ and are remounted on every boot. Pearl history lives in Dolt in your repo, not in the VM.
Workspace bind-mount
Your repo at /workspace. Operators edit in place — no copy-on-write surprises, no diff-from-overlay reconciliation. Big Smooth, Wonk, Narc, Scribe, Goalie are all read-only on it.
Reach out to host Docker
Docker is never the sandbox. But when the agent needs a container — running a test fixture, building a multi-arch image — Colima, OrbStack, Rancher Desktop, Podman, or Docker Desktop on the host are all reachable via the bundled docker CLI, brokered through the host stub.
Host-side credential broker
A tiny stub on the host (smooth-host-stub) mints short-lived creds per request over a UDS exposed into the microVM. gh auth token, aws sts get-session-token, gcloud auth print-access-token — your long-term creds never enter the VM.
Learned context that persists
Operators write short notes to the pearl DB at task end (remember) and recall them on the next run (recall_recent). The Dolt store lives in your repo, so memory survives the microVM tearing down — and travels with you across machines via th pearls push.
We tried seven phases. One agent plus a governor wins.
Each operator handles its own inner iteration (LLM → tool → LLM …). A thin outer governor feeds last run's test output back in, snapshots the workspace when failing tests drop, and stops on the first convincing signal.
Agent reports all tests passing.
Previous turn reached ≤3 failing; this turn didn't improve. More iteration likely regresses.
Next turn would blow the --budget-usd cap.
Safety ceiling (default 5) — not the primary brake.
Stop conditions are budget + plateau, not a fixed iteration cap.
One Safehouse, gRPC over UDS inside, a fixer on the corner.
The Safehouse is the microsandbox microVM the crew operates out of. Big Smooth, the cast, and every dispatched Operator share one address space; they talk to each other over tonic gRPC on Unix-domain sockets ( narc.sock, wonk.sock, scribe.sock, bigsmooth.sock). The host's long-term credentials never enter the VM — when paper is needed, the crew calls Bootstrap Bill (host-side stub) for short-lived ones. Outbound network is iptables-locked to Goalie inside the VM.
The crew Big Smooth keeps on retainer.
Every job needs a crew. The Safehouse has eight regulars and one fixer on the outside. Each has a name, a vibe, and a real job they do whether you're shipping a typo fix or rewriting a microservice.
Big Smooth
"Holds court in the Safehouse. Doesn't touch the workspace, doesn't make tool calls, never pulls a job himself. Reads the take, books the meetings, sends the crew out. READ-ONLY by enforcement — Narc'll whack anyone who tries to write, even him."
Orchestrator. axum on :4400. Schedules work, generates policy, owns the access store. Speaks to the outside world over HTTP+WS, and to the crew over `bigsmooth.sock`.
Wonk
"Reads the book. Knows every line of every policy. Doesn't argue, doesn't moralize. The crew asks Wonk before they touch anything; Goalie asks Wonk before forwarding traffic; Narc asks Wonk before issuing the verdict. No LLM, no opinions — just the rules."
Access control authority. Pure policy → answer. Hot-reloads via notify + ArcSwap. Negotiates expanded access at runtime via Big Smooth.
Goalie
"Stands at the door. Looks at the list. Asks Wonk first, then either lets you through or doesn't. iptables has his back — anything trying to slip past gets dropped at the kernel."
Outbound HTTP/HTTPS proxy. Dumb pipe — forwards or blocks based on Wonk's answer. iptables + FUSE enforced at the kernel level inside the VM.
Narc
"Every family has one — except Narc works for us. Watches every tool call, every prompt, every write. Two-tier surveillance: fast regex for the obvious stuff, an LLM judge for the gray area. When something's bad enough, Narc kicks it upstairs."
Tool surveillance + prompt-injection guard. Regex fast-path + LLM-as-a-judge (Haiku / Flash / GPT-4o-mini). Files pending access requests when a human needs to weigh in.
Scribe
"Writes everything down. Every door knock, every door slam, every tool call, every Narc decision. The books are sacred. When the heat comes, the books are how the family explains itself."
Per-actor structured logging. W3C traceparent propagation, in-memory ring, batch-forwards to Archivist over HTTP.
Archivist
"Takes the books from every Scribe and binds them into one ledger. The only one in the Safehouse with a write pen — but only on log paths. Don't let her near anything else."
Central log + event aggregator. HTTP :4401, SSE /events. The dashboard subscribes here for live updates.
Diver
"Goes underwater for the pearls. Each one's a job; Diver fishes it out, hands it to an Operator, marks it closed when the loot comes back. Phones the outside accountant (Jira) so the legitimate side of the operation stays in sync."
Pearl lifecycle manager + optional Jira sync. dispatch / complete / sub-pearl APIs over an in-process handle.
Groove
"Some jobs go sideways. Groove keeps a flask of memory at every step so when an Operator gets pinched mid-pull, the next one walks back in and picks up exactly where the last one left the heat."
LLM checkpointing + session resume. Captures conversation state after every tool call; persistent in the pearl DB.
Bootstrap Bill
"Doesn't live in the Safehouse — Bill works the streets. When the crew needs paper — gh tokens, AWS STS sessions, GCP access tokens — they shout 'Bill!' through the door. Bill delivers per request, never tells them his contacts, never says which envelope went where."
Host-side credential broker. Listens on /run/smooth/host.sock. Shells out to gh / aws sts / gcloud per request, returns short-lived creds, never persists.
Smooth Operators
"The crew. Each pearl gets its own Operator — a single agent that goes out, does the job, and reports back. They write the code. They run the tests. They ship the diff. Watched by Narc, gated by Wonk, recorded by Scribe — but the only ones in the Safehouse with a key to /workspace."
The AI agents themselves. One subprocess per dispatched pearl, agent loop + tools + NarcHook + WonkHook on every call. Streams AgentEvent JSON-lines back through Big Smooth to the WebSocket UI.
- Only Operators write to /workspace. Big Smooth, Wonk, Narc, Scribe, Goalie are read-only on the repo — enforced by file ACLs inside the VM.
- Host credentials stay on the host. The VM dials /run/smooth/host.sock for short-lived per-request creds; the stub re-validates the requested service URL against its allowlist before shelling out.
- All outbound traffic goes through Goalie. iptables inside the VM rejects anything bypassing the proxy.
- Operators see only their pearls. Assigned pearl + depth-2 dependency closure, scoped by auth token.
- Narc runs two tiers. Regex fast path for secrets, write guards, prompt injection; an LLM-as-a-judge (Haiku / Flash / GPT-4o-mini) for the ambiguous cases.
- In-VM RPCs travel over UDS, not the network. No service on the host can dial the cast — the sockets live inside the Safehouse filesystem.
No "install gh first" — the microVM ships with the tools agents reach for.
Every cloud CLI we've seen agents need is pinned in the image. Language toolchains land via mise so you can bring your own pinned versions per project. Per-project install state ( pnpm, cargo, mise) lives on the host under ~/.smooth/project-cache/ and is remounted on every boot, so repeat runs on the same repo skip the cold-install tax.
ghGitHub CLI — auth via your host gh login
awsAWS CLI v2 — STS-minted creds per request
gcloudGoogle Cloud SDK — OAuth access tokens
azAzure CLI
kubectlKubernetes CLI
dockerDocker CLI — reaches the host daemon (Colima / OrbStack / Rancher / Podman) for nested-virt-free workloads
gitPlus openssh, jq, common build tools
miseLanguage toolchain manager — node, python, go, ruby; `mise install` to add more
Every CLI that needs auth goes through the host stub — agents never see your long-term keys. Need something we didn't bundle? Add it via th plugin or pin a mise toolchain in your repo — ~/.smooth/project-cache/ caches the install so the next th up picks it up instantly.
Semantic routing slots, resolved by the gateway.
Every LLM call dispatches through a routing slot. The gateway (typically llm.smoo.ai) resolves each slot to a concrete model. Upgrading backends doesn't churn the code.
| Slot | Used by | Shape |
|---|---|---|
smooth-coding | The coding loop (workhorse) — `th code` default | Strong tool use + multi-turn |
smooth-reasoning | `th code` Plan + Think modes, deep reasoning | Extended chain-of-thought |
smooth-reviewing | `th code` Review mode, code-review flows | Adversarial critique, different lab |
smooth-judge | Narc's LLM-as-a-judge, bench scoring | Yes/no verdicts, low latency |
smooth-summarize | Context compression during long runs | Summarization, 1M-context |
smooth-fast | Session auto-naming, titles, autocomplete | Haiku/Flash-class, sub-second TTFT |
smooth-default | Alias to smooth-coding when a specific slot isn't configured | Generalist |
Bring your own provider
Smooth talks to any OpenAI-compatible endpoint. Pin each slot to a different upstream via th code's model picker or ~/.smooth/providers.json.
The agent remembers what it learned.
Two agent tools backed by the pearl DB — remember writes a short note; recall_recent reads the newest N back. Operators are taught to call them at task boundaries. Codebase conventions, gotchas, working commands, the path to that one weird config file — they stick across sessions because the volume sticks.
remember("this repo uses cargo-zigbuild
for aarch64-musl cross-compile",
source="th-893801")
# ...next session, fresh dispatch:
recall_recent(limit=10)
# → agent primes its contextShare a running session from anywhere.
Review a pearl from your phone. Hand a teammate a live session to steer. Drive your laptop's Smooth from your office machine. Smooth dials a reverse tunnel out to a smooai-operated rendezvous and gives you a stable HTTPS URL at <slug>.th.smoo.ai.
Ephemeral scratch-XXXX.th.smoo.ai slugs for ad-hoc sharing; stable subdomains on paid tiers. TLS terminates at the smooai edge on a valid wildcard — your laptop never opens an inbound port. th adds reachability, not authorization: Big Smooth still enforces the same auth locally and over the tunnel.
Every platform surface behind one binary.
Sandbox lifecycle, auth, orchestration, access control, tools, tunnels. No separate installers, no Docker Compose, no per-project runtime juggling.
Core
th upBoot the platform inside a microsandbox microVM (default). :4400 forwards out for the TUI / web UI.
th up directRun the cast on the host with no sandbox in front. Only safe in an already-trusted environment.
th downStop the platform — tears the microVM down and cleans up state.
th statusSystem health — cast, sockets, providers, operators in flight.
th codeInteractive coding assistant (ratatui TUI).
Project cache
th cache listPer-project operator caches under ~/.smooth/project-cache/ — pnpm/cargo state survives across runs.
th cache pruneDrop caches for repos you no longer touch.
th cache clearNuclear reset — wipes every project cache.
Auth
th auth login smooai-gatewayRecommended — every slot resolves via one key
th auth login openaiOr: anthropic, google, kimi, kimi-code, openrouter, ollama
th auth providersList configured providers
th auth default <provider>Pick which backs smooth-default
Work
th run <pearl-id>Dispatch a pearl to a Smooth Operator
th operatorsList active operators
th pause / resume / steer / cancelControl an operator mid-task
th inboxMessages needing attention
Access
th access pendingList pending access requests from operators
th access approve <pearl> <domain>Approve domain access for a pearl
th access policy <operator-id>Show the current policy an operator is running under
Tools & Plugins
th mcp add playwright npx @playwright/mcp@latestRegister a Model Context Protocol server
th mcp listGlobal + project scopes
th plugin init jq --command "jq {{filter}} <<< {{json}}"Expose any CLI as an agent tool
Tunnel (coming soon)
th tunnel startExpose your local Big Smooth at <slug>.th.smoo.ai
th tunnel listActive tunnels for your org
th tunnel stop <slug>Close a tunnel
Built on microsandbox, mise, tonic + tokio.
The sandbox is a real microVM, courtesy of microsandbox — open-source hardware-isolated microVMs on libkrun (Linux) and HVF (macOS). mise handles language toolchains inside it. In-VM RPCs ride on tonic over tokio's UnixStream — no extra networking, no extra processes.
Install. Boot the Safehouse. Ship.
One 10 MB binary. macOS, Linux. th up boots the Safehouse — a microsandbox microVM with the whole crew on the payroll and every CLI the operators reach for already pinned.
$ curl -fsSL https://raw.githubusercontent.com/SmooAI/smooth/main/install.sh | sh
$ th auth login smooai-gateway
$ th up
$ th code