Scheduling
Your assistant does not only answer when you talk. It can also run work on a calendar you define: once at a time, or on a repeating cadence.
That work runs on your machine, in the local assistant process. There is no Cadence Cloud 24/7 home in 0.1. If the computer is asleep or the assistant is stopped, schedules wait.
Why it matters
A lot of useful work is repetitive and time-based: briefings, reminders, follow-ups, polling an inbox. Scheduling is how the assistant does that without you asking each time.
Types of scheduled work
One-shot schedules
A single task at a specific time (an ISO 8601 timestamp plus a
message). It fires once, then is marked fired and
disabled. This is the unified form of reminders.
- “Remind me to call the dentist tomorrow at 9am”
- “Send Alice a follow-up on Friday if she has not replied”
- “Check the deploy in 30 minutes and tell me”
Recurring schedules
Tasks that repeat. Under the hood these use 5-field cron or RRULE (RFC 5545). You do not need to write either: describe it in plain language and the assistant translates.
RRULE covers patterns cron cannot: bounded recurrence
(COUNT=30 or UNTIL=...), extra or excluded
dates (RDATE / EXDATE / EXRULE),
and unions of several RRULE lines.
- “Every morning at 8am, summarize my calendar and unread email”
- “Every Friday afternoon, compile a weekly status from Slack”
- “On the 1st of each month, remind me to review subscriptions”
Heartbeats
A heartbeat is a periodic background checklist. The assistant walks
HEARTBEAT.md on an interval and only surfaces something
when it needs you. It runs in a background conversation, not your
active chat.
Config lives in config.json:
heartbeat.enabled: on or off (needs a restart)heartbeat.intervalMs: milliseconds between runs (default: 1 hour)heartbeat.activeHoursStart/activeHoursEnd: restrict to certain hours (0–23, set together)
The default checklist is relationship-oriented: scratchpad, follow-ups,
reach out when there is something worth sharing. Edit
HEARTBEAT.md; the next run picks it up.
Watchers
Watchers poll an external service for new events, then run an action prompt you define. Each watcher has a provider (Gmail, Outlook, GitHub, Google Calendar, Outlook Calendar, or Linear), a poll interval (minimum 15 seconds, default 60), and a watermark so events are not processed twice.
- “Watch my Gmail for important mail and notify me”
- “Monitor this GitHub repo for new issues assigned to me”
- “Alert me 10 minutes before Google Calendar meetings”
Watchers need a connected integration and your keys in the credential store. They do not invent a Cadence-hosted mail or GitHub account.
Playbooks
Trigger-action rules, event-based rather than time-based. Each
playbook has a trigger pattern, a natural-language action, a channel
(* or a specific one), an autonomy level
(auto, draft, or notify), and a
numeric priority when rules overlap.
- “When I get a meeting request, draft a polite decline”
- “When Slack says ‘urgent’, notify me on Telegram”
Subagents
Subagents are the on-demand cousin: they spin up now, work in parallel, and report back. A schedule is “do this on a cadence.” A subagent is “do this in parallel right now.” A recurring schedule can spawn subagents each time it fires.
Schedule modes
- Execute (default): send the message to a background conversation. The assistant processes it as if you had sent it. Use this for “check my calendar and send a digest.”
- Notify: send a notification only. No model turn. Use this for “remind me to take medicine at 9am.”
- Script: run a shell command on a cadence with no model in the loop. Stdout, stderr, and exit code are recorded. Cheap, deterministic jobs.
- Workflow: run a saved workflow, optionally with arguments.
Execute-mode runs can use skills and tools, still under permissions. Script and notify skip the model and cost less.
There is also a wake behavior: resume an existing conversation with a hint instead of starting a new one. You do not pick it as a mode. It is what the assistant sets up when you say “pick this up tomorrow morning.”
Notification routing
- All channels (default)
- Single channel (“remind me on Telegram”)
- A subset of channels
Delivery only works for channels you have actually connected. See Channels.
Lifecycle
active: enabled, waiting for the next triggerfiring: currently executingfired: one-shot completed (disabled)cancelled: cancelled before it could fire
Recurring schedules stay active and compute the next run.
Each run records status, duration, output, and errors. Ask “show me my
schedules” for the list.
When you are away
Schedules, watchers, and heartbeats run only while the assistant process is running on this computer. Put the laptop to sleep and they pause. There is no Aevum-hosted always-on home in 0.1.
The scheduler ticks about every 15 seconds. Missed one-shot schedules fire on the next startup. Recurring schedules compute the next run from now: they do not replay every missed tick.
How to set one up
Say it in plain language:
- “Remind me to call Bob at 6pm”
- “Every Monday at 9am, summarize my email”
- “Watch GitHub for new issues assigned to me”
- “When a recruiter emails, draft a polite pass”
The assistant handles cron, RRULE, watchers, and playbooks. You can also list, update, and delete them through the assistant.
See also Memory and context and Local hosting.