Appearance
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:17585The 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> # deleteconfig.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 jobsExample: 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 localRequirements for scheduled jobs
- The Hermes scheduler running (the gateway/daemon keeps it alive).
- Ollama running with the model loaded (
OLLAMA_KEEP_ALIVE=-1). - 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.