Configure OpenClaw Skills: Custom Settings Guide
Ever felt like your AI agent has too many tools, or maybe not enough? Managing how your agent interacts with your system requires a solid OpenClaw skills configuration to keep things running exactly how you want.
Most of your setup for loading and installing skills lives right inside the skills section of your ~/.openclaw/openclaw.json file. This is where you tell the system where to look for code and how to handle dependencies. You can also control agent-specific skill visibility under agents.defaults.skills and agents.list[].skills to keep your workspace organized.
{ skills: { allowBundled: ["gemini", "peekaboo"], load: { extraDirs: ["~/Projects/agent-scripts/skills", "~/Projects/oss/some-skill-pack/skills"], watch: true, watchDebounceMs: 250, }, install: { preferBrew: true, nodeManager: "npm", // npm | pnpm | yarn | bun (Gateway runtime still Node; bun not recommended) }, entries: { "image-lab": { enabled: true, apiKey: { source: "env", provider: "default", id: "GEMINI_API_KEY" }, // or plaintext string env: { GEMINI_API_KEY: "GEMINI_KEY_HERE", }, }, peekaboo: { enabled: true }, sag: { enabled: false }, }, },}If you want to use built-in image generation or editing, you should probably use agents.defaults.imageGenerationModel along with the core image_generate tool. The skills.entries.* section is really meant for your custom or third-party skill workflows.
When you pick a specific image provider or model, you also need to set up that provider’s authentication or API key. You will usually see examples like GEMINI_API_KEY or GOOGLE_API_KEY for google/* models, OPENAI_API_KEY for openai/*, and FAL_KEY for fal/*.
Here are a couple of ways you might set that up:
- Native Nano Banana-style setup:
agents.defaults.imageGenerationModel.primary: "google/gemini-3.1-flash-image-preview" - Native fal setup:
agents.defaults.imageGenerationModel.primary: "fal/fal-ai/flux/dev"
Manage Agent Skill Allowlists
Section titled “Manage Agent Skill Allowlists”You can use agent-specific configurations when you want the same machine or workspace to have different visible skill sets for different agents. This is perfect for limiting what a specific bot can do without changing your global settings for every single agent you run.
{ agents: { defaults: { skills: ["github", "weather"], }, list: [ { id: "writer" }, // inherits defaults -> github, weather { id: "docs", skills: ["docs-search"] }, // replaces defaults { id: "locked-down", skills: [] }, // no skills ], },}When you are setting these up, keep these rules in mind:
agents.defaults.skillsacts as a shared baseline allowlist for any agents that do not have their ownagents.list[].skillsdefined.- If you omit
agents.defaults.skills, your skills will remain unrestricted by default. agents.list[].skillsprovides the explicit final skill set for that specific agent, and it does not merge with your defaults.- Setting
agents.list[].skills: []ensures that no skills are exposed for that specific agent.
Available Configuration Fields
Section titled “Available Configuration Fields”There are several specific fields available to help you fine-tune how OpenClaw handles everything from installation to folder watching. These settings ensure your development workflow stays fast and predictable while managing your CLI tools.
- Built-in skill roots always include
~/.openclaw/skills,~/.agents/skills,<workspace>/.agents/skills, and<workspace>/skills. allowBundledis an optional allowlist specifically for bundled skills. When you set this, only the bundled skills in the list are eligible for use.load.extraDirslets you define additional skill directories to scan, though these have the lowest precedence.load.watchtells the system to watch skill folders and refresh the skills snapshot, which is set to true by default.load.watchDebounceMssets the debounce time for skill watcher events in milliseconds, defaulting to 250.install.preferBrewtells the system to prefer brew installers when they are available.install.nodeManagersets your node installer preference, such as npm, pnpm,yarn, orbun.- The Gateway runtime should still be Node.js even if you use other managers for skills, as
bunis not recommended for platforms like WhatsApp or Telegram. - The command
openclaw setup --node-manageris a bit narrower and currently accepts npm, pnpm, orbun. You should setskills.install.nodeManager: "yarn"manually if you want Yarn-backed installs. entries.<skillKey>allows for per-skill overrides.agents.defaults.skillsis an optional default skill allowlist inherited by agents.agents.list[].skillsis the optional per-agent final skill allowlist that replaces inherited defaults.
For individual skills, you can use these fields:
enabled: Set this tofalseto disable a skill even if it is bundled or installed.env: These are environment variables injected for the agent run, but only if they are not already set.apiKey: This is a convenience option for skills that need a primary environment variable, supporting either a plaintext string or a SecretRef JSON object.
Important Notes and Precedence
Section titled “Important Notes and Precedence”Understanding the order in which skills are loaded will save you a lot of time when you are debugging your setup. Changes are usually picked up automatically on the next agent turn if you have the watcher active in your configuration.
- Keys under
entriesmap to the skill name by default. If a skill definesmetadata.openclaw.skillKey, you should use that key instead. - The load precedence follows this order:
<workspace>/skills→<workspace>/.agents/skills→~/.agents/skills→~/.openclaw/skills→ bundled skills →skills.load.extraDirs. - When the watcher is enabled, any changes you make to your skills are picked up the next time the agent takes a turn.
Sandboxed skills and environment variables
Section titled “Sandboxed skills and environment variables”When your session is sandboxed, the skill processes run inside a controlled environment like Docker. Because of this, the sandbox won’t automatically see the environment variables on your host machine’s process.env.
To handle this, you should use one of these methods:
- Use
agents.defaults.sandbox.docker.envfor the Docker backend, or set it per-agent usingagents.list[].sandbox.docker.env. - Bake the environment variables directly into your custom sandbox image or your remote sandbox environment.
- Remember that global
envandskills.entries.<skill>.env/apiKeysettings only apply to runs happening on your host machine.
Next Steps
Section titled “Next Steps”OpenClaw Expert
Still stuck?
If this page didn't answer your case, ask OpenClaw Expert for step-by-step guidance.