Skip to content

Cron & webhooks

The conceptual side of this is in the manual. This page is the commands.

Listing

Terminal window
nouride cron # scheduled and enabled
nouride cron --all # including disabled
nouride cron runs <id> # this job's history

Creating

Terminal window
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 15man 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
--sessionfresh (default, no history), isolated (its own thread), chat (the target chat’s)
--quietdo not announce the run
--keepkeep 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

Terminal window
# 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

Terminal window
nouride cron update <id> [--name …] [--at|--every|--cron …] [--tz <zone>] [--text|--message …]
nouride cron run <id> # fire it now
nouride cron enable <id> # also clears a job disabled by its failure streak
nouride cron disable <id>
nouride cron rm <id>

Webhooks

An endpoint that runs a job when something calls it.

Terminal window
nouride webhook # what exists, with URLs
nouride 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 working

Use 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 = true
min_interval_ms = 60000 # floor on a recurring schedule
max_jobs = 100 # across every agent
fail_streak_limit = 10 # consecutive failures before a job disables itself
catchup_window_ms = 3600000 # how late an overdue job may still fire
run_retention_days = 14
command_timeout_ms = 600000
unattended_approval = "auto" # auto | deny

min_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.

Terminal window
nouride jobs
nouride 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.