byForja Tools · Scheduled tasks

Scheduled tasks

byForja automation surface · what runs, when, and whether it is really alive
27-08-2026—UPDATE

What this page is. Every automation that runs on its own for byForja, with the schedule it actually fires on, what it does, the file that holds the code, and whether it is really running. One page like this exists on each of the four intranets.

Worker code: ~/Projects/byforja-backup-worker/ and ~/Projects/byforja-cron-purge/. Deployed at byforja-backup-worker.alexandre-corne-ac.workers.dev and byforja-cron-purge.alexandre-corne-ac.workers.dev.

Status is measured, not declared. Every schedule below was read back from the Cloudflare schedules API on 27/08/2026, not copied from the wrangler.toml files. A cron declared locally and never deployed shows up as dormant, which is exactly how two dead robots were found on the Elite Outsiders side.

Sister pages: tools.bycaliber.work/crons · tools.eliteoutsiders.com/crons · tools.alexandrecorne.com/crons.

Active = trigger confirmed live, it fires on its ownDormant = the code exists, nothing calls it on a scheduleDead = it ran once, or it will never run againRead on 27/08/2026 from the local wrangler.toml files, the Cloudflare schedules API, launchd, the Claude Code task list and the n8n API
Cloudflare Workers9 crons, 2 workers
ScheduleWhat it doesSource fileReal statusRun
0 2 1 * *
1st of month, 02:00 UTC
Archives the previous month of the events table to R2 byforja-backups, then deletes those rows from D1. Backup first: an R2 failure blocks the DELETE, so nothing is lost. The DELETE cutoff is the start of the current month, which is why the retention purge no longer carries an events clause.~/Projects/byforja-backup-worker/src/events-archive.jsActiveTrigger confirmed live on the Cloudflare schedules API on 27/08/2026.
0 3 1 * *
1st of month, 03:00 UTC
Dumps every business table of D1 byforja into a single SQL file (CREATE TABLE plus one INSERT per row) and uploads it to R2 byforja-backups under YYYY-MM/.~/Projects/byforja-backup-worker/src/index.js (runBackup)ActiveTrigger confirmed live on 27/08/2026. The retention purge used to run at this exact minute on the same database and was moved to 05:00 the same day.
0 4 * * 1
Monday, 04:00 UTC
Fetches byforja.com/sitemap.xml, walks every public page and extracts every clickable element (links, buttons, [role="button"], [data-track-id]). Upserts page_inventory and button_inventory. If the sitemap fetch fails, the stale cleanup is skipped so nothing is wiped by accident.~/Projects/byforja-backup-worker/src/page-flow-crawl.jsActiveTrigger confirmed live on 27/08/2026.
0 4 1 * *
1st of month, 04:00 UTC
Builds its baseline from byforja.com/sitemap.xml, crawls each URL and buckets the results: 200 and 3xx are fine, 4xx warn, 5xx and network failures are errors. Mails only when something is off.~/Projects/byforja-backup-worker/src/url-audit.jsActiveTrigger confirmed live on 27/08/2026. Runs one hour after the backup on purpose, so the crawl does not compete with the R2 upload.
0 5 1 1,7 *
1st of January and July, 05:00 UTC
Counts rows per analytics table and per event type, then writes the snapshot back so the analytics map page reflects reality twice a year.~/Projects/byforja-backup-worker/src/analytics-map-refresh.jsActiveTrigger confirmed live on 27/08/2026. Next run 01/01/2027.
0 6 * * *
Every day, 06:00 UTC
Reads error_events over the last 24 hours plus the KPI thresholds. Sends one consolidated mail if anything is breached, and stays completely silent otherwise.~/Projects/byforja-backup-worker/src/error-events-watchdog.jsActiveTrigger confirmed live on 27/08/2026. Silence is the normal state, so an outage of this robot looks exactly like a healthy day. Use the button to prove it still answers.
0 8 * * 1
Monday, 08:00 UTC
Weekly snapshot: 7 day counters, delta against the previous 7 days, top paths, sent by mail. Runs four hours after the page-flow crawler so the report leans on a fresh inventory.~/Projects/byforja-backup-worker/src/weekly-snapshot.jsActiveTrigger confirmed live on 27/08/2026.
0 * * * *
Every hour
Outreach follow-up sender for touches T2, T4 and T5. For each prospect with a live sequence it works out which touch is due, checks it is that prospect's local 08:00 to 09:00 window on a Tuesday or a Thursday, then runs a dual stop check (a Cal.com booking under their email, or a last message coming from the prospect). Only if all of that clears does it send, inside the existing Gmail thread. T3 is never sent by this robot. An empty draft is skipped, not an error.~/Projects/byforja-backup-worker/src/gmail-followup.jsActiveTrigger confirmed live on 27/08/2026. Real sends require both LIVE_SEND = "true" in wrangler.toml and the Gmail secrets. Either one missing means dry run, no exceptions.
0 5 1 * *
1st of month, 05:00 UTC
GDPR retention purge. Deletes kit_email_opens rows older than 180 days, which is the six month promise made on the public privacy page.~/Projects/byforja-cron-purge/src/index.jsActive, no-opTwo changes on 27/08/2026. The schedule moved off 0 3 1 * *, which was the exact minute byforja-backup-worker dumps the same database to R2. And the events clause was removed: the archive at 02:00 already deletes everything older than the current month, so a 730 day cutoff could never match a row. What is left has nothing to do today either: the table kit_email_opens does not exist in D1 byforja. Confirmed by the worker's own dry run on 27/08/2026.
Local Mac robots (launchd)0
No launchd agent on AL's Mac touches byForja. The six agents installed there serve Elite Outsiders and alexandrecorne.com. Listed on their own intranets.
Claude Code routines1
ScheduleWhat it doesSource fileReal status
0 8 * * 1,4
Monday and Thursday, 08:00 local
Reads the three CRM databases in Notion, one per vertical, and produces the bi-weekly brief: clients, prospects, leads, with the rows that need attention called out. byForja is one of the three verticals it covers.~/.claude/scheduled-tasks/crm-brief-biweekly/SKILL.mdActiveLast run 24/08/2026. A Claude Code task runs on this Mac only, and only while a Claude Code app is open. If the Mac is off at 08:00 it fires on the next launch.
n8n workflows (VPS)1, dormant
ScheduleWhat it doesSource fileReal status
Every day, 09:30
Europe/Paris
Video auto-publisher for byForja. Also reachable through the webhook byforja-videos-trigger.n8n on the Hostinger VPS, workflow <code>[byForja] Video Auto-Publisher</code>DormantThe workflow carries a daily schedule trigger but the workflow itself is switched off in n8n, so the trigger never fires. Read from the n8n API on 27/08/2026.