
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.
A traditional cron line runs reconcile.sh at 2am. A Hoody cron line POSTs a prompt to hoody-agent. The schedule is fixed. The work isn't. Edge cases stop being branches you maintain — they become context the agent reasons about.
five mornings · five different decisions · one crontab line
Hoody Cron is a managed crontab on every container. Hoody Agent is a built-in autonomous agent on the same container. The cron entry curls the agent. The agent reads the date, reads the data, and decides what the day requires. Both surfaces are HTTP — the cron lives at /api/v1/cron/users/me/entries, the agent at /api/v1/agent/tasks. There is no glue code between them.
# POST /api/v1/cron/users/me/entries { "schedule": "0 7 * * *", "command": "curl -X POST $AGENT/api/v1/agent/tasks \ -d @prompt.json", "comment": "morning-reports" }
# prompt.json — the body of the POST { "description": "Reconcile yesterday’s orders. Remap if schema drifted. Halt and page on-call if anomaly score > 3. If today is the last day of the month, include monthly close on the tax-adjusted ledger.", "mode": "code" }
Two POSTs and you are done. The crontab line never changes again — the only file you maintain is the prompt. New edge case? Add a sentence. New anomaly rule? Add a sentence. The schedule keeps firing; the agent figures out what each firing means.
The shape of the work the agent receives is always the same — a date, a dataset, a goal. What changes is what the agent decides to do about them.
The agent runs after the cron fires. It checks the calendar — month-end, holiday, fiscal close. It samples the dataset — schema, volume, anomaly score. It picks the next action with that context, not from a static if-tree you wrote six months ago.
When yesterday's export adds a refund_reason column, a script breaks and pages you. The agent reads the schema, maps it to the legacy field, and notes the change in the run summary. The crontab line never had to know.
Each run posts back what the agent decided and why. The history is plain English — "skipped: no new data", "adapted: refund column added", "anomaly: refund spike +412%, paged on-call" — not exit code 0 / exit code 1. The cron's logs become a journal.
Three steps — the cron fires, the agent reasons, the decision lands. The middle step is the one you used to write yourself in a 400-line shell script with seventeen edge-case branches. Now it's a prompt.
Hoody Cron runs the entry. The crontab line is one curl: POST /api/v1/agent/tasks with the prompt body. No retries written by you, no logging plumbing — the cron service injects the entry into the system crontab and tracks the run.
The agent receives the description, opens its tools — terminal, files, sqlite, browser, exec — and picks an action plan. It might run, skip, adapt, or page. The picks change daily. The instructions don't.
The run finishes. The agent posts a summary line back: regenerated reports, skipped because no new data, halted on anomaly. You read it on your phone with breakfast.
The schedule didn't change. The script didn't change. What changed is whether you, the human, had to wake up to handle it. With the agent in the loop, the answer is almost always no — and the run history tells you why.
Hoody Cron and Hoody Agent are two services on the same container, both reachable as HTTP. Numbers come from the documented surfaces — not from invented benchmarks.
One curl in the crontab, forever. The prompt body is the only thing you ever rewrite — and you do it in a JSON file, not by running crontab -e.
hoody-agent exposes the full surface — terminal exec, file read/write, sqlite query, browser automation, daemon control — to the agent's task as plain HTTP calls.
No SDK between the cron and the agent. POST one URL, read another. Both services live on the same container, so the call is local-network fast.
Hoody Cron supports standard 5-field expressions (* * * * *) and macros (@hourly, @daily, @weekly, @monthly, @yearly). Hoody Agent task creation is one POST /api/v1/agent/tasks; live updates stream over /api/v1/agent/ws.
The cron entry doesn't run the job — it asks an agent to figure out the job.
The set of things you used to write inside reconcile.sh because cron only knew how to run files. Each one is a branch, a flag, a config — none of which the schedule actually needs to know about. The agent reads the day and decides.
Stop maintaining cron scripts. Start maintaining prompts. The schedule fires; the agent figures it out.