The night shift
Everything on /skills waits to be called. These don't. They run on a schedule whether I'm at the desk, asleep, or out — and most of the time I only find out because an email is waiting.
They work when I don't
The dashboard says 2.3% of everything I've ever logged happens between 3am and 8am. That window is sleep — my quietest hour is 5am, at a fifth of one percent.
4 of these run inside exactly that window. The database gets backed up, the memory gets compacted, and the morning briefing is written and sent — all before I'm awake to ask for any of it.
pi-db-backup claude-maintenance pi-scout pi-reminder-check The schedule
systemd user timers — not cron. systemctl --user list-timers
tells me what ran, what failed and what's next, which beats reading a log.
| When | Unit | What it does |
|---|---|---|
| 03:00 daily | pi-db-backup | Pi Database Backup (claude_memory -> R2, encrypted) |
| 04:00 daily | claude-maintenance | Claude Data nightly maintenance (dedup, stale, embeddings, distillation) |
| 07:00 daily | pi-scout | Content Scout — fetch, generate briefing, and email |
| 08:00 daily | pi-reminder-check | Reminder Scanner — check pending reminders and notify |
| 09:00 daily | pi-yay-check | Pi Yay Update Checker |
| 10:00 daily | pi-cf-cost-check | Pi Cloudflare Cost/Usage Monitor |
| Sun 12:00 weekly | pi-git-digest | Weekly git digest — scan repos and email summary |
| every 6h | cc-update-check | Claude Code Update Checker |
| monthly, 06:00 | claude-insights | Generate Claude Code monthly insights report |
| 00:00 daily | create-daily-note | Create daily note for Obsidian vault |
Always on
Not scheduled — resident. These poll continuously and act on what arrives.
pi-ask-daemon Pi ask@ email daemon (15s poll)
pi-claude-daemon Pi claude@ email daemon (30s poll, queue + ntfy)
pi-lead-daemon Pi lead intelligence daemon (15s poll)
How it's wired
The runner
A separate agent — Pi —
with its own skill tree under
~/.pi/agent/skills/. Same idea as
my Claude Code skills, different runtime: each timer points at a
script, the script calls the model, the result gets emailed or
pushed to ntfy.
Nothing here runs inside Claude Code. That's the distinction — I never invoke these.
The models
Deliberately not the same vendor I use interactively. Claude does the building; these run on OpenAI models, sized to the job:
-
gpt-5.6-sol - the scout's reasoning pass
-
gpt-4.1-mini - classification and filtering
-
gpt-4o-mini - cheap bulk summarisation
Unattended work is mostly filtering and summarising. It does not need a frontier model, and paying for one on a timer would be careless.
The 7am briefing
pi-scout
is the one I'd miss. Every morning it pulls the Cloudflare and Astro
changelogs, filters them against what I actually run, and emails a
briefing — starred if it touches my stack, ignored if it doesn't.
It has been doing this for 78 mornings. It is, functionally, a newsletter with one subscriber, written by a machine that knows what I use.