Skills
Skills are markdown files with YAML frontmatter that control how the agent responds. A skill can inject a system prompt, filter which tools are available, and require specific bundles to be installed.
How skills work
Section titled “How skills work”When you send a message, the skill matcher runs against it:
- Phase 1: Triggers — substring match against trigger phrases. First hit wins.
- Phase 2: Keywords — count keyword hits in your message. Minimum 2 hits to qualify. Highest count wins.
- The matched skill’s markdown body is injected into the system prompt.
- If the skill has
allowed-tools, only those tools (plus system tools) are surfaced.
If no skill matches, the agent uses the default system prompt with all tools available.
Two types
Section titled “Two types”| Type | Behavior | Priority range |
|---|---|---|
context | Always injected into the system prompt, regardless of matching. Sorted by priority (lower = first). | Typically 1-10 |
skill | Only injected when matched against the user’s message via triggers or keywords. | Typically 50 |
Context skills provide background knowledge. Skill-type skills provide task-specific instructions and tool scoping.
Skill file format
Section titled “Skill file format”A skill file is a markdown file (.md) with YAML frontmatter:
---name: meeting-notesdescription: Summarize and search meeting notes from Granolaversion: 1.0.0type: skillpriority: 50allowed-tools: - granola__*requires-bundles: - "@nimblebraininc/granola"metadata: keywords: - meeting - notes - agenda - minutes - standup triggers: - summarize my meetings - meeting notes category: productivity tags: - meetings - granola author: mat---
You are a meeting notes assistant. Use the Granola tools to search andsummarize meeting transcripts.
When asked about meetings:1. Search for relevant meetings using granola__search_meetings2. Retrieve full transcripts with granola__get_meeting3. Summarize the key discussion points, decisions, and action items
Format action items as a checklist.Frontmatter fields
Section titled “Frontmatter fields”| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Unique skill identifier |
description | string | No | Human-readable description |
version | string | No | Semantic version. Defaults to 0.0.0. |
type | context | skill | No | Defaults to skill if omitted. |
priority | number | No | Sort order for context skills (lower = first). Defaults to 50. |
allowed-tools | string[] | No | Glob patterns for tools this skill can access (e.g., granola__*). When set, only matching tools plus nb__* system tools are surfaced. |
requires-bundles | string[] | No | Bundle names that must be installed for this skill to work. |
metadata.keywords | string[] | No | Words matched in phase 2 (case-insensitive substring). Minimum 2 must hit. |
metadata.triggers | string[] | No | Phrases matched in phase 1 (case-insensitive substring). First hit wins. |
metadata.category | string | No | Organizational category |
metadata.tags | string[] | No | Organizational tags |
metadata.author | string | No | Author name |
The matching algorithm
Section titled “The matching algorithm”The matcher operates in two phases on type: "skill" skills only (context skills are excluded from matching).
Phase 1 — Triggers: Loop through all skills. For each skill, check if any of its trigger phrases appear as a substring in the message (case-insensitive). The first trigger that matches wins. No further skills are checked.
Phase 2 — Keywords: If no trigger matched, loop through all skills. For each, count how many of its keywords appear as substrings in the message (case-insensitive). A skill needs at least 2 keyword hits to qualify. The skill with the most hits wins.
Where skills are loaded from
Section titled “Where skills are loaded from”Skills are loaded from multiple locations, in order:
- Core skills (
src/skills/core/) — shipped with the platform, always loaded - Built-in skills (
src/skills/builtin/) — shipped with the package - Global skills (
~/.nimblebrain/skills/) — user-created - Config directories — any paths listed in
skillDirsinnimblebrain.json
{ "skillDirs": [ "./skills", "/home/user/custom-skills" ]}Files must have a .md extension. Loading is non-recursive (only top-level files in each directory).
Listing skills
Section titled “Listing skills”nb skill listNAME TYPE PRIORITY SOURCEbootstrap context 1 src/skills/core/bootstrap.mdmeeting-notes skill 50 /home/user/.nimblebrain/skills/meeting-notes.mdFor JSON output:
nb skill list --jsonGet details on a specific skill:
nb skill info meeting-notesName: meeting-notesType: skillPriority: 50Description: Summarize and search meeting notes from GranolaSource: /home/user/.nimblebrain/skills/meeting-notes.mdAllowed tools: granola__*
--- Body ---You are a meeting notes assistant. Use the Granola tools to search andsummarize meeting transcripts....Creating a custom skill
Section titled “Creating a custom skill”-
Create a
.mdfile in your skills directory:Terminal window mkdir -p ~/.nimblebrain/skills -
Write the skill file with frontmatter and body:
Terminal window cat > ~/.nimblebrain/skills/code-review.md << 'EOF'---name: code-reviewdescription: Review code for bugs and improvementstype: skillpriority: 50allowed-tools:- bash__*metadata:keywords:- review- code- bug- refactortriggers:- review this code- code review---You are a code reviewer. When asked to review code:1. Read the file using bash tools2. Identify bugs, security issues, and style problems3. Suggest specific improvements with code examplesEOF -
Verify it loaded:
Terminal window nb skill list -
If the runtime is already running, reload:
Terminal window nb reload
What’s next
Section titled “What’s next”- Chat — see skills in action during conversations
- Managing Apps — ensure required bundles are installed
- Configuration: nimblebrain.json — full config reference including
skillDirs