~/.ollim-bot/skills/<name>/SKILL.md. Define a skill once, reference it by name, and every job that uses it gets the same instructions loaded at fire time.
How skills work
When a routine or reminder fires, the scheduler checks itsskills: field. For each referenced skill:
- The scheduler loads the skill’s
SKILL.mdfrom~/.ollim-bot/skills/<name>/ - The scheduler expands any dynamic context injection markers (
!`command`) to command output - The scheduler prepends the expanded instructions to the job message as a
SKILL INSTRUCTIONS:block collect_skill_tools()merges tool dependencies from the skill’sallowed-toolsinto the routine or reminder’s tool set
The scheduler loads skills fresh every time a job fires. If you update a skill’s instructions, the next firing picks up the changes automatically.
File format
Each skill lives in its own directory:~/.ollim-bot/skills/<name>/SKILL.md. The directory name must match the skill’s name field — lowercase with hyphens.
skills/code-review/SKILL.md
Frontmatter fields
| Field | Type | Default | Description |
|---|---|---|---|
name | str | — | Lowercase with hyphens — must match the directory name |
description | str | — | What the skill does and when to use it (shown in the system prompt index) |
allowed-tools | list[str] | null | null | Tool dependencies merged into the host job’s allowed tools |
--- becomes the skill’s message — the actual instructions the agent receives.
Dynamic context injection
Skills sometimes need fresh data at fire time — not hardcoded values. The!`command` syntax embeds shell commands that the scheduler expands to their stdout before the agent sees the prompt.
skills/repo-status/SKILL.md (body)
!`command` with the command’s output.
Expansion rules
| Rule | Value |
|---|---|
| Per-command timeout | 10 seconds |
| Total wall-clock cap | 30 seconds across all commands in one expansion |
| Max output per command | 2000 characters (truncated with [...truncated] if longer) |
| Working directory | ~/.ollim-bot/ |
| Error handling | Failed commands are replaced with [command failed (exit N): cmd: error_line] |
| Timed-out commands | Replaced with [command timed out: cmd] |
| Skipped commands | If the total 30s cap is reached, remaining commands become [command skipped (total timeout): cmd] |
Using skills in routines and reminders
Reference skills by name in theskills: array of a routine or reminder’s YAML frontmatter:
routines/morning-code-review.md
Tool merging
If a skill declaresallowed-tools, collect_skill_tools() merges those tools into the host job’s tool set. Background forks always have at least a minimal default tool set, so skill tools always merge. The function deduplicates — if two skills both need Bash(git *), only one entry appears.
Reminders with skills
Reminders work the same way. You can also pass skills via the CLI:follow_up_chain tool forwards the skills field from the ChainContext, so subsequent chain links inherit the same skill set.
Creating skills
The agent creates skills by writingSKILL.md files directly using its file tools (Write, Edit). You can also create them manually:
~/.ollim-bot/skills/my-skill/SKILL.md with the frontmatter and instructions body.
For the full format specification — including edge cases and advanced patterns — the agent reads ~/.ollim-bot/skill-spec.md on demand. You can also ask the bot to create a skill conversationally:
“Create a skill called ‘deploy-check’ that verifies the production deployment is healthy by checking the status endpoint and recent error logs.”The agent reads the spec file, creates the skill directory, and writes the
SKILL.md with appropriate frontmatter and instructions.
Developer reference
System prompt integration
System prompt integration
build_skill_index() in skills.py generates a dynamic index of all available skills and appends it to the system prompt. The format is:Tool propagation
Tool propagation
collect_skill_tools() collects allowed-tools from all referenced skills and returns a deduplicated list. The scheduler calls this in _merge_skill_tools() to extend the background fork’s tool configuration before launching.load_skills() in the scheduler loads skills before passing them to this function.Chain propagation
Chain propagation
The
ChainContext dataclass in agent_tools.py includes a skills field. When a chained reminder calls follow_up_chain, the tool forwards skill names via --skills CLI arguments to the next link in the chain. This means a reminder chain that starts with skills continues using those skills through every follow-up.Path traversal protection
Path traversal protection
read_skill() resolves the skill path and verifies it stays within the skills/ directory, catching both path traversal sequences (e.g., ../../etc/passwd) and symlink escapes.Next steps
Extending overview
Compare skills with routines, reminders, webhooks, and other extensibility mechanisms.
Routines
Create recurring jobs that reference skills via the
skills: frontmatter field.File formats
Full YAML frontmatter reference for all markdown data files.
System prompt
How the system prompt is structured and what gets injected — including the skill index.
