# openclaw.net
**Repository Path**: binghe021/openclaw.net
## Basic Information
- **Project Name**: openclaw.net
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-04-18
- **Last Updated**: 2026-04-18
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# OpenClaw.NET
[](https://opensource.org/licenses/MIT)




> **Disclaimer**: This project is not affiliated with, endorsed by, or associated with [OpenClaw](https://github.com/openclaw/openclaw). It is an independent .NET implementation inspired by their work.
Self-hosted **AI agent runtime and gateway for .NET** with 48 native tools, 9 channel adapters, multi-agent routing, review-first self-evolving features, built-in OpenAI/Claude/Gemini provider support, built-in tool presets, NativeAOT support, and practical OpenClaw ecosystem compatibility.
> **New here?** Start with [Getting Started](docs/GETTING_STARTED.md) for the project shape, repository map, and first-run debugging flow. Then run the [Quickstart](docs/QUICKSTART.md). The full doc index is at [docs/README.md](docs/README.md).
## Why This Project Exists
Most agent stacks assume Python- or Node-first runtimes. That works until you want to keep the rest of your system in .NET, publish lean self-contained binaries, or reuse existing tools and plugins without rebuilding your runtime around another language stack.
OpenClaw.NET takes a different path:
- **NativeAOT-friendly runtime and gateway** for .NET agent workloads
- **Practical reuse of existing OpenClaw TS/JS plugins and `SKILL.md` packages** — inspect and install with `openclaw plugins install --dry-run` and `openclaw skills install`
- A real **tool execution layer** with approval hooks, timeout handling, usage tracking, and optional sandbox routing
- **48 native tools** covering file ops, sessions, memory, web search, messaging, home automation, databases, email, calendar, and more
- **9 channel adapters** (Telegram, SMS, WhatsApp, Teams, Slack, Discord, Signal, email, webhooks) with DM policy, allowlists, and signature validation
- **Native LLM providers out of the box** for **OpenAI**, **Claude / Anthropic**, and **Gemini**, plus Azure OpenAI, Ollama, and OpenAI-compatible endpoints
- **Optional Microsoft Agent Framework 1.0 orchestrator backend** in the MAF-enabled artifacts, with `native` still the default orchestrator
- **Review-first self-evolving workflows** that can propose profile updates, automation drafts, and skill drafts from repeated successful sessions
- A foundation for **production-oriented agent infrastructure in .NET**
If this repo is useful to you, please star it.
## Key Features
### Agent Runtime
- Multi-step execution with tool calling, retries, per-call timeouts, streaming, and circuit-breaker behavior
- Context compaction (`/compact` command or automatic) with LLM-powered summarization
- Configurable reasoning effort (`/think off|low|medium|high`)
- Delegated sub-agents with configurable profiles, tool restrictions, and depth limits
- Multi-agent routing — route channels/senders with per-route model, prompt, tool preset, and tool allowlist overrides
- Profile-aware routing — route channels/senders with per-route profile id, capability requirements, preferred tags, and fallback profile order
- Persistent session search, user profiles, and session-scoped todo state available to the agent and operators
### Built-In Providers
- **OpenAI** via `Provider: "openai"`
- **Claude / Anthropic** via `Provider: "anthropic"` or `Provider: "claude"`
- **Gemini** via `Provider: "gemini"` or `Provider: "google"`
- **Azure OpenAI** via `Provider: "azure-openai"`
- **Ollama** via `Provider: "ollama"`
- **OpenAI-compatible** endpoints via `Provider: "openai-compatible"`, `groq`, `together`, or `lmstudio`
OpenClaw registers OpenAI, Claude, and Gemini natively at startup, so a fresh install only needs a provider id, model, and API key to get going.
### Model Profiles and Gemma
OpenClaw now supports **provider-agnostic named model profiles**. This keeps model routing and capability checks above the provider layer, so **Gemma-family models, including Gemma 4, plug into the existing runtime through Ollama or OpenAI-compatible endpoints** instead of requiring a Gemma-specific execution path.
- Configure **Gemma 4 local/dev** with `Provider: "ollama"` and a named profile such as `gemma4-local`
- Configure **Gemma 4 production/self-hosted** with `Provider: "openai-compatible"` and a named profile such as `gemma4-prod`
- Select profiles explicitly or by **capabilities** and **tags** such as `local`, `private`, `cheap`, `tool-reliable`, or `vision`
- The runtime will **fail clearly** or **fall back** if a selected profile cannot satisfy required capabilities like tool calling, structured outputs, streaming, or image input
See [Model Profiles and Gemma](docs/MODEL_PROFILES.md) for the full configuration and evaluation guide.
### Prompt Caching
OpenClaw can now attach **provider-aware prompt caching hints** through the existing model-profile and provider seams rather than introducing a cache-specific runtime path.
- Configure prompt caching globally under `OpenClaw:Llm:PromptCaching` or per named model profile
- Supported cache dialects are normalized as `openai`, `anthropic`, `gemini`, or `none`
- `openai-compatible` and dynamic providers must opt into a dialect explicitly before cache hints are sent
- Cache usage is normalized into `cacheRead` / `cacheWrite` counters and exposed through diagnostics, session status, and provider usage summaries
- Keep-warm is intentionally selective in v1 and only applies to providers with explicit cache TTL/resource semantics
See [Prompt Caching](docs/PROMPT_CACHING.md) for configuration, provider behavior, and diagnostics details.
### Review-First Learning
- The runtime can observe completed sessions and create **pending learning proposals** instead of auto-mutating behavior
- Proposal kinds include **`profile_update`**, **`automation_suggestion`**, and **`skill_draft`**
- Approving a proposal can update a user profile, create a disabled automation draft, or write a managed skill draft and reload skills
- Rejections, approvals, rollbacks, and source-session references are preserved so operators can audit what the system learned and why
- Operators can fetch proposal detail with provenance and computed profile diffs before approving or reverting a learned profile update
- Learning proposals are available over the admin API, `OpenClaw.Client`, and the TUI review flow
### Memory, Profiles, and Automation
- **Session search** spans persisted conversation content for recall and operator lookup
- **User profiles** store stable facts, preferences, projects, tone, and recent intent, with native `profile_read` / `profile_write` tools
- **Memory console** in the built-in admin UI can search note memory, inspect project-scoped entries, edit/delete notes, and export/import portable bundles
- **Profile export/import** supports portability between deployments through the admin API
- **Automations** support list/get/preview/create/update/pause/resume/run flows and integrate with cron-backed delivery
- **Operator dashboard** in the built-in admin UI rolls up session volume, approval queue pressure, memory activity, automation health, channel readiness, and plugin trust into one snapshot
- **Automation center** in the built-in admin UI ships reusable templates like inbox triage, daily summary, incident follow-up, channel moderation, and repo hygiene
- **Learning queue** in the built-in admin UI exposes proposal detail, provenance, diffs, approve/reject actions, rollback, and one-click loading of automation drafts into the automation editor
- **Session console** in the built-in admin UI now shows delegated child sessions, delegated tool usage, proposed changes, and one-click promotion of a successful session into an automation draft, provider policy, or skill draft
- **Todos** are persisted per session and available through the native `todo` tool and operator surfaces
### 48 Native Tools
| Category | Tools |
|----------|-------|
| **File & Code** | `shell`, `read_file`, `write_file`, `edit_file`, `apply_patch`, `process`, `git`, `code_exec`, `browser` |
| **Sessions** | `sessions`, `sessions_history`, `sessions_send`, `sessions_spawn`, `sessions_yield`, `session_status`, `session_search`, `agents_list` |
| **Memory** | `memory`, `memory_search`, `memory_get`, `project_memory` |
| **Web & Data** | `web_search`, `web_fetch`, `x_search`, `pdf_read`, `database` |
| **Communication** | `message`, `email`, `inbox_zero`, `calendar` |
| **Home & IoT** | `home_assistant`, `home_assistant_write`, `mqtt`, `mqtt_publish` |
| **Productivity** | `notion`, `notion_write`, `todo`, `automation`, `cron`, `delegate_agent` |
| **Media & AI** | `image_gen`, `vision_analyze`, `text_to_speech` |
| **System** | `gateway`, `profile_read`, `profile_write` |
### Tool Presets & Groups
Named presets control which tools are available per surface:
| Preset | Description |
|--------|-------------|
| `full` | All tools, no restrictions |
| `coding` | File I/O, shell, git, code execution, browser, memory, sessions |
| `messaging` | Message, sessions, memory, profiles, todo |
| `minimal` | `session_status` only |
| `web` / `telegram` / `automation` / `readonly` | Channel-specific defaults |
Presets compose from reusable **tool groups**: `group:runtime`, `group:fs`, `group:sessions`, `group:memory`, `group:web`, `group:automation`, `group:messaging`.
### 9 Channel Adapters
| Channel | Transport | Features |
|---------|-----------|----------|
| **Telegram** | Webhook | Media markers, photo upload, signature validation |
| **Twilio SMS** | Webhook | Rate limiting, opt-out handling |
| **WhatsApp** | Webhook / Bridge | Official Cloud API + Baileys bridge, typing indicators, read receipts |
| **Teams** | Bot Framework | JWT validation, conversation references, group/DM policy |
| **Slack** | Events API | Thread-to-session mapping, slash commands, HMAC-SHA256, mrkdwn conversion |
| **Discord** | Gateway WebSocket | Persistent connection, slash commands, Ed25519 interaction webhook, rate limiting |
| **Signal** | signald / signal-cli | Unix socket or subprocess bridge, privacy mode (no-content logging) |
| **Email** | IMAP/SMTP | MailKit-based |
| **Webhooks** | HTTP POST | Generic webhook triggers with HMAC validation |
All channels support DM policy (`open` / `pairing` / `closed`), sender allowlists, and deduplication.
### Skills
7 bundled skills: `daily-news-digest`, `data-analyst`, `deep-researcher`, `email-triage`, `homeassistant-operator`, `mqtt-operator`, `software-developer`.
Skills are loaded from workspace (`skills/`), global (`~/.openclaw/skills/`), or plugins. Install from ClawHub with `openclaw clawhub install `.
### Chat Commands
| Command | Description |
|---------|-------------|
| `/status` | Session info (model, turns, tokens) |
| `/new` / `/reset` | Clear conversation history |
| `/model ` | Override LLM model for session |
| `/think off\|low\|medium\|high` | Set reasoning effort level |
| `/compact` | Trigger history compaction |
| `/verbose on\|off` | Show tool calls and token usage per turn |
| `/usage` | Show total token counts |
| `/help` | List commands |
### Plugin System
Install community plugins directly from npm/ClawHub:
```bash
openclaw plugins install @sliverp/qqbot
openclaw plugins install @opik/opik-openclaw
openclaw plugins install @sliverp/qqbot --dry-run
openclaw plugins list
openclaw plugins search openclaw dingtalk
```
The installer now classifies each candidate as `first-party`, `upstream-compatible`, `third-party-reviewed`, or `untrusted`, reports compatibility diagnostics, and blocks installs when manifest-backed checks fail.
Operators can review a loaded plugin from the built-in admin UI or the admin API:
- `POST /admin/plugins/{id}/review`
- `POST /admin/plugins/{id}/unreview`
- `GET /admin/plugins`
Supports JS/TS bridge plugins, native dynamic .NET plugins (`jit` mode), and standalone `SKILL.md` packages. See the [Compatibility Guide](docs/COMPATIBILITY.md).
### Skill Packages
Inspect and install standalone upstream-style skill folders without going through ClawHub:
```bash
openclaw skills inspect ./skills/my-skill
openclaw skills install ./skills/my-skill --dry-run
openclaw skills install ./skills/my-skill
openclaw skills list
```
The admin UI also exposes a live skill inventory through `GET /admin/skills`, including trust level, requirements, dispatch mode, and install location.
OpenClaw.NET now also ships the pinned public compatibility catalog that backs the smoke lane:
```bash
openclaw compatibility catalog
openclaw compatibility catalog --status compatible --kind npm-plugin
openclaw compat catalog --json
```
Operators can inspect the same catalog through `GET /admin/compatibility/catalog` or `GET /api/integration/compatibility/catalog` to see tested pass/fail scenarios, install commands, required config examples, and expected diagnostics for representative upstream packages.
### Integrations
| Integration | Description |
|-------------|-------------|
| **Tailscale Serve/Funnel** | Zero-config remote access via Tailscale |
| **Gmail Pub/Sub** | Email event triggers via Google Pub/Sub push notifications |
| **mDNS/Bonjour** | Local network service discovery |
| **Semantic Kernel** | Host SK tools/agents behind the gateway |
| **MAF Orchestrator** | Microsoft Agent Framework 1.0 backend (optional) |
| **MCP** | Model Context Protocol facade for tools, resources, prompts |
## Architecture
### System view
```mermaid
flowchart TB
subgraph Clients
A1["Browser UI / CLI / TUI / Companion"]
A2["HTTP / WebSocket / SDK clients"]
A3["Channels: Telegram, SMS, WhatsApp,
Teams, Slack, Discord, Signal, Email"]
end
subgraph "OpenClaw.NET Gateway"
B1["Endpoints and Auth"]
B2["Routing and Policy"]
B3["Sessions and Memory"]
B4["Agent Runtime"]
B5["Tool Execution and Presets"]
B6["Admin / Diagnostics / Observability"]
end
subgraph "Execution Backends"
C1["48 Native Tools"]
C2[TS/JS Plugin Bridge]
C3["Native Dynamic Plugins (JIT)"]
C4[Sandbox / Docker / SSH]
end
subgraph "State and External Systems"
D1["LLM Providers"]
D2["Memory Store / Session Store"]
D3["Cron / Automations"]
D4["External APIs and Services"]
end
Clients --> B1
B1 --> B2
B2 --> B3
B3 --> B4
B4 --> B5
B5 --> C1 & C2 & C3 & C4
B2 --> B6
B3 --> D2
B4 --> D1
B4 --> D3
C1 & C2 & C3 --> D4
B1 --> B6
B4 --> B6
```
### Runtime flow
```mermaid
sequenceDiagram
participant Inbound as UI / CLI / Channel
participant Gateway as Gateway
participant Session as Sessions / Memory
participant Agent as Agent Runtime
participant LLM as LLM Provider
participant Tools as Tools / Plugins
Inbound->>Gateway: Message or request
Gateway->>Session: Resolve route and session
Session-->>Gateway: Session state
Gateway->>Agent: Run turn
Agent->>LLM: Prompt + history + tool schema
LLM-->>Agent: Response or tool call request
Agent->>Tools: Execute tool calls
Tools-->>Agent: Tool outputs
Agent->>LLM: Continue with results
LLM-->>Agent: Final answer
Agent-->>Gateway: Output + telemetry
Gateway-->>Inbound: Response or stream
```
### Startup flow
```mermaid
flowchart LR
Args["Args / config path"] --> Bootstrap["Bootstrap"]
Bootstrap --> Config["Resolve config and secrets"]
Config --> Checks["Doctor / health-check / hardening"]
Checks --> Services["Register services"]
Services --> Build["builder.Build()"]
Build --> Runtime["Initialize runtime"]
Runtime --> Load["Load providers, skills, plugins, workers"]
Load --> Map["Apply pipeline and map endpoints"]
Map --> Run["Run gateway"]
```
### Runtime modes
| Mode | Description |
|------|-------------|
| `aot` | Trim-safe, low-memory lane. Native tools and bridge plugins only. |
| `jit` | Full plugin surfaces: channels, commands, providers, dynamic .NET plugins. |
| `auto` | Selects `jit` when dynamic code is available, `aot` otherwise. |
## Quickstart
If you want the architecture and repository map before running commands, start with [Getting Started](docs/GETTING_STARTED.md). If you want the shortest supported path to a working local instance, continue below and then use the [Quickstart Guide](docs/QUICKSTART.md).
```bash
git clone https://github.com/clawdotnet/openclaw.net
cd openclaw.net
# Guided local bootstrap
dotnet run --project src/OpenClaw.Cli -c Release -- setup
# Or automate the same path
dotnet run --project src/OpenClaw.Cli -c Release -- setup \
--non-interactive \
--profile local \
--workspace "$PWD/workspace" \
--provider openai \
--model gpt-4o \
--api-key env:MODEL_PROVIDER_KEY
```
For a reverse-proxy/public deployment:
```bash
dotnet run --project src/OpenClaw.Cli -c Release -- setup --profile public
```
For raw bootstrap files instead of the guided flow:
```bash
dotnet run --project src/OpenClaw.Cli -c Release -- init --preset both
```
`setup` writes an external config file, an adjacent env example, and prints the exact gateway launch, `--doctor`, and `admin posture` commands for the generated config.
For the supported local-first launch path, continue with:
```bash
openclaw setup launch --config ~/.openclaw/config/openclaw.settings.json
```
For generated deploy artifacts on Linux and macOS:
```bash
openclaw setup service --config ~/.openclaw/config/openclaw.settings.json --platform all
openclaw setup status --config ~/.openclaw/config/openclaw.settings.json
```
If the CLI is already on your `PATH`, the same guided entrypoint is simply:
```bash
openclaw setup
```
After the base config exists, common channel onboarding is also CLI-driven:
```bash
openclaw setup channel telegram --config ~/.openclaw/config/openclaw.settings.json
openclaw setup channel slack --config ~/.openclaw/config/openclaw.settings.json
openclaw setup channel discord --config ~/.openclaw/config/openclaw.settings.json
openclaw setup channel teams --config ~/.openclaw/config/openclaw.settings.json
openclaw setup channel whatsapp --config ~/.openclaw/config/openclaw.settings.json
```
See [Quickstart Guide](docs/QUICKSTART.md), [Compatibility Guide](docs/COMPATIBILITY.md), and [User Guide](docs/USER_GUIDE.md) for the full onboarding path and supported compatibility surface.
> **Breaking change**: `OPENCLAW_AUTH_TOKEN` is now the bootstrap and breakglass path, not the recommended day-to-day operator login. Use named operator accounts for browser admin access, and use operator account tokens for Companion, CLI, API, and websocket clients.
Then open one of:
| Surface | URL |
|---------|-----|
| Web UI / Live Chat | `http://127.0.0.1:18789/chat` |
| WebSocket | `ws://127.0.0.1:18789/ws` |
| Live WebSocket | `ws://127.0.0.1:18789/ws/live` |
| Integration API | `http://127.0.0.1:18789/api/integration/status` |
| MCP endpoint | `http://127.0.0.1:18789/mcp` |
| OpenAI-compatible | `http://127.0.0.1:18789/v1/responses` |
## Operator Auth And Deployment Surfaces
- Browser admin UI at `/admin` is now account/session-first. Sign in with an operator account username and password, or use an operator account token if you are automating browser login.
- Companion, CLI, API, and websocket clients should use operator account tokens. The gateway now exposes `POST /auth/operator-token` for credential-to-token exchange.
- `OPENCLAW_AUTH_TOKEN` still matters on non-loopback binds, but it is intended for first-account bootstrap and emergency access.
- Mutation access is role-gated: `viewer` is read-only, `operator` can run approvals/memory/automation/session mutations, and `admin` can manage settings, plugins, provider policy, accounts, and deployment policy.
Operator setup and deploy status surfaces:
- `GET /admin/setup/status`
- `GET /admin/observability/summary`
- `GET /admin/observability/series`
- `GET /admin/audit/export`
The built-in admin UI now includes setup status, operator accounts, organization policy, observability, audit export, and a local migration report viewer.
**Other entry points:**
```bash
# CLI chat
dotnet run --project src/OpenClaw.Cli -c Release -- chat
# Inspect registered model profiles
dotnet run --project src/OpenClaw.Cli -c Release -- models list
# Run a built-in evaluation suite against a profile
dotnet run --project src/OpenClaw.Cli -c Release -- eval run --profile gemma4-prod
# CLI live session
dotnet run --project src/OpenClaw.Cli -c Release -- live --provider gemini
# One-shot CLI run
dotnet run --project src/OpenClaw.Cli -c Release -- run "summarize this README" --file ./README.md
# Install a plugin
dotnet run --project src/OpenClaw.Cli -c Release -- plugins install @sliverp/qqbot
# Desktop companion (Avalonia)
dotnet run --project src/OpenClaw.Companion -c Release
# Terminal UI
dotnet run --project src/OpenClaw.Cli -c Release -- tui
```
**Key environment variables:**
| Variable | Default | Purpose |
|----------|---------|---------|
| `MODEL_PROVIDER_KEY` | — | LLM provider API key |
| `OpenClaw__Llm__Provider` | `openai` | Built-in provider id (`openai`, `anthropic`, `claude`, `gemini`, `google`, `azure-openai`, `ollama`) |
| `OpenClaw__Llm__Model` | provider-specific | Default model id for the selected provider |
| `OPENCLAW_WORKSPACE` | — | Workspace directory for file tools |
| `OPENCLAW_AUTH_TOKEN` | — | Bootstrap / breakglass token for non-loopback deployments |
| `OpenClaw__Runtime__Mode` | `auto` | Runtime lane (`aot`, `jit`, or `auto`) |
## Upstream Migration
Use the upstream migration flow when you are translating an upstream-style OpenClaw repo into an external OpenClaw.NET config:
```bash
openclaw migrate upstream \
--source ./upstream-agent \
--target-config ~/.openclaw/config/openclaw.settings.json \
--report ./migration-report.json
```
Dry-run is the default. `--apply` writes translated config, imports managed `SKILL.md` packages, and writes a plugin review plan next to the target config.
> **Breaking change**: bare `openclaw migrate` still exists for the legacy automation migration path. The new upstream translation flow is `openclaw migrate upstream`.
**Common provider examples:**
```bash
# OpenAI
export OpenClaw__Llm__Provider="openai"
export OpenClaw__Llm__Model="gpt-4.1"
export MODEL_PROVIDER_KEY="sk-..."
# Claude
export OpenClaw__Llm__Provider="claude"
export OpenClaw__Llm__Model="claude-sonnet-4-5"
export MODEL_PROVIDER_KEY="sk-ant-..."
# Gemini
export OpenClaw__Llm__Provider="gemini"
export OpenClaw__Llm__Model="gemini-2.5-flash"
export MODEL_PROVIDER_KEY="AIza..."
# Ollama
export OpenClaw__Llm__Provider="ollama"
export OpenClaw__Llm__Model="gemma4"
# OpenAI-compatible
export OpenClaw__Llm__Provider="openai-compatible"
export OpenClaw__Llm__Model="gemma-4"
export OpenClaw__Llm__Endpoint="https://your-inference-gateway.example.com/v1"
export MODEL_PROVIDER_KEY="your-api-key"
```
**Example model profile config with Gemma 4:**
```json
{
"OpenClaw": {
"Llm": {
"Provider": "openai",
"Model": "gpt-4.1"
},
"Models": {
"DefaultProfile": "gemma4-prod",
"Profiles": [
{
"Id": "gemma4-local",
"Provider": "ollama",
"Model": "gemma4",
"BaseUrl": "http://localhost:11434/v1",
"Tags": ["local", "private", "cheap"],
"Capabilities": {
"SupportsTools": false,
"SupportsVision": true,
"SupportsJsonSchema": false,
"SupportsStructuredOutputs": false,
"SupportsStreaming": true,
"SupportsParallelToolCalls": false,
"SupportsReasoningEffort": false,
"SupportsSystemMessages": true,
"SupportsImageInput": true,
"SupportsAudioInput": false,
"MaxContextTokens": 131072,
"MaxOutputTokens": 8192
}
},
{
"Id": "gemma4-prod",
"Provider": "openai-compatible",
"Model": "gemma-4",
"BaseUrl": "https://your-inference-gateway.example.com/v1",
"ApiKey": "env:MODEL_PROVIDER_KEY",
"Tags": ["private", "prod", "vision"],
"FallbackProfileIds": ["frontier-tools"],
"Capabilities": {
"SupportsTools": true,
"SupportsVision": true,
"SupportsJsonSchema": true,
"SupportsStructuredOutputs": true,
"SupportsStreaming": true,
"SupportsParallelToolCalls": true,
"SupportsReasoningEffort": false,
"SupportsSystemMessages": true,
"SupportsImageInput": true,
"SupportsAudioInput": false,
"MaxContextTokens": 262144,
"MaxOutputTokens": 16384
}
},
{
"Id": "frontier-tools",
"Provider": "openai",
"Model": "gpt-4.1",
"Tags": ["tool-reliable", "frontier"],
"Capabilities": {
"SupportsTools": true,
"SupportsVision": true,
"SupportsJsonSchema": true,
"SupportsStructuredOutputs": true,
"SupportsStreaming": true,
"SupportsParallelToolCalls": true,
"SupportsReasoningEffort": true,
"SupportsSystemMessages": true,
"SupportsImageInput": true,
"SupportsAudioInput": true,
"MaxContextTokens": 1000000,
"MaxOutputTokens": 32768
}
}
]
}
}
}
```
See the full [Quickstart Guide](docs/QUICKSTART.md) for deployment notes.
## Docker Deployment
```bash
export MODEL_PROVIDER_KEY="sk-..."
export OPENCLAW_AUTH_TOKEN="$(openssl rand -hex 32)"
# Gateway only
docker compose up -d openclaw
# With automatic TLS via Caddy
export OPENCLAW_DOMAIN="openclaw.example.com"
docker compose --profile with-tls up -d
```
### Published images
- `ghcr.io/clawdotnet/openclaw.net:latest`
- `tellikoroma/openclaw.net:latest`
- `public.ecr.aws/u6i5b9b7/openclaw.net:latest`
| Volume | Purpose |
|--------|---------|
| `/app/memory` | Session history + memory notes (persist across restarts) |
| `/app/workspace` | Mounted workspace for file tools (optional) |
See [Docker Image Notes](docs/DOCKERHUB.md) for details.
## Security and Hardening
When binding to a non-loopback address, the gateway **refuses to start** unless dangerous settings are explicitly hardened:
- Auth token **required** for non-loopback binds
- Wildcard tooling roots, shell access, and plugin execution blocked by default
- Webhook signature validation enforced (Slack HMAC-SHA256, Discord Ed25519, WhatsApp X-Hub-Signature-256)
- `raw:` secret refs rejected on public binds
- DM policy enforcement per channel (`open`, `pairing`, `closed`)
- Rate limiting per-IP, per-connection, and per-session
See [Security Guide](SECURITY.md) for full hardening guidance and [Sandboxing Guide](docs/sandboxing.md) for sandbox routing.
## Observability
| Endpoint | Description |
|----------|-------------|
| `GET /health` | Health check |
| `GET /metrics` | Runtime counters (requests, tokens, tool calls, circuit breaker) |
| `GET /memory/retention/status` | Retention config + last sweep |
| `POST /memory/retention/sweep` | Manual retention sweep (`?dryRun=true`) |
| `GET /admin/observability/summary` | Aggregated approval, automation, provider, channel, and operator activity summary |
| `GET /admin/observability/series` | Time-bucketed observability series for the same metrics |
| `GET /admin/audit/export` | Zip bundle with tamper-evident operator audit metadata and JSONL review artifacts |
All operations emit structured logs and `.NET Activity` traces with correlation IDs, exportable to OTLP collectors.
## Docs
| Document | Description |
|----------|-------------|
| [Getting Started](docs/GETTING_STARTED.md) | Project overview, repository map, setup flow, and first-run debugging |
| [Quickstart Guide](docs/QUICKSTART.md) | Local setup and first usage |
| [User Guide](docs/USER_GUIDE.md) | Runtime concepts, providers, tools, skills, memory, channels |
| [Tool Guide](docs/TOOLS_GUIDE.md) | Built-in tools, native integrations, approval guidance |
| [Compatibility Guide](docs/COMPATIBILITY.md) | Skills, plugin surfaces, channel parity, known limitations |
| [Security Guide](SECURITY.md) | Hardening guidance for public deployments |
| [Sandboxing Guide](docs/sandboxing.md) | Sandbox routing, build flags, config |
| [Semantic Kernel Guide](docs/SEMANTIC_KERNEL.md) | Hosting SK tools/agents behind OpenClaw.NET |
| [WhatsApp Setup](docs/WHATSAPP_SETUP.md) | Worker setup and auth flow |
| [Docker Image Notes](docs/DOCKERHUB.md) | Container usage and image references |
| [Changelog](CHANGELOG.md) | Tracked project changes |
## CI/CD
GitHub Actions (`.github/workflows/ci.yml`):
- **On push/PR to main**: build + test standard and MAF-enabled targets
- **On push to main**: publish gateway artifacts (`standard-{jit|aot}`, `maf-enabled-{jit|aot}`), NativeAOT CLI, and Docker image to GHCR
## Contributing
Looking for:
- Security review and penetration testing
- NativeAOT trimming improvements
- Tool sandboxing and isolation ideas
- New channel adapters and integrations
- Performance benchmarks
If this aligns with your interests, open an issue. If this project helps your .NET AI work, consider starring it.