Merge pull request #1388 from glifocat/docs/update-upstream-docs
docs: update outdated documentation, add docs portal links
This commit is contained in:
138
CHANGELOG.md
138
CHANGELOG.md
@@ -2,7 +2,139 @@
|
||||
|
||||
All notable changes to NanoClaw will be documented in this file.
|
||||
|
||||
## [1.2.0](https://github.com/qwibitai/nanoclaw/compare/v1.1.6...v1.2.0)
|
||||
For detailed release notes, see the [full changelog on the documentation site](https://docs.nanoclaw.dev/changelog).
|
||||
|
||||
[BREAKING] WhatsApp removed from core, now a skill. Run `/add-whatsapp` to re-add (existing auth/groups preserved).
|
||||
- **fix:** Prevent scheduled tasks from executing twice when container runtime exceeds poll interval (#138, #669)
|
||||
## [1.2.21] - 2026-03-22
|
||||
|
||||
- Added opt-in diagnostics via PostHog with explicit user consent (Yes / No / Never ask again)
|
||||
|
||||
## [1.2.20] - 2026-03-21
|
||||
|
||||
- Added ESLint configuration with error-handling rules
|
||||
|
||||
## [1.2.19] - 2026-03-19
|
||||
|
||||
- Reduced `docker stop` timeout for faster container restarts (`-t 1` flag)
|
||||
|
||||
## [1.2.18] - 2026-03-19
|
||||
|
||||
- User prompt content no longer logged on container errors — only input metadata
|
||||
- Added Japanese README translation
|
||||
|
||||
## [1.2.17] - 2026-03-18
|
||||
|
||||
- Added `/capabilities` and `/status` container-agent skills
|
||||
|
||||
## [1.2.16] - 2026-03-18
|
||||
|
||||
- Tasks snapshot now refreshes immediately after IPC task mutations
|
||||
|
||||
## [1.2.15] - 2026-03-16
|
||||
|
||||
- Fixed remote-control prompt auto-accept to prevent immediate exit
|
||||
- Added `KillMode=process` so remote-control survives service restarts
|
||||
|
||||
## [1.2.14] - 2026-03-14
|
||||
|
||||
- Added `/remote-control` command for host-level Claude Code access from within containers
|
||||
|
||||
## [1.2.13] - 2026-03-14
|
||||
|
||||
**Breaking:** Skills are now git branches, channels are separate fork repos.
|
||||
|
||||
- Skills live as `skill/*` git branches merged via `git merge`
|
||||
- Added Docker Sandboxes support
|
||||
- Fixed setup registration to use correct CLI commands
|
||||
|
||||
## [1.2.12] - 2026-03-08
|
||||
|
||||
- Added `/compact` skill for manual context compaction
|
||||
- Enhanced container environment isolation via credential proxy
|
||||
|
||||
## [1.2.11] - 2026-03-08
|
||||
|
||||
- Added PDF reader, image vision, and WhatsApp reactions skills
|
||||
- Fixed task container to close promptly when agent uses IPC-only messaging
|
||||
|
||||
## [1.2.10] - 2026-03-06
|
||||
|
||||
- Added `LIMIT` to unbounded message history queries for better performance
|
||||
|
||||
## [1.2.9] - 2026-03-06
|
||||
|
||||
- Agent prompts now include timezone context for accurate time references
|
||||
|
||||
## [1.2.8] - 2026-03-06
|
||||
|
||||
- Fixed misleading `send_message` tool description for scheduled tasks
|
||||
|
||||
## [1.2.7] - 2026-03-06
|
||||
|
||||
- Added `/add-ollama` skill for local model inference
|
||||
- Added `update_task` tool and return task ID from `schedule_task`
|
||||
|
||||
## [1.2.6] - 2026-03-04
|
||||
|
||||
- Updated `claude-agent-sdk` to 0.2.68
|
||||
|
||||
## [1.2.5] - 2026-03-04
|
||||
|
||||
- CI formatting fix
|
||||
|
||||
## [1.2.4] - 2026-03-04
|
||||
|
||||
- Fixed `_chatJid` rename to `chatJid` in `onMessage` callback
|
||||
|
||||
## [1.2.3] - 2026-03-04
|
||||
|
||||
- Added sender allowlist for per-chat access control
|
||||
|
||||
## [1.2.2] - 2026-03-04
|
||||
|
||||
- Added `/use-local-whisper` skill for local voice transcription
|
||||
- Atomic task claims prevent scheduled tasks from executing twice
|
||||
|
||||
## [1.2.1] - 2026-03-02
|
||||
|
||||
- Version bump (no functional changes)
|
||||
|
||||
## [1.2.0] - 2026-03-02
|
||||
|
||||
**Breaking:** WhatsApp removed from core, now a skill. Run `/add-whatsapp` to re-add.
|
||||
|
||||
- Channel registry: channels self-register at startup via `registerChannel()` factory pattern
|
||||
- `isMain` flag replaces folder-name-based main group detection
|
||||
- `ENABLED_CHANNELS` removed — channels detected by credential presence
|
||||
- Prevent scheduled tasks from executing twice when container runtime exceeds poll interval
|
||||
|
||||
## [1.1.6] - 2026-03-01
|
||||
|
||||
- Added CJK font support for Chromium screenshots
|
||||
|
||||
## [1.1.5] - 2026-03-01
|
||||
|
||||
- Fixed wrapped WhatsApp message normalization
|
||||
|
||||
## [1.1.4] - 2026-03-01
|
||||
|
||||
- Added third-party model support
|
||||
- Added `/update-nanoclaw` skill for syncing with upstream
|
||||
|
||||
## [1.1.3] - 2026-02-25
|
||||
|
||||
- Added `/add-slack` skill
|
||||
- Restructured Gmail skill for new architecture
|
||||
|
||||
## [1.1.2] - 2026-02-24
|
||||
|
||||
- Improved error handling for WhatsApp Web version fetch
|
||||
|
||||
## [1.1.1] - 2026-02-24
|
||||
|
||||
- Added Qodo skills and codebase intelligence
|
||||
- Fixed WhatsApp 405 connection failures
|
||||
|
||||
## [1.1.0] - 2026-02-23
|
||||
|
||||
- Added `/update` skill to pull upstream changes from within Claude Code
|
||||
- Enhanced container environment isolation via credential proxy
|
||||
|
||||
13
README.md
13
README.md
@@ -8,6 +8,7 @@
|
||||
|
||||
<p align="center">
|
||||
<a href="https://nanoclaw.dev">nanoclaw.dev</a> •
|
||||
<a href="https://docs.nanoclaw.dev">docs</a> •
|
||||
<a href="README_zh.md">中文</a> •
|
||||
<a href="README_ja.md">日本語</a> •
|
||||
<a href="https://discord.gg/VDdww8qS42"><img src="https://img.shields.io/discord/1470188214710046894?label=Discord&logo=discord&v=2" alt="Discord" valign="middle"></a> •
|
||||
@@ -121,7 +122,7 @@ Skills we'd like to see:
|
||||
|
||||
## Requirements
|
||||
|
||||
- macOS or Linux
|
||||
- macOS, Linux, or Windows (via WSL2)
|
||||
- Node.js 20+
|
||||
- [Claude Code](https://claude.ai/download)
|
||||
- [Apple Container](https://github.com/apple/container) (macOS) or [Docker](https://docker.com/products/docker-desktop) (macOS/Linux)
|
||||
@@ -134,7 +135,7 @@ Channels --> SQLite --> Polling loop --> Container (Claude Agent SDK) --> Respon
|
||||
|
||||
Single Node.js process. Channels are added via skills and self-register at startup — the orchestrator connects whichever ones have credentials present. Agents execute in isolated Linux containers with filesystem isolation. Only mounted directories are accessible. Per-group message queue with concurrency control. IPC via filesystem.
|
||||
|
||||
For the full architecture details, see [docs/SPEC.md](docs/SPEC.md).
|
||||
For the full architecture details, see the [documentation site](https://docs.nanoclaw.dev/concepts/architecture).
|
||||
|
||||
Key files:
|
||||
- `src/index.ts` - Orchestrator: state, message loop, agent invocation
|
||||
@@ -153,13 +154,13 @@ Key files:
|
||||
|
||||
Docker provides cross-platform support (macOS, Linux and even Windows via WSL2) and a mature ecosystem. On macOS, you can optionally switch to Apple Container via `/convert-to-apple-container` for a lighter-weight native runtime. For additional isolation, [Docker Sandboxes](docs/docker-sandboxes.md) run each container inside a micro VM.
|
||||
|
||||
**Can I run this on Linux?**
|
||||
**Can I run this on Linux or Windows?**
|
||||
|
||||
Yes. Docker is the default runtime and works on both macOS and Linux. Just run `/setup`.
|
||||
Yes. Docker is the default runtime and works on macOS, Linux, and Windows (via WSL2). Just run `/setup`.
|
||||
|
||||
**Is this secure?**
|
||||
|
||||
Agents run in containers, not behind application-level permission checks. They can only access explicitly mounted directories. You should still review what you're running, but the codebase is small enough that you actually can. See [docs/SECURITY.md](docs/SECURITY.md) for the full security model.
|
||||
Agents run in containers, not behind application-level permission checks. They can only access explicitly mounted directories. You should still review what you're running, but the codebase is small enough that you actually can. See the [security documentation](https://docs.nanoclaw.dev/concepts/security) for the full security model.
|
||||
|
||||
**Why no configuration files?**
|
||||
|
||||
@@ -203,7 +204,7 @@ Questions? Ideas? [Join the Discord](https://discord.gg/VDdww8qS42).
|
||||
|
||||
## Changelog
|
||||
|
||||
See [CHANGELOG.md](CHANGELOG.md) for breaking changes and migration notes.
|
||||
See [CHANGELOG.md](CHANGELOG.md) for breaking changes, or the [full release history](https://docs.nanoclaw.dev/changelog) on the documentation site.
|
||||
|
||||
## License
|
||||
|
||||
|
||||
@@ -19,16 +19,16 @@ launchctl list | grep nanoclaw
|
||||
# Expected: PID 0 com.nanoclaw (PID = running, "-" = not running, non-zero exit = crashed)
|
||||
|
||||
# 2. Any running containers?
|
||||
container ls --format '{{.Names}} {{.Status}}' 2>/dev/null | grep nanoclaw
|
||||
docker ps --format '{{.Names}} {{.Status}}' 2>/dev/null | grep nanoclaw
|
||||
|
||||
# 3. Any stopped/orphaned containers?
|
||||
container ls -a --format '{{.Names}} {{.Status}}' 2>/dev/null | grep nanoclaw
|
||||
docker ps -a --format '{{.Names}} {{.Status}}' 2>/dev/null | grep nanoclaw
|
||||
|
||||
# 4. Recent errors in service log?
|
||||
grep -E 'ERROR|WARN' logs/nanoclaw.log | tail -20
|
||||
|
||||
# 5. Is WhatsApp connected? (look for last connection event)
|
||||
grep -E 'Connected to WhatsApp|Connection closed|connection.*close' logs/nanoclaw.log | tail -5
|
||||
# 5. Are channels connected? (look for last connection event)
|
||||
grep -E 'Connected|Connection closed|connection.*close|channel.*ready' logs/nanoclaw.log | tail -5
|
||||
|
||||
# 6. Are groups loaded?
|
||||
grep 'groupCount' logs/nanoclaw.log | tail -3
|
||||
@@ -77,7 +77,7 @@ grep -E 'Scheduling retry|retry|Max retries' logs/nanoclaw.log | tail -10
|
||||
## Agent Not Responding
|
||||
|
||||
```bash
|
||||
# Check if messages are being received from WhatsApp
|
||||
# Check if messages are being received from channels
|
||||
grep 'New messages' logs/nanoclaw.log | tail -10
|
||||
|
||||
# Check if messages are being processed (container spawned)
|
||||
@@ -107,10 +107,10 @@ sqlite3 store/messages.db "SELECT name, container_config FROM registered_groups;
|
||||
|
||||
# Test-run a container to check mounts (dry run)
|
||||
# Replace <group-folder> with the group's folder name
|
||||
container run -i --rm --entrypoint ls nanoclaw-agent:latest /workspace/extra/
|
||||
docker run -i --rm --entrypoint ls nanoclaw-agent:latest /workspace/extra/
|
||||
```
|
||||
|
||||
## WhatsApp Auth Issues
|
||||
## Channel Auth Issues
|
||||
|
||||
```bash
|
||||
# Check if QR code was requested (means auth expired)
|
||||
|
||||
15
docs/README.md
Normal file
15
docs/README.md
Normal file
@@ -0,0 +1,15 @@
|
||||
# NanoClaw Documentation
|
||||
|
||||
The official documentation is at **[docs.nanoclaw.dev](https://docs.nanoclaw.dev)**.
|
||||
|
||||
The files in this directory are original design documents and developer references. For the most current and accurate information, use the documentation site.
|
||||
|
||||
| This directory | Documentation site |
|
||||
|---|---|
|
||||
| [SPEC.md](SPEC.md) | [Architecture](https://docs.nanoclaw.dev/concepts/architecture) |
|
||||
| [SECURITY.md](SECURITY.md) | [Security model](https://docs.nanoclaw.dev/concepts/security) |
|
||||
| [REQUIREMENTS.md](REQUIREMENTS.md) | [Introduction](https://docs.nanoclaw.dev/introduction) |
|
||||
| [skills-as-branches.md](skills-as-branches.md) | [Skills system](https://docs.nanoclaw.dev/integrations/skills-system) |
|
||||
| [DEBUG_CHECKLIST.md](DEBUG_CHECKLIST.md) | [Troubleshooting](https://docs.nanoclaw.dev/advanced/troubleshooting) |
|
||||
| [docker-sandboxes.md](docker-sandboxes.md) | [Docker Sandboxes](https://docs.nanoclaw.dev/advanced/docker-sandboxes) |
|
||||
| [APPLE-CONTAINER-NETWORKING.md](APPLE-CONTAINER-NETWORKING.md) | [Container runtime](https://docs.nanoclaw.dev/advanced/container-runtime) |
|
||||
@@ -22,9 +22,9 @@ The entire codebase should be something you can read and understand. One Node.js
|
||||
|
||||
Instead of application-level permission systems trying to prevent agents from accessing things, agents run in actual Linux containers. The isolation is at the OS level. Agents can only see what's explicitly mounted. Bash access is safe because commands run inside the container, not on your Mac.
|
||||
|
||||
### Built for One User
|
||||
### Built for the Individual User
|
||||
|
||||
This isn't a framework or a platform. It's working software for my specific needs. I use WhatsApp and Email, so it supports WhatsApp and Email. I don't use Telegram, so it doesn't support Telegram. I add the integrations I actually want, not every possible integration.
|
||||
This isn't a framework or a platform. It's software that fits each user's exact needs. You fork the repo, add the channels you want (WhatsApp, Telegram, Discord, Slack, Gmail), and end up with clean code that does exactly what you need.
|
||||
|
||||
### Customization = Code Changes
|
||||
|
||||
@@ -44,41 +44,31 @@ When people contribute, they shouldn't add "Telegram support alongside WhatsApp.
|
||||
|
||||
## RFS (Request for Skills)
|
||||
|
||||
Skills we'd love contributors to build:
|
||||
Skills we'd like to see contributed:
|
||||
|
||||
### Communication Channels
|
||||
Skills to add or switch to different messaging platforms:
|
||||
- `/add-telegram` - Add Telegram as an input channel
|
||||
- `/add-slack` - Add Slack as an input channel
|
||||
- `/add-discord` - Add Discord as an input channel
|
||||
- `/add-sms` - Add SMS via Twilio or similar
|
||||
- `/convert-to-telegram` - Replace WhatsApp with Telegram entirely
|
||||
- `/add-signal` - Add Signal as a channel
|
||||
- `/add-matrix` - Add Matrix integration
|
||||
|
||||
### Container Runtime
|
||||
The project uses Docker by default (cross-platform). For macOS users who prefer Apple Container:
|
||||
- `/convert-to-apple-container` - Switch from Docker to Apple Container (macOS-only)
|
||||
|
||||
### Platform Support
|
||||
- `/setup-linux` - Make the full setup work on Linux (depends on Docker conversion)
|
||||
- `/setup-windows` - Windows support via WSL2 + Docker
|
||||
> **Note:** Telegram, Slack, Discord, Gmail, and Apple Container skills already exist. See the [skills documentation](https://docs.nanoclaw.dev/integrations/skills-system) for the full list.
|
||||
|
||||
---
|
||||
|
||||
## Vision
|
||||
|
||||
A personal Claude assistant accessible via WhatsApp, with minimal custom code.
|
||||
A personal Claude assistant accessible via messaging, with minimal custom code.
|
||||
|
||||
**Core components:**
|
||||
- **Claude Agent SDK** as the core agent
|
||||
- **Containers** for isolated agent execution (Linux VMs)
|
||||
- **WhatsApp** as the primary I/O channel
|
||||
- **Multi-channel messaging** (WhatsApp, Telegram, Discord, Slack, Gmail) — add exactly the channels you need
|
||||
- **Persistent memory** per conversation and globally
|
||||
- **Scheduled tasks** that run Claude and can message back
|
||||
- **Web access** for search and browsing
|
||||
- **Browser automation** via agent-browser
|
||||
|
||||
**Implementation approach:**
|
||||
- Use existing tools (WhatsApp connector, Claude Agent SDK, MCP servers)
|
||||
- Use existing tools (channel libraries, Claude Agent SDK, MCP servers)
|
||||
- Minimal glue code
|
||||
- File-based systems where possible (CLAUDE.md for memory, folders for groups)
|
||||
|
||||
@@ -87,7 +77,7 @@ A personal Claude assistant accessible via WhatsApp, with minimal custom code.
|
||||
## Architecture Decisions
|
||||
|
||||
### Message Routing
|
||||
- A router listens to WhatsApp and routes messages based on configuration
|
||||
- A router listens to connected channels and routes messages based on configuration
|
||||
- Only messages from registered groups are processed
|
||||
- Trigger: `@Andy` prefix (case insensitive), configurable via `ASSISTANT_NAME` env var
|
||||
- Unregistered groups are ignored completely
|
||||
@@ -136,10 +126,11 @@ A personal Claude assistant accessible via WhatsApp, with minimal custom code.
|
||||
|
||||
## Integration Points
|
||||
|
||||
### WhatsApp
|
||||
- Using baileys library for WhatsApp Web connection
|
||||
### Channels
|
||||
- WhatsApp (baileys), Telegram (grammy), Discord (discord.js), Slack (@slack/bolt), Gmail (googleapis)
|
||||
- Each channel lives in a separate fork repo and is added via skills (e.g., `/add-whatsapp`, `/add-telegram`)
|
||||
- Messages stored in SQLite, polled by router
|
||||
- QR code authentication during setup
|
||||
- Channels self-register at startup — unconfigured channels are skipped with a warning
|
||||
|
||||
### Scheduler
|
||||
- Built-in scheduler runs on the host, spawns containers for task execution
|
||||
@@ -170,12 +161,12 @@ A personal Claude assistant accessible via WhatsApp, with minimal custom code.
|
||||
- Each user gets a custom setup matching their exact needs
|
||||
|
||||
### Skills
|
||||
- `/setup` - Install dependencies, authenticate WhatsApp, configure scheduler, start services
|
||||
- `/customize` - General-purpose skill for adding capabilities (new channels like Telegram, new integrations, behavior changes)
|
||||
- `/update` - Pull upstream changes, merge with customizations, run migrations
|
||||
- `/setup` - Install dependencies, configure channels, start services
|
||||
- `/customize` - General-purpose skill for adding capabilities
|
||||
- `/update-nanoclaw` - Pull upstream changes, merge with customizations
|
||||
|
||||
### Deployment
|
||||
- Runs on local Mac via launchd
|
||||
- Runs on macOS (launchd), Linux (systemd), or Windows (WSL2)
|
||||
- Single Node.js process handles everything
|
||||
|
||||
---
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
| Main group | Trusted | Private self-chat, admin control |
|
||||
| Non-main groups | Untrusted | Other users may be malicious |
|
||||
| Container agents | Sandboxed | Isolated execution environment |
|
||||
| WhatsApp messages | User input | Potential prompt injection |
|
||||
| Incoming messages | User input | Potential prompt injection |
|
||||
|
||||
## Security Boundaries
|
||||
|
||||
@@ -76,7 +76,7 @@ Real API credentials **never enter containers**. Instead, the host runs an HTTP
|
||||
5. Agents cannot discover real credentials — not in environment, stdin, files, or `/proc`
|
||||
|
||||
**NOT Mounted:**
|
||||
- WhatsApp session (`store/auth/`) - host only
|
||||
- Channel auth sessions (`store/auth/`) - host only
|
||||
- Mount allowlist - external, never mounted
|
||||
- Any credentials matching blocked patterns
|
||||
- `.env` is shadowed with `/dev/null` in the project root mount
|
||||
@@ -97,7 +97,7 @@ Real API credentials **never enter containers**. Instead, the host runs an HTTP
|
||||
```
|
||||
┌──────────────────────────────────────────────────────────────────┐
|
||||
│ UNTRUSTED ZONE │
|
||||
│ WhatsApp Messages (potentially malicious) │
|
||||
│ Incoming Messages (potentially malicious) │
|
||||
└────────────────────────────────┬─────────────────────────────────┘
|
||||
│
|
||||
▼ Trigger check, input escaping
|
||||
|
||||
Reference in New Issue
Block a user