Agent stack build plans · № 5 · Hermes news pipeline
Set it up
Real commands, real file paths, staged. Budget an evening; the crons wait until stage 5.
1 · Install and first run
Linux / macOS / WSL2 / Termux
curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash
Windows (PowerShell)
iex (irm https://hermes-agent.nousresearch.com/install.ps1)
Run hermes once to finish onboarding. Hermes is model-agnostic —
point the model section of ~/.hermes/config.yaml at
Nous Portal, OpenRouter, OpenAI, or your own endpoint. For this build you need
a Nous Portal subscription regardless of which model you chat
with, because Portal’s tool gateway is what serves
web_search, web_extract, x_search, and
the browser tools — all metered (see the
docs,
integrations → Nous Portal). Secrets go in ~/.hermes/.env,
never in config.yaml.
2 · The messaging gateway
Configure your platform (Telegram and Slack both confirmed; ~20 others supported), then start the daemon — it’s installable as a systemd/launchd service so it survives reboots, which a cron pipeline obviously requires.
Start the gateway
hermes gateway
Gateway access is binary — approved senders get the whole agent. When you (or your co-editor) first DM the bot, an unknown sender gets a one-time pairing code; approve it from the terminal:
Approve a paired user
hermes pairing approve telegram <code>
3 · The voice files
Two files, two sizes. ~/.hermes/SOUL.md is loaded into
every session (system-prompt slot #1) — keep it under a screenful.
The full style guide lives in a skill, loaded only when invoked:
~/.hermes/skills/editorial/house-style/SKILL.md — skeleton
--- name: house-style description: > House style for [publication]: voice, banned words, lede rules, sourcing standards, structure, and the 10-point scoring rubric. Apply when drafting or scoring any piece. version: 0.1.0 --- ## Voice [register, reader, what we never do] ## Banned words and constructions [the list — be specific, this is what the score checks] ## Sourcing Every stat and quote carries a numbered source. One source = a hedge or a cut, never a confident claim. ## Structure Headline ≤ 70 chars · dek · lede ≤ 2 sentences · 2–3 sections · further-reading links. ## Scoring rubric (0–100) [10 checks × 10 points — the Summarizer self-scores against these]
You don’t have to hand-write either file — stage 1 of
the prompts has Hermes draft both from examples of
your writing, using its skill_manage tool (writes are gated by
skills.write_approval, so you confirm each file). The skill then
answers as the /house-style slash command. Worth knowing:
hermes skills browse / search / install exist for the skills hub,
but your house style is the one skill you should never install off a shelf.
4 · Safety toggles before any cron exists
- In
config.yaml: keepapprovals.modeonsmart(LLM risk-assessment) ormanual— a scheduled agent with--yolois how you wake up famous. - Leave
skills.write_approvalon, so the agent can’t quietly rewrite its own style rules mid-run. - If the subreddit sweep ends up needing an agent-written fetch script,
run it on the docker terminal backend (hardened: all
capabilities dropped, no-new-privileges, process and tmpfs limits) —
execute_codeis not sandboxed on the defaultlocalbackend.
5 · The cron jobs
Create them by asking the agent — the cronjob tool takes
natural-language schedules and stores definitions in
~/.hermes/cron/ (stage 2 of the prompts
is the exact ask). Then verify and dry-run from the CLI:
Inspect, dry-run, and control the schedule
hermes cron list hermes cron run <job> # fire one edition now, watch it in Telegram hermes cron status hermes cron pause <job> # holidays exist hermes cron resume <job>
Run hermes cron run manually for the first few days
before letting the schedule tick on its own — every early mistake you catch by
hand is a mistake that doesn’t recur three times daily on a meter.
6 · Optional: the RSS-to-webhook bridge (you build this)
Only after the cron sweep proves insufficient. Point an external RSS-to-webhook service — or a ten-line script on any machine with a crontab — at Hermes’ webhook gateway:
Bridge target (route configured under platforms.webhook.extra)
POST http://your-server:8644/webhooks/rss-inbox # port 8644 · shared secret · HMAC validation supported # rate_limit 30/min · max_body_bytes enforced
Give the route a prompt template that triages the item against your bar and a deliver target of your Telegram thread — a fat feed item can then wake the desk between editions. This is glue you own and maintain; that’s the honest price of “RSS support”.