Running Hermes on a Cloud Machine as a Daily Routine Assistant
How I wired Hermes Agent on a remote Linux box into Telegram, email, calendar, monitoring, GitHub, and a daily morning routine.
Running Hermes on a cloud machine as a daily routine assistant
I have wanted a personal assistant for a long time, but most versions of this idea are disappointing.
A chatbot can talk, but it cannot actually see the day. It does not know that my calendar is packed, that CI failed overnight, or that the error tracker got noisy again.
A script can do one useful thing, but then you end up with ten scripts. One for email. One for calendar. One for GitHub. One for production errors. They all know a little bit, and none of them know what the others found.
This time I tried a different shape: run Hermes on a remote cloud machine, connect it to Telegram, and let it become the one place that reads the signals I already care about.
Not a magic assistant. More like a small operations desk living in a chat window.
The setup
The machine is just a remote Linux box. Hermes runs there. Telegram is the front door.
1
2
3
4
5
6
7
Telegram DM
-> Hermes gateway on remote Linux
-> email / calendar
-> error monitoring
-> GitHub via gh
-> local cloned repos
-> scheduled jobs
The remote part matters. I do not want my laptop to be responsible for reminders. If I close the lid, reboot, or go out, the routine should still happen.
The rough installation path is simple:
1
2
3
4
5
curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash
hermes setup
hermes gateway setup
hermes gateway install
hermes gateway start
Once Telegram is connected, I can message the agent from my phone. That changes the feel of it. I am not opening another AI product. I am messaging my own remote agent.
Why Telegram is a good control plane
Telegram is not fancy infrastructure, but it works well for this.
A morning briefing arrives as a normal message. If something looks wrong, I reply. If I want to send a test email, check GitHub, or ask why a CI run failed, I can do it without SSHing into the server.
A dashboard asks me to remember to look at it. A Telegram message finds me.
That makes it a good place for:
- morning routine summaries
- important email reminders
- CI and production error alerts
- quick triage when I am away from my laptop
- small commands that do not deserve a full terminal session
Email and calendar: work and personal, separated
The first useful integration was email and calendar.
I connected a work account with email and calendar access. Hermes can read the calendar, search unread mail, and send email if I explicitly ask it to.
Then I connected a personal account separately. I did not want one token replacing the other. The personal token lives under a separate Hermes profile directory, so the daily routine can read both accounts without mixing them up.
1
2
3
4
5
~/.hermes/google_token.json
-> primary account
~/.hermes/profiles/personal/google_token.json
-> secondary account
The work account has enough permission to send or modify email when I approve it. The personal account is safer: email read-only, plus calendar. I want reminders from personal email. I do not want an agent casually changing my personal inbox.
Once both accounts were connected, the morning routine could combine the two sides of the day:
1
2
3
4
5
6
Work calendar
Personal calendar
Work email signals
Personal email signals
Suggested plan
Watch-outs
That is already more useful than a normal calendar notification. A personal appointment changes how I should plan work. A CI failure in work email changes what the first hour should probably be.
The first scheduled jobs
Hermes has a cron system, so I set up the first jobs from chat.
The first one was lightweight: send me trending AI topics every morning at 9am local time.
The second one became the actual assistant:
1
2
3
4
Daily combined routine briefing
Runs: morning
Delivery: Telegram
Sources: work calendar, personal calendar, work email, personal email, monitoring, GitHub
The third job checks for important email twice a day. Not all unread email. That would just recreate the inbox in Telegram, which is the opposite of useful.
The job is supposed to look for things that are probably actionable:
- security alerts
- CI failures
- property or finance emails
- appointments
- billing
- family messages
- direct work requests
The difference between “unread email digest” and “important email reminder” is the whole point. If the assistant becomes another inbox, it has failed.
Adding error monitoring
After email and calendar, production error monitoring was the obvious next source.
For work, I gave Hermes a read-only monitoring token and a small list of projects. In the actual setup those are real project names, but the pattern is generic:
1
2
org: company-org
projects: app-one, app-two, app-three, app-four
The token lives in the Hermes .env file on the remote machine. It does not belong in prompts, posts, screenshots, or command history.
A useful monitoring section is not a dump of every issue. It should answer a few questions:
- Is anything new or regressed?
- Is an issue suddenly noisy?
- Does this look production-impacting?
- Is there something I should look at before normal work?
The first test query made the value obvious. There were real unresolved issues across the projects: mail delivery errors, Redis connection errors, Rails exceptions, external API errors. Some may be old noise, but seeing them next to calendar and GitHub gives me a better sense of what kind of day I am walking into.
GitHub via gh
GitHub was already configured on the machine with the gh CLI, so Hermes could use it directly.
1
2
3
4
5
gh auth status
gh repo view company/app-one
gh search prs --owner company --author @me --state open
gh search prs --owner company --review-requested @me --state open
gh search issues --owner company --assignee @me --state open
The daily job checks the repos I care about most. In my setup these are internal repos, so I keep the public example generic:
1
2
3
4
company/app-one
company/app-two
company/app-three
company/app-four
It looks for:
- my open PRs
- review requests
- issues assigned to me
- recent failed CI runs
- stale PRs that probably need a decision
This is where the assistant starts to feel less like a calendar bot and more like a small engineering cockpit.
GitHub tells me what I said I was doing. Monitoring tells me what production is complaining about. Email tells me what humans are asking for. Calendar tells me how much time I actually have.
Those sources are much more useful together than apart.
Local repos on the same machine
The remote machine also has local clones of the codebases. I keep them under one workspace directory:
1
/workspace/repos/
That means Hermes can move from triage into investigation.
If the morning briefing says one app’s CI failed, I can reply:
1
Look at the failed CI run and inspect the code locally.
Hermes can use GitHub to find the failing run, then use the local clone to search files, run tests, inspect history, and propose a fix. If I want, it can create a branch and open a PR.
That is the bit I care about most. A reminder is nice. A reminder that can turn into a debugging session is much better.
The safety line
Giving an agent access to email, calendar, GitHub, and monitoring should make you a little nervous. It makes me nervous too.
The rule is simple: read by default, ask before side effects.
Hermes can read and summarize automatically. It should not do these without explicit approval:
- send an email
- archive or label mail
- create or delete calendar events
- resolve or assign monitoring issues
- comment on GitHub issues or PRs
- close issues
- merge PRs
- push code
I tested email sending once. It worked. But that is not the interesting part. The interesting part is that sending stays an explicit action, not something hidden inside an automation.
What the morning message should look like
The target is not a beautiful report. I want one message that reduces morning context switching.
Something like this:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Morning Routine — Monday
Work calendar
- 10:00 Standup
- 12:00 Planning, prep the tracking sheet
Personal calendar
- 18:30 Family event
Email signals
- Work: CI failed in one repo
- Personal: property email needs a look
Monitoring signals
- app-one: mail delivery error, high frequency
- app-two: Redis connection timeout
GitHub signals
- CI failed on main
- one PR is still waiting for review
Suggested plan
- 09:00 triage email and CI
- 10:00 meeting
- 11:00 investigate the failing build
- 14:00 deep work
Watch-outs
- Leave enough time before the evening family event
The content matters more than the format. Tell me what deserves attention. Hide the noise.
What worked better than expected
The setup worked best because it was incremental.
I did not need to design the perfect personal OS in one go. I connected one thing, tested it, then added the next:
- Telegram
- daily AI trends
- email and calendar
- a separate personal account
- important email reminders
- error monitoring
- GitHub
- local codebase paths
Each step made the assistant slightly more useful. No big migration. No grand architecture.
The other nice surprise is that scheduled jobs feel conversational in Telegram. A cron result is not just a log line. It is a message I can reply to.
What I would improve next
Monitoring and GitHub should probably get real-time alert jobs, not just morning summaries. If CI fails on main, I do not want to wait until the next morning. Same for a production error spike.
The briefing also needs tuning. The hard part is not fetching data. It is ranking it. Ten unread emails, ten production issues, and ten open PRs can easily become noise again.
The next thing I want is tighter links from signals to code. If monitoring shows a Rails exception, the assistant should pull the stack trace, find the matching file under the local workspace, and suggest the first place to inspect.
That is where this starts to get interesting. Not just “you have an alert,” but “this alert probably maps to this code path.”
Final thoughts
This setup is not futuristic in the flashy sense. It is plumbing: OAuth tokens, API calls, cron jobs, Telegram messages, local repos.
But good plumbing changes behavior.
I now have one remote agent that can tell me what my day looks like, what broke overnight, which emails matter, which PRs are stale, and where the code lives if I want to fix something.
That is enough to be useful. More importantly, it is something I can keep extending.