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 in.claude/skills/ that teaches Claude Code how to transform a NanoClaw installation.
Skill structure
Skills should be self-contained directories under.claude/skills/{skill-name}/:
Writing a skill
Provide clear instructions
The skill should contain instructions Claude follows to add the feature, not pre-built code.Good example from
/add-telegram:- Create
src/channels/telegram.tswith the following structure:- Export a
connectToTelegram()function - Handle incoming messages
- Export a
sendTelegramMessage()function
- Export a
- Modify
src/index.tsto import and callconnectToTelegram()
Provide templates if needed
If the skill requires boilerplate code, include it in a
templates/ directory.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
Skills should not modify source files
Skills should not modify source files
A PR that contributes a skill should not touch
src/, container/, or other core files. The skill’s instructions tell Claude how to make those changes.Exception: If the skill requires changes to the skill system itself (e.g., new skill loading behavior), those can be source changes.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)
Session management
/clear- Compact conversation (summarize context while preserving critical information in the same session). Requires figuring out how to trigger compaction programmatically via the Claude Agent SDK.
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
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