
Sixty containers on one server
One bare-metal box runs dozens to hundreds of Hoody containers. KSM and BTRFS dedup make the marginal cost near zero.
The hourly metrics export has been failing for three days. You're on call tonight. PATCH the managed cron entry with enabled:false — the schedule, the command, the comment all stay. The job is in a defined state: present and muted, waiting for someone to fix it.
{ "enabled": false, "comment": "reindex flaking — see thread" }
the toggle is just a PATCH · the entry never leaves the list
Hoody Cron's managed entries are a JSON resource: each row has an id, a schedule, a command, a comment, and an enabled flag. Flipping enabled to false is one PATCH. The entry stays in the crontab so the next person can read it and decide what to do.
# mute the flaky entry — entry stays in the crontab curl -X PATCH \ https://cron.containers.hoody.com/users/me/entries/e7d3 \ -H "Content-Type: application/json" \ -d '["enabled": false, "comment": "flaking on monday with prod-db — see #pager"]' # response HTTP/1.1 200 OK { "id":"e7d3", "enabled":false, "schedule":"0 * * * *", "command":"/srv/cron/metrics-export.sh", ... }
# the entry is still on the list — just not running curl GET https://cron.containers.hoody.com/users/me/entries HTTP/1.1 200 OK [ { "id":"a1f2", "enabled":true, ... }, { "id":"e7d3", "enabled":false, "comment":"flaking — see #pager" }, { "id":"9b21", "enabled":true, ... } ] # present and muted — the on-call hand-off has somewhere to point
The PATCH does not delete, rewrite, or move the entry — it flips one boolean. Hand-off is one line: 'metrics-export entry e7d3 is muted, see hoody-cron, please look.'
An entry on a Hoody crontab is always in exactly one of three states. Each state has different consequences for who knows what tomorrow morning.
The entry is in the crontab and the kernel cron daemon picks it up every hour. Failures wake on-call. This is the default for healthy jobs.
enabled:false. The entry is still in the crontab so the team can read its schedule, command, and comment. The cron daemon skips it. No 2am page tomorrow, no one forgets it exists.
Once you DELETE, the schedule, the command, the comment, the reason — all of it leaves the crontab. The next on-call has nothing to grep. Mute is the choice that keeps the memory.
Mute is the middle state most schedulers don't have a name for. Hoody Cron does, because enabled is a first-class field on the managed entry.
When you can't fix a job tonight, the question is what shape its absence takes by tomorrow. Mute makes that shape readable.
Instead of pasting a Slack thread or a deleted-line PR, the message is the entry id. Tomorrow's on-call opens the cron URL, reads the comment, and knows where to start.
GET /entries returns enabled:false alongside the comment. Build an audit panel by filtering. Who muted it, why, and how long ago is in the JSON, not in someone's DMs.
When the underlying issue is fixed, one more PATCH with enabled:true puts the entry back on schedule. No rewriting the cron expression, no risk of typos, no commit-and-deploy cycle.
Numbers come from the Hoody Cron managed-entries surface, not invented benchmarks.
PATCH /users/[user]/entries/[id] accepts a partial body. Send ["enabled":false] alone — schedule, command, and comment are untouched.
Five-field schedule, command, comment, expires_at, and id all persist across the mute. The kernel crontab still reflects the entry — just commented out by the cron service.
No file edit, no PR, no deploy. The mute round-trip is one HTTP call from any terminal, including the one on your phone.
Per the Hoody Cron Managed Entries API: each entry carries an enabled boolean alongside schedule, command, comment, and optional expires_at. PATCH accepts partial bodies.
Disabled isn't deleted — the entry waits for someone to fix it.
The usual ways teams 'temporarily' park a flaky cron line. Each one is either destructive, lossy, or two PRs away from production.
Stop deleting flaky jobs at 2am. Mute them, leave a note, and let tomorrow's on-call read the JSON.