~/.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
The bot discovers skills automatically from~/.ollim-bot/skills/. At startup, it scans for skill directories, reads each SKILL.md, and registers the skill as available.
When a routine, reminder, or webhook references skills, the bot loads their instructions and runs them before carrying out the job’s own instructions. Any tools the skill declares in its allowed-tools field are automatically available during execution.
Skills are loaded fresh every time they’re invoked. If you update a skill’s instructions, the next invocation picks up the changes automatically.
Bundled skills
The bot ships with two bundled skills —job-config and setup — that live in the bot’s source code rather than in ~/.ollim-bot/skills/. job-config guides tool selection and behavioral configuration when creating background jobs. setup guides initial bot setup and configuration.
The bot invokes job-config automatically when you create or edit a routine, reminder, or webhook that needs background config. It determines which tools belong in allowed-tools and which behavioral flags (allow-ping, update-main-session, model) to set — so you don’t have to remember the rules yourself.
Bundled skills are always available and don’t need to be created manually. They work the same way as user-created skills but are maintained as part of the bot itself.
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
Skills use the same format as Claude Code skills. ollim-bot-specific behavior is noted below.| Field | Required | Description |
|---|---|---|
name | No | Slash command name (/<name>). Defaults to the directory name |
description | Recommended | When the agent should use this skill — used for auto-discovery |
argument-hint | No | Autocomplete hint for expected arguments, e.g. [issue-number] |
allowed-tools | No | Tools allowed without prompts when this skill runs. In scheduled jobs, these tools are also available to the background fork |
model | No | Model to use when this skill runs |
disable-model-invocation | No | true to prevent auto-loading — only invocable with /<name> |
user-invocable | No | false to hide from the / menu. Default: true |
context | No | fork to run in an isolated subagent context (interactive use only, not scheduled jobs) |
agent | No | Subagent type when context: fork — e.g. Explore, general-purpose |
hooks | No | Hooks scoped to this skill’s lifecycle — see the hooks guide |
--- becomes the skill’s instructions — the actual prompt the bot receives when running the skill.
String substitutions (only when invoked interactively, not from scheduled jobs): $ARGUMENTS — all arguments passed with /<name> <args>; $ARGUMENTS[N] or $N — argument by 0-based index.
Dynamic context injection
Skills sometimes need fresh data at fire time — not hardcoded values. The!`command` syntax embeds shell commands that the bot replaces with the command’s output before running the skill.
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 jobs
Reference skills by name in theskills: array of a routine, reminder, or webhook’s YAML frontmatter:
routines/morning-code-review.md
allowed-tools fields are automatically available.
Webhooks with skills
Webhooks supportskills: in the same way — referenced skills are loaded when the webhook fires:
webhooks/ci-with-review.md
Reminders with skills
Reminders work the same way. You can also pass skills via the CLI:Skill reference validation
When a routine, reminder, or webhook fires, the bot validates that every skill in theskills: array exists in ~/.ollim-bot/skills/. If any referenced skill is missing, execution is blocked entirely — the job is skipped and the bot logs a warning. For routines and reminders, a pending update is also appended so the bot can self-correct on the next interaction.
This matches the behavior for missing subagents — the bot refuses to run a job that depends on something that doesn’t exist, rather than running it in a degraded state.
User skills in the system prompt
The bot distinguishes between three categories of skills:| Category | Examples | In system prompt? |
|---|---|---|
| User-authored | Skills you create in ~/.ollim-bot/skills/ | Yes — listed under “Your custom skills” |
| Generated | routine-*, reminder-*, webhook-* (auto-created at fire time) | No |
| Bundled | job-config, setup, claude-history | No |
Creating skills
You can ask the bot to create skills for you, or create them manually:~/.ollim-bot/skills/my-skill/SKILL.md with the frontmatter and instructions body.
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 bot creates the skill directory and writes the
SKILL.md with appropriate frontmatter and instructions. New or modified skills take effect after /clear, /compact, or /restart.
Developer reference
Skill discovery
Skill discovery
The bot scans
~/.ollim-bot/skills/ at startup and registers all valid skills automatically. Each skill’s description field determines when the bot considers invoking it. Interactive skills are invocable via /<name> in Discord. User-authored skills (not generated or bundled) are listed in the system prompt via list_user_skills() in skills.py.For per-job injection (routines, reminders, and webhooks), the scheduler loads the referenced skills into the prompt and grants the background fork permission to use each skill’s tools via BgForkConfig.with_skill_tools(). Content loading, command expansion, and allowed-tools enforcement all happen automatically. At fire time, validate_skill_refs() checks that every referenced skill has a SKILL.md in the skills directory — missing refs block execution.Tool permissions
Tool permissions
When a scheduled job references a skill, the skill’s
allowed-tools are automatically merged into the background fork’s tool set. The bot handles deduplication — declaring a tool that’s already in the defaults has no effect. Skills can only grant additional tool permissions, not restrict them — if a tool is in the base set, it remains available regardless of skill configuration.Chain propagation
Chain propagation
Skills propagate through reminder chains automatically. When a chained reminder schedules a follow-up via
follow_up_chain, the same skills carry forward to every link in the chain.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.
