Schedule Syntax
This reference documents the complete schedule syntax supported by GitHub Agentic Workflows, including fuzzy schedules (recommended), time constraints, and standard cron expressions.
Overview
Section titled “Overview”GitHub Agentic Workflows supports human-friendly schedule expressions that are automatically converted to cron format. The system includes two types of schedules:
- Fuzzy schedules (recommended) - Automatically scatter execution times across workflows to prevent load spikes
- Fixed schedules - Run at specific times, but create server load when many workflows use the same time
Quick Reference
Section titled “Quick Reference”| Pattern | Example | Result | Type |
|---|---|---|---|
| Daily | daily | Scattered time | Fuzzy |
daily around 14:00 | 13:00-15:00 window | Fuzzy | |
daily between 9:00 and 17:00 | 9am-5pm window | Fuzzy | |
| Hourly | hourly | Scattered minute | Fuzzy |
every 2h | Every 2 hours | Fuzzy | |
| Weekly | weekly | Scattered day/time | Fuzzy |
weekly on monday | Monday, scattered time | Fuzzy | |
weekly on friday around 5pm | Friday 4pm-6pm | Fuzzy | |
| Intervals | every 10 minutes | Every 10 minutes | Fixed |
every 2 days | Every 2 days | Fixed | |
| Cron | 0 9 * * 1 | Standard cron | Fixed |
Fuzzy Schedules (Recommended)
Section titled “Fuzzy Schedules (Recommended)”Fuzzy schedules automatically distribute workflow execution times to prevent server load spikes. The scattering is deterministic based on the workflow file path, so each workflow consistently gets the same execution time.
Daily Schedules
Section titled “Daily Schedules”Run once per day at a scattered time:
on: schedule: dailyOutput: Each workflow gets a unique time like 43 5 * * * (5:43 AM)
Use cases:
- Daily reports
- Nightly maintenance
- Status updates
Daily with Time Constraints
Section titled “Daily with Time Constraints”Scatter within a specific time window using around or between:
Around (±1 hour window)
Section titled “Around (±1 hour window)”on: schedule: daily around 14:00Scatters within 13:00-15:00 (±1 hour window)
on: schedule: daily around 3pmScatters within 2pm-4pm
on: schedule: daily around noonScatters within 11am-1pm
Special time keywords: midnight (00:00), noon (12:00)
Between (Custom time range)
Section titled “Between (Custom time range)”on: schedule: daily between 9:00 and 17:00Scatters within business hours (9am-5pm)
on: schedule: daily between 9am and 5pmSame as above using 12-hour format
on: schedule: daily between 22:00 and 02:00Handles ranges that cross midnight (10pm-2am)
on: schedule: daily between midnight and 6amEarly morning window (12am-6am)
Use cases:
- Business hours only execution
- Regional time windows
- Off-hours maintenance (crossing midnight)
Hourly Schedules
Section titled “Hourly Schedules”Run every hour with scattered minute offset:
on: schedule: hourlyOutput: 58 */1 * * * (minute offset is scattered, e.g., minute 58)
Each workflow gets a consistent minute offset (0-59) to prevent all hourly workflows from running at the same minute.
Interval Schedules
Section titled “Interval Schedules”Run every N hours with scattered minute offset:
on: schedule: every 2hOutput: 53 */2 * * * (every 2 hours at scattered minute)
on: schedule: every 6hOutput: 12 */6 * * * (every 6 hours at scattered minute)
Supported intervals: 1h, 2h, 3h, 4h, 6h, 8h, 12h
Weekly Schedules
Section titled “Weekly Schedules”Run once per week at scattered day and time:
on: schedule: weeklyOutput: Scattered to a random day and time like 43 5 * * 1 (Monday 5:43 AM)
Run on specific weekday at scattered time:
on: schedule: weekly on mondayOutput: 43 5 * * 1 (Monday at scattered time)
on: schedule: weekly on fridayOutput: 18 14 * * 5 (Friday at scattered time)
Supported weekdays: sunday, monday, tuesday, wednesday, thursday, friday, saturday
Weekly with Time Constraints
Section titled “Weekly with Time Constraints”Add around to scatter within ±1 hour of target time:
on: schedule: weekly on monday around 09:00Scatters Monday 8am-10am
on: schedule: weekly on friday around 5pmScatters Friday 4pm-6pm
UTC Offset Support
Section titled “UTC Offset Support”All time specifications support UTC offset notation to convert times to UTC:
Syntax
Section titled “Syntax”- Plus offset:
utc+Norutc+HH:MM - Minus offset:
utc-Norutc-HH:MM
Examples
Section titled “Examples”on: schedule: daily around 14:00 utc+9Converts 2:00 PM JST (±1 hour) to UTC
on: schedule: daily around 9am utc-5Converts 9:00 AM EST (±1 hour) to UTC
on: schedule: daily around 3pm utc-8Converts 3:00 PM PST (±1 hour) to UTC
on: schedule: daily between 9am utc-5 and 5pm utc-5Business hours EST (9am-5pm EST → 2pm-10pm UTC)
on: schedule: weekly on monday around 08:00 utc+05:30Monday around 8:00 AM IST (±1 hour) to UTC
Common offsets:
- PST/PDT:
utc-8/utc-7 - EST/EDT:
utc-5/utc-4 - JST:
utc+9 - IST:
utc+05:30
Fixed Schedules
Section titled “Fixed Schedules”For fixed-time schedules, use standard cron syntax:
on: schedule: - cron: "0 2 * * *" # Daily at 2:00 AM UTCon: schedule: - cron: "30 6 * * 1" # Monday at 6:30 AM UTCon: schedule: - cron: "0 9 15 * *" # 15th of each month at 9:00 AM UTCInterval Schedules
Section titled “Interval Schedules”Minute Intervals
Section titled “Minute Intervals”Run every N minutes (minimum 5 minutes):
on: schedule: every 5 minutesOutput: */5 * * * *
on: schedule: every 10 minutesOutput: */10 * * * *
on: schedule: every 30 minutesOutput: */30 * * * *
Short format: every 5m, every 10m, every 30m
Valid intervals: 5m, 10m, 15m, 20m, 30m (minimum 5 minutes)
Hour Intervals
Section titled “Hour Intervals”Fuzzy hour intervals (recommended):
on: schedule: every 1hOutput: FUZZY:HOURLY/1 * * * → scatters to 58 */1 * * *
on: schedule: every 2 hoursOutput: FUZZY:HOURLY/2 * * * → scatters to 53 */2 * * *
Fixed hour intervals (creates load spikes):
on: schedule: - cron: "0 */2 * * *"Output: 0 */2 * * * (every 2 hours at minute 0)
Day Intervals
Section titled “Day Intervals”on: schedule: every 2 daysOutput: 0 0 */2 * * (every 2 days at midnight)
on: schedule: every 1dOutput: 0 0 * * * (midnight UTC daily)
Short format: every 1d, every 2d, every 3d
Week Intervals
Section titled “Week Intervals”on: schedule: every 1wOutput: 0 0 * * 0 (every Sunday at midnight)
on: schedule: every 2wOutput: 0 0 */14 * * (every 14 days)
Month Intervals
Section titled “Month Intervals”on: schedule: every 1moOutput: 0 0 1 * * (1st of every month at midnight)
on: schedule: every 2moOutput: 0 0 1 */2 * (1st of every other month)
Time Formats
Section titled “Time Formats”24-Hour Format
Section titled “24-Hour Format”HH:MMExamples: 00:00, 09:30, 14:00, 23:59
12-Hour Format
Section titled “12-Hour Format”Ham, HpmExamples:
1am→ 01:003pm→ 15:0012am→ 00:00 (midnight)12pm→ 12:00 (noon)11pm→ 23:00
Special Keywords
Section titled “Special Keywords”midnight→00:00noon→12:00
With UTC Offset
Section titled “With UTC Offset”TIME utc+NTIME utc-NTIME utc+HH:MMExamples:
14:00 utc+9→ Converts JST to UTC3pm utc-5→ Converts EST to UTC9am utc+05:30→ Converts IST to UTCmidnight utc-8→ Converts PST to UTC
Standard Cron Expressions
Section titled “Standard Cron Expressions”You can use standard 5-field cron expressions directly:
on: schedule: - cron: "0 9 * * 1"Format: minute hour day-of-month month day-of-week
Examples:
0 9 * * 1- Every Monday at 9:00 AM*/15 * * * *- Every 15 minutes0 0 * * *- Daily at midnight0 14 * * 1-5- Weekdays at 2:00 PM
See GitHub’s cron syntax documentation for complete cron format details.
Multiple Schedules
Section titled “Multiple Schedules”You can specify multiple schedule triggers:
on: schedule: - cron: daily - cron: weekly on monday - cron: "0 0 15 * *" # Monthly on 15thor
on: schedule: - cron: "0 9 * * 1" - cron: "0 14 * * 5"Shorthand Format
Section titled “Shorthand Format”Use the ultra-short format in the on: field:
on: dailyAutomatically expands to:
on: schedule: - cron: "FUZZY:DAILY * * *" workflow_dispatch:This shorthand adds workflow_dispatch for manual triggering alongside the schedule.
Best Practices
Section titled “Best Practices”Recommended
Section titled “Recommended”✅ Use fuzzy schedules to prevent load spikes:
on: dailyon: hourlyon: weekly on mondayon: every 2h✅ Use time constraints for business hours:
on: daily between 9:00 and 17:00on: daily around 14:00✅ Use UTC offsets for regional times:
on: daily between 9am utc-5 and 5pm utc-5❌ Fixed times using cron (creates load spikes):
on: schedule: - cron: "0 0 * * *" # All workflows run at same time - cron: "0 */2 * * *" # All workflows run at minute 0✅ Use fuzzy alternatives instead:
on: daily # Scattered timeon: daily around midnight # ±1 hour windowon: weekly on monday # Scattered time on Mondayson: every 2h # Scattered minute offsetHow Scattering Works
Section titled “How Scattering Works”Fuzzy schedules use a deterministic hash of the workflow file path to assign each workflow a unique execution time:
- Workflow identifier: Full file path (e.g.,
.github/workflows/daily-report.md) - Stable hash: FNV-1a hash algorithm (consistent across platforms)
- Deterministic offset: Hash modulo time range gives consistent offset
- Same across recompiles: Same workflow path always gets same scattered time
Example:
on: dailyWorkflow A: 43 5 * * * (5:43 AM)
Workflow B: 17 14 * * * (2:17 PM)
Workflow C: 8 20 * * * (8:08 PM)
Each workflow gets a different time, but the same workflow always gets the same time.
Validation & Warnings
Section titled “Validation & Warnings”The compiler validates schedule expressions and emits warnings for patterns that create load spikes:
⚠ Schedule uses fixed daily time (0:0 UTC). Consider using fuzzy schedule 'daily' instead to distribute workflow execution times and reduce load spikes.⚠ Schedule uses hourly interval with fixed minute offset (0). Consider using fuzzy schedule 'every 2h' instead to distribute workflow execution times and reduce load spikes.⚠ Schedule uses fixed weekly time (Monday 6:30 UTC). Consider using fuzzy schedule 'weekly on monday' instead to distribute workflow execution times and reduce load spikes.Fix these by using the suggested fuzzy schedules.
Related Documentation
Section titled “Related Documentation”- Triggers - Complete trigger configuration
- Frontmatter - Workflow configuration reference
- GitHub Actions Schedule Events - GitHub’s schedule documentation