Alexandre Corne AL personal routines

AL personal routines

Personal automations — crons, routines & events

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.

How to update this page
  • Source: ~/Projects/alexandrecorne-tools/public/alpersoroutines.html (GitHub: alexandrecorne/alexandrecorne-tools)
  • Deploy: cd ~/Projects/alexandrecorne-tools && npm run deploy:prod
  • Each new personal routine/cron/event: add a <details class="robot"> block in the right category and mirror it in the Notion Dashboard.
  • Categories: Cron (red, mechanical, zero-token), Routine (purple, Claude Code scheduled task), Event (blue, hooks / page loads / webhooks), Database (green, persistent personal data tables).
CRONS1 card · CF Worker

weekly-review-preprocess

Sunday 09:00 · Europe/Paris

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".

Cron0 7 * * SUN (UTC, ≈ 09:00 Paris)
TypeCF Worker scheduled — lives in eo-backup-worker (reuses D1 + Resend + Notion infra)
Source~/Projects/eo-backup-worker/src/personal-ops.js · runPersonalOpsPreprocess()
D1 tablesops_morning_checkins (read) · ops_weekly_reviews (write draft) · ops_decisions
OutputNotion DRAFT page under Dashboard AL + email to alexandre.corne.ac@gmail.com
Manual triggerPOST /admin/ops-preprocess-now?token=$BACKUP_HEALTH_TOKEN
Statusactive · next run: Sunday May 10, 09:00
Created2026-05-06
ROUTINES3 cards · LaunchAgents + Claude Code

downloads-weekly-cleanup

Sunday 09:02 · Europe/Paris

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.

CronStartCalendarInterval Weekday=0 Hour=9 Minute=2 (native macOS — catches up at next login if Mac was off)
TypemacOS 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 endpointPOST /api/cleanup-reports/upload on tools.alexandrecorne.com (CF Access service token + Bearer token, defense-in-depth)
StorageD1 metadata in cleanup_reports table + R2 markdown blob in ac-cleanup-reports/cleanup-reports/YYYY-MM-DD.md
Manual triggerlaunchctl kickstart -k gui/$(id -u)/com.eo.downloads-cleanup
Statusactive
Created2026-05-07 · migrated to LaunchAgent 2026-05-22 (more reliable, reports persisted to /cleanup-reports)

apple-notes-weekly-cleanup

Sunday 09:05 · Europe/Paris

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).

CronStartCalendarInterval Weekday=0 Hour=9 Minute=5 (3 min après downloads-cleanup à 09:02)
TypemacOS 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 AppleNotes (folder racine) — exclut Recently Deleted + 2 IDs blacklist (p2819, p2353 = failed reads 22/05)
Notion targetDatabase AL > Apple Note (data_source_id 117c9f31-ae27-4791-a3bb-12aae1d32a9b), via Notion API key (ntn150426 integration)
Migration modeDumb 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 rulesNotes whose name contains "Fred" or "Manou" or "manou" (case-insensitive) → trashed directly, no migration (per user rule 2026-05-22).
Manual triggerlaunchctl kickstart -k gui/$(id -u)/com.eo.apple-notes-cleanup
Statusactive
Created2026-05-22 (suite au big-bang one-shot migration de 26 notes Apple → 49 rows Notion le même jour)

danang-events

Was Sunday 19:00 · disabled

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.

TypeWas a Claude Code scheduled task (routine). Scheduled task deleted + SKILL.md removed from disk on 2026-06-29.
Was0 19 * * SUN · Asia/Ho_Chi_Minh · automatic weekly run
PromptNow the single source of truth in Notion: Prompt agent · Da Nang Weekly Events (child of the DaNang page). No more .md.
Trigger nowManual / on-demand only. AL tells Claude Code "run le prompt de la page Notion DaNang" (or "danang-events") in chat.
OutputNotion page Events DaNang · semaine du {date} under the DaNang page.
Why disabledEvent sources are anti-bot (403) so unattended auto-runs produced thin pages; AL prefers on-demand runs (often paired with manual scraps).
Statusdisabled · no auto-run
Created2026-06-29 · disabled same day (moved to on-demand from Notion)
EVENTS8 cards · hooks, calendar & UI hooks

