Skip to content

Scheduled tasks (cron)

Hermes has a built-in scheduler for recurring jobs. Combined with local models and messaging gateways, you can run scheduled work entirely on your hardware.

Why cron + local Hermes

  • Morning briefing compiled offline from local files.
  • Nightly backup verification script.
  • Weekly docs build check.
  • Scheduled log analysis on a home server.

No cloud API needed for the agent itself (messaging delivery may need network).

How jobs are created

You don't hand-write job YAML. Jobs are created through the cronjob tool and stored as JSON under ~/.hermes/cron/. There are three ways to make one:

1. Natural language (the agent creates it for you):

text
Every morning at 9am, scan ~/Projects/FDE for repos with uncommitted
changes and save a summary locally.

2. CLI:

bash
hermes cron create "0 9 * * *" "Scan ~/Projects/FDE for repos with uncommitted changes and summarize" --name "morning-scan"

3. Slash command inside a session:

text
/cron add "0 9 * * *" "Scan ~/Projects/FDE for uncommitted changes and summarize"

Schedule formats

The schedule accepts:

  • Relative delay: "30m", "2h", "1d"
  • Interval: "every 2h", "every monday 9am"
  • 5-field cron: "0 9 * * *" (minute hour day month weekday)
  • ISO timestamp: "2026-07-01T09:00:00"

Natural language like "daily at 9am" works when you ask the agent conversationally, but the CLI/slash flag wants one of the formats above; use "0 9 * * *" there.

Delivery: the --deliver flag

Where results go is controlled by --deliver (CLI) or the job's deliver field, not a delivery: config block:

bash
# Save to a local file (default on CLI): ~/.hermes/cron/output/
hermes cron create "0 22 * * *" "Summarize today's git activity in ~/Projects" --deliver local

# Send to your Telegram home channel
hermes cron create "0 8 * * 1-5" "Morning project briefing" --deliver telegram

# Send to a specific Telegram chat / topic thread
hermes cron create "0 8 * * *" "Briefing" --deliver telegram:-1001234567890
hermes cron create "0 8 * * *" "Briefing" --deliver telegram:-1001234567890:17585

The agent's final response is delivered automatically; you do not need to ask it to "send a message" in the prompt. For a fully offline job, use --deliver local.

Managing jobs

bash
hermes cron list            # list jobs (--all includes disabled)
hermes cron status          # scheduler status
hermes cron run <id>        # trigger on next tick (good for testing)
hermes cron edit <id>       # change schedule, prompt, or delivery
hermes cron pause <id>      # / resume <id>
hermes cron remove <id>     # delete

config.yaml: scheduler settings only

The cron: block in config.yaml tunes scheduler behavior, not individual jobs:

yaml
cron:
  wrap_response: false          # add a header/footer frame to deliveries
  script_timeout_seconds: 300   # timeout for --script jobs

Example: nightly project scan (local delivery)

bash
hermes cron create "0 22 * * *" \
  "Scan ~/Projects/FDE for git repos with uncommitted changes. List repo name, branch, and number of changed files. Keep it under 20 lines." \
  --name "nightly-scan" --deliver local

Requirements for scheduled jobs

  1. The Hermes scheduler running (the gateway/daemon keeps it alive).
  2. Ollama running with the model loaded (OLLAMA_KEEP_ALIVE=-1).
  3. Enough time for local inference (schedule during idle hours).

Tips

  • Keep cron prompts specific and bounded.
  • Test with hermes cron run <id> before relying on the schedule.
  • Start weekly, then move to daily once reliable.
  • Local Qwen 3.5 models take minutes per job; schedule accordingly.

Next: Messaging gateways.

Personal learning notes on Hermes Agent. Not affiliated with Nous Research. Verify against official docs.