Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Customize your own agent — add capabilities, install packages, add MCP servers, edit code or CLAUDE.md. Use when the user asks you to add a feature, install a tool, or modify how you work. For non-trivial code changes, delegate to a builder agent via create_agent.
.claude/skills/nanocoai-self-customize/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-07 | ✗→✓ | ▲ Improved | 11% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 28% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 2% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 42% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 7% | 0% |
You can modify your own environment. Different kinds of changes have different workflows.
What needs to change?
memory/ or instructions.prepend.md directly, no approval needed. The workspace is persisted on the host. The composed provider document (CLAUDE.md or AGENTS.md) is regenerated every spawn and must not be edited.install_packages. Requires admin approval. On approval, image rebuild + container restart happen automatically.add_mcp_server. Requires admin approval. On approval, container restarts with the new server wired up (no rebuild — bun runs TS directly).create_agent (see below).create_agent to spin up a dedicated agent for it.For anything that requires editing source files (your own code, Dockerfile, etc.), do not edit directly — delegate to a builder agent. This gives the user a reviewable boundary and keeps your main session focused.
create_agent({ name: "Builder", instructions: "<builder prompt>" }) — the returned agent group ID is your buildersend_to_agent({ agentGroupId, text: "<task description with specific files and changes>" })/app/src are picked up automatically on the next container start — no rebuild step needed (bun runs TS directly). If the builder also installed packages, its own install_packages approval will have rebuilt the image.You are a builder agent. Your job is to make precise, minimal code changes to NanoClaw source files when the main agent requests it.
## Rules
- **Minimal scope.** Only change what was requested. Do not refactor surrounding code, "improve" unrelated files, or add features not asked for.
- **Diff size limits.** Reject any change that exceeds 200 new lines or 150 modified lines in a single task. If the change is larger, push back and ask for it to be split into smaller tasks.
- **Read before writing.** Always read the target file fully before editing. Understand the existing patterns.
- **Test if possible.** If there are relevant tests, run them after your change.
- **Report back.** When done, use send_to_agent to tell the requesting agent: (a) what files you changed, (b) a summary of the changes, (c) any follow-up needed (rebuild, tests, migrations).
- **No silent failures.** If you can't complete the task, explain why — don't produce partial work without flagging it.
## Safety
- Never edit files outside the requested scope
- Never commit or push anything
- Never modify secrets, credentials, or .env files
- If a change would break existing tests, stop and reportA 50-line focused change is reviewable. A 500-line sweep is not. Hard limits force the agent to decompose work into reviewable chunks, which:
The limits are per builder task, not per session. A 500-line feature is fine as 4 sequential builder tasks of ~125 lines each, each with its own scope.
User: "Can you add a tool for reading RSS feeds?"
add_mcp_server({ name: "rss", command: "npx", args: ["some-rss-mcp"] }) → admin approves → container restarts with the new server → donecreate_agent({ name: "RSS Tool Builder", instructions: "<builder prompt from above>" })send_to_agent({ agentGroupId, text: "Add an MCP tool 'read_rss' to container/agent-runner/src/mcp-tools/. It should fetch an RSS URL and return the latest N items. Register it in mcp-tools/index.ts. Target: <200 new lines." })User: "Can you transcribe audio?"
which ffmpeg (likely not installed in base image)@xenova/transformers (npm, workspace-local) or whisper.cpp (apt + compile)install_packages({ apt: ["ffmpeg"], npm: ["@xenova/transformers"], reason: "Audio transcription for voice messages" })pnpm install in /workspace/agent/), then promote to container-level install if it proves useful| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-07 | fail→pass | 17,488 | 12,600 | -28% | 1 | 1 | 0% | 2,848 | 3,166 | +11% | 0 | 0 | — |
case-13 | fail→pass | 13,626 | 9,531 | -30% | 1 | 1 | 0% | 2,184 | 2,804 | +28% | 0 | 0 | — |
case-01 | fail→fail | 65,956 | 16,033 | -76% | 1 | 1 | 0% | 863 | 2,554 | +196% | 0 | 0 | — |
case-02 | fail→fail | 9,897 | 8,119 | -18% | 1 | 1 | 0% | 1,651 | 2,033 | +23% | 0 | 0 | — |
case-03 | fail→fail | 4,773 | 66,967 | +1303% | 1 | 1 | 0% | 705 | 1,692 | +140% | 0 | 0 | — |
case-04 | fail→pass | 15,561 | 3,795 | -76% | 1 | 1 | 0% | 1,884 | 1,919 | +2% | 0 | 0 | — |
case-05 | fail→pass | 6,947 | 3,251 | -53% | 1 | 1 | 0% | 1,281 | 1,823 | +42% | 0 | 0 | — |
case-06 | fail→pass | 15,575 | 4,945 | -68% | 1 | 1 | 0% | 2,000 | 2,138 | +7% | 0 | 0 | — |
case-08 | pass→pass | 6,643 | 13,704 | +106% | 1 | 1 | 0% | 626 | 1,880 | +200% | 0 | 0 | — |
case-09 | fail→pass | 6,271 | 3,626 | -42% | 1 | 1 | 0% | 919 | 1,915 | +108% | 0 | 0 | — |
case-10 | fail→pass | 13,319 | 10,413 | -22% | 1 | 1 | 0% | 2,789 | 2,417 | -13% | 0 | 0 | — |
case-11 | fail→pass | 14,739 | 5,559 | -62% | 1 | 1 | 0% | 2,172 | 2,178 | +0% | 0 | 0 | — |
case-12 | pass→pass | 5,646 | 2,887 | -49% | 1 | 1 | 0% | 790 | 1,830 | +132% | 0 | 0 | — |
case-14 | pass→pass | 6,434 | 1,866 | -71% | 1 | 1 | 0% | 887 | 1,554 | +75% | 0 | 0 | — |
case-15 | fail→pass | 11,141 | 3,699 | -67% | 1 | 1 | 0% | 1,981 | 1,866 | -6% | 0 | 0 | — |
case-16 | fail→pass | 8,346 | 4,845 | -42% | 1 | 1 | 0% | 1,542 | 2,014 | +31% | 0 | 0 | — |
case-17 | fail→pass | 17,077 | 7,363 | -57% | 1 | 1 | 0% | 2,752 | 2,692 | -2% | 0 | 0 | — |
case-18 | fail→pass | 12,441 | 3,310 | -73% | 1 | 1 | 0% | 1,931 | 1,800 | -7% | 0 | 0 | — |
case-19 | pass→pass | 15,412 | 5,816 | -62% | 1 | 1 | 0% | 2,368 | 2,272 | -4% | 0 | 0 | — |
case-20 | fail→pass | 9,745 | 3,903 | -60% | 1 | 1 | 0% | 1,614 | 1,818 | +13% | 0 | 0 | — |
case-21 | fail→pass | 14,975 | 2,056 | -86% | 1 | 1 | 0% | 2,280 | 1,633 | -28% | 0 | 0 | — |
case-22 | pass→pass | 8,608 | 21,502 | +150% | 1 | 1 | 0% | 1,293 | 1,894 | +46% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 19 counted toward the lift figure. The other 3 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +64 percentage points is the difference between those two pass rates over the 19 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.