Cron Configuration
Configure and manage the 12 built-in cron jobs — schedules, models, quiet hours, and more.
Cron Configuration
All cron jobs are defined in pipeline-server/cron-config.json. The scheduler reads this file on startup.
Config Format
{
"jobs": [
{
"id": "my-job",
"title": "My Job",
"description": "What this job does.",
"schedule": "0 */6 * * *",
"task_folder": "my-job",
"agent_instruction": "Read TASK_DESCRIPTION.md and complete the task.",
"enabled": true,
"model": "sonnet",
"quiet_start": 23,
"quiet_end": 7,
"transport": "tg",
"type": null
}
]
}Field Reference
| Field | Type | Required | Description |
|---|---|---|---|
id | string | Yes | Unique identifier (lowercase, hyphens). Must match /^[a-z0-9_-]+$/. |
title | string | No | Human-readable name shown in the dashboard. Falls back to id. |
schedule | string | Yes | Cron expression (e.g., "0 */6 * * *" = every 6 hours). |
description | string | No | Shown in the Cron Dashboard page. |
task_folder | string | No | Folder containing TASK_DESCRIPTION.md for Claude-powered jobs. |
agent_instruction | string | No | Instruction passed to Claude when the job runs. |
command | string | No | Shell command for type: "shell" jobs. Mutually exclusive with task_folder. |
enabled | boolean | No | Whether the job is active. Defaults to true. |
model | string | No | Claude model: "haiku", "sonnet", "opus". Null for shell jobs. |
provider | string | No | Model provider override. Usually null. |
transport | string | No | Notification channel: "tg" (Telegram). |
quiet_start | number | No | UTC hour to start quiet period (no execution). |
quiet_end | number | No | UTC hour to end quiet period. |
dependency | string | No | ID of a job that must complete first. |
type | string | No | Set to "shell" for shell command jobs. |
reasoning_effort | string | No | Model reasoning effort override. |
cli_parameters | array | No | Additional CLI flags passed to Claude. |
Common Cron Expressions
| Expression | Schedule |
|---|---|
0 */6 * * * | Every 6 hours |
0 9 * * * | Daily at 9:00 AM UTC |
0 9 * * 1-5 | Weekdays at 9:00 AM UTC |
0 17 * * 5 | Fridays at 5:00 PM UTC |
0 2 * * * | Daily at 2:00 AM UTC |
*/30 * * * * | Every 30 minutes |
The 12 Built-In Jobs
The default cron-config.json includes 12 jobs covering operations, maintenance, and notifications. The exact jobs depend on your configuration, but the standard set includes:
AI-Powered Jobs
These spawn Claude sessions to perform intelligent tasks:
| Job | Typical Schedule | Model | Purpose |
|---|---|---|---|
| kb-librarian | Every 12 hours | Haiku | Audit and maintain the knowledge vault |
| archive-outputs | Daily | Haiku | Archive old pipeline output files |
| friday-update | Friday afternoon | Opus | Draft weekly client update emails |
| scope-audit | Weekly | Opus | Check for scope creep on active projects |
| morning-briefing | Weekday mornings | Sonnet | Daily operations summary |
Shell Jobs
These run shell scripts without Claude:
| Job | Typical Schedule | Purpose |
|---|---|---|
| email-sync | Every 30 minutes | Sync email via himalaya CLI |
| push-activity | Every hour | Push activity data to the dashboard |
| todo-sync | Every 6 hours | Sync parsed TODOs to the dashboard |
| offsite-backup | Daily at 2 AM | Backup to Backblaze B2 via rclone |
Shell jobs use "type": "shell" and "command" instead of task_folder.
Adding a New Cron Job
- Add the job entry to
pipeline-server/cron-config.json - For AI jobs: create a task folder with
TASK_DESCRIPTION.md - For shell jobs: create the script in
$SCRIPTS_DIRand make it executable - Restart the pipeline server
- Verify in the Cron Dashboard
Shell Job Example
{
"id": "db-backup",
"title": "Database Backup",
"schedule": "0 2 * * *",
"command": "bash ${SCRIPTS_DIR}/backup-db.sh",
"enabled": true,
"model": null,
"type": "shell",
"transport": "tg"
}Quiet Hours
Each job can define a quiet window using quiet_start and quiet_end (UTC hours). During this window, scheduled executions are silently skipped. For example, "quiet_start": 23, "quiet_end": 7 skips executions between 11 PM and 7 AM UTC.
Manual Trigger
Run any job immediately:
curl -X POST http://localhost:8750/crons/JOB_ID/run \
-H "Authorization: Bearer YOUR_PIPELINE_SERVER_TOKEN"Shell Script Permissions
Shell-type cron jobs need executable scripts:
chmod +x ~/agency-workspace/.scripts/*.sh
chmod +x ~/agency-workspace/knowledge/system/scripts/*.sh