A Hermes agent cron job is a scheduled task that the Hermes gateway fires on its own, in a fresh agent session, and delivers to wherever you tell it.
The current docs add two controls I set on every job now: a way to stop a run that's already going, and a per-job rule for runs the scheduler missed.
Below is the exact order I'd set one up in, with the commands, the config keys and the traps.
If you want my team to look at what's worth scheduling in your business first, book a free SEO strategy session.
What Hermes Actually Runs When A Job Fires
Every job lives in ~/.hermes/cron/jobs.json.
The official cron docs say the gateway ticks the scheduler every 60 seconds.
On each tick it checks next_run_at, starts a fresh agent session for each due job, loads any attached skills, runs the prompt to completion and delivers the final response.
Then it writes the run metadata and the next scheduled time.
A file lock at ~/.hermes/cron/.tick.lock stops two ticks from double-running the same batch.
One tool handles all of it on the agent side: cronjob_manage.
That's why you can create, pause, edit and remove jobs just by asking Hermes in plain language.
Step 1: Install The Gateway As A Service First
No gateway, no cron.
Agent jobs execute inside the gateway, so if it's down, nothing fires.
hermes gateway install
sudo hermes gateway install --system # Linux boot-time service for servers
hermes cron status
The second line is for a server that should start Hermes at boot.
hermes cron status tells you whether the scheduler is alive, when it last ticked, and which job runs next.
Do this before you write a single job, because a schedule that depends on a terminal window staying open isn't a schedule.
Step 2: Create The Job From Chat, CLI Or Plain English
You get three doors into the same tool.
# In chat
/cron add "every 2h" "Check server status"
# Standalone CLI
hermes cron create "0 7 * * 1-5" "Morning brief" --name morning-brief
# Or just ask
Every weekday at 7am, summarise my inbox and send it to Telegram.
I use the CLI for anything I'll edit later, because I can name it.
Names matter more than they look.
Every mutating verb, including pause, run, cancel and remove, accepts the job name instead of the hex ID.
If two jobs share a name, Hermes refuses and prints both IDs, so it never changes the wrong one.
Step 3: Match The Schedule Format To The Work
Hermes reads four kinds of schedule.
| Format | Example | Repeats |
|---|---|---|
| Relative delay | in 30m | Once |
| Interval | every 2h | Until removed |
| Natural day and time | weekdays at 9am | Until removed |
| Cron expression | 0 9 * * 1-5 | Until removed |
An ISO timestamp such as 2026-03-15T09:00:00 also works for a one-time fire.
Here's the gotcha: the missed-run settings in Step 7 only apply to cron expressions.
Natural forms like weekdays at 9am compile to cron expressions internally, so they count.
A bare interval like every 2h doesn't, because it has no wall clock to miss.
Need a job pinned to another market's clock? Add --timezone America/New_York and the expression reads in that zone, across its daylight-saving changes.
Step 4: Pin The Model And Reasoning Effort Per Job
At fire time, Hermes resolves the model in this order: the per-job pin, then cron.model in config, then your main chat model.
Leave a job unpinned and it follows whatever hermes model is set to when it fires.
That surprises people who switch chat models and then wonder why the nightly job changed.
hermes cron edit morning-brief --pin
hermes cron edit weekly-review --provider <provider> --model <model> --reasoning-effort high
hermes config set cron.model <model>
Reasoning effort is a separate pin, with levels from none to ultra.
The docs deliberately keep it off the agent's tool, so only you can change it.
One more trap: a pinned job never walks your fallback_providers chain.
If you want fallback, leave the job unpinned and set cron.model instead.
🔥 Want my Hermes agent cron job setups ready to copy? Inside the AI Profit Boardroom you get step-by-step video trainings, the installable Agent OS with Hermes wired in, four coaching calls a week and 3,400+ members running scheduled agents. → Join the AI Profit Boardroom
Step 5: Point The Output At A Channel You Read
The final response goes to the job's deliver target automatically.
The agent doesn't send messages itself, so don't write "send this to Slack" into the prompt.
Set the target instead.
hermes cron edit morning-brief --deliver telegram
# or several at once
hermes cron edit morning-brief --deliver "telegram,discord"
The delivery options table covers origin, local files, Telegram, Discord, Slack, WhatsApp, email, SMS and more.
all fans out to every connected home channel, resolved at fire time.
From the CLI the default is local, which saves to ~/.hermes/cron/output/ and pings nobody.
That's fine for a test and useless for a morning brief.
Step 6: Launch It Paused As A Canary
I never let a new job's first run be a surprise.
hermes cron create "every 1h" "Post the digest" --paused --paused-reason "Awaiting review"
hermes cron run <job>
hermes cron resume <job>
The safe canary section says --paused writes the job disabled in its first locked write, with no create-then-pause race.
A manual run still works on a paused job, because it's an operator override.
Fire it by hand, read the output, tighten the prompt, then resume.
Step 7: Choose The Missed-Run Rule Before You Need It
Laptops sleep and gateways restart.
By default, a recurring job that missed its slot during an outage catches up once when the scheduler is back.
A long outage collapses into a single run, not one per missed slot.
The catch-up window is half the job's period, clamped between 2 minutes and 2 hours.
Override it per job with --grace-minutes, from 0 to 1440.
hermes cron edit market-open --grace-minutes 0 # never catch up
hermes cron edit market-open --grace-minutes 180 # run up to 3h late
hermes cron edit morning-brief --catch-up off # a stale brief is useless
hermes cron edit invoice-check --catch-up on # always run once on return
In the Desktop job editor the same choice sits under Missed runs: Use the default, Run once when back, or Skip them.
--catch-up on beats --grace-minutes.
The grace decides when a run counts as missed, and the job still runs once for it.
One-shots keep a 120-second grace, so a reminder missed by more than that is dropped unless you set --catch-up on.
Every skipped or collapsed slot shows as a missed ×N row in hermes cron runs.
How To Stop A Run That's Already Going
Pause only stops future fires.
A run that's already wedged on a slow API keeps going until it finishes or times out.
That's what cancel is for.
hermes cron cancel morning-brief --reason "wedged on the staging API"
The stop-a-run docs spell out what happens next.
- The schedule is untouched, and the next fire happens as planned.
- Script jobs get the whole process tree terminated, SIGTERM first, then SIGKILL after a grace period.
- Agent jobs get the in-flight turn interrupted at the next checkpoint.
- The run books a cancelled row with your reason.
- No failure notice goes out, and the failure streak doesn't move.
In the Desktop, a job with a run in flight shows Stop in its header.
It reads Stopping… until the cancelled row is booked, then a Run cancelled toast confirms it.
The same stop exists as POST /api/cron/jobs/{id}/cancel and as the agent's cancel action.
Removing a job stops its live run too, booked with the reason "job removed while running".
The one thing cancel won't do is roll back what the run already did, so a half-sent batch stays half-sent.
Pause One Job Or Pause The Whole Fleet
hermes cron pause <job> keeps one job but stops scheduling it.
hermes pause is the global emergency stop, and hermes resume lifts it.
The global pause docs say no scheduled fire starts while it's engaged, and due work catches up on the first tick after you resume.
Two details catch people out.
Runs already in flight are never killed by a global pause, so pair it with cancel if one is misbehaving.
And manual runs still execute while paused, since they count as an operator override.
📞 Want a second pair of eyes on what to automate? Book a free SEO strategy session and my team will map the scheduled jobs that actually move your traffic and leads. → Book your free strategy session
The Three Health Checks I Run Every Week
hermes cron status
hermes cron doctor
hermes cron runs morning-brief --limit 20
status flags any job whose next_run_at passed more than 15 minutes ago as OVERDUE.
That's the signature of a scheduler that stopped ticking, and the fix is hermes gateway restart.
The doctor command is read-only and exits 1 while any finding stands, so it works as a watchdog.
It reports failed runs, failed deliveries, late or caught-up dispatches, missing scripts and workdirs that no longer exist.
runs reads the execution ledger, where cancelled and missed ×N rows show up next to normal ones.
Gotchas That Make Cron Look Broken
Most "cron isn't working" reports come down to five things.
- Vague prompts. Each run starts in a fresh session, so "check on that server issue" means nothing to it. Put the host, the command and the success check in the prompt.
- Blocked config. Before any model call, the scheduler checks the API key, skills, delivery targets and named MCP servers. A failure sets
blocked_config, sends one alert and spends no tokens. - Cron creating cron. Scheduled runs can't manage jobs unless you set
cron.allow_agent_scheduling: true. - No project context. Jobs run detached from any repo. Pass
--workdir /absolute/pathto load that folder's AGENTS.md and run tools there. - Fat toolsets. Set
enabled_toolsetsper job so a news summary doesn't carry the browser and terminal schemas on every call.
The automatic re-runs after 5, 15 and 30 minutes for a fire that never reached the model shipped in the v0.22.0 release, so update first if you're on something older.
Track later changes on the Hermes releases page.
The config.yaml Block I Start Every Install With
cron:
model: <your-cron-model>
catch_up_missed: true
failure_nudge_threshold: 3
failure_repeat_alert_hours: 6
script_timeout_seconds: 1800
allow_agent_scheduling: false
Each key is from the docs.
failure_nudge_threshold: 3 is the default, and it adds a "fix, pause or remove" nudge after three failed runs in a row.
failure_repeat_alert_hours sends one reminder if the same error is still there after that many hours, instead of a ping every run.
The script timeout defaults to 3600 seconds, and I halve it so a stuck watchdog surfaces sooner.
Ending a quiet monitor's reply with [SILENT] suppresses delivery on healthy runs, while failed runs always deliver.
🔥 Get the Agent OS with these cron jobs already scheduled Inside the AI Profit Boardroom you get the installable Agent OS, step-by-step video trainings on Hermes scheduling, four live coaching calls a week and 3,400+ members to compare setups with. → Join the AI Profit Boardroom
Your First Job, Start To Finish
Here's the whole sequence in one block.
hermes gateway install
hermes cron create "0 7 * * 1-5" "Read my three industry feeds, list what changed since yesterday, max 5 bullets." \
--name morning-brief --deliver telegram --continuity --paused
hermes cron run morning-brief
hermes cron edit morning-brief --catch-up off
hermes cron resume morning-brief
hermes cron doctor
--continuity feeds the previous run's output back in, so the brief can skip what it already told you.
Run it once by hand, read it, then let it go live.
Also On Our Network
- 🌐 Three small-business jobs to schedule, and the two safety rules to set first
- 🌐 An eight-row scorecard of Hermes scheduling and the final 8.3 verdict
- 🌐 Five prompts that make your agent schedule, stop and repair its own jobs
- 🌐 Which AI model to pin to each scheduled job, by real GoldieBench scores
- 🌐 The complete Hermes Agent Cron Job guide on the AI Profit Boardroom blog
FAQ: Hermes Agent Cron Job
How do I stop a Hermes cron job that is already running?
Run hermes cron cancel with the job name or ID, optionally with --reason. In the Desktop, press Stop in the job header and wait for the Run cancelled toast.
Does cancelling a run change the job's schedule?
No. The job stays enabled and its next fire happens as planned. Only the current run stops.
What does --grace-minutes 0 do?
It tells Hermes never to catch up a missed occurrence of that job. It only applies to cron-expression schedules, not intervals or one-shots.
Why did my cron job switch models on its own?
An unpinned job runs on your main model at the moment it fires. Pin it with hermes cron edit --pin, or set cron.model for the whole fleet.
Why is my job marked Overdue?
Its next run passed more than 15 minutes ago without firing, which usually means the scheduler stopped ticking. Restart the gateway or run the job by hand.
📺 Video notes + links to the tools 👉
🎥 Learn how I make these videos 👉
🆓 Get a FREE AI Course + Community + 1,000 AI Agents 👉
About Julian
I'm Julian Goldie, an SEO entrepreneur, author and founder of the AI Profit Boardroom, which has 3,400+ members.
I help business owners scale with AI agents, automation and SEO.
- I've built a 7-figure SEO and link building agency, Goldie Agency, with a team of 70+ SEO experts.
- I've grown a YouTube channel to 400,000+ subscribers.
- I wrote "Link Building Mastery".
- My Udemy courses have taught over 29,000 students.
→ Get my best AI training inside the AI Profit Boardroom
Install the gateway now, create one paused job, and if you want my team to pick the jobs that pay off first, book a free strategy session and bring your first Hermes agent cron job with you.











