services/openclaw/skills.md
Table of Contents
OpenClaw Skills
๐ Skill Storage Locations
Skills load from several roots (run openclaw skills check to see what's actually live):
1. Bundled skills (ship with OpenClaw, read-only)
~/.nvm/versions/node/v26.5.0/lib/node_modules/openclaw/skills/
The prefix follows the active Node version โ npm root -g gives the real path.
2. Managed custom skills (add new ones here)
~/.openclaw/skills/
Real but currently empty, reserved for OpenClaw-specific skills. Drop a directory containing a SKILL.md here and OpenClaw picks it up.
3. Personal skills โ canonical (shared with pi)
~/.agents/skills/
A real directory since 2026-09-25. Most entries are real folders; twelve are symlinks into ~/Work/llm/dom-agent-skills/skills.
4. Plugin-managed skills (symlinks, don't touch)
~/.openclaw/plugin-skills/
5. Extra dirs (external skill packs โ lowest precedence)
Configured via skills.load.extraDirs in openclaw.json; skills.load is now empty {}. The two keys it used to hold were removed 2026-09-25, once the layout fix made them unnecessary.
๐ Skillfish โ cross-tool skill installation
Skillfish installs skills across multiple AI coding tools. Each tool keeps skills in its own directory:
| Tool | Skills directory |
|---|---|
| Claude Code | ~/.claude/skills/ |
| Cursor | ~/.cursor/skills/ |
| Codex | ~/.codex/skills/ |
| GitHub Copilot | ~/.github/skills/ |
| Gemini CLI | ~/.gemini/skills/ |
| OpenClaw | ~/.agents/skills/ (shared with pi) |
To add a custom skill manually:
mkdir -p ~/.agents/skills/my-skill/ # canonical
mkdir -p ~/.openclaw/skills/my-skill/ # OpenClaw-only
Then create a SKILL.md in that directory with YAML frontmatter (name, description) and markdown body. Format follows the brave-search skill pattern. The skill-creator skill can also scaffold these.
For loading skills from another location, configure skills.load.extraDirs in openclaw.json.
Skill symlinks & external skill roots (updated 2026-09-25)
Correction, later the same evening (2026-09-25): the cause was the root symlink itself, not the nested ones. Both
~/.agents/skillsand~/.openclaw/skillswere symlinks to~/Work/llm/skills, so OpenClaw's ancestry check ran against the wrong base. Making~/.agents/skillsa real directory fixed it outright, with no config workaround. Full write-up inai/skills.md. Everything below is kept as history.
The shared skill pack lives outside the skills root at ~/Work/llm/dom-agent-skills/skills. Point OpenClaw at it with skills.load.extraDirs โ that scans another directory as an extra (lowest-precedence) skill root, so nothing needs copying and no symlinks are required.
Symptom. At startup (and in openclaw doctor) each affected skill logs:
[skills] Skipping invalid skill: file=~/.openclaw/skills/asana/SKILL.md
error=symlink prefix resolves outside the root ancestry
Cause. Those entries are symlinked folders pointing into the shared pack. OpenClaw's path-containment check requires a skill root's resolved realpath to stay inside its configured root, so the symlinks get skipped.
Didn't work: skills.load.allowSymlinkTargets: ["/Users/dominick/Work/llm/dom-agent-skills/skills"]. It's documented ("trusted real target roots that skill symlinks may resolve into") and looks like the right lever, but the 2026.9.5 loader still skipped the symlinks โ even after a full Gateway restart. Don't reach for it first.
Works: add the target as an extra dir in ~/.openclaw/openclaw.json:
"skills": {
"load": {
"extraDirs": ["/Users/dominick/Work/llm/dom-agent-skills/skills"]
}
}
Extra dirs sit at precedence level 7 (lowest) โ a bundled, managed, agent, or workspace skill with the same name still wins. Takes effect after a Gateway restart; the openclaw CLI picks it up immediately.
Affected (13): asana, diagrams, git-commit, git-squash, granola, mongo-atlas, notion, plan-to-feature-doc, posthog, pr-review, validate-implementation, vercel โ symlinked in both ~/.openclaw/skills/ and ~/.agents/skills/. (rubrics is symlinked too but has no SKILL.md, so it's ignored rather than flagged.)
Verify:
openclaw skills list --json | grep -o '"name"[^,]*' | grep -i asana
openclaw doctor --non-interactive 2>&1 | grep "Skipping invalid skill" || echo clean
The old symlinks are harmless once extraDirs covers the target root โ they can stay.
๐งฉ Skills (81 eligible)
Live list: openclaw skills list ยท readiness: openclaw skills check ยท details: openclaw skills info <name>
Eligible as of 2026-09-25 (81). Symlink / external-root loading is covered under ๐ Skill Storage Locations above:
1password, add-model-provider, apple-notes, apple-reminders, asana,
bear-notes, blogwatcher, blucli, browser-automation, camsnap, canvas,
clawhub, cloud-image-bake, coding-agent, configure-channel, control-ui,
convert-md-to-pdf, create-planning-doc, create-pr, diagnose-gateway,
diagram-maker, diagrams, eightctl, gemini, gh-issues, gifgrep, git-commit,
git-squash, github, gog, goplaces, granola, healthcheck, himalaya,
mcp-server-registration, mcporter, meme-maker, model-usage, mongo-atlas,
nano-pdf, nextjs-developer, node-connect, node-inspect-debugger, notion,
obsidian, openai-whisper, openai-whisper-api, openclaw-claude-subscription,
openclaw-lost-context, openhue, oracle, ordercli, pdf-to-markdown, peekaboo,
personal-notes, personal-todos, plan-to-feature-doc, posthog, pr-review,
python-debugpy, sag, sherpa-onnx-tts, skill-creator, songsee, sonoscli,
spike, spotify-player, summarize, taskflow, taskflow-inbox-triage, tavily,
telegram, things-mac, tmux, trello, validate-implementation, vercel,
vietnamese-mom-translator, visualize, weather, xurl
Handy ones: gog (Google Workspace), personal-notes, personal-todos, telegram, asana, notion, granola, posthog, pr-review, validate-implementation, git-commit, git-squash, create-pr, vercel.
Apple Notes (memo CLI)
Uses memo CLI to read/write Apple Notes via the apple-notes skill.
Setup: brew install antoniorodr/memo/memo
Full docs: See documents/dev/memo.md in personal notes.