Skip to main content
YAML frontmatter specs for routines, reminders, webhooks, and skills, plus JSON/JSONL schemas for all state files. All persistent data in ollim-bot lives under ~/.ollim-bot/ as flat files. There are two families of formats: markdown files with YAML frontmatter (routines, reminders, webhooks, skills) and JSON/JSONL files (sessions, pending updates, inquiries, ping budget). The data directory is a git repository — most writes are auto-committed.

Markdown files (YAML frontmatter)

Routines, reminders, and webhooks share a common file structure: YAML frontmatter delimited by ---, followed by a markdown body. Fields that match their default value are omitted from the YAML when serialized.

Routines

Stored in ~/.ollim-bot/routines/*.md. Filenames are auto-generated slugs based on the message body. The markdown body after the closing --- becomes the routine’s task message.
routines/nightly-sleep-review.md
Every background fork always receives the default tools — help, tasks CLI, and read-only file tools (Read, Glob, Grep scoped to ./**.md). Discord tools are controlled separately by allow-ping and update-main-session. When allowed-tools is set, your tools are merged in on top of these defaults. See Tool restrictions for details.

Reminders

Stored in ~/.ollim-bot/reminders/*.md. Same slug-based filenames as routines.
reminders/pick-up-groceries.md
Chained reminder example:
reminders/follow-up-on-project.md

Webhooks

Stored in ~/.ollim-bot/webhooks/*.md. Same slug-based filenames. The markdown body is a template — {field_name} placeholders are replaced with payload values at dispatch time.
webhooks/ci-for-repo-status.md
String properties in the fields schema that lack an explicit maxLength automatically get a default limit of 500 characters. The total payload size is capped at 10 KB, with a maximum of 20 properties.

Skills

Stored in ~/.ollim-bot/skills/<name>/SKILL.md. Each skill is a directory containing a single SKILL.md file. The markdown body contains the skill’s instructions. It can include dynamic context markers using the !`command` syntax — shell commands expanded to their output at load time.
skills/ux-principles/SKILL.md
Dynamic context markers (!`command`) have a 10-second per-command timeout and a 30-second total cap. Each command’s output is truncated to 2000 characters. See Dynamic context injection for the full expansion rules.

Tool policy (tool-policy.yaml)

Stored at ~/.ollim-bot/tool-policy.yaml. An optional YAML file that lets you extend or override the default tool sets without editing source code. The file is loaded with mtime-based caching — changes take effect without a restart.
tool-policy.yaml
If bg_forks.override is set, it completely replaces the default background tools — use with care. The additional_allowed key is safer for most use cases.

Shared markdown conventions

These rules apply to routines, reminders, and webhooks. Skills use a directory-based structure (skills/<name>/SKILL.md) instead of slug-generated filenames, but share the same atomic write and git conventions.

JSON and JSONL files

Session history (session_history.jsonl)

Append-only JSONL log of session lifecycle events. Event types:
session_history.jsonl

Current session (sessions.json)

Plain text file containing the current session ID. Despite the .json extension, it is not JSON — it contains only the raw session ID string.

Fork messages (fork_messages.json)

JSON array tracking Discord messages associated with active forks. Records expire after 7 days (604,800 seconds). Expired entries are filtered out on read.

Pending updates (pending_updates.json)

JSON array of updates written by background forks for the main session. Main sessions pop (read + clear) pending updates on the next interaction. Interactive forks peek (read-only). Writes are protected by a lock to prevent concurrent corruption.

Inquiries (inquiries.json)

JSON object mapping 8-character hex UUIDs to button inquiry entries. Persists inquiry prompts so agent-created buttons survive bot restarts. Records expire after 7 days. Expired entries are filtered out on read.
inquiries.json

Ping budget (ping_budget.json)

JSON object tracking the refill-on-read ping budget for background forks.
Ping budget is not git-committed — it is ephemeral state that resets to defaults if the file is deleted.

Runtime configuration (config.json)

JSON object storing persistent settings you configure via the /config slash command.
config.json
Only non-default values are stored. Missing keys use their defaults.
The JSON keys use underscores (model_main), while the /config slash command displays them with dots (model.main). The command translates between the two formats automatically.

Next steps

Data directory

Full layout of the ~/.ollim-bot/ directory structure.

Configuration reference

Environment variables and configuration options.

Routines

How to create and manage recurring routines.

Webhooks

External triggers and webhook spec files.