Cron Jobs & Scheduled Tasks

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

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