Cron & webhooks
The conceptual side of this is in the manual. This page is the commands.
Listing
nouride cron # scheduled and enablednouride cron --all # including disablednouride cron runs <id> # this job's historyCreating
nouride cron add --name <name> \ (--at 2h | --every 15m | --cron "0 9 * * *") \ --gateway <id> --chat <id> \ [--agent <id>] \ [--message <prompt> | --text <message> | --command <shell>] \ [--then agent] [--session fresh|isolated|chat] [--tz <zone>] [--quiet] [--keep]--at 2h / --at <timestamp> | once |
--every 15m | an interval |
--cron "0 9 * * *" | a crontab expression |
--tz <zone> | which clock the expression is read against. Defaults to [daemon] timezone |
--gateway <id> --chat <id> | required — where the result goes |
--agent <id> | which agent owns it |
--message <prompt> | wake the agent with this. One turn, with tools |
--text <message> | plain text, no model call, no cost |
--command <shell> | run a shell line, no model call |
--then agent | …and have the agent read its output |
--session | fresh (default, no history), isolated (its own thread), chat (the target chat’s) |
--quiet | do not announce the run |
--keep | keep a one-shot after it fires |
--command is run through sh -lc, because an operator typing it means a shell line rather than an
argv.
Examples
# A reminder. Costs nothing — no model is called.nouride cron add --name standup --cron "0 9 * * 1-5" --tz Asia/Jakarta \ --gateway telegram:nouva --chat 123456789 \ --text "Standup in 15 minutes."
# A check with judgement attached.nouride cron add --name disk --every 6h \ --gateway telegram:nouva --chat 123456789 --agent nox \ --command "df -h /" --then agent
# A job that remembers its own past runs, and nothing else.nouride cron add --name inbox --cron "0 8 * * *" \ --gateway telegram:nouva --chat 123456789 --agent nouva \ --session isolated \ --message "Check what came in overnight and tell me what needs me."Changing and running
nouride cron update <id> [--name …] [--at|--every|--cron …] [--tz <zone>] [--text|--message …]nouride cron run <id> # fire it nownouride cron enable <id> # also clears a job disabled by its failure streaknouride cron disable <id>nouride cron rm <id>Webhooks
An endpoint that runs a job when something calls it.
nouride webhook # what exists, with URLsnouride webhook add --name <name> --agent <id> --gateway <id> --chat <id> \ [--message <prompt> | --text <message>] [--session fresh|isolated|chat]nouride webhook rotate <id> # issue a new URL; the old one stops workingUse nouride cron for rm, enable, disable, run and runs — they are the same jobs.
There is no --command for a webhook. A webhook is reachable by anything that learns its URL, and
an endpoint that runs argv on the host is a remote shell with a long password.
The guardrails
[cron]enabled = truemin_interval_ms = 60000 # floor on a recurring schedulemax_jobs = 100 # across every agentfail_streak_limit = 10 # consecutive failures before a job disables itselfcatchup_window_ms = 3600000 # how late an overdue job may still firerun_retention_days = 14command_timeout_ms = 600000unattended_approval = "auto" # auto | denymin_interval_ms is not a performance guard. It is the difference between an agent scheduling a
check and an agent scheduling a loop of provider calls.
catchup_window_ms is why a daemon down for three days does not come back with three days of
reminders: outside the window a recurring job moves to its next occurrence and a one-shot is recorded
as missed.
unattended_approval decides what happens when a scheduled turn needs an approval nobody is there to
give. Approvals →
Background jobs are not scheduled jobs
nouride jobs lists work an agent started during a turn — a long build, a slow script.
nouride jobsnouride jobs log <id>nouride jobs kill <id>When one finishes it wakes the agent that started it, and [agents] job_wake_max_chain bounds how
many times that can happen with no human in between.