This page lists everything that runs automatically on my personal stack (Mac, iCloud, folders, accounts outside EO).
For Elite Outsiders automations (eliteoutsiders.com, tools.eliteoutsiders.com, backups, monitoring), see tools.eliteoutsiders.com/crons.
Source of truth also tracked in Notion → Dashboard AL — Transformation 2026 → AL personal routines.
Cron = Cloudflare Workers cron or local launchd. Deterministic, server-side, zero LLM tokens. For mechanical jobs.
Routine = Claude Code scheduled task. Spawns a Claude session, costs tokens. For reasoning jobs.
Event = Application code fired on a user/system event (page load, hook, webhook). Not scheduled, no LLM.
Database = A personal data table maintained over time. Each entry below opens its full view in a new tab.
~/Projects/alexandrecorne-tools/public/alpersoroutines.html (GitHub: alexandrecorne/alexandrecorne-tools)cd ~/Projects/alexandrecorne-tools && npm run deploy:prod<details class="robot"> block in the right category and mirror it in the Notion Dashboard.Auto-prepares the weekly review draft for the 3 businesses (EO + AC + byForja). Reads the last 7 morning check-ins + 7-day numbers (visitors, bookings, purchases, revenue). Creates a Notion DRAFT page under Dashboard AL and emails "open Claude Code".
| Cron | 0 7 * * SUN (UTC, ≈ 09:00 Paris) |
|---|---|
| Type | CF Worker scheduled — lives in eo-backup-worker (reuses D1 + Resend + Notion infra) |
| Source | ~/Projects/eo-backup-worker/src/personal-ops.js · runPersonalOpsPreprocess() |
| D1 tables | ops_morning_checkins (read) · ops_weekly_reviews (write draft) · ops_decisions |
| Output | Notion DRAFT page under Dashboard AL + email to alexandre.corne.ac@gmail.com |
| Manual trigger | POST /admin/ops-preprocess-now?token=$BACKUP_HEALTH_TOKEN |
| Status | active · next run: Sunday May 10, 09:00 |
| Created | 2026-05-06 |
Weekly cleanup of both Downloads folders (local Mac + iCloud). Auto-sort into Trash / Admin YYYY / secrets / "à traiter" subfolder. Report POSTed to /cleanup-reports after each run + macOS notification.
| Cron | StartCalendarInterval Weekday=0 Hour=9 Minute=2 (native macOS — catches up at next login if Mac was off) |
|---|---|
| Type | macOS LaunchAgent (replaces previous Claude Code scheduled-task — unreliable since it required Claude Code to be open at the scheduled time) |
| Script | ~/Library/Application Support/eo/downloads-cleanup.py (deterministic Python, 450 LoC, no LLM) |
| LaunchAgent | ~/Library/LaunchAgents/com.eo.downloads-cleanup.plist |
| Versioned source | ~/Projects/alexandrecorne-tools/clients/launchagent/ (GitHub: alexandrecorne/alexandrecorne-tools) |
| Rules spec | ~/.claude/scheduled-tasks/downloads-weekly-cleanup/SKILL.md (canonical, deprecated as runner) |
| Targets | ~/Downloads + ~/Library/Mobile Documents/com~apple~CloudDocs/Downloads |
| Report endpoint | POST /api/cleanup-reports/upload on tools.alexandrecorne.com (CF Access service token + Bearer token, defense-in-depth) |
| Storage | D1 metadata in cleanup_reports table + R2 markdown blob in ac-cleanup-reports/cleanup-reports/YYYY-MM-DD.md |
| Manual trigger | launchctl kickstart -k gui/$(id -u)/com.eo.downloads-cleanup |
| Status | active |
| Created | 2026-05-07 · migrated to LaunchAgent 2026-05-22 (more reliable, reports persisted to /cleanup-reports) |
Garde-fou hebdo Apple Notes : détecte les notes actives accumulées (folder Notes), migre chaque note en 1 row "dumb" dans la database Notion AL > Apple Note (Status = "To process"), puis move la note dans la corbeille Apple Notes. macOS notif à la fin. L'user retraite manuellement dans Notion (digest multi-points si besoin).
| Cron | StartCalendarInterval Weekday=0 Hour=9 Minute=5 (3 min après downloads-cleanup à 09:02) |
|---|---|
| Type | macOS LaunchAgent (même pattern que downloads-cleanup) |
| Script | ~/Library/Application Support/eo/apple-notes-cleanup.py (deterministic Python, lit Apple Notes via osascript, écrit Notion via REST API) |
| LaunchAgent | ~/Library/LaunchAgents/com.eo.apple-notes-cleanup.plist |
| Versioned source | ~/Projects/alexandrecorne-tools/clients/launchagent/apple-notes-cleanup.py |
| Target folder Apple | Notes (folder racine) — exclut Recently Deleted + 2 IDs blacklist (p2819, p2353 = failed reads 22/05) |
| Notion target | Database AL > Apple Note (data_source_id 117c9f31-ae27-4791-a3bb-12aae1d32a9b), via Notion API key (ntn150426 integration) |
| Migration mode | Dumb 1 note = 1 row (titre + body brut HTML→Markdown). Type "To process". L'user retraite ensuite dans Notion (subdivise en multi-points si "à la rache"). |
| Skip rules | Notes whose name contains "Fred" or "Manou" or "manou" (case-insensitive) → trashed directly, no migration (per user rule 2026-05-22). |
| Manual trigger | launchctl kickstart -k gui/$(id -u)/com.eo.apple-notes-cleanup |
| Status | active |
| Created | 2026-05-22 (suite au big-bang one-shot migration de 26 notes Apple → 49 rows Notion le même jour) |
Weekly Da Nang nightlife digest (7-day filtered outings list written to a Notion page). The Sunday 19:00 auto-run is disabled: the prompt now lives in Notion and is triggered on demand. Kept here for the record.
| Type | Was a Claude Code scheduled task (routine). Scheduled task deleted + SKILL.md removed from disk on 2026-06-29. |
|---|---|
| Was | 0 19 * * SUN · Asia/Ho_Chi_Minh · automatic weekly run |
| Prompt | Now the single source of truth in Notion: Prompt agent · Da Nang Weekly Events (child of the DaNang page). No more .md. |
| Trigger now | Manual / on-demand only. AL tells Claude Code "run le prompt de la page Notion DaNang" (or "danang-events") in chat. |
| Output | Notion page Events DaNang · semaine du {date} under the DaNang page. |
| Why disabled | Event sources are anti-bot (403) so unattended auto-runs produced thin pages; AL prefers on-demand runs (often paired with manual scraps). |
| Status | disabled · no auto-run |
| Created | 2026-06-29 · disabled same day (moved to on-demand from Notion) |
The Da Nang map at /maps shows AL's live ratings from the Notion base Da Nang Visited Places. Pressing "Refresh from Notion" (or loading the page) pulls the latest scores/notes and overlays them onto the map markers, matched by place name. Read-only: the map never writes to Notion.
| Trigger | Manual button on /maps + automatic on page load. No schedule. |
|---|---|
| Endpoint | GET /api/maps/ratings (Pages Function, functions/api/maps/ratings.js) that proxies the Notion DB query server-side using the NOTION_API_KEY Pages secret. |
| Notion source | Database Da Nang Visited Places (id c5d0d910-4019-402b-82ed-1211ecbdb5b4), field Rating (X/5 select, 10/5 & 6/5 = top tier). Owned/structured by the chat session; Claude Code only reads it. |
| Geo source | Static JSON in public/data/danang_{coffeeshops,bars}_map.json (coordinates, place_id, open_late, Rick's flag). New places appear once added to the JSON. |
| Match key | Normalized place name (lowercase, đ→d, strip accents + parentheticals). Unmatched markers show "Not rated". |
| Auth | Whole domain behind Cloudflare Access; Notion via server secret NOTION_API_KEY (integration shared with the DB). |
| Status | active |
| Created | 2026-07-08 |
Manual ping AL → Claude Code with 5 inputs (CA, Revolut Perso, Revolut Pro, PayPal, optional XLSX template). Claude Code categorises, web-searches obscure merchants, then writes the new month tab directly into the Google Sheet (no XLSX file output anymore).
| Type | Manual trigger — AL opens Claude Code, pastes the 5 inputs and the prompt from the Notion template |
|---|---|
| Tracking file | Google Sheet · AL Monthly Expenses Follow-Up — Claude Code writes the new 26-Mois tab in place |
| Prompt + inputs | Notion · Template Bilan Mensuel Dépenses — single source of truth for the prompt, the 5 inputs and the recurring-subs map |
| Output schema | Tab columns: Solde · Solde réel · Gains · Charges · Exceptions · Tabac · Loyer · Insurance · Phone sub. · Business · Perso · To update |
| Cadence | ~Monthly, on the 7th (or whenever AL closes the previous month) |
| Status | active |
| Created | 2026-05-19 |
Asks the 7 morning questions + day axis (leads / content / delivery) + business focus (EO / AC / byForja) + optional free note. Persists to D1 via the dedicated helper script. Fires once per day.
| Type | Claude Code SessionStart hook (local Mac) |
|---|---|
| Source | ~/.claude/hooks/morning-check.sh (orchestration prompt) · ~/.claude/hooks/record-checkin.sh (deterministic POST helper, validates 0/1 + enum, logs to ~/.claude/logs/morning-checkins.log) |
| Stamp | ~/.claude/.last_morning_check (last fire date) |
| Persistence | POST /ops/checkin on eo-backup-worker → table ops_morning_checkins |
| Status | active |
| Created | 2026-05-05 · extended 2026-05-06 (axis + persistence) · hardened 2026-05-19 (split into orchestration + dedicated record-checkin.sh helper — no more inline curl with placeholders, strict 0/1 + enum validation, exit code, local audit log, hook prompt now enforces "never end first turn without calling the helper") |
| Visibility | Daily input rate visible on tools.eliteoutsiders.com/weekly-business-steering (last 14 days with greyed "no check-in" rows + density pill % input rate) |
Orchestrates the weekly review dialogue: pulls the draft, asks the questions (sentiment, content, meetings, axes per business, decisions to track, priorities 7/14/21d), finalises in Notion. Defer-retry-at-noon logic.
| Type | Claude Code SessionStart hook (local Mac) |
|---|---|
| Source | ~/.claude/hooks/sunday-review.sh |
| Stamps | ~/.claude/.last_sunday_review_offered · ~/.claude/.sunday_review_deferred |
| Logic | Sunday: fire if not yet offered. "later" → retry after 12h. Mon-Sat: fire in catch-up mode if previous Sunday is still in draft. |
| Endpoints | GET /ops/review · POST /ops/review/finalize · POST /ops/decision |
| Status | active |
| Created | 2026-05-06 |
Daily Google Calendar popup reminding the 7 morning rules. Primary reminder. Backed up by a native macOS notification (LaunchAgent) at the same time.
| Type | Recurring Google Calendar event (RRULE FREQ=DAILY) · popup at T-0 |
|---|---|
| Event ID | q2koiptgh0p2nlie935g3fbjl4 |
| Calendar | al@eliteoutsiders.com |
| Backup notif | macOS LaunchAgent com.alexandrecorne.morning-checklist.plist at 06:00 → osascript display notification. Re-enabled 2026-05-19 (was disabled 2026-05-06 as unreliable, kept as soft redundancy since the actual D1 persistence happens via the Claude Code session hook later in the day, not at 06:00). |
| Status | active |
Sunday-midnight calendar popup reminding to open Claude Code for the weekly review. If AL is still working, ignore — the noon popup runs again.
| Type | Recurring Google Calendar event (RRULE FREQ=WEEKLY;BYDAY=SU) · popup at T-0 |
|---|---|
| Event ID | 1ngcke3jk9chrboctcf1rcumoc |
| Calendar | al@eliteoutsiders.com |
| Status | active · next: Sunday May 10, 00:00 |
| Created | 2026-05-06 |
Second Sunday-noon calendar popup as a safety net if the midnight one was ignored. Catches the weekly review.
| Type | Recurring Google Calendar event (RRULE FREQ=WEEKLY;BYDAY=SU) · popup at T-0 |
|---|---|
| Event ID | ce79deuu6e1lqstqm76tc1f9jg |
| Calendar | al@eliteoutsiders.com |
| Status | active · next: Sunday May 10, 12:00 |
| Created | 2026-05-06 |
Every task deleted from the Eisenhower Matrix or Backlog (X button) is archived in D1 before removal, so nothing is ever silently lost. Visible in the Eisenhower Matrix — Traceability database below.
| Type | Browser-side fetch fired by the X-delete handler in /alsboard (deleteTask + deleteBacklogTask). Non-blocking, keepalive:true. |
|---|---|
| Endpoint | POST /api/admin/eisenhower-archive (CF Access gated) |
| D1 table | eisenhower_archive (migration 0042) — columns: id, task_text, quadrant 1–4, source (matrix or backlog), tags_json, notes, archived_at |
| Read view | tools.eliteoutsiders.com/eisenhower-traceability |
| Status | active |
| Created | 2026-05-08 |