A daily research brief in Telegram with Hermes Agent cron jobs
Connect Hermes Agent to a Telegram bot, then schedule a cron job that searches the web each morning and posts a short, linked brief to your chat.
· ranx.cloud

This guide is for anyone who wants a short, sourced summary of a topic (a market, a competitor set, a research field) waiting in Telegram every morning. You end up with a Telegram bot connected to Hermes Agent and a scheduled job that searches the web at a fixed time, writes three to five items with links, and posts them to your chat. Everything is done from the Hermes web dashboard and the Telegram app.
Commands and settings below were checked against Hermes Agent v0.22.7.
What you need
- A running Hermes Agent with its dashboard open.
- An LLM key in Keys, and a main model chosen in Models (press Change next to Main model, pick a provider and model, then Switch).
- A Telegram account on your phone.
Web search works without a key. With no search credentials set, Hermes rotates across the free keyless tiers of Exa, Parallel, Firecrawl and Keenable, and moves to the next one when a vendor rate-limits (web search docs). That is fine for one brief a day. If you want a dedicated quota, add a key later (see the costs section).
Step 1: Connect a Telegram bot
Open Channels in the dashboard sidebar and pick Telegram. The card offers two paths.
Quick setup (Create with QR). Hermes asks a Nous-hosted setup service to create a bot that you own, shows a QR code, and waits while you confirm in Telegram. It detects your numeric Telegram user ID, writes TELEGRAM_BOT_TOKEN and TELEGRAM_ALLOWED_USERS, and restarts the gateway for you.
Manual setup (your own bot). Use this if you already have a bot or prefer BotFather:
- In Telegram, open @BotFather and send
/newbot. - Pick a display name, then a username that ends in
bot. - BotFather replies with a token like
123456789:ABCdefGHIjklMNOpqrSTUvwxYZ. Copy it. - Message @userinfobot to get your numeric user ID (a number, not your @username).
- Back in Channels → Telegram → Manual setup, paste the token into Telegram bot token and your ID into Allowed Telegram user IDs (comma-separated). Save.
- The page shows a "Restart the gateway" banner. Click Restart now. Credentials are only picked up when the gateway restarts.
Hermes uses long polling for Telegram by default: the gateway makes outbound requests to Telegram, so no inbound port or webhook is needed.
Send your bot a message ("hi"). If it replies, the connection works. If it says you are not authorized, the ID in the allowlist is wrong.
Step 2: Set the home channel and timezone
Cron output goes to a platform's home channel. In your DM with the bot, send:
/sethome
That chat is now where scheduled results land.
Next, set the timezone. Cron expressions are read in the profile timezone, and an empty value means the server's local time, which on a cloud host is usually UTC. Open Config, search for timezone, and enter an IANA name:
timezone: "Europe/Istanbul"
Save. There is a second reason to set this: with timezone empty, there is an open bug where cron jobs fire an hour off after a daylight-saving change (#119969). An explicit zone avoids it.
Step 3: Get the prompt right in chat first
Cron jobs run in a fresh session with no memory of earlier conversations, so the prompt has to carry everything. Write and test it interactively before you schedule it. Open Chat in the dashboard (it is the full Hermes terminal UI running in the browser) or just message the bot in Telegram:
Search the web for news from the last 24 hours about open-weight LLM releases
and AI agent frameworks. Ignore funding announcements and product marketing.
Pick the 3 to 5 most significant items. For each: a one-line headline, two
sentences on why it matters to an engineer who builds with these tools, and
the source URL. If nothing significant happened, say so in one line.
Plain text, no emoji, under 250 words.
Run it two or three times and tighten it. Things that help:
- Say who the reader is and what to skip. "Ignore funding rounds" removes a lot of noise.
- Ask for the source URL per item, so you can check claims.
- Cap the length. A brief that scrolls past one phone screen stops getting read.
Step 4: Schedule it
You have three ways to create the job. All write to the same scheduler.
Ask in chat. In Telegram or the Chat tab:
Every weekday at 7:30, run this and deliver the result to Telegram:
<paste the prompt from step 3>
Hermes creates the job with its cronjob_manage tool. Say where to deliver: a job created from Telegram defaults to that chat, but one created in the dashboard's Chat tab defaults to local, which only saves the output on disk.
Slash command. Same thing, explicit. /cron is a terminal-UI command, so type it in the dashboard's Chat tab; Telegram doesn't accept it, which is why you ask in plain language there:
/cron add "30 7 * * 1-5" "Search the web for news from the last 24 hours about ..."
Cron page. Open Cron, create a job, and fill in:
| Field | Value |
|---|---|
| Name | Morning AI brief |
| Prompt | the prompt from step 3 |
| Schedule | weekly mode, Monday to Friday, 07:30 (or custom mode: 30 7 * * 1-5) |
| Deliver to | Telegram |
If the Deliver to list shows "Telegram — set a home channel first", go back to step 2.
Then press Trigger now on the job to run it once. Don't wait until tomorrow morning to find out the delivery is broken.
Schedules accept cron expressions and plain forms like every day at 9am, weekdays at 9am, every monday 9am or every 2h (schedule formats).
Step 5: Optional tweaks
Each delivered message is wrapped with a "Cronjob Response" header and a footer. To get only the brief, set this in Config (use the YAML toggle to edit raw YAML):
cron:
wrap_response: false
If a run finds nothing worth sending, you can suppress it entirely. When the agent's final reply contains [SILENT], delivery is skipped and the output is only saved on disk. Replace the "say so in one line" instruction with:
If nothing significant happened, reply with only [SILENT].
To keep the brief from repeating yesterday's stories, open the job on the Cron page and tick continuity. Each run then sees its own previous output and is told not to repeat it.
Costs
Hermes itself adds nothing; you pay the LLM provider and, if you add one, the search provider.
How many tokens a run uses depends on your model, prompt, and how many pages the agent reads. Each web_extract result is capped at 15,000 characters by default (web.extract_char_limit), so pages can't blow up the context on their own. As a working assumption, take 12 model calls averaging 25,000 input tokens each, plus 4,000 output tokens, so about 300,000 input tokens per brief. After the first few runs, replace this with the real numbers from the Analytics page, which shows tokens and estimated cost per day and per model.
With list prices as of November 2026 (Claude pricing, OpenRouter models), ignoring prompt-cache discounts, so these are upper bounds:
| Model | Per run | 22 weekday runs/month |
|---|---|---|
| Claude Haiku 5.5 ($0.10 in / $0.50 out per MTok) | 0.3 × $0.10 + 0.004 × $0.50 = $0.032 | ≈ $0.70 |
| DeepSeek V4.1 Flash via OpenRouter ($0.045 / $0.50) | 0.3 × $0.045 + 0.004 × $0.50 = $0.016 | ≈ $0.34 |
| Claude Sonnet 5.5 ($2 / $10) | 0.3 × $2 + 0.004 × $10 = $0.64 | ≈ $14 |
A brief is summarization with light judgment, so a small model does it well. You don't have to change your chat model to get this: open the job on the Cron page, expand Advanced fields, and set Provider and Model for that job only. A job pinned to its own model does not use your fallback chain, so if that provider fails, the run fails instead of switching providers. The model and cost guide covers setting one cheap model for every scheduled job.
Search: the keyless tier is free but rate-limited and shared. If you add a key, Hermes's docs list Firecrawl's free tier at 500 credits a month (FIRECRAWL_API_KEY, from firecrawl.dev). One brief a day fits comfortably. Check the provider's current limits before you rely on them.
Telegram: the Bot API is free. Its documented limits (about one message per second per chat, 30 per second overall, Bot FAQ) are far above a daily brief.
What goes wrong
The job ran but nothing arrived. Check the job on the Cron page. Hermes tracks execution and delivery separately; a delivery problem shows as delivery_failed with the reason in the job's delivery error. The usual causes are a missing home channel (/sethome), a bot token that changed after you set up the job, or a prompt that ended up returning [SILENT].
The job fired at the wrong hour. timezone is empty and the server runs UTC, or you hit the DST bug above. Set timezone in Config.
The job shows blocked_config. Before each run, Hermes checks that the provider key resolves, attached skills are ready, and the delivery target has credentials. If one fails, it sends one alert and makes no LLM call. Fix the key in Keys or the target in Channels; the next healthy run clears the state.
The bot answers in DMs but ignores you in a group. Telegram privacy mode is on by default, so the bot only sees commands and replies to it. Turn it off in BotFather (/mybots → your bot → Bot Settings → Group Privacy → Turn off), then remove the bot from the group and add it back, because Telegram caches the setting per membership.
Messages sent while the agent was restarting never got answered. On a cold start the Telegram adapter drops updates that queued while the gateway was down (drop_pending_on_cold_boot defaults to true, discussed in #143123). To keep them, add this in Config (YAML mode) and restart the gateway from System:
platforms:
telegram:
extra:
drop_pending_on_cold_boot: false
The brief is vague or repeats itself. The prompt is relying on context the cron session doesn't have. Name the topics, the reader, the time window, and the format in the prompt itself, and turn on continuity.
On ranx.cloud, an instance can be restarted briefly now and then, for example for maintenance or updates. A restart doesn't lose jobs (they're stored on disk), and a missed cron run is still executed late if the instance is back within the catch-up window, which is half the job's period, clamped between 2 minutes and 2 hours. A daily 07:30 job therefore runs as late as 09:30; after that, that day's run is skipped.
Variations
- Two topics, two jobs: stagger them by five minutes (
30 7 * * 1-5and35 7 * * 1-5) so they don't compete for the same provider rate limit. - A Sunday weekly roundup with a longer word limit and
every sunday 9am. - Send to a group: add the bot to a group, run
/sethomethere, and every member sees the brief.


