All cron jobs, launchd agents, and persistent systemd services across every machine. Updated May 12, 2026.
Cron error routing: All cron scripts are wrapped with cron-gotify-wrapper.sh which captures stderr and pushes errors to Gotify at priority 5 (β Telegram). MAILTO="" is set in both hpve and CT100 crontabs to prevent local mail delivery.
Health check script updated Apr 18: now monitors nvmepool, Biggest, backups, offsite (was referencing retired pool names). CWA cleanup cron re-added to CT100.
Mac Studio (192.168.8.180)
User Crontab (crontab -e as bee)
| Schedule |
Command |
Purpose |
*/30 * * * * |
/Users/bee/Sync/ED/homelab/bee_hub/deploy-vps.sh |
Build Hugo site and rsync public/ to VPS nginx β every 30 min |
Homebrew Services
| Service |
Purpose |
Port |
syncthing |
Peer-to-peer file sync β hub-and-spoke via Proxmox |
22000 (sync), 8384 (UI, localhost only) |
launchd Agents (~/Library/LaunchAgents/)
Persistent services (RunAtLoad: true, KeepAlive: true):
| Plist |
Script/Binary |
Port |
Purpose |
com.beedifferent.embed-server |
~/Sync/ED/life_archive/embed_server.py |
1235 |
gte-Qwen2-7B embedding server on MPS |
com.beedifferent.hugo-hub |
/opt/homebrew/bin/hugo server |
1313 |
Bee Hub docs site on LAN |
com.beedifferent.life-archive-api |
~/Sync/ED/life_archive/http_api.py |
8900 |
Life Archive RAG FastAPI |
com.beedifferent.life-archive-mcp-http |
~/Sync/ED/life_archive/mcp_server_http.py |
8901 |
Life Archive MCP HTTP server |
Scheduled skills (Mac Studio ~/Sync/ED/skills/, managed via Claude Cowork) β use StartCalendarInterval, no KeepAlive:
| Plist |
Schedule |
Script |
Purpose |
com.bee.browser-history |
Daily 5:30 AM |
~/Sync/ED/skills/browser-history/scripts/analyze.py --days 90 |
Snapshot Brave history β ranked site report |
com.bee.mac-inventory |
Weekly Sun 6:00 AM |
~/Sync/ED/skills/mac-inventory/scripts/inventory.py |
Snapshot Homebrew, casks, App Store, launchd, login items |
com.bee.skills-index |
Daily 5:45 AM |
~/Sync/ED/skills/scripts/generate_index.py |
Walk ~/Sync/ED/skills/, regenerate SKILLS_INDEX.md |
com.edmd.check-telegram-bridge |
Every 30 min |
/Users/bee/Scripts/check-telegram-bridge.sh |
Check Gotify-Telegram bridge health via SSH; send iMessage alert to Ed if bridge is failing, recovery message when restored |
com.bee.doc-sync |
Daily 3:00 AM |
~/Sync/ED/skills/doc-sync/scripts/run.sh |
Read previous day’s Claude conversations, compare against TASKS.md + memory + .claude-context.md, patch them, send email summary via msmtp then Gotify. Auth: Reads ~/.config/anthropic-api-key (chmod 600, no trailing newline, no -n prefix β the script defensively strips -n since manual echo -n corrupted the file on 2026-05-24); Step 0 fail-fast precheck hits /v1/models and exits clean with a Gotify alert if 401 (instead of burning 5+ minutes on a 1 MB prompt). New steps 2026-07-13: Step 1b runs ledger_backfill.py (session-ledger stubs); Step 4c runs apply_changes.py --rotate-only (keeps bundle’s Recently-shipped at newest 15, overflow β .claude-context-archive.md); Step 6 now ARCHIVES the transcript bundle to .doc-sync-log/transcripts/YYYY-MM-DD.md (feeds the session-search MCP) instead of deleting it |
com.bee.mcp-health-check |
6Γ/day (06:15, 09:15, 12:15, 15:15, 18:15, 21:15) |
~/scripts/check-mcp-health.py |
Scan each MCP’s log in ~/Library/Logs/Claude/mcp-server-<name>.log for Server transport closed unexpectedly, connect-timeout, fetch-failed, [error] lines in the last 6 hours. Gotify-alert on any failure. State log at ~/Library/Logs/mcp-health-check.log |
com.bee.pull-homelab-config |
Daily 3:00 AM |
git -C ~/homelab-config pull --ff-only |
Pulls homelab-config repo (cloned from pve over SSH) to keep the Mac-side mirror fresh for git-semantic MCP queries. Pve writes the canonical copy via collect-configs.sh at 02:45 |
com.bee.rebuild-mcp-venvs |
WatchPath on ~/.mcp-servers/ (MacBook-side mostly) |
~/scripts/rebuild-mcp-venvs.sh |
When MCP server source files change via Syncthing, walk ~/.mcp-servers/, rebuild any .venv whose requirements.txt is newer than .venv/bin/python3. Prefers python3.14β3.13β3.12β3.11β3.10β3 |
com.bee.homelab-snapshot |
Every few minutes |
~/.mcp-servers/homelab-snapshot/snapshot.py |
Writes ~/Sync/ED/.homelab-snapshot.json with current zfs/docker/disk state. Read this file directly for state; faster than the MCP for known-stale-OK queries |
com.bee.copy-life-archive |
Daily 9 AM (self-disabling) |
rsync wrapper |
Copy life_archive_backup to Biggest pool. Self-disables after a successful run |
com.bee.ledger-backfill |
Daily 3:20 AM (shared β both Macs) |
~/Sync/ED/skills/doc-sync/scripts/ledger_backfill.py --apply |
Stub .claude-session-log/ entries for substantive Claude sessions (β₯2 real user messages) that never wrote a manual ledger entry. Coverage via **Session:** local_<id> line match, then time-window fallback. Added 2026-07-13 |
com.bee.check-invariants |
Daily 3:45 AM (Studio only) |
~/scripts/check-invariants.py |
“Fixed means fixed” assertion suite β 14 checks that past fixes still hold (DNS records, farm route, killswitch allowlist, tunnels, config symlink, zpool health, newt absence, farm FTLβ¦), each tagged with the original fix’s date. Gotify priority 6 on drift. --list to enumerate, --only <id> to re-test one. State JSON at ~/Library/Logs/check-invariants-state.json. Added 2026-07-13 |
launchctl list | grep -E 'beedifferent|com.bee'
launchctl kickstart -k gui/$(id -u)/com.beedifferent.hugo-hub
launchctl kickstart -k gui/$(id -u)/com.bee.skills-index
Proxmox VE Host (192.168.8.221)
Root Crontab
| Schedule |
Command |
Purpose |
*/15 * * * * |
system-health-check.sh |
Disk, ZFS, backup, USB monitoring β Gotify (wrapped: stderr β Gotify pri 5) |
0 1 * * * |
backup-nvmepool-nightly.sh |
rsync nvmepool β Biggest/nvmepool-backup (wrapped: stderr β Gotify pri 5) |
45 2 * * * |
collect-configs.sh |
Nightly git backup of all homelab configs to GitHub (wrapped). Fixed May 2026: PATH and SSH key issues |
0 3 1 * * |
zpool scrub Biggest |
Monthly scrub β 1st of month |
0 3 8 * * |
zpool scrub nvmepool |
Monthly scrub β 8th |
0 3 22 * * |
zpool scrub mediapool |
Monthly scrub β 22nd |
Removed / moved:
sync-mac.sh (daily 2am) β removed 2026-04-13, was failing with rsync error 12
sync-seedbox.sh (every 2 min) β removed 2026-04-13
seedbox-sync.sh (every 15 min) β moved to CT100 crontab
books-ingest-pipeline.sh (every 15 min) β moved to CT100 crontab
Lidarr MissingAlbumSearch (daily 4 AM) β removed
Systemd Services
| Service |
Purpose |
syncthing@root.service |
File sync hub β UI at :8384 |
netbird.service |
NetBird mesh VPN β replaces Pangolin |
transmission-tunnel.service |
SSH tunnel :13010 β seedbox Transmission RPC β required for *arr app download management |
Removed / inactive:
nzbget-tunnel.service β SSH tunnel :16789 β seedbox NZBGet (moved to CT100 as autossh-nzbget)
nzbhydra2-tunnel.service β SSH tunnel :15076 β seedbox NZBHydra2
deluge-tunnel.service β SSH tunnel :58846 β seedbox Deluge (SSL cert issue, never used)
qbit-tunnel.service β SSH tunnel :18080 β seedbox qBittorrent (Squid proxy blocks HTTP, never used)
ZFS Auto-Snapshots (Proxmox built-in)
| Frequency |
Keep |
| Every 15 min |
4 |
| Hourly |
24 |
| Daily |
31 |
| Weekly |
8 |
| Monthly |
12 |
Proxmox vzdump Backup
Daily 2:00 AM, all VMs/CTs, snapshot mode, zstd compression, 3 copies retained β /backups/dump
CT 100 β Docker Host (192.168.8.100)
Root Crontab
| Schedule |
Command |
Purpose |
*/5 * * * * |
kiwix-watcher.sh |
Kiwix content watcher |
*/5 * * * * |
check-socks-tunnel.sh |
Monitor SOCKS5 tunnel health |
*/15 * * * * |
seedbox-sync.sh |
Pull from seedbox β nzbget Music+Books + general complete (moved from hpve) |
*/15 * * * * |
books-ingest-pipeline.sh |
Move book files from seedbox ingest β CWA ingest folder (moved from hpve) |
*/30 * * * * |
beet-full-pipeline.sh |
Beets pipeline: import, tag, art (wrapped) |
30 2 * * * |
backup-farmdb.sh |
FarmDB pg_dump backup (wrapped) |
30 2 * * * |
backup-all-dbs.sh |
Backup all PostgreSQL databases |
30 0 * * * |
paperless-pgdump.sh |
Nightly pg_dump -Fc of the Paperless DB β /opt/paperless/pgdumps/ (keeps 7), so the 01:00 nvmepoolβBiggest vms rsync captures a consistent DB copy. Self-Gotifies on failure/suspect size. Added 2026-06-21 with the PaperlessβCT100 migration |
0 4 * * 0 |
docker system prune -a -f |
Weekly Docker cleanup β removes unused images, containers, networks. Logs to /var/log/docker-prune.log |
0 5 * * * |
clean-cwa-processed.sh |
Clean CWA processed_books older than 7 days (wrapped) |
Systemd Services
| Service |
Purpose |
docker.service |
Docker runtime for all containers |
autossh-socks.service |
autossh SOCKS5 :1080 β seedbox (NL exit) β legacy, replaced by WireGuard for most apps but still running |
autossh-transmission.service |
autossh tunnel :13010 β seedbox Transmission RPC β required for *arr app download management |
autossh-nzbget.service |
autossh tunnel :16789 β seedbox NZBGet β required for Usenet downloads |
wg-quick@wg0.service |
WireGuard tunnel to UltraCC NL β 45.86.221.26:13012. All Docker outbound exits via this tunnel. Persists boot via /etc/iptables/rules.v4 (kill-switch + MSS clamp). Added Apr 29 2026. See WireGuard tunnel |
SMB Shares (Proxmox, all in /etc/samba/smb.conf)
| Share |
Path |
Access |
| Review |
/Biggest/Maple |
read-write |
| Sync |
/nvmepool/sync |
read-only |
| Music |
/nvmepool/music |
read-write |
| Books |
/nvmepool/books |
read-write |
| Movies |
/nvmepool/movies |
read-write |
| Video |
/nvmepool/video |
read-write |
| Media Staging |
/Biggest/media-staging |
read-write |
| backups |
/backuppool |
read-only |
| nvmepool-backup |
/Biggest/nvmepool-backup |
read-only |
| Possible Delete |
/Biggest/Possible Delete |
read-write |
All shares: valid users = bee, no registry shares (migrated 2026-04-13).
Cowork Scheduled Tasks (Claude Desktop)
Managed in the Claude Desktop app under Settings β Scheduled Tasks. These run as Cowork sessions on the Mac Studio.
| Task |
Schedule |
Purpose |
daily-briefing |
Daily 4:00 AM |
Morning briefing β media imports, homelab health (via homelab-snapshot MCP + ~/Sync/ED/.homelab-snapshot.json fallback), seedbox queue, farm DB changes, backups (via ~/scripts/homelab-backup-status.py), weather (NWS), Uptime Kuma summary, dictation items, diary, tasks. Delivered to ~/Sync/ED/{todays,morning}-briefing.md + email via msmtp + Drafts note. *arr data via ~/scripts/arr-briefing-data.py (one clean SSH-Python-heredoc call instead of inline shell-string chains) |
claude-email-review |
Hourly |
Scan Gmail for actionable items, draft responses, flag urgent messages. Uses Gmail MCP connector (OAuth β may need re-auth periodically) |
process-dictation |
Hourly |
Transcribe new JPR voice recordings (Whisper large-v3 via mlx-whisper), parse dash-commands, extract tasks/observations/diary. Date-keyed by recording start time (from JPR folder name), never script-run time. No-content placeholder when run produces no narrative |
tana-mac-contacts-sync |
Weekly Sun 8:00 AM |
Sync Mac Contacts β Tana #contact nodes β Tana wins conflicts |
calendar-duplicate-cleanup |
Daily 7:07 AM |
Scan all Google Calendars for duplicate events (fuzzy venue-name normalization for Dawes / Licking Park District / trailing parens), delete extras |
weekly-review |
Weekly Sun 7:10 AM |
Strategic review (the daily briefing’s slower sibling): slipping ledger follow-ups, stale TASKS.md items, invariant-drift trend (reads check-invariants-state.json), secrets-rotation backlog, automation health, unconfirmed loose ends β From Claude book + email. Added 2026-07-13 |
farm-db-maintenance |
Weekly Sun ~6:30 AM |
farmdb integrity validate + USDA/iNat backfill + dup report via ~/scripts/farm-db-maintenance.py (Gotify only on issues) |
Gmail connector auth: The claude-email-review task uses an OAuth connector that expires periodically. When it fails, the Gotify-Telegram bridge sends an iMessage fallback alert. Re-authenticate in Claude Desktop β Settings β Connectors β Gmail.
Quick Reference β All Schedules
| Time |
Machine |
Job |
| Every 5 min |
CT 100 |
kiwix-watcher.sh |
| Every 5 min |
CT 100 |
check-socks-tunnel.sh β SOCKS5 tunnel health monitor |
| Every 15 min |
Proxmox |
system-health-check.sh |
| Every 15 min |
CT 100 |
seedbox-sync.sh β pull from seedbox (moved from hpve) |
| Every 15 min |
CT 100 |
books-ingest-pipeline.sh β seedbox books β CWA (moved from hpve) |
| Every 30 min |
CT 100 |
beet-full-pipeline.sh |
| Every 30 min |
Mac Studio |
deploy-vps.sh β hugo build + push |
| Every 30 min |
Mac Studio |
com.edmd.check-telegram-bridge β Telegram bridge health monitor + iMessage fallback |
| Hourly |
Proxmox |
ZFS hourly snapshot (keep 24) |
| Daily 12:30 AM |
CT 100 |
paperless-pgdump.sh β Paperless DB dump β /opt/paperless/pgdumps (before the 1 AM nvmepool backup) |
| Daily 1:00 AM |
Proxmox |
backup-nvmepool-nightly.sh |
| Daily 2:00 AM |
Proxmox |
vzdump β backup all VMs/CTs to Biggest/backups |
| Daily 2:30 AM |
CT 100 |
backup-farmdb.sh β pg_dump farmdb (Gotify wrapped) |
| Daily 2:30 AM |
CT 100 |
backup-all-dbs.sh β backup all PostgreSQL databases |
| Daily 2:45 AM |
Proxmox |
collect-configs.sh β git backup all configs to GitHub (wrapped) |
| Daily 3:00 AM |
Mac Studio |
backup-farmdb-gdrive.sh β pull dump, push to Google Drive |
| Daily 3:00 AM |
Mac Studio |
com.bee.doc-sync β Claude conversation drift detector |
| Daily 3:00 AM |
Mac Studio |
com.bee.pull-homelab-config β git pull –ff-only ~/homelab-config |
| Daily 3:20 AM |
Both Macs |
com.bee.ledger-backfill β stub missing session-ledger entries |
| Daily 3:45 AM |
Mac Studio |
com.bee.check-invariants β fixed-means-fixed assertion suite |
| Daily 4:00 AM |
Cowork |
daily-briefing β morning briefing |
| Daily 5:00 AM |
CT 100 |
clean-cwa-processed.sh |
| Daily 5:30 AM |
Mac Studio |
com.bee.browser-history β Brave history snapshot |
| Daily 5:45 AM |
Mac Studio |
com.bee.skills-index β regenerate SKILLS_INDEX.md |
| 6Γ/day at :15 |
Mac Studio |
com.bee.mcp-health-check β scan MCP logs for transport-closed / errors β Gotify |
| Daily 7:07 AM |
Cowork |
calendar-duplicate-cleanup β dedupe Google Calendar |
| Hourly |
Cowork |
claude-email-review β Gmail scan + draft responses |
| Hourly |
Cowork |
process-dictation β voice notes β structured tasks |
| Weekly Sun 4:00 AM |
CT 100 |
docker system prune -a -f β weekly Docker cleanup |
| Weekly Sun 6:00 AM |
Mac Studio |
com.bee.mac-inventory β installed-software snapshot |
| Weekly Sun 7:10 AM |
Cowork |
weekly-review β strategic review (follow-ups, stale tasks, invariant drift) |
| Weekly Sun 8:00 AM |
Cowork |
tana-mac-contacts-sync β sync Mac Contacts β Tana #contact nodes |
| Daily |
Proxmox |
ZFS daily snapshot (keep 31) |
| Weekly |
Proxmox |
ZFS weekly snapshot (keep 8) |
| 1st of month |
Proxmox |
zpool scrub Biggest |
| 8th of month |
Proxmox |
zpool scrub nvmepool |
| 22nd of month |
Proxmox |
zpool scrub mediapool |
| Monthly |
Proxmox |
ZFS monthly snapshot (keep 12) |