5 launchd Traps I Hit Running Claude Code Automation 24/7 on macOS A developer running 20 launchd jobs for Claude Code automation on macOS documented five traps encountered when scheduling tasks. The traps include cron being non-functional on modern macOS, unsupported periodic syntax in StartCalendarInterval, missing absolute paths for output logs, incorrect Label format, and PATH issues causing 'command not found' errors. Verified workarounds involve migrating to launchd with StartInterval, using absolute paths, and setting env.PATH in Claude's settings.json. In earlier posts I walked through a mechanism that auto-generates skills https://zenn.dev/bokuwalily/articles/self-growing-skills and context auditing https://zenn.dev/bokuwalily/articles/context-slimming . The whole point of these is to run them automatically at a fixed time every night — that's where the value comes from. Right now my setup has 20 launchd jobs running skill generation, context audits, a morning briefing generator, Vault ingestion, and more . The catch: setting up scheduled jobs on macOS is far trickier than you'd expect. This post covers the 5 traps I actually hit and fixed, along with verified workarounds . cron is dead on modern macOS You register a job with crontab -e and it never runs even once . That's the first trap. On modern macOS Sequoia and later the cron daemon effectively doesn't run, and jobs are silently skipped. You don't even get an error. Here's how to check whether it's alive. log show --predicate 'process == "cron"' --last 7d If this returns zero entries , cron isn't running. Just migrate to launchd . A launchd job looks like this plist.