launchd jobs
Build a launchd job (LaunchAgent or LaunchDaemon) from a form, or paste one to have it explained and checked; turn crontab lines into StartCalendarInterval, see the next run times and what happens if the Mac sleeps through one, and get the launchctl bootstrap/bootout/enable/kickstart/print commands.
Added
Works with
- Cron expression tool TimeSend to launchd opens a crontab schedule here as StartCalendarInterval, and Open in the cron tool goes back
How to use it
On a Mac, cron still exists but launchd runs everything: it starts your agents when you log in and
system daemons at boot, keeps them alive, and fires them on timers, file changes and sockets. Each
job is a property list, and most of the ways to get one wrong — a command with spaces in one
string, a ~ nobody expands, a schedule without a Minute that fires sixty times an hour — produce
no error at all. This page writes the plist for you, or reads yours and says what it will actually
do.
How to use it
-
Pick the kind of job at the top. An agent runs as you while you’re logged in (
~/Library/LaunchAgents, or/Library/LaunchAgentsfor every user); a daemon runs at boot as root or a user you name (/Library/LaunchDaemons). Give it a reverse-DNS label. -
Build: type the command, choose when it runs — at load, kept alive (always, until it succeeds, after a crash), every N seconds, or on calendar schedules — and where its output goes. The plain English summary, the checks and the plist update as you type. Download the plist, or copy it.
-
Explain a plist: paste a job (XML, JSON or old-style; open a binary one as a file) and say where it lives. You get a summary, every key explained, and checks: unknown or misspelt keys (
RunAtLod,Weekdays), wrong types (<string>true</string>), relative programs that launchd won’t find on its shortPATH, shell syntax inProgramArguments,~in paths, decimalUmaskvalues that were meant as octal,UserNamein an agent, paths in privacy-protected folders, and more. Edit in the builder carries it over. -
From crontab: paste lines from
crontab -l. launchd takes one number per key, so ranges, lists and steps are multiplied out into an array of dictionaries; day-of-month and day-of-week stay an OR, as in cron. It also says what doesn’t carry over:@rebootbecomesRunAtLoad,%in a command,MAILTO,CRON_TZ, and Quartz-styleL,Wand#. -
Schedule & sleep: the next run times in your time zone, and what a night’s sleep does to them.
StartCalendarIntervaljobs that were due while the Mac slept run once on wake (several missed runs become one);StartIntervalfirings are just lost; cron skips them; nothing catches up after a shutdown. -
launchctl: the commands to install, load (
bootstrap), enable, run now (kickstart), inspect (print,blame), reload after an edit, stop, and remove the job — for an agent ingui/$UID, or a daemon insystemwithsudo— and the legacyload/unloadequivalents. Below them, what the usual errors mean (Bootstrap failed: 5: Input/output error, exit code 78, 126/127). -
Keys lists every
launchd.plistkey with what it does, deprecated ones last.
The page never talks to launchd; it only prints commands for you to run.
From and to the cron tool
The cron expression tool has a Send to launchd button for any five-field schedule: it opens here in From crontab with the schedule already in the builder. The other way, Open in the cron tool next to each converted line shows that schedule there. Linux’s equivalent of a launchd timer is a systemd timer — server config builds those. To look inside or convert any property list, use property lists and defaults.
Checked against
The key descriptions follow launchd.plist(5) and launchctl(1) from macOS 27. Every plist the
builder writes passes plutil -lint (the tests generate a range of jobs and lint them). The cron
conversion uses the same parser as the cron tool. Jobs were not loaded into a real launchd while
building this page, so the behaviour notes (sleep coalescing, throttling, ownership rules) come from
Apple’s documentation rather than from experiments.
Feedback is a gift. Something to improve, a feature to add, or a bug? Tell me.
Runs entirely in your browser; nothing you type leaves this page.