Philosophy: Skills over features
From the NanoClaw README:
Skills over features. Instead of adding features (e.g. support for Telegram) to the codebase, contributors submit claude code skills like /add-telegram that transform your fork. You end up with clean code that does exactly what you need.
This approach means:
- The base NanoClaw codebase stays small (~39.8k tokens)
- Each installation is customized to your exact needs
- No configuration sprawl or unused features
- The code remains understandable and modifiable
How skills work
Skills are distributed as git branches on the upstream repository. Applying a skill is agit merge. Updating core is a git merge. Everything is standard git.
Repository structure
The upstream repo (qwibitai/nanoclaw) maintains skill branches for features that extend core functionality:
| Branch | Description |
|---|---|
main | Core NanoClaw — no channel or skill code |
skill/ollama-tool | Ollama MCP server for local models |
skill/compact | /compact session command |
skill/apple-container | Apple Container runtime (macOS) |
| … | And more |
package.json dependencies, .env.example additions — everything.
Channel fork architecture
Channels (WhatsApp, Telegram, Discord, Slack, Gmail) live in separate fork repositories, not as skill branches on upstream. Each channel fork is a complete NanoClaw installation with the channel code already merged in.| Fork repo | Channel | Library |
|---|---|---|
qwibitai/nanoclaw-whatsapp | @whiskeysockets/baileys | |
qwibitai/nanoclaw-telegram | Telegram | grammy |
qwibitai/nanoclaw-discord | Discord | discord.js |
qwibitai/nanoclaw-slack | Slack | @slack/bolt (Socket Mode) |
qwibitai/nanoclaw-gmail | Gmail | googleapis |
src/channels/registry.ts). Each channel module calls registerChannel() with a factory function — the host process discovers available channels dynamically via getRegisteredChannelNames().
Channel-specific skills also live on the channel fork, not upstream:
| Skill | Channel fork | What it does |
|---|---|---|
/add-voice-transcription | nanoclaw-whatsapp | Whisper API voice transcription |
/use-local-whisper | nanoclaw-whatsapp | Local whisper.cpp transcription |
/add-image-vision | nanoclaw-whatsapp | Image attachment processing |
/add-reactions | nanoclaw-whatsapp | Emoji reaction support |
/add-pdf-reader | nanoclaw-whatsapp | PDF text extraction |
/add-telegram-swarm | nanoclaw-telegram | Agent swarm for Telegram |
The channel fork architecture keeps the upstream
main branch minimal. Core NanoClaw has no channel code at all — you add exactly the channels you need by merging from the appropriate fork.Four categories of skills
Feature skills (branch-based, installed on demand):/add-discord,/add-telegram,/add-slack,/add-gmail, etc.- Each has a
SKILL.mdwith setup instructions and a correspondingskill/*branch with code - Discovered through Claude Code’s plugin marketplace
- Ship code files alongside the
SKILL.md(e.g., scripts in ascripts/subfolder) - No branch merge needed — the code is self-contained in the skill directory
- Example:
/claw(Python CLI inscripts/claw) - Live in
.claude/skills/<name>/onmain
main, always available):
/setup,/debug,/update-nanoclaw,/customize,/update-skills,/get-qodo-rules,/qodo-pr-resolver,/x-integration- Instruction-only
SKILL.mdfiles — no code changes, just workflows - Live in
.claude/skills/onmain
/agent-browser,/capabilities,/slack-formatting,/status- Live in
container/skills/and are synced to each group’s.claude/skills/directory - Available to the agent running inside the container
- Some are restricted to the main channel (e.g.,
/capabilitiesand/statuscheck for the/workspace/projectmount)
Applying a skill
Via Claude Code (recommended)
Run the skill command in Claude Code. For example,/add-discord triggers Claude to:
Interactive setup
Walks you through creating the bot, getting tokens, configuring environment variables, and registering chats.
Manually
- Channel (from fork repo)
- Skill (from upstream branch)
Applying multiple channels
Skill discovery
Skills are available through Claude Code’s plugin marketplace. NanoClaw’s.claude/settings.json registers the official marketplace:
/setup, the marketplace plugin is installed automatically:
/setup can install the marketplace plugin, then immediately run any feature skill, all in one session.
Skill dependencies
Some skills depend on others. For example,skill/telegram-swarm requires skill/telegram. Dependent skill branches are branched from their parent, not from main.
This means skill/telegram-swarm includes all of Telegram’s changes plus its own additions. When you merge skill/telegram-swarm, you get both — no need to merge Telegram separately.
Dependencies are implicit in git history — no separate dependency file is needed.
Available integration skills
Channels (from fork repos)
| Channel | Command | Fork repo | Library |
|---|---|---|---|
/add-whatsapp | nanoclaw-whatsapp | @whiskeysockets/baileys | |
| Telegram | /add-telegram | nanoclaw-telegram | grammy |
| Discord | /add-discord | nanoclaw-discord | discord.js |
| Slack | /add-slack | nanoclaw-slack | @slack/bolt (Socket Mode) |
| Gmail | /add-gmail | nanoclaw-gmail | googleapis |
Upstream skills (from skill branches)
/add-compact— Manual context compaction skill/add-ollama-tool— Ollama MCP server for local models/add-parallel— Parallel AI MCP servers for web research/convert-to-apple-container— Switch from Docker to Apple Container on macOS/use-native-credential-proxy— Replace OneCLI gateway with built-in.env-based credential proxy
Channel-specific skills (from channel fork branches)
/add-voice-transcription— Voice message transcription (onnanoclaw-whatsapp)/add-image-vision— Image attachment processing (onnanoclaw-whatsapp)/add-reactions— Emoji reaction support (onnanoclaw-whatsapp)/add-pdf-reader— PDF text extraction (onnanoclaw-whatsapp)/add-telegram-swarm— Agent swarm support (onnanoclaw-telegram)
Updating
Updating core
git merge upstream/main just works. No skill replay step needed.
Updating channels
Channel forks track upstream, so pulling from a channel fork also brings in the latest core changes:Checking for skill updates
Run/update-skills or let /update-nanoclaw check after a core update. For each previously-merged skill branch or channel fork that has new commits, Claude offers to merge the updates.
This requires no state files — it uses git history to determine which skills were previously merged and whether they have new commits.
Removing a skill
Community marketplaces
Anyone can maintain their own fork with skill branches and their own marketplace repo. This enables a community-driven skill ecosystem. A community contributor:- Maintains a fork with
skill/*branches - Creates a marketplace repo with a
.claude-plugin/marketplace.json - Opens a PR to add their marketplace to NanoClaw’s
.claude/settings.json
CI: Keeping skill branches current
A GitHub Action runs on every push tomain:
- Lists all
skill/*branches - Merges
maininto each skill branch (merge-forward, not rebase) - Runs build and tests on the merged result
- Pushes the updated skill branch if tests pass
- Opens a GitHub issue for any skill that fails
Merge-forward (not rebase) preserves history for users who already merged the skill. No force-push needed.
Contributing a skill
As a contributor
- Fork
qwibitai/nanoclaw - Branch from
mainand make your code changes - Open a regular PR
skill/<name> branch from your PR and add the SKILL.md to the marketplace.
As a maintainer
When a skill PR is approved:- Create a
skill/<name>branch from the PR’s commits - Add the skill’s
SKILL.mdto the marketplace repo (qwibitai/nanoclaw-skills) - The contributor is added to
CONTRIBUTORS.md
Skills vs configuration files
NanoClaw deliberately avoids configuration files. From the README:Customization = code changes. No configuration sprawl. Want different behavior? Modify the code. The codebase is small enough that it’s safe to make changes.Skills extend this philosophy: instead of a config file with
integrations: [telegram, discord, slack], you merge skill branches that modify the source code directly. You end up with code that does exactly what you need, nothing more.
Best practices
Next steps
Add Telegram
Add Telegram support to your installation
Add Discord
Add Discord support to your installation
Add Slack
Add Slack support to your installation
Add Gmail
Add Gmail integration to your installation