# SneakerPicks Cron Jobs # All TS scripts load .env via: export $(grep -v "^#" .env | xargs) # Logs: /var/log/sneakerpicks/ # ENV loader shorthand SHELL=/bin/bash ENVLOAD=export $(grep -v "^#" /var/www/sneakerpicks/.env | xargs) # 00:30 - Aggregate daily stats 30 0 * * * cd /var/www/sneakerpicks && export $(grep -v "^#" .env | xargs) && npx tsx scripts/aggregate-stats.ts >> /var/log/sneakerpicks/stats.log 2>&1 # 01:00 - Nightly feed sync (Python) + bol.com 0 1 * * * cd /var/www/sneakerpicks && bash scripts/nightly-sync.sh >> /var/log/sneakerpicks/nightly-sync.log 2>&1 # 01:30 - Compute popularity scores (after nightly-sync updates clicks_7d) 30 1 * * * cd /var/www/sneakerpicks && export $(grep -v "^#" .env | xargs) && npx tsx scripts/compute-popularity.ts >> /var/log/sneakerpicks/popularity.log 2>&1 # Every 4 hours - Revenue sync (Webgains, Awin, TradeTracker) 0 */4 * * * cd /var/www/sneakerpicks && export $(grep -v "^#" .env | xargs) && npx tsx scripts/sync-revenue.ts >> /var/log/sneakerpicks/revenue-sync.log 2>&1 # 06:00 - Update homepage sections 0 6 * * * cd /var/www/sneakerpicks && export $(grep -v "^#" .env | xargs) && npx tsx scripts/update-homepage.ts >> /var/log/sneakerpicks/update-homepage.log 2>&1 # 06:15 - Auto-deals (find price drops) 15 6 * * * cd /var/www/sneakerpicks && export $(grep -v "^#" .env | xargs) && npx tsx scripts/update-deals.ts >> /var/log/sneakerpicks/update-deals.log 2>&1 # 07:00 Monday - Weekly deals generation 0 7 * * 1 cd /var/www/sneakerpicks && export $(grep -v "^#" .env | xargs) && npx tsx scripts/generate-weekly-deals.ts >> /var/log/sneakerpicks/weekly-deals.log 2>&1 # 03:00 - Generate Klaviyo catalog feed JSON (nightly, after feed sync has updated prices) # Klaviyo auto-syncs every 6h from https://sneakerpicks.nl/feeds/klaviyo-catalog.json 0 3 * * * cd /var/www/sneakerpicks && export $(grep -v "^#" .env | xargs) && npx tsx scripts/generate-klaviyo-feed.ts >> /var/log/sneakerpicks/klaviyo-feed.log 2>&1 # 07:30 - Compute taste profiles (daily, before price alerts) 30 7 * * * cd /var/www/sneakerpicks && export $(grep -v "^#" .env | xargs) && npx tsx scripts/compute-taste-profiles.ts >> /var/log/sneakerpicks/taste-profiles.log 2>&1 # 07:31 - Sync taste profiles to Klaviyo (daily) 31 7 * * * cd /var/www/sneakerpicks && export $(grep -v "^#" .env | xargs) && npx tsx scripts/sync-klaviyo-profiles.ts >> /var/log/sneakerpicks/sync-klaviyo-profiles.log 2>&1 # 08:00 - Price alerts check 0 8 * * * cd /var/www/sneakerpicks && export $(grep -v "^#" .env | xargs) && npx tsx scripts/check-price-alerts.ts >> /var/log/sneakerpicks/price-alerts.log 2>&1 # 09:00 Monday - Watchlist digest emails (Klaviyo event) 0 9 * * 1 cd /var/www/sneakerpicks && export $(grep -v "^#" .env | xargs) && npx tsx scripts/send-watchlist-digest.ts >> /var/log/sneakerpicks/watchlist-digest.log 2>&1 # 10:00 Monday - Best Deals weekly (personalized Klaviyo event, after watchlist digest) 0 10 * * 1 cd /var/www/sneakerpicks && export $(grep -v "^#" .env | xargs) && npx tsx scripts/send-best-deals.ts >> /var/log/sneakerpicks/best-deals.log 2>&1 # 10:00 Tuesday & Friday - New Release alerts (Klaviyo event for followed brands) 0 10 * * 2,5 cd /var/www/sneakerpicks && export $(grep -v "^#" .env | xargs) && npx tsx scripts/send-new-releases.ts >> /var/log/sneakerpicks/new-releases.log 2>&1 # --- DISABLED: scripts that don't exist yet --- # 00:45 - DB backup (TODO: create nightly-backup.sh) # 45 0 * * * cd /var/www/sneakerpicks && bash scripts/nightly-backup.sh >> /var/log/sneakerpicks/backup.log 2>&1 # 05:45 - Sitemaps (standalone, also runs in nightly-sync) 45 5 * * * cd /var/www/sneakerpicks && python3 scripts/generate-sitemaps.py >> /var/log/sneakerpicks/sitemaps.log 2>&1 # 05:50 - llms.txt + llms-full.txt (AI-readable site content) 50 5 * * * cd /var/www/sneakerpicks && python3 scripts/generate-llms-txt.py >> /var/log/sneakerpicks/llms-txt.log 2>&1 # 09:00 - Auto-publish blogs 0 9 * * * cd /var/www/sneakerpicks && export $(grep -v "^#" .env | xargs) && npx tsx scripts/auto-publish-blogs.ts >> /var/log/sneakerpicks/auto-publish-blogs.log 2>&1 # 09:15 - IndexNow ping for newly published blogs 15 9 * * * cd /var/www/sneakerpicks && export $(grep -v "^#" .env | xargs) && npx tsx scripts/submit-indexnow.ts --blogs-only >> /var/log/sneakerpicks/indexnow.log 2>&1 # Blog generation scripts (TODO: create scripts/blog/) # 0 10 1 * * bash /var/www/sneakerpicks/scripts/blog/run-blog-scripts.sh top >> /var/log/sneakerpicks-blog.log 2>&1 # 0 5 * * 1 bash /var/www/sneakerpicks/scripts/blog/run-weekly-generator.sh >> /var/log/sneakerpicks/blog-generator.log 2>&1 # 0 7 * * 1 bash /var/www/sneakerpicks/scripts/blog/run-blog-scripts.sh deals >> /var/log/sneakerpicks-blog.log 2>&1 # 0 8 1 * * bash /var/www/sneakerpicks/scripts/blog/run-blog-scripts.sh releases >> /var/log/sneakerpicks-blog.log 2>&1 # 0 9 1 * * bash /var/www/sneakerpicks/scripts/blog/run-blog-scripts.sh trending >> /var/log/sneakerpicks-blog.log 2>&1 # 02:30 - Overnight cutout processing (birefnet-general quality, low CPU priority) 30 2 * * * cd /var/www/sneakerpicks && nice -n 19 python3 scripts/rembg-direct.py --batch 500 --model birefnet-general --priority p1 --delay 0.5 >> /var/log/sneakerpicks/rembg.log 2>&1