Skip to content

Cron Schedules

Every recurring job in the stack. Times are local PDT/PST (DST-aware where the runner respects TZ; UTC-fixed where it doesn't).

Active

When (PDT) When (UTC) Mechanism What Source
Daily 7:00am 14:00 launchd com.casey.warehouse-sync ~/garmin-warehouse/scripts/daily_sync.sh — garmindb sync, ICU refresh, kb embed, R2 backup, Worker cache build, comment scan ~/Library/LaunchAgents/com.casey.warehouse-sync.plist
Sun 6:00am 13:00 (Sun) launchd com.casey.podcast-sync ~/data-ingestion/scripts/podcast-sync.sh — triage + research new episodes across all shows ~/Library/LaunchAgents/com.casey.podcast-sync.plist
Daily 8:00pm 03:00 (next day) Cloudflare Worker 0 3 * * * OTQCheckinAgent.runCheckin() — Telegram check-in for any unlogged scheduled events cloudflare/otq-checkin/wrangler.jsonc
Daily 8:30am 15:30 Cloudflare Worker 30 15 * * * OTQCheckinAgent.runMorningSummary() — Telegram training summary cloudflare/otq-checkin/wrangler.jsonc

DST behavior: - launchd respects local TZ → fires at 7am PDT and 7am PST without intervention. - Cloudflare crons are UTC-fixed → when PST returns in November, evening fires at 9pm and morning at 9:30am local. Edit wrangler.jsonc twice a year, or accept the drift.

Deprecated (kept for ~1 week shadow then teardown)

When Was Now Status
Daily 8:00pm launchd com.casey.warehouse-checkin (evening_checkin.py) Replaced by Worker runCheckin() shipped 2026-05-04, run cloudflare/otq-checkin/teardown-laptop.sh after 7d
8:30/9:30/6:30am launchd com.casey.warehouse-listener (telegram_listener.py, polling) Replaced by Worker webhook (push) same
Daily 8pm UTC GitHub Actions evening-checkin.yml Replaced by Worker runCheckin() rename to .disabled + commit when retiring

Inspect / manage

# Active launchd jobs:
launchctl list | grep com.casey

# Reload after editing a plist:
launchctl unload ~/Library/LaunchAgents/com.casey.<job>.plist
launchctl load ~/Library/LaunchAgents/com.casey.<job>.plist

# Cloudflare crons (registered on each wrangler deploy):
cd ~/garmin-warehouse/cloudflare/otq-checkin && grep -A4 '"crons"' wrangler.jsonc

# Worker live tail:
cd ~/garmin-warehouse/cloudflare/otq-checkin && npx wrangler tail

Wake-from-sleep

Mac must be awake at trigger time for launchd jobs. pmset repeat wakeorpoweron MTWRFSU 6:55:00 schedules wake before the 7am sync if the lid is closed. Worker is NOT subject to this — runs in CF's edge.

Quiet-hours guard

daily_sync.sh has a built-in 5am-11pm guard to defeat launchd's missed-wake recovery. If the Mac was asleep at 7am and wakes at 1am, launchd auto-fires the job — without the guard, that kicks off garmindb downloads + kb embedding off-schedule. Override with FORCE_RUN=1.

Notifications

daily_sync.sh and podcast-sync.sh both send notifications on completion (Telegram + Resend email). See systems memory.