Philosophy
NanoClaw is not a framework that tries to support every use case. It’s software that each user customizes to fit their exact needs. Instead of adding features to the codebase, we contribute skills that teach Claude Code how to transform a NanoClaw installation.What we accept
Source code changes
Accepted: Bug fixes
Accepted: Bug fixes
Fixes for broken functionality, crashes, or incorrect behavior.Example: Fix message cursor advancing before agent succeeds, causing messages to be lost on timeout.
Accepted: Security fixes
Accepted: Security fixes
Patches for security vulnerabilities or improvements to the security model.Example: Add symlink resolution to mount validation to prevent traversal attacks.
Accepted: Simplifications
Accepted: Simplifications
Refactoring that reduces complexity, removes dependencies, or makes the codebase easier to understand.Example: Consolidate duplicate mount validation logic into a single function.
Accepted: Code reduction
Accepted: Code reduction
Removing unnecessary code, dependencies, or features.Example: Remove unused configuration options.
Not accepted: Features
Not accepted: Features
New capabilities, integrations, or functionality expansions.Why: Features should be skills, not source code.Example: Adding Telegram support, Gmail integration, or new scheduling options.
Not accepted: Enhancements
Not accepted: Enhancements
Improvements to existing features or performance optimizations.Why: Users should customize their fork to add enhancements they need.Example: Adding caching, improving query performance, or adding retry logic.
Not accepted: Compatibility
Not accepted: Compatibility
Support for new platforms, runtimes, or environments.Why: Compatibility changes should be skills.Example: Adding Windows support, Podman support, or ARM64 optimization.
Contributing skills
A skill is a markdown file that teaches Claude Code how to transform or extend a NanoClaw installation. NanoClaw has four types of skills, each serving a different purpose.Skill types
Feature skills — add capabilities by merging askill/* branch. The SKILL.md contains setup instructions; the actual code lives on the branch.
skill/telegram branch
src/channels/telegram.ts
src/index.ts
package.json
.env.example
.claude/skills
claw
SKILL.md
scripts
claw
main with no code changes.
.claude/skills
debug
SKILL.md
container/skills/.
Writing a skill
For feature skills: make code changes on a branch
Branch from The branch should contain all the code needed for the integration — new files, modified source files, updated dependencies,
main and make your code changes directly:.env.example additions.For utility skills: create a self-contained directory
Create
.claude/skills/{name}/ with a SKILL.md and supporting code files (e.g., in a scripts/ subfolder). Use ${CLAUDE_SKILL_DIR} to reference files in the skill directory. Put code in separate files, not inline in the SKILL.md.For operational skills: write SKILL.md
Create a
SKILL.md in .claude/skills/{name}/ on main. The skill should contain instructions Claude follows to execute a workflow.For container skills: add to container/skills/
Create
container/skills/{name}/SKILL.md. Keep skills focused — the agent’s context window is shared across all container skills.Include context and rationale
For feature skills, write a SKILL.md for the marketplace that explains setup steps and design decisions.
Why skills instead of features?
Every user should have clean and minimal code that does exactly what they need. Skills let users selectively add features to their fork without inheriting code for features they don’t want.- With skills
- Without skills (traditional approach)
Skill guidelines
Feature skills contain source changes
Feature skills contain source changes
Feature skills are
skill/* branches that contain all code changes for the integration — including modifications to src/, container/, package.json, etc. This is by design: the skill branch is the complete diff from main.Utility skills ship code alongside the SKILL.md but don’t modify source files — the code is self-contained in the skill directory. Operational skills are instruction-only.Skills should be reversible
Skills should be reversible
Users should be able to remove a skill’s changes if they no longer want it. Include removal instructions in the skill or create a separate
/remove-{feature} skill.Skills should be composable
Skills should be composable
Skills should work together without conflicts. If your skill is incompatible with another skill, document this clearly.
Skills should preserve security
Skills should preserve security
Skills that add new capabilities must respect the existing security model. Don’t bypass container isolation, mount validation, or IPC authorization.
Request for skills (RFS)
Skills we’d like to see contributed:Communication channels
Slack, Discord, Telegram, and Gmail integrations already exist! Check the integrations overview.
/add-signal- Add Signal integration/add-matrix- Add Matrix integration/add-whatsapp-cloud-api- Add WhatsApp Cloud API (for business accounts)
Deployment
/deploy-railway- Deploy NanoClaw to Railway/deploy-fly- Deploy NanoClaw to Fly.io/deploy-vps- Deploy NanoClaw to a VPS with systemd
Integrations
/add-calendar- Google Calendar integration/add-todoist- Todoist integration/add-notion- Notion integration
Runtime
/convert-to-podman- Switch from Docker to Podman/add-windows-support- WSL2 support for Windows
Submitting a contribution
Make your changes
For operational skills:For feature skills:For source changes (bug fixes, simplifications):
Code style
When contributing source code:- Follow existing TypeScript conventions
- Use meaningful variable names
- Add comments for non-obvious logic
- Keep functions small and focused
- Prefer explicit over implicit
NanoClaw doesn’t use a linter or formatter. Code style is enforced through review. The goal is readability and simplicity, not stylistic uniformity.
Getting help
If you’re working on a contribution and need help:- Ask Claude Code: Describe what you’re trying to do. Claude can help write skills or refactor code.
- Join the Discord: Community Discord
- Open a draft PR: Start a discussion before the work is complete.
License
By contributing to NanoClaw, you agree that your contributions will be licensed under the MIT License.Related pages
- Security model - Understanding security boundaries
- IPC system - How agents communicate with the host
- Container runtime - Container execution details