Tutorial Automation

Hermes Cron in practice: a daily report delivered to Telegram at 8 AM

Hermes Agent

Hermes Agent

@hermesagents

May 17, 2026

8 min read

Hermes Agent's cron scheduler is the third major shape of agent work, after turn-by-turn chat and /goal loops. With cron, the agent runs unattended on a schedule, with results delivered to whichever messaging platform you want — or to all of them at once via deliver=all (#21495).

This post walks through building one specific job — a daily morning report — and uses it to explain how the scheduler actually works. The same pattern handles nightly backups, weekly security audits, on-call rotation pings, or whatever else you'd otherwise wire up with a brittle bash + cron.

What we're building

Every weekday at 8 AM:

  1. 1.Read overnight email (since 5 PM yesterday)
  2. 2.Pull GitHub notifications (issues, PR reviews, mentions)
  3. 3.Check today's calendar for the first 4 hours
  4. 4.Summarize all three into one Telegram message

If anything important happened, the message is detailed. If nothing happened, the message is one sentence: "Quiet overnight. Calendar is light until 11 AM."

Step 1: define the job

hermes cron add walks you through it. The CLI prompts for: a name, a schedule, the job description (natural language), and delivery targets.

bash
$ hermes cron add
Name: daily-morning-report
Schedule (cron expression or natural language): 0 8 * * MON-FRI
Description: |
  Read overnight email (since 5 PM yesterday).
  Pull GitHub notifications via the github skill.
  Check today's calendar via google-calendar for the first 4 hours.
  Summarize all three into one Telegram message.
  Be brief when nothing important happened.
Delivery: telegram

0 8 <em class="italic text-slate-200"> </em> MON-FRI is standard cron syntax: minute 0, hour 8, every day-of-month, every month, Monday through Friday. Hermes accepts both cron syntax and looser natural-language phrasings like "every weekday at 8 AM."

Step 2: what runs at 8 AM

At 8 AM the next weekday, Hermes spawns an isolated agent session with:

  • The job description as the initial user message
  • Whichever skills the agent decides to call (email, github, google-calendar)
  • A delivery hook that pipes the final response to Telegram

No persistent context, no user typing. The agent reads the description, calls the skills, drafts a message, sends it. Done in 15-30 seconds typically.

The output appears in Telegram as a message from your Hermes bot. If the job took longer than usual or hit an error, you also get an error message on the same channel.

Step 3: deliver=all — fan out to every platform

By default, delivery goes to one platform — whichever you specified at cron add. If you want the report to land everywhere you can reach you, set:

bash
hermes cron edit daily-morning-report --deliver all

Now the message goes to every connected messaging platform at once — your Telegram, Discord, Slack, WhatsApp, Signal, LINE, SimpleX, whatever you've configured. v0.14.0 wired the per-platform delivery for cron explicitly (#21495).

When this is useful: you want a guarantee of seeing the message regardless of which app you happen to be in.

When this is overkill: you only check one platform in the morning. Pick that one.

Step 4: see what's scheduled

bash
hermes cron list

Shows everything scheduled, next run time, last run status. v0.14.0 added name-based lookup for job operations (#26231), so you can reference jobs by name rather than ID:

bash
hermes cron logs daily-morning-report --last 5
hermes cron disable daily-morning-report
hermes cron run-now daily-morning-report  # trigger immediately, off-schedule

What happens when a job fails

Cron jobs run in their own sandbox session (same backends as interactive Hermes — see the sandbox backends post). If a skill call fails, the agent gets the error and either retries or reports it.

If the entire job crashes (the agent itself errors out), Hermes notifies you on your default messaging platform with the error and a link to the logs. v0.13.0's session durability work means a gateway restart doesn't lose pending cron deliveries — the dedupe is via atomic claim with rewind on failure (#23401).

A few useful real jobs

These are patterns people actually run:

Nightly backup verification. Cron at 3 AM: list backup snapshots, check that today's snapshot exists and is non-empty, fail loudly if missing. deliver=all so you wake up to the failure if there is one.

Weekly security audit. Cron Sunday 10 PM: pull dependency advisories, scan for known CVEs in your lockfiles, summarize new vulnerabilities. v0.14.0's supply-chain advisory checker (#24220) makes this cleaner than DIY scripts.

On-call handoff. Cron Friday 5 PM: read this week's pages, write a one-paragraph handoff to next week's on-call. Deliver to the shared Slack channel.

Watchers (the v0.14.0 skill #21881). Poll an RSS feed, an HTTP JSON endpoint, or a GitHub repo for changes; only notify when something changed. Combined with cron, this becomes "notify me when X changes," which is one of the most under-used automation primitives.

Where the logs go

bash
hermes cron logs daily-morning-report

By default, the last 10 runs. Each shows: timestamp, duration, what skills were called, what was delivered, what failed if anything. Logs live under ~/.hermes/cron/logs/ and rotate automatically.

Why this beats writing a shell script

You could write the same daily-report as a bash script + cron + curl-to-Telegram + maybe a tiny LLM call. Many people have.

The reason cron-on-an-agent is interesting:

  1. 1.The job description is the spec. No code to maintain. Change "first 4 hours" to "first 6 hours" — edit the description, no redeploy.
  2. 2.Skills compose. Adding "also check Linear for new tickets" is one sentence in the description. With a shell script it's a new API client.
  3. 3.Delivery is decoupled. deliver=all means you don't write 5 different webhooks for 5 different chat apps. The gateway already speaks all 22.
  4. 4.Errors are debuggable. When a job fails, the agent tells you what it tried and why it failed, in English. Bash scripts give you exit code 1.

That doesn't make agent-cron always the right answer — for jobs that need to be 100% deterministic and run in 30 ms, a shell script is still better. But for "do something thoughtful at this time and tell me about it," cron-on-Hermes is the cleanest tool in the box.

Read more

Stay in the Loop

Community updates on Hermes Agent releases, new skills, and integrations. No spam, unsubscribe anytime.