Freshness and Refresh Cycles

How often AeroCopilot refreshes each upstream feed — from 5-minute METAR pulls to 28-day AIRAC cycles, with the exact cron schedules that drive ingest.

Freshness and Refresh Cycles

Every data source AeroCopilot ingests has a refresh cadence chosen to match how the upstream agency publishes. METAR observations move every five minutes; the FAA Digital Obstacle File moves every 56 days. Pulling either too slowly or too fast adds no value — and in the slow case, can mislead.

This page documents the actual cron schedules running in production. The source of truth is apps/cron-worker/index.ts, the Railway-deployed worker that triggers every refresh endpoint.

How the worker runs

The cron worker is a long-running Node process. Each entry has a name, an HTTP path on the Next.js app, and a standard five-field cron expression. When a schedule fires, the worker acquires a Postgres advisory lock (so multiple replicas don't double-trigger), calls the corresponding /api/cron/* endpoint with the CRON_SECRET bearer token, and retries with exponential backoff (1 s, 4 s, 16 s) on failure. Each run writes a row to the sync_job table and optionally pings a Healthchecks.io URL configured per job.

That gives every refresh four guarantees:

  • Single-fire — one execution per scheduled tick, even with multiple worker replicas.
  • Retried — three attempts before a failure is final.
  • Audited — start time, completion time, duration, and error message persisted to sync_job.
  • Externally watched — Healthchecks.io fires an alert if a job stops pinging.

Refresh cadences in production

The schedules below are taken directly from the cron worker. Cadence column is the human-readable interval; cron column is the literal expression in apps/cron-worker/index.ts.

JobCadenceCron expression
METAR observationsEvery 5 minutes*/5 * * * *
FAA airport status (delays / ground stops)Every 5 minutes*/5 * * * *
NWS public alertsEvery 5 minutes*/5 * * * *
NOTAM syncEvery 10 minutes*/10 * * * *
TFR syncEvery 10 minutes*/10 * * * *
D-ATISEvery 10 minutes*/10 * * * *
PIREPsEvery 15 minutes*/15 * * * *
SIGMETs / domesticEvery 15 minutes*/15 * * * *
International SIGMETsEvery 15 minutes*/15 * * * *
Center Weather AdvisoriesEvery 15 minutes*/15 * * * *
SPC watches & mesoscaleEvery 15 minutes*/15 * * * *
TAF forecastsEvery 30 minutes*/30 * * * *
Met Impact StatementsEvery 30 minutes*/30 * * * *
Nav Canada METAR/TAFEvery 30 minutes*/30 * * * *
Tile source health probeEvery 30 minutes*/30 * * * *
Status page health sweepEvery 2 minutes*/2 * * * *
AirNow AQIHourly0 * * * *
NOAA SWPC space weatherHourly0 * * * *
AIRAC detectorHourly0 * * * *
Convective forecastsEvery 2 hours0 */2 * * *
G-AIRMETsEvery 3 hours0 */3 * * *
NOAA HMS smoke plumesEvery 3 hours0 */3 * * *
NWS forecast discussionsEvery 3 hours0 */3 * * *
NHC tropical cyclonesEvery 3 hours0 */3 * * *
Winds and temperatures aloftEvery 6 hours0 */6 * * *
FAA weather camerasEvery 6 hours0 */6 * * *
MOS forecastsEvery 6 hours0 */6 * * *
NDBC ocean buoysEvery 6 hours0 */6 * * *
Airworthiness DirectivesDaily 06:00 UTC0 6 * * *
Pilot alerts (AD / Medical / BFR)Daily 08:00 UTC0 8 * * *
Email engagement campaignsDaily 09:00 UTC0 9 * * *
Vermont post-trial confirmDaily 09:00 UTC0 9 * * *
Compliance notificationsDaily 10:00 UTC0 10 * * *
Weather data cleanupDaily 03:00 UTC0 3 * * *
OpsAuditLog 7-year retention purgeDaily 04:00 UTC0 4 * * *
Weather station metadata syncWeekly Sunday 04:00 UTC0 4 * * 0
Historic AD backfillWeekly Sunday 02:00 UTC0 2 * * 0
FAA obstacles (DOF)Weekly Sunday 05:00 UTC0 5 * * 0
Airspace boundariesWeekly Sunday 05:00 UTC0 5 * * 0
NTSB accident reportsWeekly Sunday 05:00 UTC0 5 * * 0
Airways / routesWeekly Sunday 06:00 UTC0 6 * * 0
FAA chart tile cacheWeekly Sunday 06:00 UTC0 6 * * 0
NASR 28-day airports1st & 15th of month, 02:00 UTC0 2 1,15 * *
CIFP procedures1st & 15th of month, 04:00 UTC0 4 1,15 * *
FAA aircraft registryMonthly, 1st 03:00 UTC0 3 1 * *
FAA Part 141 flight schoolsMonthly, 1st 07:00 UTC0 7 1 * *
FAA Part 145 repair stationsMonthly, 1st 08:00 UTC0 8 1 * *
FAA Part 135 operatorsMonthly, 1st 09:00 UTC0 9 1 * *
UAS Facility MapsMonthly, 1st 07:00 UTC0 7 1 * *
FAA Airman datasetMonthly, 6th 06:00 UTC0 6 6 * *

Why some jobs are every 5 minutes and some are every 56 days

Cadence follows the upstream publication rhythm. Pulling METAR more often than the 5-minute window the NWS publishes on would burn requests for no new data. Pulling sectional charts more often than the 56-day FAA AIRAC cycle would re-fetch identical bytes. The job schedule above respects the publisher in both directions.

The sub-minute exceptions — ADS-B traffic and the status-page health sweep — are streaming or probe workloads, not pulled refreshes; they appear in the worker for sweep-style monitoring rather than for ingest cadence.

What the AIRAC cycle is

Several entries above run on the 28-day or 56-day rhythm. These align with the FAA's Aeronautical Information Regulation And Control (AIRAC) cycle — the worldwide schedule on which charting, procedures, and airspace data are republished. The hourly airac-detector job watches for a new cycle becoming effective and triggers the dependent chart, CIFP, and procedure refreshes when one drops.

Where to see live freshness

  • The /data-sources directory shows the cadence badge per source.
  • The /data-leaderboard page ranks the catalog from freshest to slowest.
  • Authenticated admin users can inspect sync_job history via the internal admin tools.