Schedule Tasks with Hermes Using Natural Language
Schedule Hermes Agent cron jobs safely: choose LLM-driven vs script-only jobs, pin delivery, avoid provider surprises, verify the result, and recover when scheduled delivery fails.
Quick answer
Use Hermes cron for scheduled agent work that needs judgment, tools, memory, and delivery. Use script-only no_agent jobs for quiet deterministic monitors. Always pin the profile, workdir, delivery target, and success condition, then verify the first run in the dashboard, logs, and destination channel.
Hermes has a built-in cron scheduler that understands natural language — tell it 'every morning at 9am, check Hacker News and send me a summary on Telegram' and it handles the rest, running unattended while you sleep.
Managed cloud · API costs included · Skill library · Cancel anytime
Before you start:
- ☑Hermes Agent installed and running as a persistent process (PM2 or Docker recommended)
- ☑At least one messaging channel connected (Telegram, Discord, etc.) to receive scheduled outputs
- ☑'scheduler: enabled: true' in config.yaml
- ☑After upgrading to v0.16, use the dashboard/admin surface to inspect scheduled jobs, then confirm the actual destination received the run
Steps
- 1
Enable scheduling
Set scheduler: enabled: true in config.yaml
- 2
Add a schedule
Tell Hermes: 'Every day at 9am, summarize my emails'
- 3
Configure notifications
Set up where you want notifications (Telegram, Discord, etc.)
- 4
Done
Hermes schedules it automatically
Pro Tips
- 💡For scheduling to work reliably, Hermes must run continuously — use PM2 ('pm2 start hermes') or Docker to keep it alive
- 💡You can schedule with natural language: 'every weekday at 8am' or 'every Sunday at 7pm' — no cron syntax needed
- 💡Chain tasks: set a morning digest that pulls from email, GitHub, and calendar into one Telegram message
- 💡A scheduled agent job should prove completion with a report, alert, commit, published URL, or explicit no-op, not just say it ran.
- 💡Use script-only no_agent jobs for quiet deterministic monitors and LLM-driven cron jobs for judgment-heavy scheduled work.
- 💡Pin important cron delivery to an explicit Telegram topic, Discord channel, email, or file path instead of relying on vague origin delivery.
- 💡For deterministic monitors, prefer no_agent=true scripts that print nothing unless an alert is needed.
- 💡For publishing or research jobs, require a live URL, saved artifact, sent report, or passing test before the job can report success.
- 💡For quiet monitors, prefer script-only no_agent jobs that print nothing unless a threshold is crossed.
- 💡If the cron delivers to Telegram or Discord, verify the exact chat, forum topic, thread, or channel after the first run.
- 💡Use the Web UI to inspect cron/profile/gateway state, but use delivered output as the proof; the optional --tui browser Chat tab is for local debugging, not a cron success condition.
- 💡For Obsidian updates, cron jobs should append dated summaries and read back changed files instead of silently rewriting large notes.
- 💡Use the Hermes dashboard/Web UI as a status checkpoint, but verify success with the real command, channel message, cron delivery, or deployed URL that matters.
Troubleshooting
❌ Scheduled task doesn't run at the expected time
✅ Check your timezone setting in config.yaml. Hermes uses UTC by default if no timezone is set, which may cause time offset issues.
❌ Hermes misses schedules after server reboot
✅ Ensure Hermes is set to auto-start on boot. With PM2: 'pm2 startup && pm2 save'. With Docker: use '--restart unless-stopped'.
❌ Scheduled notification arrives but message is empty
✅ The scheduled task may have hit a tool error silently. Check 'hermes logs --level debug' around the scheduled time to see what failed.