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:

  1. The server creates a new conversation turn with the schedule’s prompt
  2. The orchestrator processes it like any other message — skills, tools, and memory are all available
  3. The response is delivered to the configured channel
  4. 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:

ExpressionMeaning
0 9 * * *Every day at 9:00 AM
0 9 * * 1-5Weekdays 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 * * 5Every Friday at 4:30 PM

Schedule fields

FieldTypeRequiredDescription
cronstringYesCron expression (5-field)
promptstringYesThe message sent to the AI
channelstringYesTarget channel type (web, telegram, discord, slack)
channel_idstringYesPlatform-specific channel or chat ID
skillstringNoForce a specific skill (default: Constellation routing)
toolsstring[]NoOverride tool access for this schedule
enabledbooleanNoEnable/disable without deleting (default: true)
timezonestringNoTimezone for cron evaluation (default: server local time)

Setting up schedules

Through the UI

  1. Open the Brain Canvas
  2. Click the clock icon in the toolbar (or press Ctrl+Shift+S / Cmd+Shift+S)
  3. Click “New Schedule”
  4. Fill in the cron expression, prompt, and delivery target
  5. 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:

  1. A temporary “Schedule” node appears on the canvas
  2. The execution follows the same visual path as any user message — skill activation, tool calls, memory retrieval
  3. 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