Field notes · AI agents, Hermes & Claude Code By Julian Goldie

Hermes Agent Cron Job: Set One Up In 7 Steps, Stop A Stuck Run And Pick The Missed-Run Rule

Seven steps from gateway to live job, plus the two new controls: Stop for a run in flight and a per-job rule for missed runs.

Get The AI Profit Stack Join AIPB →
  • 01 1,000+ done-for-you AI agent workflows
  • 02 5 live coaching calls / week with me
  • 03 7-day refund, cancel anytime
  • 04 3,400+ AI operators inside

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.

FormatExampleRepeats
Relative delayin 30mOnce
Intervalevery 2hUntil removed
Natural day and timeweekdays at 9amUntil removed
Cron expression0 9 * * 1-5Until 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/path to load that folder's AGENTS.md and run tools there.
  • Fat toolsets. Set enabled_toolsets per 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

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.

§ Field reports

Real wins from inside the AI Profit Boardroom

See all 3,400+ members →
AIPB member win screenshot AIPB member win screenshot AIPB member win screenshot AIPB member win screenshot AIPB member win screenshot AIPB member win screenshot AIPB member win screenshot AIPB member win screenshot AIPB member win screenshot AIPB member win screenshot AIPB member win screenshot AIPB member win screenshot

Scroll sideways →

⚑ Next step

Ready to run AI agents that actually do the work?

Join 3,400+ operators inside the AI Profit Boardroom. Get 1,000+ plug-and-play AI agent workflows, 5 coaching calls a week, and a community that holds you accountable.

Join The AI Agent Community →

7-day no-questions refund · Cancel anytime

Found this useful? Get more of this site in your Google.

One tap adds us as a preferred source — Google then shows you our posts more often in Search, Top Stories, and AI Overviews.

← Back to all posts