Daily rhythm
A single user’sroutines/ directory can define an entire day. Here’s how
17 routines and a handful of reminders fit together:
Weekly additions: fitness review (Sun 9 AM), sleep review (Sun 9:30 AM),
music review (Sun 10 AM), responsiveness review (Sun 6 PM), weekend
planner (Thu 5 PM).
Routines
Morning briefing — multi-step dashboard
The most complex routine. It gathers data from multiple sources in parallel, creates tasks from findings, schedules reminders for time-critical items, and sends a single dashboard embed with action buttons.routines/morning-briefing.md
- Parallel enrichment — core steps always run; enrichment steps are best-effort and skipped on failure
- Graceful degradation — the embed always sends, even with partial data
- Duplicate prevention — checks existing reminders before scheduling new ones
- Cap overwhelm — limits “needs a deadline” suggestions to 2-3 items
- Subagent delegation — uses the user-proxy subagent to make judgment calls (prioritization, rescheduling dates) that benefit from simulating user preferences
- Escalating overdue handling — overdue tasks get progressively more assertive treatment rather than nagging indefinitely
Workout nudge — embeds with buttons and follow-up chains
Sends a weather-aware workout suggestion with interactive buttons, then schedules a 2-hour follow-up chain to check in.routines/workout-nudge.md
- Agent buttons — each button’s
actionis anagent:<prompt>that tells the interactive fork what to do when clicked - Adaptive button set — active recovery omits Harder/Easier; runs omit Choose Exercises
- Follow-up chain — the routine itself schedules a chain reminder to check back later
- report_updates is critical — without it, the main session can’t handle button clicks (“Harder” with no workout context)
Nightly sleep — dynamic single-reminder scheduling
A silent scheduler routine that reads sleep data, calculates a bedtime, and schedules a single reminder timed to it.routines/nightly-sleep.md
- Routine creates reminders — the routine itself never pings; it calculates timing and schedules a reminder that does
- Self-contained reminder prompt — the reminder must carry all context since it runs in a fresh fork
- Dynamic timing — the delay is computed from sleep data, not hardcoded
- Data-driven scheduling — prescribed bedtime adjusts weekly based on sleep efficiency metrics
- Minimal nudge — a single
ping_userline, not an embed or chain. Lower friction means less annoyance at bedtime
Chore time — low-friction ADHD nudge
A simple routine designed around ADHD — lower the bar to “one thing, 15 minutes” instead of listing everything that needs doing.routines/chore-time.md
- Behavioral design — the prompt encodes knowledge about the user’s ADHD and designs the interaction around it
- Chain length by urgency — more urgent tasks get longer chains
- Checks before scheduling — checks
reminder listto avoid compounding chain reminders
Email check — conditional silence
A quiet background routine that only pings when something is genuinely urgent. Most runs produce no notification at all.routines/email-check-morning.md
- Time-based dedup — ignores emails before 8:30 AM because the morning briefing already handled them
- Conditional ping — strict criteria for when to notify; defaults to silence
- Content boundary — explicit instruction to treat email as data, preventing the bot from being tricked by instructions hidden in emails
Self-reflection — observation-only meta-routine
A meta-routine that reviews the bot’s own behavior. It runs before the morning briefing and feeds findings into it, but takes no action itself.routines/self-reflection.md
- Routine pipeline — self-reflection runs at 8:00 AM, morning
briefing at 8:30 AM. The briefing receives the finding via
report_updates(prepended as pending updates) - Single finding — avoids information overload by surfacing only the highest-impact issue
- No side effects — explicitly prevented from creating tasks or scheduling reminders to avoid double-processing
Identity stabilize — silent maintenance
A high-frequency maintenance routine that keeps a core profile file accurate. Runs every 4 hours, never pings, and uses the cheapest model.routines/identity-stabilize.md
model: "haiku"— uses the cheapest model since this is simple file maintenanceallow-ping: false— can never notify the user; purely backgroundupdate-main-session: "freely"— reports updates only when changes are made, so the main session stays informed without noise- Freshness protocol — date-tagged facts with automatic staleness pruning
- Conservative edits — only changes what has evidence; if the history-reviewer subagent fails, the routine does nothing
Reminders
One-shot reminder — time-sensitive errand
A simple time-based nudge for a real-world errand. Created by the agent during conversation when the user mentioned a pickup.reminders/cake-pickup-reminder.md
- No description needed — the message is self-explanatory
- Agent-created — the user mentioned the pickup in conversation; the agent scheduled the reminder automatically
- Precise timing —
run-atis an exact ISO datetime computed from a delay
Future-dated reminder — scheduled weeks out
A reminder scheduled far in advance for a recurring financial event. The detailed message ensures a fresh agent fork has full context.reminders/token-thaw-reminder.md
- Self-contained context — the reminder includes everything a future agent needs (batch number, remaining count, action to take)
- Background by default — runs in a background fork and pings via
ping_userfor maximum visibility on a financial deadline. Addbackground: falseif you prefer a direct DM instead - Far future — scheduled 6 weeks out; the scheduler handles dates far in the future without any special configuration
Chain reminders and single reminders — spawned by routines
Routines schedule reminders dynamically. Some use chains for progressive follow-up, others use a single fire-and-forget reminder:follow_up_chain(minutes_from_now=N) to
schedule the next step, or end the chain by not calling it. Single
reminders (no --max-chain) fire once and self-remove.
Patterns worth noting
Routine pipelines
Routines can feed into each other viareport_updates:
Conditional silence
Most background routines default to silence. They only ping when criteria are met:- Email checks: ping only for urgent, human-sent, actionable mail
- End-of-day: silent if nothing is overdue or due
- Responsiveness review: silent if all reminders are working well
- Identity stabilize:
allow-ping: false— can never notify
Behavioral design in prompts
Routines encode knowledge about the user’s needs directly in the prompt:- Chore time: “ADHD makes starting the hardest part — lower the bar”
- Morning briefing: “cap at 2-3 suggestions because more is overwhelming”
- Workout nudge: “no guilt” skip option on every workout
- Music practice: “feel like a friend nudging, not a task manager”
Chain reminders for progressive nudging
Chains create multi-step follow-up sequences without open-ended loops:- Workout: suggest → 2h check-in → offer quick version (max 2)
- Chores: nudge → 1h check-in → gentle reminder (max 2)
- Music: suggest → 90-min check-in (max 1)
ping_user
at the right moment is less annoying than a sequence of embeds.
Bot-authored logic
The routines on this page weren’t hand-written — the bot created them through conversation. You describe what you want, give feedback on what it builds, and iterate until it works the way you need. The bot handles the YAML configuration, prompt logic, button interactions, follow-up chains, and cross-routine coordination.How the workout routine was created
The conversation started with:- Gathered context — read existing routines to understand the scheduling pattern, checked what profile data existed
- Created a fitness profile — wrote
~/.ollim-bot/fitness-profile.mdwith stats, goals, and available equipment (sourced from conversation history) - Designed the interaction — chose Discord embeds with buttons over plain messages for richer feedback loops
- Iterated on the prompt logic through feedback until it encoded:
- A 7-day workout rotation with muscle group balancing rules
- Weather-aware indoor/outdoor logic
- Exercise progressions (harder/easier variants)
- A condensed 15-minute version for busy days
- A multi-step “choose exercises” flow with muscle group picker
- A 2-hour follow-up chain that stays silent if already completed
- Wired up
report_updatesso button clicks in the main session have full context about which workout was suggested
What this means
Every routine prompt is executable logic. When a background fork fires, the agent reads the prompt and executes it as a program — gathering data, making decisions, building UI, and scheduling follow-ups. The bot is effectively programming itself: compiling your requirements into natural language instructions that its future instances interpret and run. This works because of three properties of the system:- Skills let the bot write shared function libraries — a SKILL.md file read by multiple routines acts like an imported module
- Background forks run prompts
in isolated sessions, so each execution is a fresh “function call”
with defined inputs (the preamble) and outputs (
report_updates,discord_embed,follow_up_chain) - Chain reminders let the bot schedule its own continuations — recursive self-invocation with context passing
Next steps
Routines
Cron syntax, YAML frontmatter fields, and management commands.
Reminders
One-shot reminders, delay scheduling, and follow-up chains.
Background forks
Isolated mode, model overrides, tool restrictions, and update
modes.
Ping budget
How notification rate limiting works for background tasks.
