Cron Jobs
Schedule tasks to run automatically with natural language or cron expressions. Hermes exposes cron management through a single cronjob tool with action-style operations.
Cron-run sessions cannot recursively create more cron jobs. Hermes disables cron management tools inside cron executions to prevent runaway scheduling loops.
What Cron Can Do
Section titled “What Cron Can Do”Cron jobs can:
- Schedule one-shot or recurring tasks
- Pause, resume, edit, trigger, and remove jobs
- Attach zero, one, or multiple skills to a job
- Deliver results back to the origin chat, local files, or configured platform targets
- Run in fresh agent sessions with the normal static tool list
- Run in no-agent mode — a script on a schedule, its stdout delivered verbatim, zero LLM involvement
Creating Scheduled Tasks
Section titled “Creating Scheduled Tasks”In chat with /cron
Section titled “In chat with /cron”/cron add 30m "Remind me to check the build"
/cron add "every 2h" "Check server status"
/cron add "every 1h" "Summarize new feed items" --skill blogwatcher
/cron add "every 1h" "Use both skills and combine the result" --skill blogwatcher --skill mapsFrom the standalone CLI
Section titled “From the standalone CLI”hermes cron create "every 2h" "Check server status"
hermes cron create "every 1h" "Summarize new feed items" --skill blogwatcher
hermes cron create "every 1h" "Use both skills and combine the result" \ --skill blogwatcher \ --skill maps \ --name "Skill combo"Through natural conversation
Section titled “Through natural conversation”Ask Hermes normally:
Every morning at 9am, check Hacker News for AI news and send me a summary on Telegram.Skill-backed Cron Jobs
Section titled “Skill-backed Cron Jobs”A cron job can load one or more skills before it runs the prompt.
Single skill
Section titled “Single skill”cronjob( action="create", skill="blogwatcher", prompt="Check the configured feeds and summarize anything new.", schedule="0 9 * * *", name="Morning feeds",)Multiple skills
Section titled “Multiple skills”Skills are loaded in order. The prompt becomes the task instruction layered on top of those skills.
cronjob( action="create", skills=["blogwatcher", "maps"], prompt="Look for new local events and interesting nearby places, then combine them into one short brief.", schedule="every 6h", name="Local brief",)Lifecycle Actions
Section titled “Lifecycle Actions”/cron list/cron pause <job_id>/cron resume <job_id>/cron run <job_id>/cron remove <job_id>Standalone CLI
Section titled “Standalone CLI”hermes cron listhermes cron pause <job_id>hermes cron resume <job_id>hermes cron run <job_id>hermes cron remove <job_id>hermes cron statushermes cron tickWhat they do:
pause— keep the job but stop scheduling itresume— re-enable the job and compute the next future runrun— trigger the job on the next scheduler tickremove— delete it entirely
How It Works
Section titled “How It Works”Cron execution is handled by the gateway daemon. The gateway ticks the scheduler every 60 seconds, running any due jobs in isolated agent sessions.
hermes gateway install # Install as a user servicesudo hermes gateway install --system # Linux: boot-time system service for servershermes gateway # Or run in foregroundhermes cron listhermes cron statusDelivery Options
Section titled “Delivery Options”When scheduling jobs, you specify where the output goes:
| Option | Description | Example |
|---|---|---|
"origin" | Back to where the job was created | Default on messaging platforms |
"local" | Save to local files only (~/.hermes/cron/output/) | Default on CLI |
"telegram" | Telegram home channel | Uses TELEGRAM_HOME_CHANNEL |
"discord" | Discord home channel | Uses DISCORD_HOME_CHANNEL |
"slack" | Slack home channel | |
"email" | ||
"all" | Fan out to every connected home channel | Resolved at fire time |
The agent’s final response is automatically delivered. You do not need to call send_message in the cron prompt.
Silent Suppression
Section titled “Silent Suppression”If the agent’s final response starts with [SILENT], delivery is suppressed entirely:
Check if nginx is running. If everything is healthy, respond with only [SILENT].Otherwise, report the issue.No-Agent Mode (Script-Only Jobs)
Section titled “No-Agent Mode (Script-Only Jobs)”For recurring jobs that don’t need LLM reasoning — classic watchdogs, disk/memory alerts, heartbeats, CI pings:
hermes cron create "every 5m" \ --no-agent \ --script memory-watchdog.sh \ --deliver telegram \ --name "memory-watchdog"Semantics:
- Script stdout (trimmed) → delivered verbatim as the message
- Empty stdout → silent tick, no delivery
- Non-zero exit or timeout → an error alert is delivered
- No tokens, no model, no provider fallback
Schedule Formats
Section titled “Schedule Formats”Relative delays (one-shot)
Section titled “Relative delays (one-shot)”30m → Run once in 30 minutes2h → Run once in 2 hours1d → Run once in 1 dayCron expressions
Section titled “Cron expressions”0 9 * * * → Every day at 9:00 AM*/30 * * * * → Every 30 minutes0 */6 * * * → Every 6 hoursNatural language
Section titled “Natural language”every 2 hoursevery day at 9amevery Monday at 8amConfiguration
Section titled “Configuration”# In ~/.hermes/config.yamlcron: wrap_response: false # Deliver raw agent output without wrapper script_timeout_seconds: 300 # Pre-run script timeout (default: 120s)