Stack: Docker + hermes acp + VS Code ACP extension
What you get: A local AI coding assistant running inside VS Code — with full codebase context, persistent memory of your project's architecture, and zero code leaving your machine.
- Open any file in VS Code, select a function, press a hotkey → Hermes reviews it for bugs, edge cases, and style issues
- "Why does this module use a singleton?" → Hermes checks its memory of your codebase architecture and explains
- After reviewing 20+ files: Hermes auto-creates a
code_reviewskill calibrated to your project's conventions - Works entirely offline — no code is sent to any external API
| Requirement | Notes |
|---|---|
| Docker Desktop | install |
| VS Code | install |
| A GGUF model | Recommended: Qwen3-14B-Q4_K_M.gguf for code (~8 GB). 7B also works. |
| Node.js 18+ | For running MCP servers |
git clone https://github.com/TheAiSingularity/hermesclaw
cd hermesclaw
cp .env.example .envDownload a code-capable model into models/. Qwen3 models are strong at code:
# Set in .env:
MODEL_FILE=Qwen3-14B-Q4_K_M.gguf
CTX_SIZE=16384 # larger context for code reviewStart the stack:
docker compose up -d
docker compose ps # wait until both services are "healthy"The ACP (Agent Communication Protocol) extension connects VS Code to any ACP-compatible agent, including Hermes.
- Open VS Code
- Go to Extensions (
Ctrl+Shift+X/Cmd+Shift+X) - Search for "ACP" or "Agent Communication Protocol"
- Install the extension by i-am-bee / BeeAI
Hermes runs as an ACP stdio server. The VS Code extension communicates with it directly.
Option A — run ACP inside the Docker container:
docker exec -it hermesclaw hermes acpOption B — if Hermes is installed locally on your machine:
hermes acpThe ACP server starts and listens on stdio. Leave this terminal open.
In VS Code:
- Open the Command Palette (
Ctrl+Shift+P/Cmd+Shift+P) - Run:
ACP: Connect to Agent - Choose stdio mode
- Enter the command:
docker exec -i hermesclaw hermes acp
The ACP panel will show Hermes as connected. You'll see a chat interface in the sidebar.
The Git MCP server gives Hermes access to your git history for richer code review context.
Add to configs/hermes.yaml (create it from the example if you haven't):
mcp:
servers:
git:
command: npx
args: ["-y", "@modelcontextprotocol/server-git", "--repository", "/workspace"]Mount your project into the container by adding to the hermesclaw service in docker-compose.yml:
volumes:
- /path/to/your/project:/workspace:roRestart: docker compose up -d
./skills/install.sh code-reviewThis installs the skill into ~/.hermes/skills/code-review/ (mounted into the container).
In the ACP chat panel in VS Code:
This is a Python FastAPI project. We use async/await throughout, Pydantic v2 for models,
and SQLAlchemy 2.0 with async sessions. All endpoints return typed response models.
Tests use pytest-asyncio. Please remember this architecture.
Hermes writes this to MEMORY.md and applies it to all future code reviews.
Test code review via ACP:
- Open any Python/TypeScript file in VS Code
- Select a function
- In the ACP chat: "Review this function for bugs and edge cases"
- Hermes should respond with a structured review within 15–30 seconds
Test via CLI:
docker exec -it hermesclaw hermes chat -q "Review this Python function: def divide(a, b): return a / b"
# Expected: Hermes flags the ZeroDivisionError and suggests a guardTest memory persistence:
docker exec hermesclaw cat /root/.hermes/memories/MEMORY.md
# Should contain your codebase architecture notesInline code review:
You: "Review this function for edge cases" Hermes: "Found 2 issues: (1) No guard for empty list input — will raise IndexError on line 12. (2) The timeout is hardcoded to 30s; this should be a parameter with a sensible default. Suggested fix: [code block]"
Architecture questions:
You: "Why do we use a singleton for the database connection pool?" Hermes: "Based on your architecture notes, the pool is a singleton because FastAPI creates one instance per worker process and SQLAlchemy's async pool is not thread-safe across processes."
Documentation generation:
You: "Generate docstrings for all functions in this file that don't have them" Hermes: [reads file, writes docstrings, returns diffs]
Debugging:
You: "I'm getting 'relation does not exist' in prod but not locally. Check the migration history." Hermes: [reads git log, checks migration files, identifies the missing migration]
| Feature | HermesClaw | NemoClaw |
|---|---|---|
| VS Code ACP integration | ✅ | |
| Persistent codebase memory (MEMORY.md) | ✅ | ❌ (session-only) |
| MCP server support | ✅ | ❌ (unconfirmed) |
| Local model (code never leaves machine) | ✅ | ❌ on macOS (cloud API required) |
| Self-improving code review skill | ✅ | ❌ |
| OpenShell sandbox | Optional | ✅ |
Where NemoClaw falls short for this use case: ACP is an open standard — VS Code, Zed, and JetBrains integrate with it natively. OpenClaw has its own IDE integration, which may not be compatible with these editors. More critically, on macOS NemoClaw routes inference to cloud APIs — your proprietary code is sent externally on every review request.