danang-map-notion-sync

On-demand · "Refresh from Notion" button

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.

TriggerManual button on /maps + automatic on page load. No schedule.
EndpointGET /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 sourceDatabase 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 sourceStatic 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 keyNormalized place name (lowercase, đ→d, strip accents + parentheticals). Unmatched markers show "Not rated".
AuthWhole domain behind Cloudflare Access; Notion via server secret NOTION_API_KEY (integration shared with the DB).
Statusactive
Created2026-07-08

monthly-expense-summary

Manual ping · ~7th of each month

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).

TypeManual trigger — AL opens Claude Code, pastes the 5 inputs and the prompt from the Notion template
Tracking fileGoogle Sheet · AL Monthly Expenses Follow-Up — Claude Code writes the new 26-Mois tab in place
Prompt + inputsNotion · Template Bilan Mensuel Dépenses — single source of truth for the prompt, the 5 inputs and the recurring-subs map
Output schemaTab 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)
Statusactive
Created2026-05-19

morning-checkin-hook

First Claude Code open · daily

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.

TypeClaude 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)
PersistencePOST /ops/checkin on eo-backup-worker → table ops_morning_checkins
Statusactive
Created2026-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")
VisibilityDaily input rate visible on tools.eliteoutsiders.com/weekly-business-steering (last 14 days with greyed "no check-in" rows + density pill % input rate)

sunday-review-hook

First Claude Code open Sunday (+ retry)

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.

TypeClaude Code SessionStart hook (local Mac)
Source~/.claude/hooks/sunday-review.sh
Stamps~/.claude/.last_sunday_review_offered · ~/.claude/.sunday_review_deferred
LogicSunday: fire if not yet offered. "later" → retry after 12h. Mon-Sat: fire in catch-up mode if previous Sunday is still in draft.
EndpointsGET /ops/review · POST /ops/review/finalize · POST /ops/decision
Statusactive
Created2026-05-06

gcal-morning-checklist

06:00 daily · Europe/Paris

Daily Google Calendar popup reminding the 7 morning rules. Primary reminder. Backed up by a native macOS notification (LaunchAgent) at the same time.

TypeRecurring Google Calendar event (RRULE FREQ=DAILY) · popup at T-0
Event IDq2koiptgh0p2nlie935g3fbjl4
Calendaral@eliteoutsiders.com
Backup notifmacOS 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).
Statusactive

gcal-weekly-review-midnight

Sunday 00:00 · Europe/Paris

Sunday-midnight calendar popup reminding to open Claude Code for the weekly review. If AL is still working, ignore — the noon popup runs again.

TypeRecurring Google Calendar event (RRULE FREQ=WEEKLY;BYDAY=SU) · popup at T-0
Event ID1ngcke3jk9chrboctcf1rcumoc
Calendaral@eliteoutsiders.com
Statusactive · next: Sunday May 10, 00:00
Created2026-05-06

gcal-weekly-review-noon

Sunday 12:00 · Europe/Paris

Second Sunday-noon calendar popup as a safety net if the midnight one was ignored. Catches the weekly review.

TypeRecurring Google Calendar event (RRULE FREQ=WEEKLY;BYDAY=SU) · popup at T-0
Event IDce79deuu6e1lqstqm76tc1f9jg
Calendaral@eliteoutsiders.com
Statusactive · next: Sunday May 10, 12:00
Created2026-05-06

eisenhower-archive-on-delete

X-delete on /alsboard · per click

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.

TypeBrowser-side fetch fired by the X-delete handler in /alsboard (deleteTask + deleteBacklogTask). Non-blocking, keepalive:true.
EndpointPOST /api/admin/eisenhower-archive (CF Access gated)
D1 tableeisenhower_archive (migration 0042) — columns: id, task_text, quadrant 1–4, source (matrix or backlog), tags_json, notes, archived_at
Read viewtools.eliteoutsiders.com/eisenhower-traceability
Statusactive
Created2026-05-08
DATABASES2 cards · personal data