Scheduler
Cron-style recurring agent jobs — set it and forget it, running on your hardware.
How it works
The Scheduler runs as part of the asyncat backend. It checks for due jobs on a regular interval and fires them by running a full agent session with the job's goal as the initial message. Each run is logged with its full output and stored in the run history.
Jobs survive restarts — they are stored in SQLite and the scheduler picks up where it left off on next startup. If the server was down when a job was due, it fires on the next check after startup.
Each job can be assigned to a specific Profile — so a daily code review job uses the Developer profile while a weekly digest uses the Research profile.
Creating jobs
Create jobs in three ways:
- UI — Settings → Scheduler → New Job
- Agent — tell the agent: "schedule a daily standup at 9am" and it will call
create_scheduled_taskfor you - API —
POST /api/scheduler/jobswith a cron expression and goal
Each job has a name, a cron expression, a goal (the task prompt), an optional profile, and an enabled/disabled toggle.
Cron syntax
asyncat uses standard 5-field cron syntax: minute hour day-of-month month day-of-week
| Expression | Meaning |
|---|---|
0 9 * * * | Every day at 9:00 AM |
0 9 * * 1 | Every Monday at 9:00 AM |
0 17 * * 5 | Every Friday at 5:00 PM |
*/30 * * * * | Every 30 minutes |
0 0 1 * * | First day of every month at midnight |
0 8,12,17 * * 1-5 | Weekdays at 8am, noon, and 5pm |
Example jobs
| Cron | Goal |
|---|---|
0 9 * * 1-5 | Check overnight logs and flag any anomalies or failed processes |
0 17 * * 5 | Summarize this week's commits, decisions, and open issues across all repos |
0 0 * * * | Back up the asyncat database and clean up temp files older than 7 days |
*/15 * * * * | Check if any monitored services are down and send a desktop notification if so |
0 8 1 * * | Generate a monthly usage report and save it as a note |