Learn-skills.dev zeroclaw
Comprehensive operational knowledge for ZeroClaw, the fast, small, fully autonomous AI assistant infrastructure built in Rust. Covers CLI, 30 providers, 14 channels, config, hardware, deployment, and security.
git clone https://github.com/NeverSight/learn-skills.dev
T=$(mktemp -d) && git clone --depth=1 https://github.com/NeverSight/learn-skills.dev "$T" && mkdir -p ~/.claude/skills && cp -r "$T/data/skills-md/adisinghstudent/zeroclaw/zeroclaw" ~/.claude/skills/neversight-learn-skills-dev-zeroclaw && rm -rf "$T"
data/skills-md/adisinghstudent/zeroclaw/zeroclaw/SKILL.mdZeroClaw — Complete Reference Skill
Comprehensive operational knowledge for ZeroClaw, the fast, small, fully autonomous AI assistant infrastructure built in Rust. Source: https://github.com/zeroclaw-labs/zeroclaw | Version: 0.1.1 | Last updated: 2026-02-21
What Is ZeroClaw
- Language: 100% Rust, single binary (~3.4-8.8MB release)
- Memory: <5MB RAM at runtime
- Startup: <10ms cold start
- Platforms: ARM, x86, RISC-V — runs on $10 hardware
- Architecture: Trait-driven, everything is swappable (providers, channels, tools, memory, tunnels, security)
- Config:
(TOML format)~/.zeroclaw/config.toml - Workspace:
(SOUL.md, AGENTS.md, IDENTITY.md, USER.md, MEMORY.md, TOOLS.md, HEARTBEAT.md, BOOTSTRAP.md)~/.zeroclaw/workspace/ - Identity: ZeroClaw introduces itself as ZeroClaw, never as ChatGPT/Claude/etc.
Installation
# Option A: Clone + build git clone https://github.com/zeroclaw-labs/zeroclaw.git cd zeroclaw && ./bootstrap.sh # Option B: Remote one-liner curl -fsSL https://raw.githubusercontent.com/zeroclaw-labs/zeroclaw/main/scripts/bootstrap.sh | bash # Fresh machine (install Rust + system deps) ./bootstrap.sh --install-system-deps --install-rust # Quick onboard after install zeroclaw onboard --api-key "your-api-key" --provider openrouter
Updating ZeroClaw
# Fastest: prebuilt binary (no compile) git clone https://github.com/zeroclaw-labs/zeroclaw.git /tmp/zeroclaw-update cd /tmp/zeroclaw-update && bash scripts/bootstrap.sh --prefer-prebuilt rm -rf /tmp/zeroclaw-update # With browser-native feature (requires compile) git clone https://github.com/zeroclaw-labs/zeroclaw.git /tmp/zeroclaw-update cd /tmp/zeroclaw-update && cargo install --path . --force --locked --features browser-native rm -rf /tmp/zeroclaw-update # Verify zeroclaw --version
Note: There is no built-in
zeroclaw update command. Re-running bootstrap.sh --prefer-prebuilt from a fresh clone is the quickest path. The prebuilt binary does not include browser-native — you must build from source with --features browser-native if you need the rust_native browser backend.
CLI Reference (All Commands)
Top-Level
| Command | Purpose |
|---|---|
| Initialize workspace/config (quick setup) |
| Full interactive wizard |
| Reconfigure channels only |
| Interactive AI chat |
| Single message mode |
| Override provider/model |
| Attach hardware peripheral |
| Start webhook/websocket gateway |
| Full autonomous runtime (gateway + channels + heartbeat + scheduler) |
| Show full system status |
| Run diagnostics |
| List 30 supported AI providers |
Service Management (launchd/systemd)
zeroclaw service install # Install for auto-start zeroclaw service start # Start service zeroclaw service stop # Stop service zeroclaw service status # Check status zeroclaw service uninstall # Remove service
Channel Management
zeroclaw channel list # List all channels + status zeroclaw channel start # Start all configured channels zeroclaw channel doctor # Health check channels zeroclaw channel add <type> <json> # Add channel (type + JSON config) zeroclaw channel remove <name> # Remove channel zeroclaw channel bind-telegram <IDENTITY> # Add Telegram user to allowlist
Note:
channel add/remove is not a full config mutator yet — prefer editing ~/.zeroclaw/config.toml directly or using zeroclaw onboard.
Cron / Scheduling
zeroclaw cron list # List tasks zeroclaw cron add "<cron-expr>" "<command>" # Add recurring task zeroclaw cron add --tz America/New_York "..." # With timezone zeroclaw cron add-at <rfc3339> "<command>" # One-shot at timestamp zeroclaw cron add-every <ms> "<command>" # Fixed interval zeroclaw cron once <delay> "<command>" # One-shot delayed (e.g. "30m", "2h") zeroclaw cron remove <id> zeroclaw cron pause <id> zeroclaw cron resume <id>
Models & Providers
zeroclaw providers # List all 30 providers zeroclaw models refresh # Refresh model catalogs zeroclaw models refresh --provider <ID> # Refresh specific provider zeroclaw models refresh --force # Force refresh
Skills
zeroclaw skills list # List installed skills zeroclaw skills install <source> # Install from GitHub URL or local path zeroclaw skills remove <name> # Remove skill
Integrations
zeroclaw integrations info <name> # Show integration details # Examples: Telegram, Discord, Slack, iMessage, Matrix, Signal, WhatsApp, Email, DingTalk, Ollama
Auth
zeroclaw auth login --provider <ID> # OAuth login (e.g. openai-codex) zeroclaw auth login --provider <ID> --device-code # Device code flow zeroclaw auth paste-token # Paste auth token (Anthropic) zeroclaw auth setup-token # Alias for paste-token zeroclaw auth refresh # Refresh OAuth token zeroclaw auth logout # Remove auth profile zeroclaw auth use --provider <ID> # Set active profile zeroclaw auth list # List profiles zeroclaw auth status # Show token expiry info
Hardware & Peripherals
zeroclaw hardware discover # Enumerate USB devices (VID/PID) zeroclaw hardware introspect <path> # Introspect device zeroclaw hardware info [--chip <name>] # Chip info via probe-rs zeroclaw peripheral list # List configured boards zeroclaw peripheral add <board> <path> # Add board (e.g. nucleo-f401re /dev/ttyACM0) zeroclaw peripheral flash [--port <port>] # Flash Arduino firmware zeroclaw peripheral setup-uno-q # Setup Arduino Uno Q Bridge zeroclaw peripheral flash-nucleo # Flash Nucleo-F401RE firmware
Migration
zeroclaw migrate openclaw [--source <path>] [--dry-run] # Import from OpenClaw
Supported Providers (30 total)
| ID | Description |
|---|---|
| OpenRouter (default) |
| Anthropic |
| OpenAI |
| OpenAI Codex (OAuth) |
| Ollama [local] |
| Google Gemini |
| Venice |
| Vercel AI Gateway |
| Cloudflare AI |
| Moonshot / Kimi |
| OpenCode Zen |
| Z.AI |
| GLM (Zhipu) |
| MiniMax |
| Amazon Bedrock |
| Qianfan (Baidu) |
| Qwen (DashScope) |
| Groq |
| Mistral |
| xAI (Grok) |
| DeepSeek |
| Together AI |
| Fireworks AI |
| Perplexity |
| Cohere |
| GitHub Copilot |
| LM Studio [local] |
| NVIDIA NIM |
| OVHcloud AI Endpoints |
| Any OpenAI-compatible endpoint |
| Any Anthropic-compatible endpoint |
Custom Provider Setup
# OpenAI-compatible default_provider = "custom:https://your-api.com" api_key = "your-api-key" default_model = "your-model" # Anthropic-compatible default_provider = "anthropic-custom:https://your-api.com" api_key = "your-api-key" default_model = "your-model"
Channels (14 supported)
Channel Matrix
| Channel | Config Section | Access Control Field | Setup |
|---|---|---|---|
| CLI | always enabled | n/a | Built-in |
| Telegram | | | |
| Discord | | | |
| Slack | | | |
| Mattermost | | | Manual config |
| Webhook | | (optional) | Manual / onboard |
| iMessage | | | macOS only |
| Matrix | | | |
| Signal | | | Manual config |
| | | |
| | Manual config | |
| IRC | | | |
| Lark | | | Manual config |
| DingTalk | | | |
Deny-by-Default Allowlist Rules
(empty) = deny all[]
= allow all (not recommended for production)["*"]
= exact match only["123456789", "username"]
Telegram Setup
[channels_config.telegram] bot_token = "your-bot-token" allowed_users = []
# 1. Get bot token from @BotFather on Telegram # 2. Add config above to ~/.zeroclaw/config.toml # 3. Bind your user: zeroclaw channel bind-telegram <USER_ID_OR_USERNAME> # 4. Start: zeroclaw daemon
Important: Telegram uses long-polling — no inbound port or public IP required. Only one poller per bot token allowed (don't run multiple daemons).
Discord Setup
- Go to https://discord.com/developers/applications
- Create app, enable Bot, copy token
- Enable MESSAGE CONTENT intent
- Run
zeroclaw onboard
Slack Setup
- Go to https://api.slack.com/apps
- Create app, add Bot Token Scopes, install
- Run
zeroclaw onboard
Mattermost Setup
[channels_config.mattermost] url = "https://mm.your-domain.com" bot_token = "your-bot-access-token" channel_id = "your-channel-id" allowed_users = ["user-id-1"] thread_replies = true mention_only = true
WhatsApp Setup
[channels_config.whatsapp] access_token = "your-access-token" phone_number_id = "your-phone-number-id" verify_token = "your-verify-token" allowed_numbers = ["+1234567890"]
WhatsApp requires a public URL (webhook) — use a tunnel (Tailscale/ngrok/Cloudflare).
Signal Setup
[channels_config.signal] http_url = "http://127.0.0.1:8686" account = "+1234567890" allowed_from = ["+1987654321"] ignore_attachments = true ignore_stories = true
Lark Setup
[channels_config.lark] app_id = "your-app-id" app_secret = "your-app-secret" allowed_users = ["your-user-id"] receive_mode = "websocket" # or "webhook"
In-Chat Commands (Telegram/Discord)
While channel server is running, users can execute:
— show available providers/models
— switch provider (sender-scoped)/models <provider>
— show current model/model
— switch model (sender-scoped)/model <model-id>
Switching clears that sender's conversation history to avoid cross-model contamination.
Config Reference (~/.zeroclaw/config.toml
)
~/.zeroclaw/config.tomlCore
| Key | Default | Notes |
|---|---|---|
| | Provider ID or alias |
| | Model routed through provider |
| | 0.0-2.0 |
Gateway
| Key | Default | Purpose |
|---|---|---|
| | Bind address |
| | Listen port |
| | Require pairing for auth |
| | Block accidental public exposure |
Memory
| Key | Default | Purpose |
|---|---|---|
| | , , , |
| | Auto-persist |
| | , , or custom |
| | Hybrid search vector weight |
| | Hybrid search keyword weight |
Autonomy / Security
| Key | Default | Purpose |
|---|---|---|
| | , , |
| | Restrict to workspace |
| | Whitelisted commands |
| | Rate limit |
| | Cost cap |
Agent
| Key | Default |
|---|---|
| |
| |
| |
Browser Control
| Key | Default | Purpose |
|---|---|---|
| | Enable browser tools |
| | Domain allowlist ( for all) |
| (none) | Optional session identifier for persistence |
| | , , , |
| | Headless mode for rust_native backend |
| | WebDriver endpoint for rust_native |
| (auto) | Optional explicit Chrome binary path |
| | Computer-use sidecar endpoint |
| (none) | Optional bearer token for sidecar auth (encrypted) |
| | Per-action timeout |
| | Only allow localhost sidecar |
| | Restrict which OS windows are targetable |
| (none) | Optional X boundary for coordinate validation |
| (none) | Optional Y boundary for coordinate validation |
HTTP Requests
| Key | Default | Purpose |
|---|---|---|
| | Enable HTTP request tool |
| | Domain allowlist ( for all) |
| | Max response bytes (0 = unlimited) |
| | Request timeout (0 = unlimited) |
Other Notable Sections
— native or docker sandbox[runtime]
— provider retries, backoff, fallback[reliability]
— task scheduling (max 64 tasks, 4 concurrent)[scheduler]
— periodic check-ins (disabled by default)[heartbeat]
— cron scheduling[cron]
— provider:[tunnel]
,none
,tailscale
,ngrokcloudflare
— Composio integration (250+ app integrations)[composio]
— encrypted secrets[secrets]
— DuckDuckGo by default[web_search]
— HTTP proxy support[proxy]
— daily/monthly limits, per-model pricing[cost]
— hardware boards[peripherals]
Browser Control Setup
Browser Backends
| Backend | Mechanism | Runtime Requirement | Build Requirement |
|---|---|---|---|
(default) | Calls Vercel's CLI as subprocess | on | None (default build / prebuilt binary) |
| In-process WebDriver via fantoccini | ChromeDriver running | (must build from source) |
| HTTP POST to sidecar for OS-level mouse/keyboard/screen | Computer-use sidecar server | None |
| Auto-detects best available backend | Depends on what's installed | None |
detection priority order: rust_native (if compiled + WebDriver reachable) -> agent_browser (if CLI installed) -> computer_use (if sidecar reachable). Falls back with helpful error if nothing is available.auto
Prebuilt binary note: The prebuilt binary from
bootstrap.sh --prefer-prebuilt does not include browser-native. If you set backend = "rust_native" with the prebuilt binary, the agent will report the feature isn't enabled. You must build from source: cargo install --path . --force --locked --features browser-native.
Browser Actions (17 total)
Standard actions (all backends):
| Action | Purpose | Notes |
|---|---|---|
| Navigate to URL | All backends |
| Get accessibility tree with element handles | agent_browser only — returns null on rust_native |
| Click element by CSS selector or | only works with agent_browser |
| Clear field and fill with value | |
| Type text into focused element | |
| Extract text from element | |
| Get page title | |
| Get current URL | |
| Capture page screenshot | Options: path, full_page |
| Wait for element/time/text | |
| Press keyboard key | |
| Hover over element | |
| Scroll page | Options: direction, pixels |
| Check element visibility | Strict mode — selector must match exactly one element |
| Close browser | |
| Find by semantic locator | Options: role, text, label, placeholder, testid |
Computer-use only actions (6 extra — OS-level, not DOM):
| Action | Purpose |
|---|---|
| Move mouse to coordinates |
| Click at coordinates |
| Drag from one point to another |
| Type keys via sidecar |
| Press individual keys |
| Capture OS screen |
Using computer-use actions on a non-computer-use backend returns a backend-specific error.
Backend Comparison (Tested)
| Capability | agent_browser | rust_native | computer_use |
|---|---|---|---|
| open / close | yes | yes | yes |
| get_title / get_text / get_url | yes | yes | yes |
| click / fill / type | yes (CSS + @ref) | yes (CSS only) | yes (coordinates) |
| hover / scroll / press | yes | yes | yes |
| screenshot | yes | yes | yes (screen_capture) |
| is_visible | yes (strict mode) | yes | n/a |
| snapshot (a11y tree) | yes (full @ref tree) | no (returns null) | n/a |
| find (semantic locator) | partial | no | n/a |
| Element @refs | yes | no | n/a |
| Session persistence | yes (profile path) | no | n/a |
| Headed mode | config + executablePath | | n/a (OS-level) |
| Subprocess overhead | yes (shells out per action) | none (in-process) | yes (HTTP per action) |
| OS-level mouse/keyboard | no | no | yes |
Recommendation for AI-driven automation: Use
agent_browser. The accessibility tree snapshot with @ref handles is essential — it lets the agent "see" page structure and target specific elements (e.g. @e12) rather than guessing CSS selectors. Use rust_native only for zero-Node deployments or simple scraping where you already know the selectors. Use computer_use when you need OS-level control beyond the browser DOM.
Recommended Setup: agent_browser
with Visible Chrome Window
agent_browserThis gives you a visible Chrome window that pops up on your desktop (like OpenClaw) — you can watch the AI browse, log into sites, and the profile persists cookies/sessions.
Step 1: Install agent-browser
npm install -g agent-browser # Verify: agent-browser --version
Step 2: Configure agent-browser for headed mode
Create
~/.agent-browser/config.json:
{ "headed": true, "profile": "~/.agent-browser/profile", "executablePath": "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" }
CRITICAL: The
is required for headed (visible) mode. By default, agent-browser uses Playwright's bundled Chromium (executablePath
~/Library/Caches/ms-playwright/chromium-*/) which ignores the headed flag and always runs headless. Pointing to your real Google Chrome install fixes this.
Common Chrome paths:
- macOS:
/Applications/Google Chrome.app/Contents/MacOS/Google Chrome - Linux:
or/usr/bin/google-chrome/usr/bin/chromium - Windows:
C:\Program Files\Google\Chrome\Application\chrome.exe
The
profile path gives you persistent cookies/logins across sessions.
Step 3: Configure ZeroClaw
In
~/.zeroclaw/config.toml:
[browser] enabled = true allowed_domains = ["*"] backend = "agent_browser"
Step 4: Start daemon with headed env var (belt and suspenders)
AGENT_BROWSER_HEADED=true zeroclaw daemon
Or for service install, export the env var in your shell profile first.
agent-browser CLI Reference
agent-browser open <url> # Navigate to URL agent-browser click <selector> # Click element agent-browser type <sel> <text> # Type into element agent-browser fill <sel> <text> # Clear and fill agent-browser screenshot [path] # Take screenshot agent-browser snapshot # Accessibility tree with @refs (for AI) agent-browser eval <js> # Run JavaScript agent-browser close # Close browser agent-browser --headed open <url> # Force visible window agent-browser --session <name> ... # Isolated session agent-browser --profile <path> ... # Persistent browser profile
agent-browser Environment Variables
| Var | Purpose |
|---|---|
| Show browser window (not headless) |
| Session name |
| Auto-save/restore state persistence |
| Persistent browser profile path |
| Custom browser binary |
| Proxy server URL |
| Path to config file |
| Auto-discover running Chrome |
| WebSocket streaming port |
Browser Security Model
- All URLs pass through
which enforcesvalidate_url()allowed_domains
scheme is blocked (prevents local file exfiltration)file://- Private/reserved IP ranges are rejected
- For
: coordinate validation, endpoint must be localhost unlesscomputer_useallow_remote_endpoint = true
Troubleshooting Browser
| Problem | Solution |
|---|---|
| Browser opens but invisible (headless) | Set in to real Chrome, not Playwright Chromium |
| "domain not in allowed list" | Set in ZeroClaw config and restart daemon |
| agent-browser not found | |
| Browser closes immediately | Check ; ensure Chrome is installed |
| Stale session | then retry |
| rust_native "feature not enabled" | Prebuilt binary lacks — rebuild: |
| rust_native snapshot returns null | Expected — rust_native does not support accessibility tree snapshots. Switch to for snapshot/ support |
| ChromeDriver version mismatch | ChromeDriver version must match Chrome version. On macOS: then |
| computer_use actions fail on agent_browser | OS-level actions (mouse_move, mouse_click, etc.) only work on backend |
| is_visible strict mode error | Selector matched multiple elements. Use a more specific CSS selector or an from snapshot |
Full Autonomy Setup (Max Power Mode)
To unlock all capabilities and remove all restrictions:
Config (~/.zeroclaw/config.toml
)
~/.zeroclaw/config.toml[autonomy] level = "full" workspace_only = false allowed_commands = ["*"] forbidden_paths = [] max_actions_per_hour = 200 max_cost_per_day_cents = 5000 require_approval_for_medium_risk = false block_high_risk_commands = false auto_approve = [ "shell", "file_read", "file_write", "memory_store", "memory_recall", "memory_forget", ] always_ask = [] [agent] compact_context = false max_tool_iterations = 50 max_history_messages = 200 parallel_tools = true tool_dispatcher = "auto" [scheduler] enabled = true max_tasks = 128 max_concurrent = 8 [heartbeat] enabled = true interval_minutes = 30 [browser] enabled = true allowed_domains = ["*"] backend = "agent_browser" [http_request] enabled = true allowed_domains = ["*"] max_response_size = 10485760 timeout_secs = 30 [composio] enabled = true entity_id = "default" [web_search] enabled = true provider = "duckduckgo" max_results = 5 timeout_secs = 15
External Dependencies for Full Power
# Browser control (visible Chrome window) npm install -g agent-browser # agent-browser config (~/.agent-browser/config.json) { "headed": true, "profile": "~/.agent-browser/profile", "executablePath": "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" } # Start daemon with headed browser AGENT_BROWSER_HEADED=true zeroclaw daemon
What Each Setting Unlocks
| Setting | What it does |
|---|---|
| No approval needed for any action |
| Can access files anywhere on system |
| Can run any shell command |
| No path restrictions |
| Destructive commands allowed |
| All tools run without confirmation |
| 5x more tool calls per task |
| Run multiple tools simultaneously |
| Browser automation active |
| Can browse any website |
| Can make HTTP requests to any domain |
| 250+ app integrations (Gmail, Calendar, GitHub, etc.) |
| Proactive background checks every 30 min |
| 8 parallel scheduled tasks |
Security Warning
Full autonomy mode removes all guardrails. The agent can:
- Run any command on your system
- Read/write any file
- Browse any website with your Chrome profile (cookies, logins)
- Make HTTP requests to any domain
- Execute shell commands without approval
Only use this on trusted, personal machines. For shared/production use, keep
supervised mode with explicit allowlists.
Operations Runbook
Runtime Modes
| Mode | Command | When |
|---|---|---|
| Foreground runtime | | Local debugging |
| Gateway only | | Webhook testing |
| User service | | Persistent runtime |
Operator Checklist
zeroclaw status # Check config zeroclaw doctor # Run diagnostics zeroclaw channel doctor # Check channel health zeroclaw daemon # Start runtime
Safe Config Change Flow
- Backup
~/.zeroclaw/config.toml - Apply one logical change
- Run
zeroclaw doctor - Restart daemon/service
- Verify with
+statuschannel doctor
Logs
- macOS/Windows:
,~/.zeroclaw/logs/daemon.stdout.logdaemon.stderr.log - Linux systemd:
journalctl --user -u zeroclaw.service -f
Network Deployment
Telegram/Discord/Slack (No Port Needed)
These use long-polling — outbound only. Works behind NAT, on RPi, in home labs.
zeroclaw daemon --host 127.0.0.1 --port 3000
Webhook Channels (WhatsApp, etc.)
Need a public URL. Options:
— Tailscale Funnel[tunnel] provider = "tailscale"
— ngrok tunnel[tunnel] provider = "ngrok"- Cloudflare Tunnel
LAN Access
[gateway] host = "0.0.0.0" allow_public_bind = true
Hardware Peripherals
Supported Boards
| Board | Transport | Path |
|---|---|---|
| nucleo-f401re | serial | /dev/ttyACM0 |
| arduino-uno | serial | /dev/ttyACM0, /dev/cu.usbmodem* |
| arduino-uno-q | bridge | (IP) |
| rpi-gpio | native | native |
| esp32 | serial | /dev/ttyUSB0 |
Adding a Board
zeroclaw peripheral add nucleo-f401re /dev/ttyACM0
Or in config:
[peripherals] enabled = true datasheet_dir = "docs/datasheets" [[peripherals.boards]] board = "nucleo-f401re" transport = "serial" path = "/dev/ttyACM0" baud = 115200
Two Operation Modes
- Edge-Native: ZeroClaw runs directly on device (ESP32, RPi) with local GPIO/I2C/SPI
- Host-Mediated: ZeroClaw on host (Mac/Linux) connects to device via USB/J-Link for development/debugging
Troubleshooting Quick Reference
| Problem | Solution |
|---|---|
not found | |
not found | |
| Gateway unreachable | Check / in config |
Telegram | Stop extra daemon/channel processes — only one poller per token |
| Channel unhealthy | then verify credentials + allowlist |
| Service not running | |
| Config world-readable warning | |
| Browser opens headless (invisible) | Set in to real Chrome — Playwright's bundled Chromium ignores flag |
| "domain not in allowed list" for browser | Set in config + restart daemon |
| Agent claims domain restrictions that don't exist | The LLM is hallucinating — tell it "allowed_domains is wildcard, browse it now" |
not found | |
| rust_native browser feature not in binary | Prebuilt binary lacks it — build from source with |
| No built-in update command | Clone repo + for quick update |
Diagnostic Commands
zeroclaw --version zeroclaw status zeroclaw doctor zeroclaw channel doctor zeroclaw channel list
Workspace Files
| File | Purpose |
|---|---|
| Agent personality, identity, communication style |
| Session protocol, memory system, safety rules |
| Name, creature type, vibe, emoji |
| User profile, preferences, work context |
| Long-term curated memories (auto-injected in main session) |
| Local notes — SSH hosts, device names, environment specifics |
| Periodic tasks (empty = skip heartbeat) |
| First-run onboarding (delete after initial setup) |
Memory System
- Daily notes:
— raw logs (on-demand via tools)memory/YYYY-MM-DD.md - Long-term:
— curated, auto-injected each sessionMEMORY.md - Tools:
,memory_store
,memory_recallmemory_forget
Security Model
- Deny-by-default channel allowlists
- Gateway pairing required by default
- Public bind disabled by default
- Workspace-scoped filesystem access
- Command allowlist for shell execution
- Rate limiting (actions/hour, cost/day)
- Encrypted secrets storage
- Pluggable sandboxing (Landlock, Firejail, Bubblewrap, Docker — feature-gated)
- Audit logging (proposal/roadmap — HMAC-signed tamper-evident logs)
LangGraph / Python Integration
zeroclaw-tools Python package provides LangGraph-based tool calling for consistent behavior with any OpenAI-compatible provider:
pip install zeroclaw-tools
from zeroclaw_tools import create_agent, shell, file_read, file_write agent = create_agent(tools=[shell, file_read, file_write], model="glm-5", api_key="your-api-key", base_url="your-base-url")
Open Skills Integration
ZeroClaw integrates with Open Skills (https://github.com/besoeasy/open-skills) — pre-built execution playbooks that reduce token usage by 95-98%.
Skills are synced to
~/.zeroclaw/workspace/skills/ and installed via:
zeroclaw skills install <github-url-or-local-path>
Key Design Principles
- Zero overhead — <5MB RAM, <10ms startup, ~3.4MB binary
- Zero compromise — full security without sacrificing performance
- 100% Rust — single binary, no runtime dependencies
- 100% Agnostic — swap providers, channels, tools, memory, tunnels at will
- Trait-driven — every subsystem is a trait, making everything pluggable
- Secure by default — pairing, scoping, allowlists, encrypted secrets