Complete reference for every SILO command, flag, option, and output format.
| Flag | Description |
|---|---|
-V, --version |
Print the current SILO version |
-h, --help |
Show help for any command |
silo --version # → 0.2.0
silo --help # Show all commands
silo start --help # Show help for a specific commandInteractive setup wizard. Configures the LLM provider, API key, model, workspace path, container resource limits, and security policy mode.
silo onboard [--force]| Flag | Type | Default | Description |
|---|---|---|---|
-f, --force |
boolean | false |
Overwrite existing configuration |
Wizard Steps:
| Step | Prompt | Example Values |
|---|---|---|
| 1 | LLM Provider | openai, anthropic, local |
| 2 | API Key | sk-proj-abc123..., sk-ant-xyz... |
| 3 | Model name | gpt-4o, claude-sonnet-4-6, llama3 |
| 4 | Workspace path | ~/silo-workspace, ./my-project |
| 5a | CPU limit | 1.0 (one core), 2.0 (two cores) |
| 5b | Memory limit | 512m, 1g, 2g |
| 6 | Security policy | Strict (Default Deny) or Audit Only (Default Allow) |
Local provider extras: When selecting local, an additional prompt asks for the base URL of your local inference server (default: http://localhost:11434).
Security policy modes:
| Mode | Default Action | Behaviour |
|---|---|---|
| Strict (Default Deny) | deny |
Blocks all unknown traffic. Prompts you to approve new connections via the interactive interceptor. Auto-applies the standard preset (PyPI, npm, GitHub). |
| Audit Only (Default Allow) | allow |
Allows all traffic but logs every request in the audit trail. Ideal for getting started quickly — lock down later by editing ~/.silo/policy.yaml. |
Config storage:
- macOS:
~/Library/Preferences/cli-silo-nodejs/config.json - Linux:
~/.config/cli-silo-nodejs/config.json
Security: Your API key is encrypted at rest using AES-256-GCM with a machine-bound key. It is never passed into the Docker container. The inference proxy decrypts and injects it at request time.
Build the agent sandbox Docker image from sandbox/Dockerfile.
silo build [--tag <tag>] [--no-cache] [--framework <name>] [--all-frameworks] [--browser]| Flag | Type | Default | Description |
|---|---|---|---|
-t, --tag <tag> |
string | silo-sandbox:latest |
Override the Docker image tag |
--no-cache |
boolean | false |
Pass --no-cache to docker build for a clean rebuild |
-f, --framework <name> |
string | — | Build a framework-specific image (e.g. crewai, langgraph) |
--all-frameworks |
boolean | false |
Build framework images for every supported framework |
--browser |
boolean | false |
Build a browser-capable framework image, e.g. silo-sandbox-openclaw-browser:latest |
What the image includes:
- Python 3.12 runtime (based on
python:3.12-slim) - System tools:
curl,git,jq,ca-certificates - Non-root user:
agent(UID 1001, GID 1001) /workspacemount point (populated at runtime via--volume)/skillsdirectory for custom agent skill scripts- Custom
entrypoint.shthat validates non-root execution, prints proxy config, loads skill scripts, and keeps the container alive
Browser-capable framework images additionally bake Chromium into the read-only image layer, expose common browser binary names through a SILO launcher, and use disposable runtime tmpfs mounts for browser cache/profile/downloads.
Use silo build --all-frameworks --browser to build browser-capable variants for every supported framework.
Launch the full sandbox stack: Docker bridge network → inference proxy daemon → sandbox container.
silo start [--policy <file>] [--rebuild] [--name <agent>] [--workspace <path>] [--desktop] [--mount <spec>] [--framework <name>] [--browser]| Flag | Type | Default | Description |
|---|---|---|---|
-p, --policy <file> |
string | from onboard | Path to a YAML policy file |
--rebuild |
boolean | false |
Rebuild the sandbox image before starting |
-n, --name <agent> |
string | from config | Name the agent (creates container silo-<name>) |
-w, --workspace <path> |
string | from config | Override the workspace path for this agent |
--desktop |
boolean | false |
Mount the host Desktop at /host/Desktop |
--mount <spec> |
string | — | Mount a host path into /host/..., e.g. ~/Downloads:/host/Downloads:ro |
-f, --framework <name> |
string | — | Start with a specific framework (uses framework image) |
--browser |
boolean | false |
Use the browser-capable variant of the selected framework image |
Startup sequence:
- Reads and validates config from disk
- Checks Docker availability
- Guards against already-running containers (removes stale stopped containers)
- Creates the
silo-sandbox-netDocker bridge network (if not exists) - Spawns the inference proxy daemon on the host (detached, port
:8199) - Starts the sandbox container with all security hardening flags
- Writes
proxy.running = trueto config - Prints connection instructions
Additional host mounts are intentionally opt-in. Agents can always read and write /workspace, but they cannot see host paths like Desktop unless you start the sandbox with --desktop or an explicit --mount.
Browser mode is also opt-in and requires a framework image built with silo build --framework <name> --browser. It keeps /tmp hardened, adds isolated browser tmpfs mounts, sets /dev/shm to 512m, and raises the container memory limit to at least 2g for that run.
Capability profiles are additive:
| Profile | Scope |
|---|---|
| default | Safe coding, text, API, shell, and /workspace tasks |
--desktop |
Adds host Desktop at /host/Desktop |
--mount |
Adds explicit host folders under /host/... |
--browser |
Adds sandboxed Chromium for framework browser automation |
Example output:
╭──────────────────────────────────────╮
│ SILO v0.2.0 │
│ Secure AI Agent Sandbox Orchestrator│
╰──────────────────────────────────────╯
ℹ Agent: silo-agent
ℹ Workspace: ~/silo-workspace
ℹ Image: silo-sandbox:latest
ℹ Policy: ~/.silo/policy.yaml (strict)
✔ Docker network "silo-sandbox-net" created
✔ Inference proxy running (pid=48291)
✔ Sandbox started (a3f1b2c4d5e6)
✔ Agent sandbox "silo-agent" is running.
Commands:
silo connect — open an interactive shell
silo status — view resource usage
silo policy apply pypi — allow pip installs
silo stop — shut down the sandbox
Gracefully shut down part or all of the SILO stack.
silo stop [--name <agent>] [--all]| Flag | Type | Default | Description |
|---|---|---|---|
-n, --name <agent> |
string | — | Stop only a specific named agent (keeps proxy running) |
-a, --all |
boolean | false |
Stop ALL running SILO agent containers |
Shutdown sequence (for default/all):
- Stops and removes the sandbox container(s) (
docker stop+docker rm --force) - Stops the inference proxy daemon (SIGTERM → wait 5s → SIGKILL if needed)
- Logs a
session_stopaudit event - Writes
proxy.running = falseto config - Removes the
silo-sandbox-netDocker network (if no other containers attached)
Stopping a named agent: When --name is used, only that specific container is stopped. The proxy and network remain active for other agents.
Stopping all agents: When --all is used, all containers with the managed-by=silo Docker label are discovered and stopped.
Open an interactive shell inside the running sandbox container.
silo connect [--shell <path>] [--name <agent>]| Flag | Type | Default | Description |
|---|---|---|---|
-s, --shell <shell> |
string | /bin/sh |
Shell binary to use (e.g. /bin/bash) |
-n, --name <agent> |
string | from config | Connect to a specific named agent |
Auto-repair: Before connecting, SILO checks if the proxy daemon is alive and healthy. If it has crashed, it is transparently restarted via ensureProxyRunning().
Inside the sandbox:
# Check proxy connectivity
curl http://llm.gateway:8199/_silo/health
# Make an LLM call (API key injected by proxy)
curl http://llm.gateway:8199/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"model":"gpt-4o","messages":[{"role":"user","content":"Hello"}]}'
# Exit (container keeps running)
exitRun an LLM-powered agent task. SILO orchestrates the full tool-calling loop.
silo run <task> [--max-turns <n>] [--name <agent>] [--policy <file>] [--no-stream]| Flag | Type | Default | Description |
|---|---|---|---|
-m, --max-turns <n> |
integer | 10 |
Maximum conversation turns before stopping |
-n, --name <agent> |
string | from config | Run against a specific named agent |
-p, --policy <file> |
string | — | Policy file override |
--no-stream |
boolean | false |
Disable streaming output |
Execution loop:
- Sends the task to the LLM via the local inference proxy (audited + policy-checked)
- When the LLM produces tool calls, executes them inside the sandbox via
docker exec --workdir /workspace - Captures stdout, stderr, and exit code from each command
- Feeds results back to the LLM as tool call responses
- Loops until the LLM produces a final text response (no tool calls) or
--max-turnsis reached
Tool definitions:
The agent has access to three tools:
| Tool | Description |
|---|---|
execute_command |
Run a shell command. Returns stdout, stderr, exit code. |
read_file |
Read file contents with optional max_lines limit (default 200). |
write_file |
Write content to a file. Creates parent directories if needed. Executes securely via direct container process with stdin piping. |
[
{
"name": "execute_command",
"parameters": { "command": "string (required)" }
},
{
"name": "read_file",
"parameters": { "path": "string (required)", "max_lines": "number (optional, default 200)" }
},
{
"name": "write_file",
"parameters": { "path": "string (required)", "content": "string (required)" }
}
]Timeouts:
- Per-command execution timeout: 120 seconds
- LLM request timeout: 120 seconds
Output truncation:
- stdout displayed: first 2,000 characters
- stderr displayed: first 1,000 characters
- Tool result to LLM: stdout up to 8,000 chars, stderr up to 2,000 chars
Provider support: Supports both OpenAI and Anthropic function calling formats. The message format is automatically converted for Anthropic (tool_use/tool_result blocks).
List all running SILO agent containers.
silo list
silo lsNo flags. Uses the Docker label managed-by=silo to discover SILO-managed containers.
Output columns:
| Column | Description |
|---|---|
| Name | Container name (e.g. silo-alpha) |
| Status | ● running or ● stopped |
| Image | Docker image tag |
| Uptime | Running time |
Show a comprehensive dashboard of the entire SILO stack.
silo statusDashboard sections:
| Section | Information Displayed |
|---|---|
| LLM Configuration | Provider, model, masked API key, base URL |
| Sandbox | Container name/status, image, workspace, CPU/memory limits, live CPU/memory usage, uptime |
| Policy | Active policy file path, mode (strict/audit-only), and default action |
| Inference Proxy | Port, running status, PID, PID file path |
| Audit | Session ID, total requests, LLM requests, total tokens, audit log path |
| Meta | Config file path, onboard timestamp |
Parent command for managing sandbox egress policies. Has six subcommands.
Show all available built-in presets.
silo policy listBuilt-in presets:
| Preset | Description | Allowed Hosts |
|---|---|---|
pypi |
Allow pip installs | pypi.org, files.pythonhosted.org, *.pythonhosted.org |
npm |
Allow npm/pnpm installs | registry.npmjs.org, *.npmjs.org |
github |
Allow Git clone + GitHub API | github.com, api.github.com, raw.githubusercontent.com, objects.githubusercontent.com |
huggingface |
Allow HF model downloads | huggingface.co, cdn-lfs.huggingface.co, *.hf.co |
Print the active policy rules with a preview of evaluation results.
silo policy showDisplays: file path, default action, all rules (host pattern, action, comment), and a preview test against llm.gateway, api.openai.com, and evil.example.com.
Merge a preset's rules into the active policy.
silo policy apply <preset>- If no policy file exists, creates one at
~/.silo/policy.yamlfrom the baseline (using the mode chosen during onboard) - Merges rules idempotently — applying the same preset twice adds no duplicates
- Auto-reloads the running proxy daemon via SIGHUP
Remove a preset's rules from the active policy.
silo policy remove <preset>Rules are matched by host pattern only — the action/comment may differ if the user edited them.
Add a single host rule without editing YAML files.
silo policy add <host> [--action <allow|deny>] [--comment <text>]| Flag | Type | Default | Description |
|---|---|---|---|
--action <action> |
string | allow |
Rule action: allow or deny |
--comment <text> |
string | — | Optional comment for the rule |
- Idempotent — skips if the host already exists in the policy
- Auto-creates the policy file if it doesn't exist
- Auto-reloads the proxy daemon via SIGHUP
- Persists the policy file path in config if not already set
Hot-reload the active policy without restarting the proxy.
silo policy reloadSends SIGHUP to the proxy daemon process. The daemon re-reads and recompiles the YAML policy file without dropping connections.
Parent command for managing credential-managed API integrations. Has five subcommands.
Add a new integration. Uses a built-in template if one exists for the service, otherwise launches an interactive wizard.
silo integrations add slack # Template-based (prompts for token only)
silo integrations add my-custom-api # Custom (prompts for URL, auth type, token)Built-in templates:
| Template | Service | Base URL | Auth Type | Token Hint |
|---|---|---|---|---|
slack |
Slack | https://slack.com/api |
Bearer | xoxb-... |
github |
GitHub | https://api.github.com |
Bearer | ghp_... or github_pat_... |
hubspot |
HubSpot | https://api.hubapi.com |
Bearer | pat-... |
linear |
Linear | https://api.linear.app |
Bearer | lin_api_... |
notion |
Notion | https://api.notion.com |
Bearer | secret_... |
Custom integration prompts:
| Prompt | Description |
|---|---|
| API base URL | e.g. https://api.example.com |
| Auth type | bearer, header (custom header), or query (URL parameter) |
| Header name | Only for header auth — e.g. x-api-key |
| Query param name | Only for query auth — e.g. api_key |
| API token | Masked input, never displayed |
Gateway: Each integration gets a gateway alias <name>.gateway (e.g. slack.gateway). The sandbox container can reach it at http://slack.gateway:8199.
Important: Restart the sandbox (silo stop && silo start) after adding new integrations for the DNS alias to take effect.
List all configured integrations with their gateway, base URL, auth type, and masked token.
silo integrations list
silo int listRemove a configured integration by name.
silo integrations remove slackTest basic HTTPS connectivity to the integration's base URL.
silo integrations test githubMakes a simple HTTPS GET to the base URL and reports the status code. Does not inject credentials — this is a connectivity check only.
List all available built-in integration templates.
silo integrations templatesView the unified audit trail — LLM calls, LLM request messages, tool calls, egress, blocked requests, framework traces.
silo logs [--tail <n>] [--category <cat>] [--verdict <v>] [--since <duration>] [--framework <name>] [--agent <name>] [--follow] [--json]| Flag | Type | Default | Description |
|---|---|---|---|
-n, --tail <count> |
integer | 20 |
Number of entries to show |
-c, --category <cat> |
string | — | Filter: llm, llm_message, egress, blocked, integration, tool_call, or trace |
-v, --verdict <v> |
string | — | Filter: allow or deny |
-s, --since <duration> |
string | — | Time filter: 30m, 2h, 1d, 1w |
--framework <name> |
string | — | Filter by framework (e.g. crewai, langgraph) |
--agent <name> |
string | — | Filter by agent name |
-F, --follow |
boolean | false |
Follow the audit log in real-time (like tail -f) |
--json |
boolean | false |
Output raw JSONL for piping |
Table columns (formatted mode):
| Column | Description |
|---|---|
| Time | Local time (HH:MM:SS format) |
| Category | llm, llm_message, egress, blocked, integration, tool_call, or trace |
| Verdict | allow or deny |
| Method | HTTP method (or MESSAGE / TOOL_CALL / TRACE) |
| Host | Target hostname (truncated to 26 chars) |
| Status | HTTP status code |
| Latency | Round-trip time in ms |
| Detail | Framework name, tool name, agent name, or trace event |
Duration format:
| Suffix | Meaning | Example |
|---|---|---|
s |
seconds | 30s |
m |
minutes | 30m |
h |
hours | 2h |
d |
days | 1d |
w |
weeks | 1w |
Piping examples:
# Count blocked requests
silo logs --json --verdict deny | wc -l
# List all unique hosts accessed
silo logs --json | jq -r '.host' | sort -u
# Export LLM latency data
silo logs --json --category llm | jq '{time: .timestamp, latency: .latencyMs, model: .model}'
# Inspect individual request message previews
silo logs --json --category llm_message | jq '{role: .messageRole, preview: .messagePreview}'
# See all tool calls
silo logs --json --category tool_call | jq '.toolName'
# All activity from a specific agent
silo logs --framework crewai --agent Researcher
# Full audit export
silo logs --json > audit-export.jsonlConvenience alias for viewing framework trace events.
silo traces [--tail <n>] [--framework <name>] [--agent <name>] [--since <duration>] [--json]Equivalent to silo logs --category trace --category tool_call with the same filtering options.
Manage supported agent frameworks.
List all available frameworks with descriptions, install methods, and icons.
silo frameworks listShow detailed information about a specific framework.
silo frameworks info crewaiDisplays: name, description, version, install method, packages, required policies, health check command, tags, and docs URL.
Save and restore container state.
Create a Docker commit of the current sandbox state.
silo snapshot create "clean-install"List all saved snapshots.
silo snapshot listRestore the sandbox to a previous snapshot.
silo snapshot rollback "clean-install"Delete a saved snapshot.
silo snapshot delete "clean-install"Run diagnostic checks on the SILO environment.
silo doctorChecks: Node.js version, Docker availability, Docker daemon status, config file existence, proxy health, container status.
Zero-to-sandbox in one command. Combines onboard → build → start → connect.
silo quickstart [--framework <name>] [--browser]| Flag | Type | Default | Description |
|---|---|---|---|
-f, --framework <name> |
string | — | Build and start with a specific framework |
--browser |
boolean | false |
Use the browser-capable framework image and runtime profile |
Skips steps that are already done (already onboarded, image already built, container already running).
| Command | Description |
|---|---|
silo quickstart [--framework] [--browser] |
Zero-to-sandbox in one command |
silo onboard [--force] |
Interactive setup wizard |
silo doctor |
System diagnostics |
silo build [--tag] [--no-cache] [--framework] [--all-frameworks] [--browser] |
Build the sandbox Docker image |
silo start [--policy] [--rebuild] [--name] [--workspace] [--desktop] [--mount] [--framework] [--browser] |
Launch sandbox + proxy |
silo stop [--name] [--all] |
Shut down the stack |
silo connect [--shell] [--name] |
Shell into the sandbox |
silo run <task> [--max-turns N] [--name] |
Run an LLM agent task |
silo list / silo ls |
List running agents |
silo status |
Health dashboard |
silo logs [--tail] [--category] [--verdict] [--since] [--framework] [--agent] [--follow] [--json] |
View unified audit trail |
silo traces [--tail] [--framework] [--agent] [--since] [--json] |
View framework traces |
silo frameworks list |
List available frameworks |
silo frameworks info <id> |
Framework details |
silo policy list |
List presets |
silo policy show |
Print active policy |
silo policy apply <preset> |
Merge a preset |
silo policy remove <preset> |
Remove a preset |
silo policy add <host> [--action] [--comment] |
Add a single rule |
silo policy reload |
Hot-reload policy |
silo integrations add <service> |
Add integration (Slack, GitHub, etc.) |
silo integrations list / silo int list |
List integrations |
silo integrations remove <name> |
Remove an integration |
silo integrations test <name> |
Test integration connectivity |
silo integrations templates |
List built-in templates |
silo snapshot create <name> |
Save container state |
silo snapshot list |
List snapshots |
silo snapshot rollback <name> |
Restore a snapshot |
silo snapshot delete <name> |
Delete a snapshot |
SILO v0.2.0 — Secure AI Agent Sandbox Orchestrator