Schedules
Automate recurring tasks with cron-based scheduling. Deliver daily reports, monitoring alerts, and reminders to any connected channel.
6 min read
Schedules
Schedules let your AI work on autopilot. Define cron-based tasks that run at specific times, use any skill and tool, and deliver results to any connected channel. Daily standups, monitoring checks, weekly reports, periodic reminders — anything you would otherwise do manually on a recurring basis.
How schedules work
A schedule is a cron expression paired with a prompt and a delivery target. When the cron fires:
- The server creates a new conversation turn with the schedule’s prompt
- The orchestrator processes it like any other message — skills, tools, and memory are all available
- The response is delivered to the configured channel
- Execution is logged and visible on the Brain Canvas
Schedules run server-side. The client does not need to be open.
Configuration
Define schedules in your config.yaml:
schedules:
daily-standup:
cron: "0 9 * * 1-5" # 9:00 AM, Monday through Friday
prompt: |
Generate a daily standup summary. Check what was discussed
yesterday across all channels, list any unresolved action items,
and highlight anything that needs attention today.
skill: daily-digest # Optional: force a specific skill
channel: telegram # Where to deliver the result
channel_id: "123456789" # Specific chat/channel ID
enabled: true
system-health:
cron: "*/30 * * * *" # Every 30 minutes
prompt: |
Run a quick health check. Verify the API is responding,
check memory usage, and report any anomalies.
tools:
- code_execution # Override tool access for this schedule
channel: discord
channel_id: "9876543210987654321"
enabled: true
weekly-report:
cron: "0 17 * * 5" # 5:00 PM every Friday
prompt: |
Generate a weekly summary report. Include:
- Total conversations this week across all channels
- Most discussed topics
- Action items that were completed
- Action items still pending
channel: slack
channel_id: "C0123ABCDEF"
enabled: true
Cron syntax reference
Chvor uses standard 5-field cron syntax:
┌───────────── minute (0-59)
│ ┌───────────── hour (0-23)
│ │ ┌───────────── day of month (1-31)
│ │ │ ┌───────────── month (1-12)
│ │ │ │ ┌───────────── day of week (0-7, where 0 and 7 are Sunday)
│ │ │ │ │
* * * * *
Common patterns:
| Expression | Meaning |
|---|---|
0 9 * * * | Every day at 9:00 AM |
0 9 * * 1-5 | Weekdays at 9:00 AM |
*/15 * * * * | Every 15 minutes |
0 */2 * * * | Every 2 hours |
0 0 1 * * | First day of every month at midnight |
30 16 * * 5 | Every Friday at 4:30 PM |
Schedule fields
| Field | Type | Required | Description |
|---|---|---|---|
cron | string | Yes | Cron expression (5-field) |
prompt | string | Yes | The message sent to the AI |
channel | string | Yes | Target channel type (web, telegram, discord, slack) |
channel_id | string | Yes | Platform-specific channel or chat ID |
skill | string | No | Force a specific skill (default: Constellation routing) |
tools | string[] | No | Override tool access for this schedule |
enabled | boolean | No | Enable/disable without deleting (default: true) |
timezone | string | No | Timezone for cron evaluation (default: server local time) |
Setting up schedules
Through the UI
- Open the Brain Canvas
- Click the clock icon in the toolbar (or press
Ctrl+Shift+S/Cmd+Shift+S) - Click “New Schedule”
- Fill in the cron expression, prompt, and delivery target
- Save — the schedule starts immediately based on the cron timing
The UI includes a cron builder with a plain-language preview (“Runs every weekday at 9:00 AM”) so you do not need to memorize cron syntax.
Through the config file
Add a new entry under schedules: in config.yaml. The schedule is picked up on hot reload — no restart required.
Through the API
# Create a schedule
curl -X POST http://localhost:3000/api/schedules \
-H "Content-Type: application/json" \
-d '{
"name": "morning-briefing",
"cron": "0 8 * * 1-5",
"prompt": "Give me a morning briefing with top tech news.",
"channel": "telegram",
"channel_id": "123456789"
}'
# List all schedules
curl http://localhost:3000/api/schedules | jq
# Disable a schedule
curl -X PATCH http://localhost:3000/api/schedules/morning-briefing \
-H "Content-Type: application/json" \
-d '{"enabled": false}'
# Trigger a schedule manually (runs immediately)
curl -X POST http://localhost:3000/api/schedules/morning-briefing/trigger
# Delete a schedule
curl -X DELETE http://localhost:3000/api/schedules/morning-briefing
Delivery to any channel
Schedules can deliver to any connected channel. The same schedule can even be delivered to multiple channels:
schedules:
daily-standup:
cron: "0 9 * * 1-5"
prompt: "Generate today's standup summary."
deliver_to:
- channel: slack
channel_id: "C0123ABCDEF"
- channel: telegram
channel_id: "123456789"
- channel: discord
channel_id: "9876543210987654321"
If a channel is temporarily unavailable (e.g., the Telegram bot is disconnected), the schedule logs a delivery failure and retries on the next execution. Failed deliveries are visible in the schedule’s execution history.
Use cases
Daily standup summary
Pull together what happened across all channels overnight and post a morning briefing:
daily-standup:
cron: "0 9 * * 1-5"
prompt: |
Review all conversations from the last 24 hours across every channel.
Summarize key discussions, decisions made, and action items.
Format as a standup: What happened, what's planned, any blockers.
channel: slack
channel_id: "C0123ABCDEF"
Infrastructure monitoring
Check system health at regular intervals and alert if something is wrong:
health-check:
cron: "*/15 * * * *"
prompt: |
Run these health checks:
1. Ping https://api.example.com/health
2. Check if response time is under 500ms
3. Only report if something is wrong or degraded.
If everything is healthy, respond with just "OK" (this will be suppressed).
tools:
- web_search
- code_execution
channel: telegram
channel_id: "123456789"
Weekly project digest
Compile a structured weekly report every Friday:
weekly-digest:
cron: "0 17 * * 5"
prompt: |
Generate a weekly project digest covering Monday through Friday.
Include conversation statistics, topics discussed, tools used,
and outstanding action items. Format as a well-structured report.
skill: daily-digest
channel: discord
channel_id: "9876543210987654321"
Recurring reminders
Simple time-based reminders:
water-reminder:
cron: "0 */2 9-17 * * 1-5"
prompt: "Send a brief, friendly reminder to drink water and stretch."
channel: telegram
channel_id: "123456789"
Execution visibility
Every schedule execution is tracked and visible on the Brain Canvas. When a schedule fires:
- A temporary “Schedule” node appears on the canvas
- The execution follows the same visual path as any user message — skill activation, tool calls, memory retrieval
- The execution is logged with timing, token usage, and delivery status
You can view execution history for any schedule:
curl http://localhost:3000/api/schedules/daily-standup/history | jq
# [
# {
# "id": "exec_abc123",
# "triggered_at": "2025-03-24T09:00:00Z",
# "completed_at": "2025-03-24T09:00:12Z",
# "status": "delivered",
# "tokens_used": 1847,
# "skill_used": "daily-digest",
# "tools_called": ["web_search"]
# },
# ...
# ]
Next steps
- Channels — configure the channels that schedules deliver to
- Skills — define skills optimized for scheduled tasks
- Directives — set rules that apply to scheduled executions too