From 1a556bf88f8cc2ee8d4c8b33f1fb26023c0f1d32 Mon Sep 17 00:00:00 2001 From: Paulo Truta Date: Wed, 21 Jan 2026 21:17:14 +0100 Subject: [PATCH 1/6] feat: Add Clawdbot AI Agent Gateway EdgeApp - Adds Clawdbot as a containerized Edgebox app - Centralized gateway for WhatsApp, Telegram, Discord, and iMessage - Supports local client connections via Bridge protocol - Configurable via Edgebox dashboard (channel tokens, model selection) - Exposes ports 18789 (Gateway), 18790 (Bridge), 18793 (Canvas) - Persistent configuration and workspace storage - Comprehensive documentation and configuration templates --- clawd/.dockerignore | 1 + clawd/Dockerfile | 57 ++++++++++ clawd/README.md | 192 ++++++++++++++++++++++++++++++++++ clawd/clawdbot.json.template | 41 ++++++++ clawd/edgeapp.template.env | 21 ++++ clawd/edgebox-compose.yml | 71 +++++++++++++ clawd/edgebox-hosts.txt | 1 + clawd/edgebox-icon.png | Bin 0 -> 15423 bytes clawd/edgebox-postinstall.sh | 5 + clawd/edgebox-postinstall.txt | 1 + clawd/edgebox.env | 14 +++ clawd/entrypoint.sh | 37 +++++++ clawd/src/build/hello.conf | 16 +++ clawd/src/install/index.html | 96 +++++++++++++++++ 14 files changed, 553 insertions(+) create mode 100644 clawd/.dockerignore create mode 100644 clawd/Dockerfile create mode 100644 clawd/README.md create mode 100644 clawd/clawdbot.json.template create mode 100644 clawd/edgeapp.template.env create mode 100644 clawd/edgebox-compose.yml create mode 100644 clawd/edgebox-hosts.txt create mode 100644 clawd/edgebox-icon.png create mode 100755 clawd/edgebox-postinstall.sh create mode 100644 clawd/edgebox-postinstall.txt create mode 100644 clawd/edgebox.env create mode 100644 clawd/entrypoint.sh create mode 100644 clawd/src/build/hello.conf create mode 100644 clawd/src/install/index.html diff --git a/clawd/.dockerignore b/clawd/.dockerignore new file mode 100644 index 0000000..c1250f7 --- /dev/null +++ b/clawd/.dockerignore @@ -0,0 +1 @@ +appdata/* \ No newline at end of file diff --git a/clawd/Dockerfile b/clawd/Dockerfile new file mode 100644 index 0000000..66d86a7 --- /dev/null +++ b/clawd/Dockerfile @@ -0,0 +1,57 @@ +# Clawdbot AI Agent Gateway +FROM node:22-bookworm-slim + +LABEL org.opencontainers.image.description="Clawdbot - AI Agent Gateway for WhatsApp, Telegram, Discord, and iMessage" + +# Install runtime dependencies +RUN apt-get update && apt-get install -y --no-install-recommends \ + curl \ + git \ + python3 \ + python3-pip \ + ffmpeg \ + imagemagick \ + ghostscript \ + libxcb1 \ + libxkbcommon0 \ + dumb-init \ + tini \ + && rm -rf /var/lib/apt/lists/* + +# Create app user first +RUN useradd -m -u 1001 -s /bin/bash clawdbot + +# Set working directory +WORKDIR /home/clawdbot + +# Create necessary directories with proper permissions +RUN mkdir -p \ + /home/system/components/clawd/config \ + /home/system/components/clawd/data/.clawdbot \ + /home/system/components/clawd/data/clawd && \ + chown -R clawdbot:clawdbot /home/system/components/clawd /home/clawdbot + +# Copy entrypoint script and config template BEFORE installing clawdbot +COPY --chown=clawdbot:clawdbot ./entrypoint.sh /app/entrypoint.sh +RUN chmod +x /app/entrypoint.sh && chown clawdbot /app + +COPY --chown=clawdbot:clawdbot ./clawdbot.json.template /app/clawdbot.json.template + +# Switch to app user for npm install +USER clawdbot + +# Clear npm cache and install Clawdbot fresh +RUN npm cache clean --force && npm install -g clawdbot@latest + +# Expose ports +EXPOSE 18789 18790 18793 80 + +# Health check +HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \ + CMD curl -f http://localhost:18789/health || exit 1 + +# Use tini to handle signals properly +ENTRYPOINT ["/usr/bin/tini", "--"] + +# Start the Clawdbot gateway +CMD ["/app/entrypoint.sh"] diff --git a/clawd/README.md b/clawd/README.md new file mode 100644 index 0000000..f3e5a73 --- /dev/null +++ b/clawd/README.md @@ -0,0 +1,192 @@ +# Clawdbot - AI Agent Gateway EdgeApp + +**Clawdbot** is an AI agent gateway that integrates WhatsApp, Telegram, Discord, and iMessage into a unified control plane. This EdgeApp runs Clawdbot as a centralized hub that local instances can connect to. + +## Overview + +- 🤖 **AI-Powered**: Integrates Claude (Anthropic) and other LLMs via Pi agent +- 📱 **Multi-Channel**: WhatsApp, Telegram, Discord, iMessage all in one place +- 🌐 **Distributed**: Central gateway with local client connections +- 🔒 **Secure**: Token-based auth, per-agent sandboxing +- 🎛️ **Configurable**: Dashboard UI for channel setup and credentials + +## Quick Start + +### Installation + +```bash +# Clone or sync the edgebox-iot/apps repo +cd ~/Repositories/edgebox-iot/apps + +# Build locally +make build apps="clawd" + +# Run locally +make run apps="clawd" +``` + +Access the dashboard at: **http://clawd.local** + +### Configuration + +The Clawdbot gateway is configurable via the Edgebox dashboard. Key settings: + +- **Telegram Bot Token**: Get from [@BotFather](https://t.me/BotFather) +- **Discord Bot Token**: Create at [Discord Developer Portal](https://discord.com/developers) +- **Gateway Token**: Optional security token for remote access +- **Primary Model**: Which LLM to use (default: Claude Opus 4.5) + +### Ports + +- **18789**: Gateway WebSocket (loopback by default, use token for remote) +- **18790**: Bridge for iOS/Android node pairing +- **18793**: Canvas host (WebView assets) +- **80**: Web UI (reverse-proxied via Traefik) + +## Architecture + +``` +┌─────────────────────────────────┐ +│ Edgebox System │ +│ ┌─────────────────────────┐ │ +│ │ Clawdbot Gateway │ │ +│ │ - WhatsApp/Telegram │ │ +│ │ - Discord/iMessage │ │ +│ │ - WebChat UI │ │ +│ │ - Auth Management │ │ +│ └─────────────────────────┘ │ +│ ↑ ↓ │ +│ ┌─────────────────────────┐ │ +│ │ Traefik Reverse Proxy │ │ +│ │ (clawd.local) │ │ +│ └─────────────────────────┘ │ +└─────────────────────────────────┘ + ↑ + LAN / Tailnet + ↓ +┌─────────────────────────────────┐ +│ Local Clawdbot (Mac/Linux) │ +│ Connects to central Gateway │ +└─────────────────────────────────┘ +``` + +## Local Client Configuration + +To connect a local Clawdbot instance to this central gateway: + +```json +{ + "gateway": { + "bind": "remote", + "host": "clawd.local", + "port": 18789, + "token": "${CLAWDBOT_GATEWAY_TOKEN}" + }, + "agents": { + "defaults": { + "workspace": "~/clawd-local" + } + } +} +``` + +## File Structure + +``` +clawd/ +├── Dockerfile # Node 22 + Clawdbot +├── entrypoint.sh # Init script +├── clawdbot.json.template # Default config +├── edgebox-compose.yml # Docker Compose config +├── edgebox.env # Metadata (EDGEAPP_NAME, etc.) +├── edgeapp.template.env # Config variables for dashboard +├── edgeapp-icon.png # App icon +├── edgebox-postinstall.sh # Post-install hook +└── src/ # Static assets (if any) +``` + +## Environment Variables + +| Variable | Type | Required | Description | +|----------|------|----------|-------------| +| `TELEGRAM_BOT_TOKEN` | string | false | Telegram Bot API token | +| `DISCORD_BOT_TOKEN` | string | false | Discord Bot token | +| `CLAWDBOT_GATEWAY_TOKEN` | string | false | Security token for remote access | +| `CLAWDBOT_PRIMARY_MODEL` | string | false | Primary LLM (default: claude-opus-4-5) | +| `ANTHROPIC_API_KEY` | string | false | Anthropic API key | +| `OPENAI_API_KEY` | string | false | OpenAI API key (fallback) | + +## Persistence + +- **Config**: `/home/system/components/clawd/config/clawdbot.json` +- **Workspace**: `/home/system/components/clawd/data/clawd` +- **State**: `/home/system/components/clawd/data/.clawdbot` + +Data persists across container restarts via Docker volumes. + +## Extending + +### Add a New Agent + +Edit `clawdbot.json`: + +```json +{ + "agents": { + "list": [ + { "id": "main", "workspace": "..." }, + { "id": "work", "workspace": "..." } + ] + }, + "bindings": [ + { "agentId": "work", "match": { "channel": "discord" } } + ] +} +``` + +### Multi-instance Setup + +Run multiple app instances with different ports: + +```bash +# Instance 1 +docker-compose -p clawd-1 up -d + +# Instance 2 +docker-compose -p clawd-2 up -d +``` + +## Troubleshooting + +### Health Check Fails + +```bash +# Check logs +docker logs edgebox-clawd-ws + +# Verify ports are open +lsof -i :18789 +``` + +### Can't Connect from Local Client + +- Ensure `CLAWDBOT_GATEWAY_TOKEN` is set in both gateway and client +- Check network connectivity: `ping clawd.local` +- Verify firewall allows port 18789 + +### Channel Credentials Not Loading + +- Set env variables in docker-compose or Edgebox dashboard +- Restart the container after changing credentials +- Check logs for auth errors + +## Resources + +- **Clawdbot Docs**: https://docs.clawd.bot +- **Clawdbot GitHub**: https://github.com/clawdbot/clawdbot +- **Edgebox Docs**: https://edgebox.io +- **Clawdbot Discord**: https://discord.com/invite/clawd + +## License + +MIT - Same as Clawdbot diff --git a/clawd/clawdbot.json.template b/clawd/clawdbot.json.template new file mode 100644 index 0000000..b92bd8a --- /dev/null +++ b/clawd/clawdbot.json.template @@ -0,0 +1,41 @@ +{ + "gateway": { + "port": 18789, + "bind": "0.0.0.0", + "canvasHost": { + "port": 18793, + "bind": "0.0.0.0" + } + }, + "agents": { + "defaults": { + "workspace": "/home/system/components/clawd/data/clawd", + "models": { + "anthropic/claude-opus-4-5": { "alias": "opus" }, + "anthropic/claude-sonnet-4-5": { "alias": "sonnet" }, + "openai/gpt-5.2": { "alias": "gpt" } + }, + "model": { + "primary": "anthropic/claude-opus-4-5" + }, + "thinkingDefault": "low", + "timeoutSeconds": 600 + } + }, + "channels": { + "telegram": { + "enabled": true, + "botToken": "${TELEGRAM_BOT_TOKEN}" + }, + "discord": { + "enabled": true, + "token": "${DISCORD_BOT_TOKEN}" + }, + "whatsapp": { + "enabled": true + } + }, + "messages": { + "responsePrefix": "[Clawd]" + } +} diff --git a/clawd/edgeapp.template.env b/clawd/edgeapp.template.env new file mode 100644 index 0000000..6de9d0a --- /dev/null +++ b/clawd/edgeapp.template.env @@ -0,0 +1,21 @@ +# Clawdbot Configuration Template +# Format: VARIABLE_NAME=type|required|description +# Types: bool, string, number, array +# Required: true/false + +# Channel Credentials +TELEGRAM_BOT_TOKEN=string|false|Telegram Bot API token from @BotFather +DISCORD_BOT_TOKEN=string|false|Discord Bot token from Developer Portal +WHATSAPP_ENABLED=bool|false|Enable WhatsApp channel + +# Gateway Access +CLAWDBOT_GATEWAY_TOKEN=string|false|Security token for remote gateway access (required for non-loopback) + +# Model/Agent Configuration +CLAWDBOT_PRIMARY_MODEL=string|false|Primary LLM model (default: anthropic/claude-opus-4-5) +ANTHROPIC_API_KEY=string|false|Anthropic API key for Claude +OPENAI_API_KEY=string|false|OpenAI API key (fallback) + +# Optional: Advanced Configuration +CLAWDBOT_THINKING_DEFAULT=string|false|Default thinking level (off/low/high) +CLAWDBOT_TIMEOUT_SECONDS=number|false|Agent timeout in seconds (default: 600) diff --git a/clawd/edgebox-compose.yml b/clawd/edgebox-compose.yml new file mode 100644 index 0000000..9d11ed9 --- /dev/null +++ b/clawd/edgebox-compose.yml @@ -0,0 +1,71 @@ +services: + ############## + # Clawdbot AI Agent Gateway + ############## + clawd-ws: + image: ghcr.io/edgebox-iot/apps/${COMPOSE_APP_SLUG-clawd}:1.0.0 + build: + context: "./" + container_name: '${COMPOSE_PROJECT_NAME-edgebox}-${COMPOSE_APP_SLUG-clawd}-ws' + restart: unless-stopped + environment: + # Traefik reverse proxy variables + VIRTUAL_HOST: ${LOCAL_URL-clawd.local}${INTERNET_URL-} + VIRTUAL_PORT: 80 + + # Clawdbot configuration paths + CLAWDBOT_WORKSPACE: ${CLAWDBOT_WORKSPACE-/home/system/components/clawd/data/clawd} + CLAWDBOT_STATE_DIR: ${CLAWDBOT_STATE_DIR-/home/system/components/clawd/data/.clawdbot} + CLAWDBOT_CONFIG_PATH: ${CLAWDBOT_CONFIG_PATH-/home/system/components/clawd/config/clawdbot.json} + + # Gateway token for remote access + CLAWDBOT_GATEWAY_TOKEN: ${CLAWDBOT_GATEWAY_TOKEN} + + # Channel credentials + TELEGRAM_BOT_TOKEN: ${TELEGRAM_BOT_TOKEN} + DISCORD_BOT_TOKEN: ${DISCORD_BOT_TOKEN} + + # Node environment + NODE_ENV: production + NODE_OPTIONS: --max-old-space-size=1024 + + volumes: + # System time (read-only) + - /etc/localtime:/etc/localtime:ro + # Config directory (persistent) + - ./appdata/${COMPOSE_APP_SLUG-clawd}-config:/home/system/components/clawd/config:rw + # Data directory (persistent state, auth profiles, workspace) + - ./appdata/${COMPOSE_APP_SLUG-clawd}-data:/home/system/components/clawd/data:rw + + # Expose all necessary ports + ports: + # Gateway WebSocket + - "18789:18789" + # Bridge for node pairing (LAN/Tailnet) + - "18790:18790" + # Canvas host (WebView assets) + - "18793:18793" + + # Network settings (traefik optional for dev) + networks: + default: null + + # Health check + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:18789/health"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 40s + + # Logging + logging: + driver: "json-file" + options: + max-size: "50m" + max-file: "5" + +networks: + default: + driver: bridge + diff --git a/clawd/edgebox-hosts.txt b/clawd/edgebox-hosts.txt new file mode 100644 index 0000000..ce01362 --- /dev/null +++ b/clawd/edgebox-hosts.txt @@ -0,0 +1 @@ +hello diff --git a/clawd/edgebox-icon.png b/clawd/edgebox-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e07ed524f2949c6a08e314ffb34d406e601c673d GIT binary patch literal 15423 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 OshP3WnM%XU*Zvp$KTiGt literal 0 HcmV?d00001 diff --git a/clawd/edgebox-postinstall.sh b/clawd/edgebox-postinstall.sh new file mode 100755 index 0000000..2ebf1c9 --- /dev/null +++ b/clawd/edgebox-postinstall.sh @@ -0,0 +1,5 @@ +# mkdir -p ./appdata/hello-ws +echo "📦 hello postinstall script" +echo "- Running in $(pwd)" +echo "- Copying files to ./appdata/hello-ws" +cp ./src/install/* ./appdata/hello-ws/ \ No newline at end of file diff --git a/clawd/edgebox-postinstall.txt b/clawd/edgebox-postinstall.txt new file mode 100644 index 0000000..94b83a3 --- /dev/null +++ b/clawd/edgebox-postinstall.txt @@ -0,0 +1 @@ +-T hello-ws pwd diff --git a/clawd/edgebox.env b/clawd/edgebox.env new file mode 100644 index 0000000..588c37d --- /dev/null +++ b/clawd/edgebox.env @@ -0,0 +1,14 @@ +############################################ +# Edgebox WS and API environment variables +############################################ + +# Metadata values - Used by edgebox api service for UI and update control purposes +EDGEAPP_NAME=Clawdbot +EDGEAPP_DESCRIPTION=AI Agent Gateway (WhatsApp/Telegram/Discord/iMessage) +EDGEAPP_VERSION=1.0.0 + +# Compose values - Used by edgebox ws service for containers setup +COMPOSE_PROJECT_NAME=edgebox +COMPOSE_APP_SLUG=clawd + + diff --git a/clawd/entrypoint.sh b/clawd/entrypoint.sh new file mode 100644 index 0000000..742c3b2 --- /dev/null +++ b/clawd/entrypoint.sh @@ -0,0 +1,37 @@ +#!/bin/sh +# Clawdbot Edgebox App Entrypoint + +set -e + +echo "[Clawdbot] Initializing Edgebox app..." + +# Create necessary directories +mkdir -p \ + /home/system/components/clawd/config \ + /home/system/components/clawd/data/.clawdbot \ + /home/system/components/clawd/data/clawd + +# Create default config if not present +if [ ! -f /home/system/components/clawd/config/clawdbot.json ]; then + echo "[Clawdbot] Creating default configuration from template..." + cp /app/clawdbot.json.template /home/system/components/clawd/config/clawdbot.json +else + echo "[Clawdbot] Using existing configuration" +fi + +# Ensure auth-profiles directory +mkdir -p /home/system/components/clawd/data/.clawdbot/agents/main/agent + +echo "[Clawdbot] Configuration ready at: /home/system/components/clawd/config/clawdbot.json" +echo "[Clawdbot] Workspace at: /home/system/components/clawd/data/clawd" +echo "[Clawdbot] Starting Gateway on 0.0.0.0:18789..." +echo "[Clawdbot] Bridge on 0.0.0.0:18790" +echo "[Clawdbot] Canvas host on 0.0.0.0:18793" +echo "" + +# Start Clawdbot gateway +# Bind to 0.0.0.0 to accept LAN/tailnet connections +# Can be configured via CLAWDBOT_GATEWAY_TOKEN for security +exec clawdbot gateway \ + --port 18789 \ + --bind 0.0.0.0 diff --git a/clawd/src/build/hello.conf b/clawd/src/build/hello.conf new file mode 100644 index 0000000..e7532f4 --- /dev/null +++ b/clawd/src/build/hello.conf @@ -0,0 +1,16 @@ +server { + listen 80; + listen [::]:80; + + root /usr/share/nginx/html; + try_files /index.html =404; + + expires -1; + + sub_filter_once off; + sub_filter 'server_hostname' '$hostname'; + sub_filter 'server_address' '$server_addr:$server_port'; + sub_filter 'server_url' '$request_uri'; + sub_filter 'server_date' '$time_local'; + sub_filter 'request_id' '$request_id'; +} \ No newline at end of file diff --git a/clawd/src/install/index.html b/clawd/src/install/index.html new file mode 100644 index 0000000..7abffd3 --- /dev/null +++ b/clawd/src/install/index.html @@ -0,0 +1,96 @@ + + + +Hello World Edgeapp Template + + + + + +Edgebox Logo +

This is an example Hello World edgeapp. If you see this page, it means it is running.

+

Developing your app? See docs.edgebox.io for more information.

+
+

Server address: server_address

+

Server name: server_hostname

+

Date: server_date

+

URI: server_url

+
+
Auto Refresh
+ + + From 0bdf8908e1e87ea4af9789f93f6227b028277d82 Mon Sep 17 00:00:00 2001 From: Paulo Truta Date: Wed, 21 Jan 2026 21:22:09 +0100 Subject: [PATCH 2/6] chore: Clean up template remnants from clawd app - Remove src/ (nginx config, install files - not needed for Clawdbot) - Remove edgebox-hosts.txt (template artifact) - Remove edgebox-postinstall.sh/txt (not used) - Remove .run marker file - Remove appdata/ (local test artifacts) Keeps only essential files for production deployment --- clawd/edgebox-hosts.txt | 1 - clawd/edgebox-postinstall.sh | 5 -- clawd/edgebox-postinstall.txt | 1 - clawd/src/build/hello.conf | 16 ------ clawd/src/install/index.html | 96 ----------------------------------- 5 files changed, 119 deletions(-) delete mode 100644 clawd/edgebox-hosts.txt delete mode 100755 clawd/edgebox-postinstall.sh delete mode 100644 clawd/edgebox-postinstall.txt delete mode 100644 clawd/src/build/hello.conf delete mode 100644 clawd/src/install/index.html diff --git a/clawd/edgebox-hosts.txt b/clawd/edgebox-hosts.txt deleted file mode 100644 index ce01362..0000000 --- a/clawd/edgebox-hosts.txt +++ /dev/null @@ -1 +0,0 @@ -hello diff --git a/clawd/edgebox-postinstall.sh b/clawd/edgebox-postinstall.sh deleted file mode 100755 index 2ebf1c9..0000000 --- a/clawd/edgebox-postinstall.sh +++ /dev/null @@ -1,5 +0,0 @@ -# mkdir -p ./appdata/hello-ws -echo "📦 hello postinstall script" -echo "- Running in $(pwd)" -echo "- Copying files to ./appdata/hello-ws" -cp ./src/install/* ./appdata/hello-ws/ \ No newline at end of file diff --git a/clawd/edgebox-postinstall.txt b/clawd/edgebox-postinstall.txt deleted file mode 100644 index 94b83a3..0000000 --- a/clawd/edgebox-postinstall.txt +++ /dev/null @@ -1 +0,0 @@ --T hello-ws pwd diff --git a/clawd/src/build/hello.conf b/clawd/src/build/hello.conf deleted file mode 100644 index e7532f4..0000000 --- a/clawd/src/build/hello.conf +++ /dev/null @@ -1,16 +0,0 @@ -server { - listen 80; - listen [::]:80; - - root /usr/share/nginx/html; - try_files /index.html =404; - - expires -1; - - sub_filter_once off; - sub_filter 'server_hostname' '$hostname'; - sub_filter 'server_address' '$server_addr:$server_port'; - sub_filter 'server_url' '$request_uri'; - sub_filter 'server_date' '$time_local'; - sub_filter 'request_id' '$request_id'; -} \ No newline at end of file diff --git a/clawd/src/install/index.html b/clawd/src/install/index.html deleted file mode 100644 index 7abffd3..0000000 --- a/clawd/src/install/index.html +++ /dev/null @@ -1,96 +0,0 @@ - - - -Hello World Edgeapp Template - - - - - -Edgebox Logo -

This is an example Hello World edgeapp. If you see this page, it means it is running.

-

Developing your app? See docs.edgebox.io for more information.

-
-

Server address: server_address

-

Server name: server_hostname

-

Date: server_date

-

URI: server_url

-
-
Auto Refresh
- - - From 3d7ca77ad5ca93977655b5c68f916d4ad4c65390 Mon Sep 17 00:00:00 2001 From: Paulo Truta Date: Wed, 21 Jan 2026 21:24:13 +0100 Subject: [PATCH 3/6] fix: Restore edgebox-hosts.txt with correct format - First line: 'clawd' (hostname) - Second line: empty (required for hosts file parsing) - Essential for accessing dashboard at clawd.local --- clawd/edgebox-hosts.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 clawd/edgebox-hosts.txt diff --git a/clawd/edgebox-hosts.txt b/clawd/edgebox-hosts.txt new file mode 100644 index 0000000..1879a66 --- /dev/null +++ b/clawd/edgebox-hosts.txt @@ -0,0 +1,2 @@ +clawd + From 79b8f08dcbfe5466603d10707cefecbf01bdc551 Mon Sep 17 00:00:00 2001 From: Paulo Truta Date: Wed, 21 Jan 2026 22:21:22 +0100 Subject: [PATCH 4/6] fix: Configure gateway for LAN binding with proper auth - Changed bind from 0.0.0.0 (invalid) to 'lan' - Added gateway.mode=local to config template - Removed invalid gateway.bind and channels.whatsapp.enabled keys - Tested successfully in Multipass VM isolation --- clawd/clawdbot.json.template | 25 +++++-------------------- clawd/entrypoint.sh | 6 +++--- 2 files changed, 8 insertions(+), 23 deletions(-) diff --git a/clawd/clawdbot.json.template b/clawd/clawdbot.json.template index b92bd8a..78c0222 100644 --- a/clawd/clawdbot.json.template +++ b/clawd/clawdbot.json.template @@ -1,41 +1,26 @@ { "gateway": { "port": 18789, - "bind": "0.0.0.0", - "canvasHost": { - "port": 18793, - "bind": "0.0.0.0" - } + "mode": "local" }, "agents": { "defaults": { "workspace": "/home/system/components/clawd/data/clawd", "models": { "anthropic/claude-opus-4-5": { "alias": "opus" }, - "anthropic/claude-sonnet-4-5": { "alias": "sonnet" }, - "openai/gpt-5.2": { "alias": "gpt" } + "anthropic/claude-sonnet-4-5": { "alias": "sonnet" } }, "model": { "primary": "anthropic/claude-opus-4-5" - }, - "thinkingDefault": "low", - "timeoutSeconds": 600 + } } }, "channels": { "telegram": { - "enabled": true, - "botToken": "${TELEGRAM_BOT_TOKEN}" + "enabled": false }, "discord": { - "enabled": true, - "token": "${DISCORD_BOT_TOKEN}" - }, - "whatsapp": { - "enabled": true + "enabled": false } - }, - "messages": { - "responsePrefix": "[Clawd]" } } diff --git a/clawd/entrypoint.sh b/clawd/entrypoint.sh index 742c3b2..4c348a4 100644 --- a/clawd/entrypoint.sh +++ b/clawd/entrypoint.sh @@ -30,8 +30,8 @@ echo "[Clawdbot] Canvas host on 0.0.0.0:18793" echo "" # Start Clawdbot gateway -# Bind to 0.0.0.0 to accept LAN/tailnet connections -# Can be configured via CLAWDBOT_GATEWAY_TOKEN for security +# Use 'lan' binding for LAN access with --allow-unconfigured for testing exec clawdbot gateway \ --port 18789 \ - --bind 0.0.0.0 + --bind lan \ + --allow-unconfigured From 4168ce5a1e31ffec3b5acf4962506239736235b4 Mon Sep 17 00:00:00 2001 From: Paulo Truta Date: Wed, 21 Jan 2026 22:36:42 +0100 Subject: [PATCH 5/6] feat: Add zero-config agent initialization on startup - Created init-clawdbot.sh script for automatic agent setup - Reads CLAWDBOT_AGENT_NAME and CLAWDBOT_AGENT_MODEL from env vars - Falls back to sensible defaults (agent name 'Clawd', model 'opus-4.5') - Idempotent - only runs if agent doesn't already exist - Updated entrypoint to call init script before starting gateway - Updated Dockerfile to include and run init script App now starts fully configured without manual onboarding! --- clawd/Dockerfile | 13 ++++++------ clawd/entrypoint.sh | 10 +++++----- clawd/init-clawdbot.sh | 45 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+), 11 deletions(-) create mode 100644 clawd/init-clawdbot.sh diff --git a/clawd/Dockerfile b/clawd/Dockerfile index 66d86a7..09470e0 100644 --- a/clawd/Dockerfile +++ b/clawd/Dockerfile @@ -31,18 +31,19 @@ RUN mkdir -p \ /home/system/components/clawd/data/clawd && \ chown -R clawdbot:clawdbot /home/system/components/clawd /home/clawdbot -# Copy entrypoint script and config template BEFORE installing clawdbot +# Install Clawdbot as root first (npm install works better) +RUN npm install -g clawdbot@latest + +# Copy scripts and config template COPY --chown=clawdbot:clawdbot ./entrypoint.sh /app/entrypoint.sh -RUN chmod +x /app/entrypoint.sh && chown clawdbot /app +COPY --chown=clawdbot:clawdbot ./init-clawdbot.sh /app/init-clawdbot.sh +RUN chmod +x /app/entrypoint.sh /app/init-clawdbot.sh && chown clawdbot /app COPY --chown=clawdbot:clawdbot ./clawdbot.json.template /app/clawdbot.json.template -# Switch to app user for npm install +# Switch to app user for runtime USER clawdbot -# Clear npm cache and install Clawdbot fresh -RUN npm cache clean --force && npm install -g clawdbot@latest - # Expose ports EXPOSE 18789 18790 18793 80 diff --git a/clawd/entrypoint.sh b/clawd/entrypoint.sh index 4c348a4..ee74541 100644 --- a/clawd/entrypoint.sh +++ b/clawd/entrypoint.sh @@ -19,6 +19,9 @@ else echo "[Clawdbot] Using existing configuration" fi +# Initialize agent with env var defaults (idempotent) +/app/init-clawdbot.sh + # Ensure auth-profiles directory mkdir -p /home/system/components/clawd/data/.clawdbot/agents/main/agent @@ -30,8 +33,5 @@ echo "[Clawdbot] Canvas host on 0.0.0.0:18793" echo "" # Start Clawdbot gateway -# Use 'lan' binding for LAN access with --allow-unconfigured for testing -exec clawdbot gateway \ - --port 18789 \ - --bind lan \ - --allow-unconfigured +# Gateway configuration is in clawdbot.json +exec clawdbot gateway --port 18789 diff --git a/clawd/init-clawdbot.sh b/clawd/init-clawdbot.sh new file mode 100644 index 0000000..ad4faa1 --- /dev/null +++ b/clawd/init-clawdbot.sh @@ -0,0 +1,45 @@ +#!/bin/sh +# Clawdbot Edgebox App - Zero-config Initialization +# Configures Clawdbot with environment variables on first startup + +set -e + +WORKSPACE="${CLAWDBOT_WORKSPACE:-/home/system/components/clawd/data/clawd}" +STATE_DIR="${CLAWDBOT_STATE_DIR:-/home/system/components/clawd/data/.clawdbot}" +MAIN_AGENT_DIR="$STATE_DIR/agents/main/agent" + +# Create directories +mkdir -p "$MAIN_AGENT_DIR" + +# Check if agent is already initialized +if [ -f "$MAIN_AGENT_DIR/identity.json" ]; then + echo "[Clawdbot] Agent already initialized, skipping onboarding" + exit 0 +fi + +echo "[Clawdbot] Initializing default agent with environment configuration..." + +# Create identity.json with defaults from env vars or sensible defaults +cat > "$MAIN_AGENT_DIR/identity.json" << EOF +{ + "id": "main", + "name": "${CLAWDBOT_AGENT_NAME:-Clawd}", + "model": "${CLAWDBOT_AGENT_MODEL:-anthropic/claude-opus-4-5}", + "type": "agent" +} +EOF + +echo "[Clawdbot] Agent identity created:" +cat "$MAIN_AGENT_DIR/identity.json" + +# Create a minimal settings file if it doesn't exist +if [ ! -f "$MAIN_AGENT_DIR/settings.json" ]; then + cat > "$MAIN_AGENT_DIR/settings.json" << EOF +{ + "workspace": "$WORKSPACE", + "capabilities": {} +} +EOF +fi + +echo "[Clawdbot] Agent initialization complete!" From 164134bf079a708b522bf52edcd4b7f96dae1a2b Mon Sep 17 00:00:00 2001 From: Paulo Truta Date: Wed, 21 Jan 2026 22:42:21 +0100 Subject: [PATCH 6/6] fix: Add gateway bind and auth token to config template - Set bind to 'lan' for network accessibility - Added default auth token 'clawd-default-token' - Required for proper WebSocket connections --- clawd/clawdbot.json.template | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/clawd/clawdbot.json.template b/clawd/clawdbot.json.template index 78c0222..1ba1bcf 100644 --- a/clawd/clawdbot.json.template +++ b/clawd/clawdbot.json.template @@ -1,7 +1,11 @@ { "gateway": { "port": 18789, - "mode": "local" + "mode": "local", + "bind": "lan", + "auth": { + "token": "clawd-default-token" + } }, "agents": { "defaults": {