{"id":48375355,"url":"https://github.com/raphaelmansuy/edgecrab","last_synced_at":"2026-04-12T04:01:11.098Z","repository":{"id":349344671,"uuid":"1201906097","full_name":"raphaelmansuy/edgecrab","owner":"raphaelmansuy","description":"EdgeCrab 🦀 A Super Powerful Personal Assistant inspired by NousHermes and OpenClaw — Rust-native, blazing-fast terminal UI, ReAct tool loop, multi-provider LLM support, ACP protocol, gateway adapters, and built-in security hardening. ","archived":false,"fork":false,"pushed_at":"2026-04-05T17:43:38.000Z","size":7425,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-05T18:28:37.195Z","etag":null,"topics":["agentic-ai","ai-agent","autonomous-agent","cli","llm","mcp","nous-hermes","openclaw","react-agent","rust","terminal","tui"],"latest_commit_sha":null,"homepage":"https://www.edgecrab.com","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/raphaelmansuy.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-04-05T10:25:20.000Z","updated_at":"2026-04-05T17:43:43.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/raphaelmansuy/edgecrab","commit_stats":null,"previous_names":["raphaelmansuy/edgecrab"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/raphaelmansuy/edgecrab","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/raphaelmansuy%2Fedgecrab","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/raphaelmansuy%2Fedgecrab/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/raphaelmansuy%2Fedgecrab/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/raphaelmansuy%2Fedgecrab/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/raphaelmansuy","download_url":"https://codeload.github.com/raphaelmansuy/edgecrab/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/raphaelmansuy%2Fedgecrab/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31580509,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-08T14:31:17.711Z","status":"ssl_error","status_checked_at":"2026-04-08T14:31:17.202Z","response_time":54,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agentic-ai","ai-agent","autonomous-agent","cli","llm","mcp","nous-hermes","openclaw","react-agent","rust","terminal","tui"],"created_at":"2026-04-05T18:04:02.831Z","updated_at":"2026-04-11T03:02:38.866Z","avatar_url":"https://github.com/raphaelmansuy.png","language":"Rust","funding_links":[],"categories":["Rust"],"sub_categories":[],"readme":"# EdgeCrab 🦀\n\n\u003e **\"Your SuperAgent — built in Rust.\"**\n\n[![License](https://img.shields.io/badge/License-Apache--2.0-blue.svg)](LICENSE)\n[![Rust](https://img.shields.io/badge/Rust-1.86%2B-orange.svg)](https://www.rust-lang.org/)\n[![crates.io](https://img.shields.io/crates/v/edgecrab-cli.svg)](https://crates.io/crates/edgecrab-cli)\n[![PyPI](https://img.shields.io/pypi/v/edgecrab-cli.svg)](https://pypi.org/project/edgecrab-cli/)\n[![npm](https://img.shields.io/npm/v/edgecrab-cli.svg)](https://www.npmjs.com/package/edgecrab-cli)\n[![CI](https://github.com/raphaelmansuy/edgecrab/actions/workflows/ci.yml/badge.svg)](https://github.com/raphaelmansuy/edgecrab/actions/workflows/ci.yml)\n[![Website](https://img.shields.io/badge/Website-edgecrab.com-orange.svg)](https://www.edgecrab.com)\n\nEdgeCrab is a **SuperAgent** — a personal assistant and coding agent forged in Rust. It carries the soul of **Nous Hermes Agent** (autonomous reasoning, persistent memory, user-first alignment) and the always-on presence of **OpenClaw** (15 messaging gateways, smart-home integration), compressed into a **15 MB static binary** that starts in **\u003c 50 ms** with zero runtime dependencies.\n\n\n\n## Architecture\n\n![Architecture](./assets/edgecrab-archi.jpg)\n\n```\nhermes-agent soul  +  OpenClaw vision  =  EdgeCrab\n   (reasoning)          (presence)        (Rust)\n```\n\n| Metric              | EdgeCrab 🦀                     | hermes-agent ☤   |\n| ------------------- | ------------------------------ | ---------------- |\n| Binary              | 15 MB static                   | Python venv + uv |\n| Startup             | \u003c 50 ms                        | ~1–3 s           |\n| Memory              | ~15 MB resident                | ~80–150 MB       |\n| LLM providers       | 14 built-in (+ Azure, Bedrock) | varies           |\n| Messaging platforms | 15 gateways                    | 7 platforms      |\n| Tests               | 1629 passing (Rust)            | —                |\n| Migrate from hermes | `edgecrab migrate`             | N/A              |\n\n![EdgeCrab — The Clash of the Crustaceans](assets/edgecrab-hero.jpeg)\n\n---\n\n## Table of Contents\n\n- [EdgeCrab 🦀](#edgecrab-)\n  - [Architecture](#architecture)\n  - [Table of Contents](#table-of-contents)\n  - [Why EdgeCrab?](#why-edgecrab)\n  - [Quick Start (90 seconds)](#quick-start-90-seconds)\n    - [Option A — npm (no Rust required)](#option-a--npm-no-rust-required)\n    - [Option B — pip (no Rust required)](#option-b--pip-no-rust-required)\n    - [Option C — cargo](#option-c--cargo)\n    - [Option D — build from source](#option-d--build-from-source)\n    - [Guided Setup Output](#guided-setup-output)\n    - [First Prompts](#first-prompts)\n  - [What EdgeCrab Can Do](#what-edgecrab-can-do)\n    - [ReAct Tool Loop](#react-tool-loop)\n    - [Built-in Tools](#built-in-tools)\n    - [Semantic Code Intelligence (LSP)](#semantic-code-intelligence-lsp)\n      - [File Tools (`file` toolset)](#file-tools-file-toolset)\n      - [Terminal Tools (`terminal` toolset)](#terminal-tools-terminal-toolset)\n      - [Web Tools (`web` toolset)](#web-tools-web-toolset)\n      - [Browser Tools (`browser` toolset)](#browser-tools-browser-toolset)\n      - [Memory \\\u0026 Honcho Tools (`memory` + `honcho` toolsets)](#memory--honcho-tools-memory--honcho-toolsets)\n      - [Skills Tools (`skills` toolset)](#skills-tools-skills-toolset)\n      - [Session \\\u0026 Search (`session` toolset)](#session--search-session-toolset)\n      - [Delegation \\\u0026 MoA (`delegation` + `moa` toolsets)](#delegation--moa-delegation--moa-toolsets)\n      - [Code Execution (`code_execution` toolset)](#code-execution-code_execution-toolset)\n      - [MCP Tools (`mcp` toolset)](#mcp-tools-mcp-toolset)\n      - [Media Tools (`vision` / `tts` / `transcribe` toolsets)](#media-tools-vision--tts--transcribe-toolsets)\n      - [Automation Tools](#automation-tools)\n    - [Sub-agent Delegation](#sub-agent-delegation)\n    - [Sandboxed Code Execution](#sandboxed-code-execution)\n    - [Browser Automation](#browser-automation)\n    - [15 Messaging Gateways](#15-messaging-gateways)\n    - [Persistent Memory \\\u0026 Learning](#persistent-memory--learning)\n    - [Skills Library](#skills-library)\n    - [Plugin System](#plugin-system)\n    - [Cron Scheduling](#cron-scheduling)\n    - [Checkpoints \\\u0026 Rollback](#checkpoints--rollback)\n    - [Profiles \\\u0026 Worktrees](#profiles--worktrees)\n    - [Vision, TTS \\\u0026 Transcription](#vision-tts--transcription)\n  - [14 LLM Providers](#14-llm-providers)\n  - [6 Terminal Backends](#6-terminal-backends)\n  - [MCP Server Integration](#mcp-server-integration)\n  - [ACP / VS Code Copilot Integration](#acp--vs-code-copilot-integration)\n  - [ratatui TUI](#ratatui-tui)\n  - [All CLI Commands](#all-cli-commands)\n  - [All Slash Commands](#all-slash-commands)\n  - [Security Model](#security-model)\n  - [Architecture](#architecture-1)\n  - [Configuration](#configuration)\n  - [SDK: Python \\\u0026 Node.js](#sdk-python--nodejs)\n    - [Python SDK (`edgecrab-sdk`)](#python-sdk-edgecrab-sdk)\n    - [Node.js SDK (`edgecrab-sdk`)](#nodejs-sdk-edgecrab-sdk)\n  - [Docker](#docker)\n  - [Migrating from hermes-agent](#migrating-from-hermes-agent)\n  - [Testing](#testing)\n  - [Project Structure](#project-structure)\n  - [Requirements \\\u0026 Build](#requirements--build)\n  - [Contributing](#contributing)\n  - [Release Channels](#release-channels)\n  - [License](#license)\n\n---\n\n## Why EdgeCrab?\n\nMost AI agents are either too constrained (coding agents that forget you exist after the session) or too heavy (Python runtimes, Node daemons, GBs of RAM). EdgeCrab is different.\n\n**It learns.** Like Nous Hermes Agent, EdgeCrab maintains persistent memory across sessions, auto-generates reusable skills, and builds a cross-session Honcho user model that gets smarter over time.\n\n**It's everywhere.** Like OpenClaw, EdgeCrab lives in your channels — Telegram, Discord, Slack, WhatsApp, Signal, Matrix, Mattermost, DingTalk, SMS, Email, Home Assistant, and more. Send it a voice memo on WhatsApp and get a PR back.\n\n**It's fast and lean.** Unlike Python agents, EdgeCrab is a Rust binary. It starts before you finish blinking. It uses ~15 MB of RAM instead of 150 MB. Security is compiled in — path jails, SSRF guards, command scanners — not runtime patches.\n\n**It's extensible.** MCP servers, custom Rust tools, Python/JS sandboxes, sub-agents, Mixture-of-Agents consensus — the full toolkit for heavy-duty automation.\n\n**It's now plugin-native.** Skill plugins inject prompt expertise, tool-server plugins expose external JSON-RPC tools, and script plugins run safe Rhai logic, all from `~/.edgecrab/plugins/` with persisted enable/disable policy.\n\n---\n\n## Quick Start (90 seconds)\n\n### Option A — npm (no Rust required)\n\n```bash\nnpm install -g edgecrab-cli\nedgecrab update              # channel-aware updater\nedgecrab setup               # interactive wizard — detects API keys, writes config\nedgecrab doctor              # verify health\nedgecrab                     # launch TUI\n```\n\n### Option B — pip (no Rust required)\n\n```bash\npip install edgecrab-cli\n# OR: pipx install edgecrab-cli  (isolated install)\nedgecrab update\nedgecrab setup \u0026\u0026 edgecrab doctor \u0026\u0026 edgecrab\n```\n\n### Option C — cargo\n\n```bash\ncargo install edgecrab-cli\nedgecrab update --check\nedgecrab setup \u0026\u0026 edgecrab doctor \u0026\u0026 edgecrab\n```\n\n### Option D — build from source\n\n```bash\ngit clone https://github.com/raphaelmansuy/edgecrab\ncd edgecrab\ncargo build --release         # ~30 s first build\n./target/release/edgecrab setup\n```\n\n### Guided Setup Output\n\n```\nEdgeCrab Setup Wizard\n──────────────────────────────────────────────────────────────\n✓ Detected GitHub Copilot (GITHUB_TOKEN)\n✓ Detected OpenAI (OPENAI_API_KEY)\n\nChoose LLM provider:\n  [1] copilot      (GitHub Copilot — gpt-4.1-mini)  ← auto-detected\n  [2] openai       (OpenAI — GPT-4.1, GPT-5, o3/o4)\n  [3] anthropic    (Anthropic — Claude Opus 4.6)\n  [4] ollama       (local — llama3.3)\n  ...\nProvider [1]: 1\n\n✓ Config written to ~/.edgecrab/config.yaml\n✓ Created ~/.edgecrab/memories/\n✓ Created ~/.edgecrab/skills/\n\nRun `edgecrab` to start chatting!\n```\n\n### First Prompts\n\n```bash\nedgecrab \"summarise the git log for today and open PRs\"\nedgecrab --model anthropic/claude-opus-4-6 \"review this codebase for security issues\"\nedgecrab --model ollama/llama3.3 \"explain this code offline\"\nedgecrab --quiet \"count lines in src/**/*.rs\"   # pipe-safe, no banner\nedgecrab -C \"continue-my-refactor\"              # resume named session\nedgecrab -w \"explore that perf idea\"            # isolated git worktree\n```\n\n---\n\n## What EdgeCrab Can Do\n\nEdgeCrab is an autonomous agent. Give it a goal in natural language; it reasons, calls tools, observes results, and loops until the task is done. Here's what it can actually reach.\n\n### ReAct Tool Loop\n\nEdgeCrab uses a **Reason → Act → Observe** loop (ReAct pattern) implemented in `crates/edgecrab-core/src/conversation.rs`. Each turn:\n\n1. **System prompt built once** per session (SOUL.md, AGENTS.md, memories, skills, date/time, cwd) — cached for Anthropic prompt cache hits\n2. **LLM decides** what to do next (including parallel tool calls)\n3. **Security check** runs before every tool execution (path jail, SSRF guard, command scan)\n4. **Tool executes** — file I/O, shell, web, code, sub-agents, browser, etc.\n5. **Result injected** back into context\n6. **Loop** until no more tool calls (task done), `Ctrl-C`, or 90-iteration budget exhausted\n7. **Context compression** fires at 50% of context window — prunes old tool outputs, then LLM-summarizes\n8. **Learning reflection** auto-fires after ≥5 tool calls — agent can save new skills and update memory\n\nThe budget default is **90 iterations** (`max_iterations` in config). Increase it for long autonomous tasks.\n\n### Built-in Tools\n\nTools are registered at compile time via the `inventory` crate — zero startup cost. The `ToolRegistry` dispatches by exact name with fuzzy (Levenshtein ≤3) fallback suggestions.\n\n### Semantic Code Intelligence (LSP)\n\nEdgeCrab now exposes a dedicated LSP subsystem through the `lsp` toolset. When a language server is configured, the agent can prefer semantic operations over grep-style guesses:\n\n- Claude-parity navigation: `lsp_goto_definition`, `lsp_find_references`, `lsp_hover`, `lsp_document_symbols`, `lsp_workspace_symbols`, `lsp_goto_implementation`, `lsp_call_hierarchy_prepare`, `lsp_incoming_calls`, `lsp_outgoing_calls`\n- EdgeCrab-only semantic edits: `lsp_code_actions`, `lsp_apply_code_action`, `lsp_rename`, `lsp_format_document`, `lsp_format_range`\n- Deep analysis: `lsp_inlay_hints`, `lsp_semantic_tokens`, `lsp_signature_help`, `lsp_type_hierarchy_prepare`, `lsp_supertypes`, `lsp_subtypes`\n- Diagnostics: `lsp_diagnostics_pull`, `lsp_linked_editing_range`, `lsp_enrich_diagnostics`, `lsp_select_and_apply_action`, `lsp_workspace_type_errors`\n\nBuilt-in default server definitions now cover Rust, TypeScript, JavaScript, Python, Go, C, C++, Java, C#, PHP, Ruby, Bash, HTML, CSS, and JSON.\n\n#### File Tools (`file` toolset)\n| Tool           | What it does                                                                 |\n| -------------- | ---------------------------------------------------------------------------- |\n| `read_file`    | Read file with optional `start_line`/`end_line` — path-jailed, canonicalized |\n| `write_file`   | Write or create file (parent dirs auto-created)                              |\n| `patch_file`   | Search-and-replace patch — exact string match, atomic write                  |\n| `search_files` | Regex + glob search across a directory tree                                  |\n\n#### Terminal Tools (`terminal` toolset)\n| Tool             | What it does                                                         |\n| ---------------- | -------------------------------------------------------------------- |\n| `terminal`       | Execute shell command — persistent shell per task, env-var blocklist |\n| `manage_process` | Start/stop/list/kill/read background processes                       |\n\n#### Web Tools (`web` toolset)\n| Tool          | What it does                                                             |\n| ------------- | ------------------------------------------------------------------------ |\n| `web_search`  | Web search via Firecrawl → Tavily → Brave → DuckDuckGo fallback chain    |\n| `web_extract` | Full-page extraction — HTML strip + PDF parse (EdgeParse) — SSRF-guarded |\n\n#### Browser Tools (`browser` toolset)\n| Tool                 | What it does                                  |\n| -------------------- | --------------------------------------------- |\n| `browser_navigate`   | Navigate Chrome via CDP                       |\n| `browser_snapshot`   | Accessibility tree snapshot (text, not pixel) |\n| `browser_click`      | Click element by `@eN` ref ID from snapshot   |\n| `browser_type`       | Type text into focused input                  |\n| `browser_screenshot` | Annotated screenshot with numbered elements   |\n| `browser_console`    | Capture/clear browser console log             |\n\n#### Memory \u0026 Honcho Tools (`memory` + `honcho` toolsets)\n| Tool             | What it does                                                    |\n| ---------------- | --------------------------------------------------------------- |\n| `memory_read`    | Read `MEMORY.md` and `USER.md` from `~/.edgecrab/memories/`     |\n| `memory_write`   | Write/append to memory files (prompt-injection scanned)         |\n| `honcho_profile` | Get/set user profile facts via Honcho cross-session model       |\n| `honcho_context` | Retrieve contextually relevant Honcho memories for current task |\n\n#### Skills Tools (`skills` toolset)\n| Tool           | What it does                             |\n| -------------- | ---------------------------------------- |\n| `skill_manage` | Create, view, patch, delete, list skills |\n\n#### Session \u0026 Search (`session` toolset)\n| Tool             | What it does                                          |\n| ---------------- | ----------------------------------------------------- |\n| `session_search` | SQLite FTS5 full-text search across all past sessions |\n\n#### Delegation \u0026 MoA (`delegation` + `moa` toolsets)\n| Tool                | What it does                                                                                             |\n| ------------------- | -------------------------------------------------------------------------------------------------------- |\n| `delegate_task`     | Fork a sub-agent — single task or batch of up to 3 in parallel                                           |\n| `mixture_of_agents` | Run task through Claude Opus 4.6, Gemini 2.5 Pro, GPT-4.1, DeepSeek R1 in parallel; synthesize consensus |\n\n#### Code Execution (`code_execution` toolset)\n| Tool           | What it does                                                              |\n| -------------- | ------------------------------------------------------------------------- |\n| `execute_code` | Sandboxed Python / JS / Bash / Ruby / Perl / Rust execution with tool RPC |\n\n#### MCP Tools (`mcp` toolset)\n| Tool             | What it does                                    |\n| ---------------- | ----------------------------------------------- |\n| `mcp_list_tools` | List tools exposed by all connected MCP servers |\n| `mcp_call_tool`  | Call a named tool on any connected MCP server   |\n\n#### Media Tools (`vision` / `tts` / `transcribe` toolsets)\n| Tool               | What it does                                                 |\n| ------------------ | ------------------------------------------------------------ |\n| `vision_analyze`   | Analyze image via multimodal model (URL or local path)       |\n| `text_to_speech`   | Generate audio from text (OpenAI TTS or configured provider) |\n| `transcribe_audio` | Transcribe audio file (Whisper or Groq/OpenAI)               |\n\n#### Automation Tools\n| Tool                    | What it does                                                   |\n| ----------------------- | -------------------------------------------------------------- |\n| `manage_todo_list`      | Structured checklist — create, update, complete, delete items  |\n| `manage_cron_jobs`      | Schedule recurring and one-shot cron jobs                      |\n| `checkpoint`            | Filesystem snapshot for rollback (create, list, restore, diff) |\n| `clarify`               | Ask user a clarifying question (with optional choices)         |\n| `send_message`          | Send message via gateway to any connected platform             |\n| `ha_get_states`         | Fetch Home Assistant entity states                             |\n| `ha_call_service`       | Call HA service (e.g. `light.turn_on`)                         |\n| `ha_trigger_automation` | Trigger HA automation                                          |\n| `ha_get_history`        | Fetch HA entity history                                        |\n\n**Control which toolsets are active:**\n```bash\nedgecrab --toolset file,terminal \"add tests\"        # minimal dev\nedgecrab --toolset all \"go wild\"                    # full capability\nedgecrab --toolset coding \"refactor this module\"    # file+terminal+search+exec+lsp\nedgecrab --toolset research \"investigate this bug\"  # web+browser+vision\n```\n\n---\n\n### Sub-agent Delegation\n\nEdgeCrab can spawn sub-agents that run the full ReAct loop with their own session state. This enables parallelism for complex tasks.\n\n```\n# Example: agent delegates 3 subtasks in parallel\ndelegate_task([\n  { task: \"Review auth module for security issues\" },\n  { task: \"Write unit tests for the payment service\" },\n  { task: \"Update API documentation\" }\n])\n# → 3 sub-agents run concurrently, results aggregated\n```\n\n**How it works** (`crates/edgecrab-tools/src/tools/delegate_task.rs`):\n- Sub-agents share LLM provider Arc + tool registry Arc\n- Each child gets its own `SessionState`, `ProcessTable`, `TodoStore`, `IterationBudget`\n- Max concurrent: **3 sub-agents in parallel** (configurable via `delegation.max_subagents`)\n- Max depth: **2 levels** (parent → child → grandchild blocked)\n- Children cannot use `delegation`, `clarify`, `memory`, `code_execution`, or `messaging` toolsets\n\nConfigure delegation:\n```yaml\ndelegation:\n  enabled: true\n  model: \"anthropic/claude-sonnet-4\"   # use cheaper model for sub-agents\n  max_subagents: 3\n  max_iterations: 50\n```\n\n---\n\n### Sandboxed Code Execution\n\nThe `execute_code` tool runs code in an isolated subprocess with strict resource limits:\n\n- **Languages**: Python, JavaScript, Bash, Ruby, Perl, Rust\n- **Tool RPC**: Scripts can call 7 tools via Unix domain socket — `web_search`, `web_extract`, `read_file`, `write_file`, `search_files`, `terminal`, `session_search`\n- **Limits**: 50-tool call limit, 5-minute timeout, 50 KB stdout cap, 10 KB stderr cap\n- **Security**: API keys/tokens stripped from child environment before execution\n\n```python\n# Example: agent writes and executes this in a sandbox\nimport subprocess\nresult = subprocess.run(['cargo', 'test', '-p', 'edgecrab-core'], capture_output=True)\nprint(result.stdout.decode())\n```\n\n---\n\n### Browser Automation\n\nChrome DevTools Protocol-based browser automation — no Selenium, no Playwright dependency. ElementCrab connects directly to a CDP endpoint.\n\n```\nRequirements: Chrome/Chromium binary, or set CDP_URL to an existing instance\nCheck:         edgecrab doctor  (reports browser availability)\n```\n\nThe `browser_snapshot` tool returns an accessibility tree — not pixels — so the LLM can reason about page structure without vision costs. `browser_screenshot` adds numbered element overlays for precise clicking.\n\n---\n\n### 15 Messaging Gateways\n\nStart the gateway server and EdgeCrab becomes an always-on assistant in 15 messaging platforms simultaneously:\n\n```bash\nedgecrab gateway start           # runs in background\nedgecrab gateway start --foreground   # keep in foreground\nedgecrab gateway status          # check which platforms are live\nedgecrab gateway stop\n```\n\n| Platform           | Transport                               | Auth                                              |\n| ------------------ | --------------------------------------- | ------------------------------------------------- |\n| **Telegram**       | Long-poll REST                          | `TELEGRAM_BOT_TOKEN`                              |\n| **Discord**        | WebSocket gateway                       | `DISCORD_BOT_TOKEN`                               |\n| **Slack**          | Socket Mode WebSocket                   | `SLACK_BOT_TOKEN` + `SLACK_APP_TOKEN`             |\n| **WhatsApp**       | Baileys bridge (local Node subprocess)  | `edgecrab whatsapp` QR pairing                    |\n| **Signal**         | signal-cli HTTP + SSE                   | `SIGNAL_HTTP_URL` + `SIGNAL_ACCOUNT`              |\n| **Matrix**         | Client-Server REST + long-poll sync     | `MATRIX_HOMESERVER` + `MATRIX_ACCESS_TOKEN`       |\n| **Mattermost**     | REST v4 + WebSocket                     | `MATTERMOST_URL` + `MATTERMOST_TOKEN`             |\n| **DingTalk**       | Stream SDK (no public webhook)          | `DINGTALK_APP_KEY` + `DINGTALK_APP_SECRET`        |\n| **SMS**            | Twilio REST v2010                       | `TWILIO_ACCOUNT_SID` + `TWILIO_AUTH_TOKEN`        |\n| **Email**          | SMTP (lettre, rustls) + inbound webhook | `EMAIL_PROVIDER` + `EMAIL_FROM` + `EMAIL_API_KEY` |\n| **Home Assistant** | WebSocket + REST                        | `HASS_URL` + `HASS_TOKEN`                         |\n| **Webhook**        | axum HTTP POST                          | any HTTP caller                                   |\n| **API Server**     | axum OpenAI-compatible HTTP             | `API_SERVER_PORT` (optional)                      |\n| **Feishu/Lark**    | REST                                    | `FEISHU_APP_ID` + `FEISHU_APP_SECRET`             |\n| **WeCom**          | REST                                    | `WECOM_CORP_ID` + `WECOM_SECRET`                  |\n\n**Streaming delivery**: Edit-mode platforms (Telegram, Discord, Slack) receive live token streaming with 300ms edit intervals. Batch-mode platforms (WhatsApp, Signal, SMS, Email) accumulate the full response and send once.\n\n**Built-in gateway slash commands** (send via chat):\n```\n/help      /new       /reset     /stop      /retry\n/status    /usage     /background  /approve   /deny\n```\n\n**Setup WhatsApp** (one-time QR pairing):\n```bash\nedgecrab whatsapp      # launches QR code scanner wizard\n# Scan with your phone — session persists across restarts\nedgecrab gateway start\n```\n\n**Cron-triggered messages**: Schedule the agent to proactively message you:\n```yaml\n# ~/.edgecrab/cron/daily-standup.json\nschedule: \"0 9 * * 1-5\"     # every weekday at 9am\ntask: \"Summarize open PRs and blockers for today's standup\"\ntarget: telegram             # deliver to your Telegram\n```\n\n---\n\n### Persistent Memory \u0026 Learning\n\nEdgeCrab has a three-layer memory system:\n\n**Layer 1 — MEMORY.md** (`~/.edgecrab/memories/MEMORY.md`): Free-form notes. The agent reads this at session start and can update it. You can also edit it directly.\n\n**Layer 2 — SQLite session history** (`~/.edgecrab/state.db`): Every conversation stored in WAL-mode SQLite with FTS5 full-text search. Browse, search, and export sessions:\n```bash\nedgecrab sessions list                           # list recent sessions\nedgecrab sessions search \"auth bug from last week\"  # FTS5 search\nedgecrab sessions export \u003cid\u003e --format jsonl     # export session\nedgecrab sessions browse                         # interactive browser\n```\n\n**Layer 3 — Honcho cross-session user model**: EdgeCrab builds a semantic model of you — your preferences, projects, working style — via the Honcho API. This context is injected at the start of new sessions to provide continuity.\n\n**Auto-learning**: After ≥5 tool calls in a session, a learning reflection fires automatically. The agent can save new skills, update MEMORY.md, and record useful patterns without being asked.\n\n---\n\n### Skills Library\n\nSkills are reusable agent procedures — markdown files that define prompts, steps, and best practices for recurring tasks. Think recipe cards for your agent.\n\n```bash\n# Create a skill\nedgecrab skills list                    # browse installed skills\nedgecrab skills view git-workflow       # read a skill\nedgecrab skills install my-skill.md    # install from file\nedgecrab skills search \"diagram\"       # search remote skill sources\nedgecrab skills install edgecrab:diagramming/ascii-diagram-master\nedgecrab skills install hermes-agent:research/ml-paper-writing\nedgecrab skills install raphaelmansuy/edgecrab/skills/research/ml-paper-writing\nedgecrab skills update                 # refresh all remote-installed skills\nedgecrab skills update ml-paper-writing\n\n# Use a skill in a session\nedgecrab -S git-workflow \"review this branch for prod readiness\"\nedgecrab -S security,refactor          # load multiple skills\n```\n\nInside TUI: `/skills` opens the installed-skill browser, and `/skills search [query]` opens the remote-skill browser with live search, source notes, and install/update actions.\n\nSkills are saved to `~/.edgecrab/skills/` and loaded on demand. The agent can also create new skills mid-session during learning reflection.\n\nClaude-style skill bundles with helper scripts are supported in the standalone skills runtime:\n\n- bundled helper files under `references/`, `templates/`, `scripts/`, and `assets/`\n- `${CLAUDE_SKILL_DIR}` substitution to the concrete skill directory\n- `${CLAUDE_SESSION_ID}` substitution to the active EdgeCrab session id\n- the same bundle rendering for `skill_view` and preloaded `--skill` / `skills.preloaded` flows\n- parsing and display of `when_to_use`, `arguments`, `argument-hint`, `allowed-tools`,\n  `user-invocable`, `disable-model-invocation`, `context`, and `shell`\n\nCurrent boundary: EdgeCrab does not auto-execute Claude inline prompt-shell\nblocks and does not auto-fork a dedicated skill sub-agent from those metadata\nfields alone.\n\n### Skills Vs Plugins\n\nFirst principles:\n\n- A `skill` is reusable guidance for the model.\n- A `plugin` is an installable runtime unit that EdgeCrab discovers, enables, disables, updates, and audits.\n\nThat leads to a clean operational split:\n\n- Use `skills` when the extension is instructions-first: procedures, examples, checklists, workflow scaffolding, or bundled helper files/scripts that the agent uses through normal tools.\n- Use `plugins` when the extension needs executable code, tool registration, hooks, readiness checks, trust metadata, or install lifecycle management.\n- A plain skill changes prompt behavior. It can bundle helper files such as `scripts/`, `references/`, `templates/`, and `assets/`, but it still does not register a new runtime service or plugin lifecycle on its own.\n- A plugin may bundle a `SKILL.md`, but that bundled skill is still part of a plugin-managed runtime bundle.\n\nConcrete examples:\n\n- `~/.edgecrab/skills/security-review/SKILL.md` is a standalone skill.\n- `~/.edgecrab/skills/security-review/scripts/check.py` can be bundled with that skill and referenced from `SKILL.md`.\n- `~/.edgecrab/plugins/github-tools/plugin.toml` is a plugin.\n- `~/.edgecrab/plugins/calculator/plugin.yaml` plus `__init__.py` is a Hermes plugin.\n- A plugin of kind `skill` is still managed through `edgecrab plugins ...`, not `edgecrab skills ...`.\n\n---\n\n### Plugin System\n\nPlugins extend EdgeCrab beyond the built-in tool inventory without forking the repo.\n\n```bash\nedgecrab plugins list\nedgecrab plugins info github-tools\nedgecrab plugins status\nedgecrab plugins install github:edgecrab/plugins/github-tools\nedgecrab plugins install hub:community/github-tools\nedgecrab plugins install https://example.com/github-tools.zip\nedgecrab plugins install ./plugins/github-tools\nedgecrab plugins enable github-tools\nedgecrab plugins disable github-tools\nedgecrab plugins toggle [github-tools]\nedgecrab plugins audit --lines 20\nedgecrab plugins search github\nedgecrab plugins search --source hermes weather\nedgecrab plugins search --source hermes-evey telemetry\nedgecrab plugins browse\nedgecrab plugins update\nedgecrab plugins remove github-tools\n```\n\nInside the TUI, `/plugins search ...` and `/plugins browse` now open the same\nkind of async remote browser EdgeCrab already uses for skills and MCP:\nfuzzy filtering, background search, split-detail view, and one-key install or\nreplace from official registries.\n\nEdgeCrab now supports four plugin kinds:\n\n- `skill` plugins load `SKILL.md` content from `~/.edgecrab/plugins/\u003cname\u003e/` into the session prompt with Hermes-compatible frontmatter, readiness checks, and platform filtering.\n- `tool-server` plugins spawn a subprocess and proxy MCP-compatible newline-delimited JSON-RPC over stdio, including reverse `host:*` calls for platform info, memory/session access, secret reads, safe conversation message injection, logging, and delegated tool execution.\n- `script` plugins load Rhai code for lightweight local extension points and tool handlers without shipping a separate daemon.\n- `hermes` plugins load Hermes-style Python directory plugins with `plugin.yaml` + `__init__.py register(ctx)` compatibility, including `requires_env` setup gating, bundled `SKILL.md` loading, `post_tool_call`, `on_session_start`, `pre_llm_call`, and `on_session_end`.\n\nEdgeCrab also discovers legacy Hermes plugin roots from `~/.hermes/plugins/`, plus `./.hermes/plugins/` when `HERMES_ENABLE_PROJECT_PLUGINS=true`. Plugin installs now stage in quarantine, run a static security scan, resolve trust from their source, and stamp `plugin.toml` with a directory checksum before activation. Plugin state persists in `config.yaml` under `plugins:`. Disabled or setup-needed plugins are excluded from tool exposure or prompt injection without uninstalling them.\n\nRuntime exposure is live:\n\n- enabled plugin tools are registered into the `plugins` toolset and appear in `/tools`\n- disabling a plugin removes its tools from the active registry without restarting EdgeCrab\n- re-enabling a plugin re-exposes those tools immediately in the same TUI session\n\nInside the TUI you can verify that directly:\n\n```text\n/plugins                 # open the installed-plugin browser overlay\n/tools                   # shows active built-in + plugin tools\n/plugins disable demo\n/tools                   # demo plugin tools are gone\n/plugins enable demo\n/tools                   # demo plugin tools are back under the plugins toolset\n```\n\nRemote plugin search is cached by first principles:\n\n- hub indexes and repo-backed source trees are cached under `~/.edgecrab/plugins/.hub/cache/`\n- repo-backed plugin descriptions are cached separately so repeated searches do not refetch `plugin.yaml` or `SKILL.md`\n- expired cache is refreshed when possible, but stale cache is still used on refresh failure so plugin search degrades gracefully instead of going empty\n\nExample: install a Hermes guide-style local plugin with a bundled skill:\n\n```text\ncalculator/\n├── plugin.yaml\n├── __init__.py\n├── schemas.py\n├── tools.py\n├── SKILL.md\n└── data/\n    └── units.json\n```\n\n```bash\nedgecrab plugins install ./calculator\nedgecrab plugins info calculator\nedgecrab plugins status\n```\n\nThis repository also ships official Hermes-format examples that are indexed by\nthe `edgecrab-official` search source:\n\n```bash\nedgecrab plugins search --source edgecrab calculator\nedgecrab plugins search --source edgecrab json\n\nedgecrab plugins install ./plugins/productivity/calculator\nedgecrab plugins install ./plugins/developer/json-toolbox\n\nedgecrab plugins info calculator\nedgecrab plugins info json-toolbox\n```\n\nThose examples prove two different Hermes runtime surfaces:\n\n- `plugins/productivity/calculator` registers tools plus a `post_tool_call` hook\n- `plugins/developer/json-toolbox` registers tools plus a top-level CLI command\n\nExample: install real Hermes assets directly from a local clone of `NousResearch/hermes-agent`:\n\n```bash\nedgecrab plugins install ~/src/hermes-agent/plugins/memory/holographic\nedgecrab plugins info holographic\n\n# pip entry-point plugins are discovered through the selected Python runtime\nEDGECRAB_PLUGIN_PYTHON=~/.venvs/hermes/bin/python \\\n  edgecrab plugins list\nEDGECRAB_PLUGIN_PYTHON=~/.venvs/hermes/bin/python \\\n  edgecrab entry-demo status\n```\n\nStandalone Hermes skills are browsed from the skills surface instead of the\nplugin browser:\n\n```bash\nedgecrab skills search 1password\nedgecrab skills install hermes-agent:security/1password\n```\n\nExample: search and install curated community Hermes plugins from `42-evey/hermes-plugins`:\n\n```bash\nedgecrab plugins search --source hermes-evey telemetry\nedgecrab plugins install hub:hermes-evey/evey-telemetry\nedgecrab plugins install hub:hermes-evey/evey-status\nedgecrab plugins info evey-telemetry\n```\n\nFor a step-by-step authoring tutorial, see `docs/007_memory_skills/005_building_hermes_style_plugins.md` and the site guide at `site/src/content/docs/guides/build-hermes-plugin.md`.\n\nCompatibility proof currently covers:\n\n- official repo Hermes examples `calculator` and `json-toolbox`, including search visibility and local end-to-end install/runtime proof\n- guide-style Hermes plugin install and end-to-end tool execution from the upstream \"Build a Hermes Plugin\" contract\n- real upstream Hermes plugin install and runtime execution for `holographic`\n- real upstream Hermes optional-skill compatibility for `1password` via local bundle install\n- real upstream Python import/runtime shims plus `cli.py register_cli(subparser)` CLI bridging for `honcho`\n- real `42-evey/hermes-plugins` runtime execution for `evey-telemetry` and `evey-status`\n- pip entry-point discovery and top-level Hermes CLI command execution through `ctx.register_cli_command()`\n- Hermes hub indexing for upstream `plugins/...` directories and `42-evey` repo-root Hermes directories in the plugin browser\n- full Hermes `VALID_HOOKS` surface in the CLI runtime: `pre_tool_call`, `post_tool_call`, `pre_llm_call`, `post_llm_call`, `pre_api_request`, `post_api_request`, `on_session_start`, `on_session_end`, `on_session_finalize`, `on_session_reset`\n- gateway per-chat session isolation and session-boundary parity proof for `on_session_start`, `on_session_end`, `on_session_finalize`, and `on_session_reset`\n\n---\n\n### Cron Scheduling\n\nSchedule recurring or one-shot tasks:\n\n```bash\nedgecrab cron list\nedgecrab cron add \"0 9 * * 1-5\" \"Summarize open PRs for standup\"\nedgecrab cron add \"@daily\" \"Update MEMORY.md with project progress\"\nedgecrab cron pause \u003cid\u003e\nedgecrab cron resume \u003cid\u003e\nedgecrab cron remove \u003cid\u003e\nedgecrab cron run \u003cid\u003e      # manual trigger\nedgecrab cron tick          # process due jobs (called by system cron)\n```\n\nOr from within a TUI session:\n```\n/cron list\n/cron add \"0 18 * * 5\" \"Generate weekly summary\"\n```\n\nThe `manage_cron_jobs` tool also lets the agent schedule its own follow-ups autonomously.\n\n---\n\n### Checkpoints \u0026 Rollback\n\nBefore destructive operations, EdgeCrab creates filesystem snapshots:\n\n```bash\n# Manual checkpoint\nedgecrab sessions\n# → checkpoint auto-created before every file write\n\n# Inside TUI\n/rollback                    # restore last checkpoint\n/rollback checkpoint-abc123  # restore specific checkpoint\n```\n\nConfiguration:\n```yaml\ncheckpoints:\n  enabled: true\n  max_snapshots: 50    # keep last 50 checkpoints per session\n```\n\nThe `checkpoint` tool is also available to the agent itself — it can snapshot before risky operations and offer rollback if something goes wrong.\n\n---\n\n### Profiles \u0026 Worktrees\n\n**Profiles** let you switch between different configurations instantly:\n\n```bash\nedgecrab profile create work         # create \"work\" profile\nedgecrab profile create homelab      # create \"homelab\" profile\nedgecrab profile use work            # switch to work profile\nedgecrab profile alias w work        # alias shorthand\nedgecrab profile list\n```\n\nProfiles store their config in `~/.edgecrab/profiles/\u003cname\u003e/` — different API keys, default models, memory files, and toolsets per context.\n\n**Worktrees** isolate each agent session in a separate git worktree:\n\n```bash\nedgecrab -w \"explore that refactor idea safely\"\n# Creates ~/.edgecrab/worktrees/\u003cname\u003e/, runs there\n# Changes stay isolated — merge or discard when done\n```\n\n---\n\n### Vision, TTS \u0026 Transcription\n\n```bash\n# Vision: analyze an image\nedgecrab \"What's in this screenshot?\" --attach screenshot.png\n\n# TTS: speak the response\nedgecrab --quiet \"Write a haiku about Rust\" | say   # pipe to macOS say\n# Or the agent can generate audio directly via text_to_speech tool\n\n# Transcription: send a voice note via WhatsApp gateway\n# → EdgeCrab transcribes it with Whisper and responds\n```\n\nVision providers: any multimodal model (Claude, GPT-4o, Gemini).\nTTS providers: OpenAI TTS, edge-tts (offline).\nTranscription: Whisper (local), Groq Whisper, OpenAI Whisper.\n\n---\n\n## 14 LLM Providers\n\nEdgeCrab ships with 14 LLM providers out of the box (12 cloud, 2 local). Over 200 models compiled in, with user override via `~/.edgecrab/models.yaml`.\n\n| Provider      | Env Var                          | Notable Models                                    |\n| ------------- | -------------------------------- | ------------------------------------------------- |\n| `copilot`     | `GITHUB_TOKEN`                   | GPT-4.1-mini, GPT-4.1 — free with GitHub Copilot  |\n| `openai`      | `OPENAI_API_KEY`                 | GPT-4.1, GPT-5, o3, o4-mini                       |\n| `anthropic`   | `ANTHROPIC_API_KEY`              | Claude Opus 4.6, Sonnet 4.6, Haiku 4.5            |\n| `google`      | `GOOGLE_API_KEY`                 | Gemini 2.5 Pro, Gemini 2.5 Flash                  |\n| `vertexai`    | `GOOGLE_APPLICATION_CREDENTIALS` | Gemini via Google Cloud                           |\n| `xai`         | `XAI_API_KEY`                    | Grok 3, Grok 4                                    |\n| `deepseek`    | `DEEPSEEK_API_KEY`               | DeepSeek V3, DeepSeek R1                          |\n| `mistral`     | `MISTRAL_API_KEY`                | Mistral Large, Mistral Small                      |\n| `groq`        | `GROQ_API_KEY`                   | Llama 3.3 70B, Gemma2 9B (blazing fast inference) |\n| `huggingface` | `HUGGING_FACE_HUB_TOKEN`         | Any HF Inference API model                        |\n| `zai`         | `ZAI_API_KEY`                    | Z.AI / GLM series                                 |\n| `openrouter`  | `OPENROUTER_API_KEY`             | 600+ models via one endpoint                      |\n| `ollama`      | *(none)*                         | Any model — `ollama serve` on port 11434          |\n| `lmstudio`    | *(none)*                         | Any model — LM Studio on port 1234                |\n\n**Switch provider at any time:**\n```bash\nedgecrab --model anthropic/claude-opus-4-6 \"deep code review\"\nedgecrab --model ollama/llama3.3 \"work offline\"\nedgecrab --model groq/llama-3.3-70b-versatile \"quick task\"\n```\n\n**Hot-swap inside TUI:**\n```\n/model groq/llama-3.3-70b-versatile\n/reasoning high                      # enable extended thinking (Anthropic/OpenAI)\n```\n\n**Smart routing** (experimental): automatically selects cheap vs full model by turn complexity:\n```yaml\nmodel:\n  smart_routing:\n    enabled: true\n    cheap_model: \"groq/llama-3.3-70b-versatile\"\n```\n\n**Mixture of Agents**: Run a single prompt through 4 frontier models simultaneously and get a synthesized consensus:\n```\n/model moa    # Claude Opus 4.6 + Gemini 2.5 Pro + GPT-4.1 + DeepSeek R1 → aggregated\n```\n\n---\n\n## 6 Terminal Backends\n\nThe `terminal` tool is pluggable. Select your execution environment:\n\n| Backend             | How to activate                   | Use case                              |\n| ------------------- | --------------------------------- | ------------------------------------- |\n| **Local** (default) | `EDGECRAB_TERMINAL_BACKEND=local` | Persistent shell on your machine      |\n| **Docker**          | `backend: docker`                 | Isolated container per task           |\n| **SSH**             | `backend: ssh`                    | Remote server via ControlMaster       |\n| **Modal**           | `backend: modal`                  | Cloud sandbox (Modal.com)             |\n| **Daytona**         | `backend: daytona`                | Persistent cloud dev sandbox          |\n| **Singularity**     | `backend: singularity`            | HPC/Apptainer with persistent overlay |\n\n```yaml\nterminal:\n  backend: docker\n  docker:\n    image: \"python:3.12-slim\"\n    container_name: \"edgecrab-sandbox\"\n```\n\n---\n\n## MCP Server Integration\n\nEdgeCrab is a full MCP (Model Context Protocol) client. Connect any MCP server and its tools become available to the agent automatically.\n\n```yaml\n# ~/.edgecrab/config.yaml\nmcp_servers:\n  filesystem:\n    command: \"npx\"\n    args: [\"-y\", \"@modelcontextprotocol/server-filesystem\", \"/tmp/workspace\"]\n\n  my-api-server:\n    url: \"https://my-server.example.com/mcp\"\n    bearer_token: \"${MY_API_TOKEN}\"   # env-backed bearer token works\n    enabled: true\n```\n\n```bash\nedgecrab mcp list                                 # show configured MCP servers\nedgecrab mcp install filesystem --path \"/tmp/ws\" # install a curated preset\nedgecrab mcp doctor                              # static checks + live probe\nedgecrab mcp doctor filesystem                   # diagnose one configured server\nedgecrab mcp remove server-name\n/mcp                                             # open the TUI MCP browser\n/reload-mcp                                      # hot-reload in TUI without restart\n```\n\nThe agent uses `mcp_list_tools` and `mcp_call_tool` to discover and invoke MCP server capabilities.\nThe TUI MCP browser supports install, view, test, diagnose, and remove flows, and quoted\n`--path` / `name=` values are parsed safely for Unix and Windows-style paths.\nHTTP MCP servers that rely on OAuth-style bearer access tokens are supported through\neither `bearer_token`, `/mcp-token set \u003cserver\u003e \u003ctoken\u003e`, or env-backed config values such\nas `bearer_token: \"${MY_API_TOKEN}\"`.\n\n---\n\n## ACP / VS Code Copilot Integration\n\nEdgeCrab implements the [Agent Communication Protocol](https://github.com/i-am-bee/acp) — JSON-RPC 2.0 over stdio — enabling it to run as a VS Code Copilot agent, in Zed, JetBrains, and any ACP-compatible runner.\n\n```bash\nedgecrab acp           # starts ACP server on stdin/stdout\nedgecrab acp init      # scaffold agent.json manifest for a workspace\n```\n\nThe `acp_registry/agent.json` manifest declares capabilities for extension discovery. The ACP adapter uses a restricted `ACP_TOOLS` subset that excludes interactive-only tools (`clarify`, `send_message`, `text_to_speech`).\n\n---\n\n## ratatui TUI\n\n60 fps capable, GPU-composited full-screen TUI built with [ratatui](https://ratatui.rs/).\n\n**Layout:**\n```\n┌────────────────────────────────────────────────────────────┐\n│  output area (markdown-rendered, mouse-scrollable)          │\n│  ⚙  file_read  src/main.rs                                  │\n│     → 342 lines read                                        │\n│                                                             │\n│  The `main` function initializes the agent loop and...      │\n├────────────────────────────────────────────────────────────┤\n│ ● anthropic/claude-opus-4-6  1,234t  $0.023  [/commands]  │\n├────────────────────────────────────────────────────────────┤\n│ ❯ Type your message…                                        │\n└────────────────────────────────────────────────────────────┘\n```\n\n**Features:**\n- Streaming output with token-by-token rendering\n- Fish-style ghost text (type-ahead) completion\n- Tab-complete slash commands with fuzzy match overlay\n- Multi-line input (Shift+Enter for newlines)\n- Mouse scroll in output area\n- Approval dialogs for dangerous operations (inline, non-blocking)\n- Clarify dialogs — agent asks questions without blocking the loop\n- Secret-request overlays — prompt for missing API keys mid-session\n- Session spinner + model name + token count + cost in status bar\n\n**Theme customization** (`~/.edgecrab/skin.yaml`):\n```yaml\nuser_fg:      \"#89b4fa\"   # Catppuccin blue\nassistant_fg: \"#a6e3a1\"   # Catppuccin green\nsystem_fg:    \"#f9e2af\"   # Catppuccin yellow\nerror_fg:     \"#f38ba8\"   # Catppuccin red\ntool_fg:      \"#cba6f7\"   # Catppuccin mauve\nstatus_bg:    \"#313244\"\nstatus_fg:    \"#cdd6f4\"\nborder_fg:    \"#6c7086\"\nprompt_symbol: \"❯\"\ntool_prefix:   \"⚙\"\n```\n\n---\n\n## All CLI Commands\n\n```bash\n# Launch\nedgecrab                          # interactive TUI\nedgecrab \"prompt here\"            # TUI + auto-submit\nedgecrab --quiet \"prompt\"         # no banner, pipe-safe output\nedgecrab --model p/m \"prompt\"     # specify LLM\nedgecrab --toolset web,file \"p\"   # restrict toolsets\nedgecrab --session id \"p\"         # use specific session\nedgecrab --resume title \"p\"       # resume by title\nedgecrab -C \"p\"                   # continue last session\nedgecrab -w \"p\"                   # isolated git worktree\nedgecrab -S skill1,skill2 \"p\"     # preload skills\n\n# Setup \u0026 diagnostics\nedgecrab setup [--section s] [--force]    # interactive wizard\nedgecrab doctor                           # full health check\nedgecrab version                          # version + providers\nedgecrab migrate [--dry-run]              # import hermes-agent state\n\n# Sessions\nedgecrab sessions list\nedgecrab sessions browse\nedgecrab sessions export \u003cid\u003e [--format jsonl]\nedgecrab sessions delete \u003cid\u003e\nedgecrab sessions rename \u003cid\u003e \u003ctitle\u003e\nedgecrab sessions prune [--older-than 30d]\nedgecrab sessions stats\n\n# Configuration\nedgecrab config show\nedgecrab config edit\nedgecrab config path\nedgecrab config set \u003ckey\u003e \u003cvalue\u003e\n\n# Tools\nedgecrab tools list\nedgecrab tools enable \u003ctoolset\u003e\nedgecrab tools disable \u003ctoolset\u003e\n\n# Providers\nedgecrab mcp list\nedgecrab mcp add \u003cname\u003e\nedgecrab mcp remove \u003cname\u003e\n\n# Plugins\nedgecrab plugins list\nedgecrab plugins info \u003cname\u003e\nedgecrab plugins status\nedgecrab plugins install \u003csource\u003e\nedgecrab plugins audit [--lines 20]\nedgecrab plugins search \u003cquery\u003e\nedgecrab plugins search --source hermes \u003cquery\u003e\nedgecrab plugins browse\nedgecrab plugins refresh\nedgecrab plugins toggle [name]\nedgecrab plugins update [name]\nedgecrab plugins remove \u003cname\u003e\n\n# Cron\nedgecrab cron list\nedgecrab cron add \"\u003cschedule\u003e\" \"\u003ctask\u003e\"\nedgecrab cron run \u003cid\u003e\nedgecrab cron tick\nedgecrab cron remove \u003cid\u003e\nedgecrab cron pause \u003cid\u003e\nedgecrab cron resume \u003cid\u003e\n\n# Gateway\nedgecrab gateway start [--foreground]\nedgecrab gateway stop\nedgecrab gateway restart\nedgecrab gateway status\nedgecrab gateway configure [--platform \u003cname\u003e]\nedgecrab whatsapp               # WhatsApp QR pairing wizard\nedgecrab status                 # overall gateway status\n\n# Skills\nedgecrab skills list\nedgecrab skills view \u003cname\u003e\nedgecrab skills search \u003cquery\u003e\nedgecrab skills install \u003cpath|edgecrab:path|owner/repo/path\u003e\nedgecrab skills update [name]\nedgecrab skills remove \u003cname\u003e\n\n# Profiles\nedgecrab profile list\nedgecrab profile use \u003cname\u003e\nedgecrab profile create \u003cname\u003e\nedgecrab profile delete \u003cname\u003e\nedgecrab profile show [name]\nedgecrab profile alias \u003calias\u003e \u003cname\u003e\nedgecrab profile rename \u003cold\u003e \u003cnew\u003e\nedgecrab profile export \u003cname\u003e [--output path]\nedgecrab profile import \u003cpath\u003e\n\n# ACP\nedgecrab acp                    # start ACP stdio server\nedgecrab acp init [--workspace] [--force]\n\n# Shell completion\nedgecrab completion bash\nedgecrab completion zsh\nedgecrab completion fish\n```\n\n---\n\n## All Slash Commands\n\nType these inside the TUI (after `❯`):\n\n| Command                                  | Action                                          |\n| ---------------------------------------- | ----------------------------------------------- |\n| `/help`                                  | List all slash commands with descriptions       |\n| `/quit` / `/exit`                        | Exit EdgeCrab                                   |\n| `/clear`                                 | Clear the output area                           |\n| `/new`                                   | Start a fresh session                           |\n| `/model [provider/model]`                | Hot-swap LLM without restart                    |\n| `/reasoning [effort]`                    | Set reasoning effort (low/medium/high/auto)     |\n| `/retry`                                 | Retry the last message                          |\n| `/undo`                                  | Remove the last turn from history               |\n| `/stop`                                  | Interrupt current tool execution and generation |\n| `/history`                               | Show session message history                    |\n| `/save [title]`                          | Save session with a title                       |\n| `/export [format]`                       | Export session (jsonl, markdown)                |\n| `/title \u003ctitle\u003e`                         | Rename current session                          |\n| `/resume [id-or-title]`                  | Resume a past session                           |\n| `/session [list/switch/delete]`          | Manage sessions                                 |\n| `/config [show/set]`                     | View or update config                           |\n| `/prompt`                                | Show current system prompt                      |\n| `/verbose`                               | Toggle verbose tool output                      |\n| `/personality [preset]`                  | Switch agent personality (14 presets)           |\n| `/statusbar`                             | Toggle status bar                               |\n| `/tools`                                 | List active toolsets and tools                  |\n| `/toolsets`                              | Show toolset aliases and expansions             |\n| `/mcp [subcommand]`                      | Browse, install, test, diagnose, or remove MCP servers |\n| `/reload-mcp`                            | Hot-reload MCP servers (no restart needed)      |\n| `/mcp-token \u003cserver\u003e \u003ctoken\u003e`            | Set MCP bearer token at runtime                 |\n| `/plugins [info/status/install/enable/disable/toggle/audit/hub]` | Browse installed plugins and manage plugin actions |\n| `/memory [show/edit]`                    | View or edit agent memory                       |\n| `/cost`                                  | Show token costs for this session               |\n| `/usage`                                 | Detailed usage breakdown                        |\n| `/compress`                              | Force context compression now                   |\n| `/insights`                              | Show session statistics and key moments         |\n| `/theme [preset]`                        | List or switch built-in theme                   |\n| `/paste`                                 | Toggle paste mode (multi-line clipboard input)  |\n| `/queue \u003cmessage\u003e`                       | Queue a message while agent is running          |\n| `/background`                            | Fork current task to background, free the TUI   |\n| `/rollback [checkpoint]`                 | Restore filesystem to a checkpoint              |\n| `/platforms`                             | Show connected gateway platforms                |\n| `/approve`                               | Approve a pending agent action                  |\n| `/deny`                                  | Deny a pending agent action                     |\n| `/sethome`                               | Set cwd as home directory                       |\n| `/update`                                | Check for EdgeCrab updates                      |\n| `/cron [list/add/remove]`                | Manage cron jobs inline                         |\n| `/voice \u003con/off/status\u003e`                 | Toggle voice output                             |\n| `/skills [list/view/install/remove/hub]` | Manage skills                                   |\n| `/doctor`                                | Run inline health diagnostics                   |\n| `/version`                               | Show version and provider info                  |\n\nKeyboard shortcuts:\n\n| Key                      | Action                                              |\n| ------------------------ | --------------------------------------------------- |\n| `Enter`                  | Submit prompt                                       |\n| `Shift+Enter`            | New line in input                                   |\n| `Ctrl+C`                 | Interrupt running agent                             |\n| `Ctrl+L`                 | Clear output area                                   |\n| `Ctrl+U`                 | Clear input line                                    |\n| `Alt+↑` / `Alt+↓`        | Scroll output                                       |\n| `Ctrl+Home` / `Ctrl+End` | Jump to top/bottom of output                        |\n| `Tab`                    | Accept ghost text / cycle slash command completions |\n\n---\n\n## Security Model\n\nSecurity is compiled in — not an afterthought. EdgeCrab applies defense-in-depth at seven independent layers:\n\n| Layer                      | Mechanism                                                                                                                                                     | Where                             |\n| -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------- |\n| **File I/O**               | All paths canonicalized, checked against `allowed_roots`. `SanitizedPath` is a distinct Rust type — bypassing it is a compile error.                          | `edgecrab-security::path_safety`  |\n| **Web tools**              | SSRF guard blocks private IP ranges (10.x, 192.168.x, 172.16.x, 127.x, ::1) before any outbound HTTP call. `SafeUrl` distinct type.                           | `edgecrab-security::ssrf`         |\n| **Terminal**               | Command injection scan (Aho-Corasick + regex) over 8 danger categories rejects shell metacharacters and forbidden patterns.                                   | `edgecrab-security::command_scan` |\n| **Context files**          | Prompt injection patterns (regex + invisible Unicode + homoglyphs) scanned in SOUL.md, AGENTS.md, .cursor/rules. High-severity blocked with `[BLOCKED: ...]`. | `prompt_builder.rs`               |\n| **Code execution sandbox** | API keys/tokens stripped from child env. Only 7 whitelisted tool stubs exposed via Unix socket RPC. `SIGTERM→SIGKILL` escalation on timeout.                  | `execute_code.rs`                 |\n| **Skills installation**    | External skills run through a 23-pattern threat scanner (exfiltration, injection, destructive ops, persistence, obfuscation) before install.                  | `skills_guard`                    |\n| **LLM output**             | Redaction pipeline strips secrets and tokens before displaying or logging any LLM response.                                                                   | `edgecrab-security::redact`       |\n\nPath safety and SSRF use Rust's **type system** as the primary control — not runtime checks alone. If your code doesn't have a `SanitizedPath`, it can't call file I/O. Period.\n\n---\n\n## Architecture\n\nEdgeCrab is an 11-crate Rust workspace. The dependency graph is a strict DAG — no circular dependencies, no feature flags that reverse the graph.\n\n```\nedgecrab-types      (shared types — no deps on other crates)\n       ↑\nedgecrab-security   (path safety, SSRF, cmd scan — types only)\nedgecrab-cron       (standalone cron store + schedule parser)\n       ↑\nedgecrab-tools      (ToolRegistry + built-in tool implementations)\nedgecrab-lsp        (language-server client, document sync, semantic tools)\nedgecrab-state      (SQLite WAL + FTS5 session store)\n       ↑\nedgecrab-core       (Agent, ReAct loop, prompt builder, compression)\n       ↑\nedgecrab-cli    edgecrab-gateway    edgecrab-acp    edgecrab-migrate\n```\n\n| Crate               | Responsibility                                                                                                               |\n| ------------------- | ---------------------------------------------------------------------------------------------------------------------------- |\n| `edgecrab-types`    | `Message`, `Role`, `ToolCall`, `ToolSchema`, `Usage`, `Cost`, `AgentError`, `Trajectory` — all shared with no business logic |\n| `edgecrab-security` | Path jail, SSRF, command scan, redaction, approval engine                                                                    |\n| `edgecrab-state`    | SQLite WAL + FTS5 session storage (`~/.edgecrab/state.db`)                                                                   |\n| `edgecrab-cron`     | Cron expression parser, job store (`~/.edgecrab/cron/`)                                                                      |\n| `edgecrab-tools`    | `ToolRegistry`, `ToolHandler` trait, `ToolContext`, the built-in tool surface including browser, MCP, media, and LSP       |\n| `edgecrab-lsp`      | Language-server manager, JSON-RPC client, document sync, diagnostics, edit application, and `lsp_*` tool handlers          |\n| `edgecrab-core`     | `Agent`, `AgentBuilder`, `execute_loop()`, `PromptBuilder`, compression, routing, 200+ model catalog                         |\n| `edgecrab-cli`      | ratatui TUI, 42 slash commands, all CLI subcommands, skin engine, profiles                                                   |\n| `edgecrab-gateway`  | axum HTTP + 15 platform adapters, streaming delivery, `MEDIA://` protocol                                                    |\n| `edgecrab-acp`      | ACP JSON-RPC 2.0 stdio adapter for VS Code / Zed / JetBrains                                                                 |\n| `edgecrab-migrate`  | hermes-agent → EdgeCrab state import, schema migrations                                                                      |\n\n**Key design decisions (from the code):**\n\n1. **Single binary** — Static linking embeds all deps (TLS, SQLite, Aho-Corasick). No shared libraries except OS.\n2. **Type-level security** — `SanitizedPath` and `SafeUrl` are distinct types in `edgecrab-types`. Bypassing sanitization is a compile error.\n3. **Compile-time tool registry** — `inventory::submit!()` registers tools at link time. Zero startup cost. All tools present or absent by feature flag, not runtime config.\n4. **Single system prompt per session** — Built once, cached in `SessionState.cached_system_prompt`. Compression never rebuilds it (preserves Anthropic prompt cache hits).\n5. **Hot-swappable model** — `RwLock\u003cArc\u003cdyn LLMProvider\u003e\u003e` in `Agent`. In-flight conversations keep their Arc clone; swap affects only new turns.\n\n---\n\n## Configuration\n\nEdgeCrab uses layered config: `defaults → ~/.edgecrab/config.yaml → EDGECRAB_* env vars → CLI flags`. Later layers win.\n\n```yaml\n# ~/.edgecrab/config.yaml\n\nmodel:\n  default_model: \"ollama/gemma4:latest\"\n  max_iterations: 90          # ReAct loop budget per session\n  streaming: true\n  smart_routing:\n    enabled: false\n    cheap_model: \"\"\n\ndisplay:\n  skin: \"catppuccin\"\n  show_reasoning: false\n\ntools:\n  enabled_toolsets: null       # null = all toolsets active\n  disabled_toolsets: null\n  file:\n    allowed_roots: []          # empty = cwd only\n  custom_groups:\n    backend-dev:\n      - read_file\n      - write_file\n      - terminal\n      - session_search\n\nlsp:\n  enabled: true\n  file_size_limit_bytes: 10000000\n  servers:\n    rust:\n      command: \"rust-analyzer\"\n      args: []\n      file_extensions: [\"rs\"]\n      language_id: \"rust\"\n      root_markers: [\"Cargo.toml\", \"rust-project.json\"]\n\nmemory:\n  enabled: true\n\nskills:\n  enabled: true\n  preloaded: []\n\ndelegation:\n  enabled: true\n  model: null                  # null = use default model\n  max_subagents: 3\n  max_iterations: 50\n\nterminal:\n  backend: local               # local | docker | ssh | modal | daytona | singularity\n  docker:\n    image: \"ubuntu:22.04\"\n\nbrowser:\n  record_sessions: false\n\ncheckpoints:\n  enabled: true\n  max_snapshots: 50\n\ngateway:\n  host: \"0.0.0.0\"\n  port: 8642\n  enabled_platforms: []        # [\"telegram\", \"discord\", ...]\n  whatsapp:\n    enabled: false\n    mode: \"self-chat\"          # self-chat | any-sender\n    allowed_users: []\n\nsecurity:\n  path_restrictions: []\n\nmcp_servers:\n  my-server:\n    command: \"npx\"\n    args: [\"-y\", \"@modelcontextprotocol/server-example\"]\n    enabled: true\n```\n\nKey environment variables:\n```bash\nEDGECRAB_MODEL=anthropic/claude-opus-4-6\nEDGECRAB_MAX_ITERATIONS=120\nEDGECRAB_TERMINAL_BACKEND=docker\nEDGECRAB_SKIP_MEMORY=false\nEDGECRAB_SAVE_TRAJECTORIES=true\n```\n\n---\n\n## SDK: Python \u0026 Node.js\n\nBoth SDKs wrap the OpenAI-compatible HTTP API exposed by EdgeCrab's API server gateway adapter.\n\n### Python SDK (`edgecrab-sdk`)\n\n**Python 3.10+ — async-first, streaming, CLI.**\n\n```bash\npip install edgecrab-sdk\n```\n\n```python\nfrom edgecrab import Agent\n\n# Simple chat\nagent = Agent(model=\"anthropic/claude-opus-4-6\")\nreply = agent.chat(\"Explain Rust ownership in 3 sentences\")\nprint(reply)\n\n# Async streaming\nimport asyncio\nfrom edgecrab import AsyncAgent\n\nasync def main():\n    agent = AsyncAgent(model=\"openai/gpt-4o\")\n    async for token in agent.stream(\"Write a Rust hello-world\"):\n        print(token, end=\"\", flush=True)\n\nasyncio.run(main())\n```\n\nBuilt-in CLI:\n```bash\nedgecrab chat \"Hello, EdgeCrab!\"\nedgecrab models\nedgecrab health\n```\n\nFull docs: [sdks/python/README.md](sdks/python/README.md)\n\n### Node.js SDK (`edgecrab-sdk`)\n\n**Node 18+ — TypeScript-first, streaming, CLI.**\n\n```bash\nnpm install edgecrab-sdk\n```\n\n```typescript\nimport { Agent } from 'edgecrab-sdk';\n\n// Simple chat\nconst agent = new Agent({ model: 'anthropic/claude-opus-4-6' });\nconst reply = await agent.chat('Explain Rust ownership');\nconsole.log(reply);\n\n// Streaming\nfor await (const token of agent.stream('Write a README')) {\n  process.stdout.write(token);\n}\n```\n\nCLI via npx:\n```bash\nnpx edgecrab-sdk chat \"Hello!\"\nnpx edgecrab-sdk models\n```\n\nFull docs: [sdks/node/README.md](sdks/node/README.md)\n\n---\n\n## Docker\n\nRun EdgeCrab as a gateway server in a container:\n\n```bash\n# Pull multi-arch GHCR image\ndocker pull ghcr.io/raphaelmansuy/edgecrab:latest\n\n# Run gateway server\ndocker run -p 8642:8642 \\\n  -e ANTHROPIC_API_KEY=\"$ANTHROPIC_API_KEY\" \\\n  -e TELEGRAM_BOT_TOKEN=\"$TELEGRAM_BOT_TOKEN\" \\\n  -v \"$HOME/.edgecrab:/root/.edgecrab\" \\\n  ghcr.io/raphaelmansuy/edgecrab:latest\n\n# Or with docker-compose\ndocker compose up -d\n```\n\nThe Docker image is multi-stage, ~50 MB (distroless final stage). Multi-arch: `linux/amd64` + `linux/arm64`. Uses `rustls-tls` — no OpenSSL dependency for clean cross-compilation.\n\n---\n\n## Migrating from hermes-agent\n\nEdgeCrab imports your entire hermes-agent state in one command:\n\n```bash\n# Preview first (no changes made)\nedgecrab migrate --dry-run\n\n# Live migration\nedgecrab migrate\n```\n\n| What        | From                    | To                        |\n| ----------- | ----------------------- | ------------------------- |\n| Config      | `~/.hermes/config.yaml` | `~/.edgecrab/config.yaml` |\n| Memories    | `~/.hermes/memories/`   | `~/.edgecrab/memories/`   |\n| Skills      | `~/.hermes/skills/`     | `~/.edgecrab/skills/`     |\n| Environment | `~/.hermes/.env`        | `~/.edgecrab/.env`        |\n\nThe migrator is in `crates/edgecrab-migrate/`. It returns a `MigrationReport` with per-item `MigrationStatus` (Success/Skipped/Failed). Config format differences are handled automatically.\n\n---\n\n## Testing\n\n```bash\n# Run all unit + integration tests\ncargo test\n\n# Run only a specific crate\ncargo test -p edgecrab-core\ncargo test -p edgecrab-tools\ncargo test -p edgecrab-gateway\n\n# Run E2E tests (requires a configured LLM provider)\ncargo test -- --include-ignored\n\n# Lint (zero warnings policy)\ncargo clippy -- -D warnings\n\n# Format check\ncargo fmt --check\n\n# Build documentation\ncargo doc --no-deps --open\n```\n\nCurrent: **1629 tests passing** (unit + integration). The codebase has a zero-clippy-warnings policy enforced in CI.\n\n\u003e **Note:** 8 gap-audit tests in `edgecrab-cli` require the hermes-agent source tree at `../hermes-agent/`. Skip them when developing standalone: `cargo test --workspace --exclude edgecrab-cli`\n\n---\n\n## Project Structure\n\n```\nedgecrab/\n├── crates/\n│   ├── edgecrab-types/         Shared types — Message, Role, ToolCall, errors\n│   ├── edgecrab-security/      Path jail, SSRF, cmd scanner, injection, redact\n│   ├── edgecrab-state/         SQLite WAL + FTS5 session store\n│   ├── edgecrab-cron/          Cron parser, job store, scheduler\n│   ├── edgecrab-tools/         ToolRegistry + built-in tool implementations\n│   │   └── tools/\n│   │       ├── file.rs         read_file, write_file, patch_file, search_files\n│   │       ├── terminal.rs     terminal, manage_process\n│   │       ├── web.rs          web_search, web_extract\n│   │       ├── browser.rs      CDP browser automation (6 tools)\n│   │       ├── memory.rs       memory_read, memory_write, Honcho tools\n│   │       ├── delegate_task.rs Sub-agent delegation + batch parallelism\n│   │       ├── execute_code.rs Sandboxed multi-language code execution\n│   │       ├── vision.rs       vision_analyze, text_to_speech, transcribe_audio\n│   │       └── ...             session, cron, checkpoint, skills, mcp, todo, HA\n│   ├── edgecrab-lsp/           LSP client, document sync, diagnostics, semantic edits\n│   ├── edgecrab-core/\n│   │   └── src/\n│   │       ├── agent.rs        AgentBuilder, Agent, StreamEvent, fork_isolated\n│   │       ├── conversation.rs execute_loop() — the ReAct engine\n│   │       ├── compression.rs  Context window compression\n│   │       ├── prompt_builder.rs System prompt assembly from 9+ sources\n│   │       ├── model_router.rs Smart routing (cheap vs full model)\n│   │       └── model_catalog.rs 200+ models, user-overridable YAML\n│   ├── edgecrab-cli/           ratatui TUI, slash commands, skin engine, profiles\n│   ├── edgecrab-gateway/       axum + 15 platform adapters, streaming delivery\n│   ├── edgecrab-acp/           ACP JSON-RPC 2.0 stdio adapter\n│   └── edgecrab-migrate/       hermes-agent import + schema migrations\n├── sdks/\n│   ├── python/                 Python SDK (edgecrab-sdk on PyPI)\n│   └── node/                   Node.js SDK (edgecrab-sdk on npm)\n├── site/                       Astro documentation website\n├── docs/                       Specification documents\n├── acp_registry/\n│   └── agent.json              VS Code Copilot agent manifest\n├── .github/workflows/          CI + 4 release workflows (Rust/Python/Node/Docker)\n├── Dockerfile                  Multi-stage, distroless, multi-arch\n└── docker-compose.yml          One-command gateway deployment\n```\n\n---\n\n## Requirements \u0026 Build\n\n| Tool  | Version               |\n| ----- | --------------------- |\n| Rust  | 1.86+                 |\n| Cargo | bundled with Rust     |\n| OS    | macOS, Linux, Windows |\n\n```bash\n# Debug build (fast iteration)\ncargo build\n\n# Release build (optimized, ~3× faster startup than debug)\ncargo build --release\n\n# Cross-compile for Linux on macOS\ncargo build --release --target x86_64-unknown-linux-musl\n```\n\nThe release binary is statically linked — no OpenSSL, no libc versions to worry about. Drop it on any Linux box and it runs.\n\n---\n\n## Contributing\n\nEdgeCrab welcomes contributions. The codebase has a zero-clippy-warnings policy and enforces `cargo fmt`.\n\n```bash\ngit clone https://github.com/raphaelmansuy/edgecrab\ncd edgecrab\ncargo build                    # verify it compiles\ncargo test                     # run test suite\ncargo clippy -- -D warnings    # must be warning-free\n```\n\n**Adding a new tool:**\n1. Create `crates/edgecrab-tools/src/tools/my_tool.rs`\n2. Implement the `ToolHandler` trait (name, schema, execute, toolset, emoji)\n3. Register with `inventory::submit!(RegisteredTool { handler: \u0026MyTool })`\n4. Declare in `crates/edgecrab-tools/src/tools/mod.rs`\n\n**Adding a new gateway:**\n1. Create `crates/edgecrab-gateway/src/my_platform.rs`\n2. Implement `PlatformAdapter` trait\n3. Register in `crates/edgecrab-gateway/src/run.rs`\n\n**Security reporting:** `security@elitizon.com`\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) for full details.\n\n---\n\n## Release Channels\n\n| Channel        | Artifact                                           | Install                                                             |\n| -------------- | -------------------------------------------------- | ------------------------------------------------------------------- |\n| **npm**        | `edgecrab-cli` (binary wrapper — no Rust required) | `npm install -g edgecrab-cli`                                       |\n| **pip**        | `edgecrab-cli` (binary wrapper — no Rust required) | `pip install edgecrab-cli`                                          |\n| **cargo**      | Rust crates (12 crates published)                  | `cargo install edgecrab-cli`                                        |\n| **Python SDK** | `edgecrab-sdk`                                     | `pip install edgecrab-sdk`                                          |\n| **Node SDK**   | `edgecrab-sdk`                                     | `npm install edgecrab-sdk`                                          |\n| **Docker**     | GHCR multi-arch                                    | `docker pull ghcr.io/raphaelmansuy/edgecrab:latest`                 |\n| **Binary**     | GitHub Release archives                            | [Releases page](https://github.com/raphaelmansuy/edgecrab/releases) |\n\nRelease automation: `.github/workflows/release-rust.yml`, `release-python.yml`, `release-node.yml`, `release-docker.yml`.\n\n---\n\n## License\n\nApache-2.0 — see [LICENSE](LICENSE).\n\nBuilt by [Elitizon](https://elitizon.com) · inspired by [Nous Hermes Agent](https://github.com/NousResearch) and [OpenClaw](https://github.com/openclaw).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fraphaelmansuy%2Fedgecrab","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fraphaelmansuy%2Fedgecrab","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fraphaelmansuy%2Fedgecrab/lists"}