Planekeeper is currently in alpha development. Features and APIs may change. Feedback is welcome! Request early access to get started.

Cron expressions

Cron expression format reference for scheduling gather and scrape jobs, with common examples and tips for choosing intervals.

Gather jobs and scrape jobs use standard 5-field cron expressions to define their execution schedule. When a scheduled job completes, Planekeeper calculates the next run time from the cron expression and waits until that time to run the job again.

Format

* * * * *
| | | | |
| | | | +--- Day of week (0-6, Sunday=0)
| | | +----- Month (1-12)
| | +------- Day of month (1-31)
| +--------- Hour (0-23)
+----------- Minute (0-59)

Each field accepts:

SyntaxMeaningExample
*Every value* * * * * = every minute
NSpecific value0 9 * * * = at 9:00
*/NEvery N units*/15 * * * * = every 15 minutes
N-MRange0 9-17 * * * = hourly from 9am to 5pm
N,MList0 9,17 * * * = at 9am and 5pm

Common schedules

High frequency

ScheduleExpressionUse case
Every 15 minutes*/15 * * * *Fast-moving projects, CI/CD pipelines
Every 30 minutes*/30 * * * *Active development tracking
Every hour0 * * * *General monitoring

Standard frequency

ScheduleExpressionUse case
Every 6 hours0 */6 * * *Most gather jobs
Every 12 hours0 */12 * * *Stable projects
Daily at midnight0 0 * * *Nightly checks
Daily at 9am0 9 * * *Morning reports

Low frequency

ScheduleExpressionUse case
Every Monday at 9am0 9 * * 1Weekly reviews
First of each month0 0 1 * *Monthly audits
Weekdays at 8am0 8 * * 1-5Business-hours only

Examples in context

Gather job: track a fast-moving project

For a project like Kubernetes that releases frequently, poll every 6 hours:

0 */6 * * *

This runs at midnight, 6am, noon, and 6pm.

Scrape job: check deployed versions daily

For a production deployment that changes during business hours:

0 9 * * 1-5

This runs at 9am Monday through Friday.

Gather job: track a slow-moving project

For a project that releases monthly or quarterly:

0 0 * * 0

This runs once per week at midnight on Sunday.


Tips for choosing schedules

Match the schedule to the release cadence. A project that releases every few months does not need hourly polling. A project with daily releases benefits from more frequent checks.

Consider GitHub API rate limits. Without a GitHub token, you are limited to 60 API requests per hour. With a token, the limit is 5,000 per hour. If you have many gather jobs, space them out or add a GitHub token to your configuration.

Stagger job start times. If you have multiple jobs, avoid scheduling them all at the same minute. Spread them across different minutes to reduce load spikes:

# Instead of all at the top of the hour:
0 */6 * * *   # Job A
0 */6 * * *   # Job B
0 */6 * * *   # Job C

# Stagger across the hour:
0 */6 * * *   # Job A
10 */6 * * *  # Job B
20 */6 * * *  # Job C

Scrape jobs can run less often. Your deployed version likely changes far less frequently than upstream releases. A daily or even weekly scrape schedule is sufficient for most deployments.

info

All times are UTC

Cron expressions are evaluated in UTC. Account for your local timezone when scheduling jobs for specific business hours.


What happens when a schedule is set

  1. You create or update a job with a cron schedule
  2. The job runs immediately (or at its next scheduled time)
  3. When the job completes, Planekeeper calculates the next run time from the cron expression
  4. The job waits in “completed” status until the scheduled time arrives
  5. The scheduler activates the job by setting it back to “pending”
  6. An available agent picks up the job and executes it
  7. The cycle repeats from step 3

Jobs without a schedule run once and remain in “completed” status until triggered manually.