Schedules
Schedules automate task execution on a recurring basis using cron expressions. A schedule links together a task, an assistant, and a user — defining what should be done, who does it, and on whose behalf.
Creating a Schedule
Navigate to Schedules in the sidebar and click New Schedule.
| Field | Description |
|---|---|
| Name | A descriptive name for the schedule (e.g., “Monday Morning Blog Post”) |
| Task | The task definition to execute (only active tasks are shown) |
| Assistant | Which assistant runs the task. The assistant’s linked project provides knowledge and guidelines. |
| User | Which user owns the task run and receives any email output |
| Cron Expression | When to run the task (standard 5-field cron format) |
| Active | Whether the schedule is currently enabled |
Cron Expressions
Schedules use standard 5-field cron expressions to define when tasks run:
┌───────── 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 Examples
| Expression | Description |
|---|---|
0 9 * * * | Every day at 9:00 AM |
0 9 * * 1 | Every Monday at 9:00 AM |
0 9 * * 1-5 | Weekdays at 9:00 AM |
0 */6 * * * | Every 6 hours |
0 9,17 * * * | At 9:00 AM and 5:00 PM daily |
0 9 1 * * | First day of every month at 9:00 AM |
30 8 * * 1 | Every Monday at 8:30 AM |
How Scheduled Execution Works
When a schedule triggers:
- A new conversation is created for the task run
- A task run record is created with status tracking
- The assistant executes the task using the instructions from the task definition
- The assistant has access to its linked project’s knowledge, guidelines, and plugins
- Any deliverables created are associated with the task run
- The task run status is updated when execution completes
Technical Details
Schedule dispatcher — A background periodic task runs every 60 seconds and checks all active schedules. For each schedule, it evaluates the cron expression using the croniter library to calculate the next run time based on the schedule’s last execution timestamp. If the next run time has passed, the task is dispatched for execution.
Double-dispatch prevention — After dispatching a task, the system immediately updates the schedule’s last_run_at timestamp. This ensures that even if the periodic task runs again before the dispatched task completes, the same schedule will not fire twice for the same time window.
Async execution — Scheduled tasks are dispatched as asynchronous background jobs. A worker picks up the job, creates a fresh conversation with the assigned assistant, and runs the full agent loop. The schedule itself only tracks when it last ran — all execution details live on the task run record and its associated conversation.
Notifications — When a scheduled task completes, the task owner receives a notification (in-app or email depending on their preferences). Events are also broadcast to any configured system webhooks. This means you don’t need to manually check whether scheduled tasks ran — you’ll be alerted automatically.
Enabling and Disabling
Use the toggle on the schedules list to enable or disable a schedule without deleting it. Disabled schedules retain their configuration and can be re-enabled at any time.
The schedules list shows the last run timestamp for each schedule, so you can verify that schedules are executing as expected.
Schedule Components
A schedule brings together three key elements:
- Task — Defines what to do (instructions, output type, tool restrictions)
- Assistant — Defines how to do it (personality, project context, skills, tools)
- User — Defines for whom (ownership of output, email recipient)
This separation means you can reuse the same task across different assistants and schedules, each with their own project context and capabilities.