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_task for you
  • APIPOST /api/scheduler/jobs with 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

ExpressionMeaning
0 9 * * *Every day at 9:00 AM
0 9 * * 1Every Monday at 9:00 AM
0 17 * * 5Every Friday at 5:00 PM
*/30 * * * *Every 30 minutes
0 0 1 * *First day of every month at midnight
0 8,12,17 * * 1-5Weekdays at 8am, noon, and 5pm

Example jobs

CronGoal
0 9 * * 1-5Check overnight logs and flag any anomalies or failed processes
0 17 * * 5Summarize 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