Your assistant doesn't just respond when you talk to it. It can also work on its own, on a schedule you define. Scheduling lets you set up tasks that run automatically: once at a specific time, or repeatedly on a cadence.
Think of it as giving your assistant a calendar of its own. Instead of waiting for you to ask, it can check things, send things, and surface things proactively.
Most AI assistants are purely reactive. You ask, they answer. But a lot of useful work is repetitive and time-based: checking for updates, sending reminders, generating reports, following up on things that went quiet.
Scheduling turns your assistant from something you talk to into something that works for you in the background. It's the difference between a tool you pick up and an assistant that's actually assisting.
There are several flavors of automated work, each suited to different needs.
A single task that fires at a specific time. You give it an ISO 8601 timestamp and a message. It fires once, then is automatically marked as fired and disabled. This is what used to be called “reminders” — now it's a unified concept.
Tasks that repeat on a cadence. Under the hood, these use standard cron expressions (5-field) or RRULE recurrence rules (RFC 5545), but you don't need to know that — just describe what you want in plain language and the assistant translates it.
RRULE supports advanced patterns that cron can't: bounded recurrence (COUNT=30 or UNTIL=...), set constructs with RDATE / EXDATE / EXRULE for adding or excluding specific dates, and union patterns with multiple RRULE lines.
A heartbeat is a periodic background checklist. Your assistant runs through the items in HEARTBEAT.md at a configurable interval and only surfaces things when they need your attention. It runs in a separate background conversation, not your active chat.
Configuration lives in config.json:
heartbeat.enabled — toggle on/off (requires restart)heartbeat.intervalMs — milliseconds between runs (default: 1 hour)heartbeat.activeHoursStart / activeHoursEnd — restrict runs to certain hours (0–23, both must be set together)The default checklist focuses on your user relationship — reviewing the scratchpad, thinking about follow-ups from recent conversations, and reaching out when there's something worth sharing. You can customize HEARTBEAT.md to check whatever you want, and changes take effect on the next run without a restart.
Watchers are a polling-based monitoring system for external services. Instead of running on a fixed schedule with a message, a watcher polls a specific provider for new events and processes them with an action prompt you define.
Each watcher has:
Playbooks are trigger-action automation rules — not time-based like schedules, but event-based. They tell your assistant how to handle incoming messages that match a pattern.
Each playbook has:
* for all, or a specific channel)auto (execute immediately), draft (prepare for review), or notify (alert only)Schedules (both one-shot and recurring) have two modes that control what happens when they fire:
Execute-mode schedules run in their own background conversations, which means they have full access to skills and tools. The assistant can check your email, query APIs, build reports — anything it can do in a normal conversation.
When a schedule fires in notify mode, you can control where the notification goes:
You can also pass routing hints to influence delivery — for example, preferred channels or exclusions. Most of the time, the default (all channels) is what you want.
Every schedule moves through a set of statuses:
active — enabled and waiting for the next trigger timefiring — currently executingfired — one-shot schedule that has completed (automatically disabled)cancelled — cancelled before it could fireRecurring schedules stay active after each run and automatically compute the next trigger time. One-shot schedules transition to fired after completing.
Each run is recorded with its status, duration, output, and any errors. You can ask your assistant “show me my schedules” to see the full list with their statuses and recent run history.
A few ways scheduling and automation come together:
Scheduled tasks run as long as the assistant process is running. For local installs, that means the Vellum daemon on your machine needs to be active. For managed (cloud-hosted) deployments, the assistant runs 24/7 — schedules, watchers, and heartbeats fire reliably regardless of whether your desktop is on.
The scheduler ticks every 15 seconds, so schedules fire within that window of their target time.
If the assistant was offline when a schedule was supposed to fire, missed one-shot schedules will fire on the next startup. Recurring schedules compute their next run from the current time, so they don't replay missed runs — they just resume on cadence.
Just tell your assistant what you want in plain language:
The assistant handles the translation to cron/RRULE expressions, watcher configurations, or playbook rules. You can also manage everything programmatically — schedules, watchers, and playbooks all have full CRUD tools (schedule_create, watcher_create, playbook_create, etc.) and can be listed, updated, or deleted.