Hermes cron starts the medium-digest skill
The model has no file tools in this job. It can only call the server and delegate reading.
Every morning, scheduled agents post a reading digest of Substack and Medium to my Discord. Twice a week they build a Spotify playlist of new music. They run on Hermes Agent on a home server, using three MCP servers I wrote. The first versions were long prompts that did everything. The current ones give the model only judgment calls and handle everything else in code.
hermesYYYYMMDDThese are the worked examples from each server's docs, with fictional posts and tracks. A test checks them against real tool output, so every call and every result below is exactly what the tools produce.
Every morning · Sonnet main session, local Qwen subagents
Hermes cron starts the medium-digest skillThe model has no file tools in this job. It can only call the server and delegate reading.
digest_beginOne call. The server collects Following, top picks and For you, drops what was already reported, has Jev rank every headline, and writes a run file. The model gets a compact work list of refs.
{}Medium digest run 20261004T111522Z · member: yes
Since: Sat, Oct 3, 7:15 AM EDT (2026-10-03T11:15:07Z)
Following: 5 new (1 already reported) · Top picks: 2 (5 dropped) · For you: 2 from positions 25–100 (1 dropped)
Classifier jev (typesafe/jev-1.13): 9 ranked · 1 skipped (threshold 70%)
You read: @samlee ×1, @raequinn ×1 | Applied AI Notes ×2
Interests:
- Backend engineering: databases, distributed systems, performance work with real numbers
- AI engineering: agents, evaluation, LLMs in production
- Self-hosting and home labs
Columns: ref | rank (0–100, the classifier's guess at how much you'd want it; rows are sorted by it) | title | author | publication | minutes | claps | flags (M member-only, R you read this author/publication) [| reason]
## Following
F1 | 95 | Postgres VACUUM, measured on a 2 TB table | Ana Ruiz | Better Databases | 14 | 412 | M
F2 | 91 | Evaluating agents without fooling yourself | Sam Lee | Applied AI Notes | 11 | 1.3k | R
F3 | 72 | My home lab runs on three mini PCs | Jo Park | - | 7 | 96 | -
F4 | 21 | Ten morning habits of senior engineers | Max Doe | Career Lift | 4 | 2.3k | -
## Top picks
T1 | 83 | Raft in 200 lines of Go | Lena Ito | Systems Weekly | 18 | 3.4k | - | follow:Distributed Systems
T2 | 66 | Why we left Kubernetes | Omar Haddad | - | 9 | 7.8k | M | selected
## For you
Y1 | 61 | What the 2026 layoffs data actually shows | Rae Quinn | Applied AI Notes | 12 | 640 | R | network
Y2 | 55 | The case for boring technology, revisited | Ted Vos | - | 8 | 210 | - | history
## Skipped by classifier
F5 I made $12k in a month with AI side hustles
Next: shortlist ≤10 F, ≤5 T, ≤10 Y refs (rows are best-ranked first; prefer them unless a lower one clearly fits the Interests better); read them with subagents (read_post accepts the ref); then call digest_finish.read_post by refSubagents on a local 27B model read posts by ref. The server resolves F1 from the run file, so nobody copies a URL and nothing can be renumbered.
{ "url": "F1", "format": "text" }# Postgres VACUUM, measured on a 2 TB table
- Author: Ana Ruiz (@anaruiz)
- Publication: Better Databases
- Published: 2026-10-03
- URL: https://medium.com/@anaruiz/postgres-vacuum-measured-on-a-2-tb-table-d0c5e0000a1
- ID: d0c5e0000a1
- Access: full
- Reading time: 14 min
- Words: 2850
- Claps: 412
- Member-only story
Autovacuum fell behind on our 2 TB orders table, and bloat reached 38% before anyone noticed.
What we measured
…Each subagent returns a verdictThis is the model's only real job: judging a post.
REF: F1
ACCESS: full
TYPE: analysis
GIST: Autovacuum fell behind on a 2 TB orders table until bloat reached 38%. Per-table cost limits, a raised worker count and a nightly freeze job brought it back under 5%, measured over three weeks.
DEPTH: 5
WHY: Before-and-after numbers for each setting change, which a summary can't carry.digest_finishThe model sends picks and gists by ref. The server validates every ref, fills in titles and links, saves state before it replies, and returns the exact message to send.
{
"starred": [
{ "ref": "F1", "gist": "Autovacuum fell behind on a 2 TB table until bloat hit 38%; per-table cost limits and a nightly freeze job brought it back under 5%.", "why": "Before-and-after numbers for each setting, which the gist can't carry." },
{ "ref": "T1", "gist": "Builds a working Raft (elections, log replication, snapshots) in about 200 lines of Go, then breaks it with a partition test.", "why": "The failure cases are the lesson, and they only make sense with the code." }
],
"following": [
{ "ref": "F2", "gist": "Argues most agent evals measure the prompt, not the agent, and shows a held-out task set that caught two regressions." },
{ "ref": "F3", "gist": "A three-node Proxmox cluster on used mini PCs: power draw, noise and what broke in the first year." }
],
"top_picks": [
{ "ref": "T2", "gist": "A 12-person team moved back to plain VMs and cut its infrastructure bill by 60%." }
],
"for_you": [
{ "ref": "Y1", "gist": "Tracks 2026 tech layoffs by role and finds senior IC roles cut least." }
]
}STATE SAVED: 8 ids added (0 already present), 9 total, last_run 2026-10-04T11:15:22Z
COUNTS: 5 new in Following · 6 read in full · 1 also new · 1 skipped · 0 unreadable
WARNINGS: none
===== DIGEST: reply with exactly the text below, nothing before or after =====
📰 **Medium** — 5 new in Following, 6 read in full (since Sat, Oct 3, 7:15 AM EDT)
⭐ **Read in full**
1. **Postgres VACUUM, measured on a 2 TB table** — Ana Ruiz, Better Databases [member]
Autovacuum fell behind on a 2 TB table until bloat hit 38%; per-table cost limits and a nightly freeze job brought it back under 5%.
_Why:_ Before-and-after numbers for each setting, which the gist can't carry.
https://medium.com/@anaruiz/postgres-vacuum-measured-on-a-2-tb-table-d0c5e0000a1
2. **Raft in 200 lines of Go** — Lena Ito, Systems Weekly
Builds a working Raft (elections, log replication, snapshots) in about 200 lines of Go, then breaks it with a partition test.
_Why:_ The failure cases are the lesson, and they only make sense with the code.
https://medium.com/@lenaito/raft-in-200-lines-of-go-d0c5e0050a1
👥 **Following**
• **Evaluating agents without fooling yourself** — Sam Lee · Argues most agent evals measure the prompt, not the agent, and shows a held-out task set that caught two regressions. https://medium.com/@samlee/evaluating-agents-without-fooling-yourself-d0c5e0010a1
• **My home lab runs on three mini PCs** — Jo Park · A three-node Proxmox cluster on used mini PCs: power draw, noise and what broke in the first year. https://medium.com/@jopark/my-home-lab-runs-on-three-mini-pcs-d0c5e0020a1
_Also new_
**Career Lift** (1) · [Ten morning habits of senior engineers](<https://medium.com/@maxdoe/ten-morning-habits-of-senior-engineers-d0c5e0030a1>)
🔥 **Medium's top picks**
• **Why we left Kubernetes** — Omar Haddad [member] · A 12-person team moved back to plain VMs and cut its infrastructure bill by 60%. · _Selected for you_ https://medium.com/@ohaddad/why-we-left-kubernetes-d0c5e0060a1
🎯 **For you**
• **What the 2026 layoffs data actually shows** — Rae Quinn · Tracks 2026 tech layoffs by role and finds senior IC roles cut least. · _From your network_ https://medium.com/@raequinn/what-the-2026-layoffs-data-actually-shows-d0c5e0070a1
🗑 Skipped 1 as clickbaitDelivered to DiscordThe reply is the text after the ===== line, word for word.
📰 **Medium** — 5 new in Following, 6 read in full (since Sat, Oct 3, 7:15 AM EDT)
⭐ **Read in full**
1. **Postgres VACUUM, measured on a 2 TB table** — Ana Ruiz, Better Databases [member]
Autovacuum fell behind on a 2 TB table until bloat hit 38%; per-table cost limits and a nightly freeze job brought it back under 5%.
_Why:_ Before-and-after numbers for each setting, which the gist can't carry.
https://medium.com/@anaruiz/postgres-vacuum-measured-on-a-2-tb-table-d0c5e0000a1
2. **Raft in 200 lines of Go** — Lena Ito, Systems Weekly
Builds a working Raft (elections, log replication, snapshots) in about 200 lines of Go, then breaks it with a partition test.
_Why:_ The failure cases are the lesson, and they only make sense with the code.
https://medium.com/@lenaito/raft-in-200-lines-of-go-d0c5e0050a1
👥 **Following**
• **Evaluating agents without fooling yourself** — Sam Lee · Argues most agent evals measure the prompt, not the agent, and shows a held-out task set that caught two regressions. https://medium.com/@samlee/evaluating-agents-without-fooling-yourself-d0c5e0010a1
• **My home lab runs on three mini PCs** — Jo Park · A three-node Proxmox cluster on used mini PCs: power draw, noise and what broke in the first year. https://medium.com/@jopark/my-home-lab-runs-on-three-mini-pcs-d0c5e0020a1
_Also new_
**Career Lift** (1) · [Ten morning habits of senior engineers](<https://medium.com/@maxdoe/ten-morning-habits-of-senior-engineers-d0c5e0030a1>)
🔥 **Medium's top picks**
• **Why we left Kubernetes** — Omar Haddad [member] · A 12-person team moved back to plain VMs and cut its infrastructure bill by 60%. · _Selected for you_ https://medium.com/@ohaddad/why-we-left-kubernetes-d0c5e0060a1
🎯 **For you**
• **What the 2026 layoffs data actually shows** — Rae Quinn · Tracks 2026 tech layoffs by role and finds senior IC roles cut least. · _From your network_ https://medium.com/@raequinn/what-the-2026-layoffs-data-actually-shows-d0c5e0070a1
🗑 Skipped 1 as clickbaitTue & Fri mornings · six genre lanes, all on a local Qwen model, $0
Hermes cron starts one laneSix lanes run one after another. Each one adds 3–6 tracks to that day's private playlist.
discovery_beginFinds or creates today's playlist, pulls new releases from the lane's known labels and artists, and hands out K refs.
{ "lane": "a-dnb" }Lane a-dnb: Neurofunk and techstep
Today's playlist: hermes20261006 (0 tracks so far)
Baseline: Dark, technical drum & bass: neurofunk, techstep and halftime.
Research note: Releases are sparse; two great fits beat six average ones.
Pick up to 6 (aim for 3–6; fewer is fine if nothing else fits). At most 3 from K/C refs unless no web find verifies. At most 2 by core artists.
New from known labels and artists (since 2026-09-23):
K1 Kestrel — Hollow Ground · single, 2026-10-01 · Ferrous Records [core artist]
K2 Pressure Front (single, 2026-09-30, Obsidian Audio) · 2 tracks:
K2.1 Mara Voss — Pressure Front · Obsidian Audio
K2.2 Mara Voss — Undertow · Obsidian Audio
K3 Night Shift (single, 2026-09-27, Ironclad Music) · 3 tracks:
K3.1 Dekker — Night Shift · Ironclad Music
K3.2 Dekker — Rivet · Ironclad Music
K3.3 Dekker — Coldline · Ironclad Music
Covered labels (research should look elsewhere): Obsidian Audio, Ironclad Music
Covered artists: KestrelWeb research → verify_tracksThe research subagent searches the open web and passes its finds as plain lines. The server checks each one on Spotify with exact field searches, compares the ℗ label, and dedups by URI, ISRC and artist+title.
{
"lane": "a-dnb",
"text": "Vanta | Signal Loss | Signal Loss | Deepcut Records | 2026-10-02 | Sublevel Recordings: 'a slow-burning halftime roller' | https://example.com/sublevel/signal-loss\nAsh Meridian | Fever Line | Fever Line EP | Ironclad Music | 2026-10-23 | Ironclad: 'out on the 23rd' | https://example.com/ironclad/fever-line\nHollow Point | Static Bloom | Static Bloom | Ironclad Music | 2025-06-01 | Ironclad: 'their heaviest yet' | https://example.com/ironclad/static-bloom\nLumen Drift | Glass Engine | Glass Engine | Sublevel Recordings | 2026-09-29 | Sublevel Recordings: 'clinical neurofunk built from field recordings' | https://example.com/sublevel/glass-engine\nLABEL | Sublevel Recordings | https://example.com/sublevel | Halftime and neurofunk label"
}W1 ✓ Vanta — Signal Loss · 2026-10-02 · Sublevel Recordings [core artist]
⚠ label is Sublevel Recordings, not Deepcut Records as the source said
W2 pending Ash Meridian — Fever Line · not on Spotify (yet); re-checked each run
W3 dup Hollow Point — Static Bloom · recommended 2026-09-18 (a-dnb)
W4 ✓ Lumen Drift — Glass Engine · 2026-09-29 · Sublevel Recordings
Labels noted for this lane: Sublevel Recordings
2 of 4 verified. Pick by ref (W, K or C) in discovery_finish, best first.discovery_reviewEverything that can be picked, read from the server's own run file.
{ "lane": "a-dnb" }Lane a-dnb: Neurofunk and techstep
Baseline: Dark, technical drum & bass: neurofunk, techstep and halftime.
Pick up to 6 (aim for 3–6; fewer is fine if nothing else fits). At most 3 from K/C refs unless no web find verifies. At most 2 by core artists.
Web finds, verified on Spotify (2):
W1 Vanta — Signal Loss · single, 2026-10-02 · Sublevel Recordings [core artist]
why: Sublevel Recordings: 'a slow-burning halftime roller'
⚠ label is Sublevel Recordings, not Deepcut Records as the source said
W4 Lumen Drift — Glass Engine · single, 2026-09-29 · Sublevel Recordings
why: Sublevel Recordings: 'clinical neurofunk built from field recordings'
Not pickable: W2 Ash Meridian — Fever Line (pending); W3 Hollow Point — Static Bloom (dup)
From known labels and artists (6):
K1 Kestrel — Hollow Ground · single, 2026-10-01 · Ferrous Records [core artist]
K2.1 Mara Voss — Pressure Front · single, 2026-09-30 · Obsidian Audio
K2.2 Mara Voss — Undertow · Pressure Front, single, 2026-09-30 · Obsidian Audio
K3.1 Dekker — Night Shift · single, 2026-09-27 · Ironclad Music
K3.2 Dekker — Rivet · Night Shift, single, 2026-09-27 · Ironclad Music
K3.3 Dekker — Coldline · Night Shift, single, 2026-09-27 · Ironclad Music
Next: call discovery_finish with your picks as refs, best first.discovery_finishThe model ranks by ref. The server enforces the lane limits by dropping picks from the end instead of refusing, adds the tracks, and saves history, the pool and what the lane learned.
{
"lane": "a-dnb",
"picks": ["W4", "W1", "K2.1", "K1", "K3.1", "K3.2"],
"why": { "K2.1": "Obsidian Audio: 'a rolling techstep workout'" },
"reject": ["K3.3"]
}Saved. Added 5 track(s) to hermes20261006: Lumen Drift — Glass Engine; Vanta — Signal Loss; Mara Voss — Pressure Front; Kestrel — Hollow Ground; Dekker — Night Shift.
The report job posts the full report. Reply with one line: Done: a-dnbA no-model job delivers the reportA model once posted its own persona prompt to Discord instead of the report. Now plain code, run every five minutes, posts each finished report exactly once.
**Lane:** Neurofunk and techstep
**Playlist:** hermes20261006 — <https://open.spotify.com/playlist/pl1>
**Added (5):**
- **Lumen Drift — Glass Engine** (Sublevel Recordings, 2026-09-29). Sublevel Recordings: 'clinical neurofunk built from field recordings' <https://example.com/sublevel/glass-engine>
- **Vanta — Signal Loss** (Sublevel Recordings, 2026-10-02). Sublevel Recordings: 'a slow-burning halftime roller' <https://example.com/sublevel/signal-loss> · *core artist*
- **Mara Voss — Pressure Front** (Obsidian Audio, 2026-09-30). Obsidian Audio: 'a rolling techstep workout'
- **Kestrel — Hollow Ground** (Ferrous Records, 2026-10-01) · *core artist*
- **Dekker — Night Shift** (Ironclad Music, 2026-09-27)
Dropped by limits: Dekker — Rivet (feed limit of 3)
Already recommended: Hollow Point — Static Bloom
Not on Spotify yet (re-checking each run): Ash Meridian — Fever Line <https://example.com/ironclad/fever-line>
New labels for this lane: Sublevel RecordingsReads my Substack subscriptions, posts, chats and DMs, and runs the daily digest.
get_feed read_post search_posts list_chats read_chat_thread interests_evidence digest_begin digest_finish
Reads Medium Following and For-you feeds, including full member-only posts, with optional follows, lists and claps.
get_feed read_post rate_headings list_reading_lists interests_evidence digest_begin digest_finish
Runs a discovery playlist for a scheduled agent. The code handles feeds, verification, dedup and state. The model only judges the music.
discovery_begin verify_tracks discovery_review discovery_finish discovery_status forget
TypeScript on the official MCP SDK, with zod schemas and vitest. All three are MIT-licensed. The reader servers use each site's own web API with my session, read-only by default. State writes take a lock, go through a temp file and a rename, and keep a .bak, because Hermes runs two copies of each server at once.
| Run | Design | Cost | Time |
|---|---|---|---|
| Sep 29 | One big prompt, Sonnet everywhere | $3.26 | 25 min |
| Oct 2 | Local subagents, same prompt | $1.53 | 19 min |
| Oct 3 | Digest tools: refs + server-side state | $0.42 | 13 min |
| Oct 4 | + Jev headline ranking | $0.27 | 8 min |
| Jev | Local Qwen 27B | |
|---|---|---|
| AUCArea under the ROC curve: the chance that a post I wanted is ranked above one I didn't, picking one of each at random. 50 is a coin flip and 100 is perfect. | 76 | 75 |
| NDCG@20Normalized discounted cumulative gain over the top 20: how close the first 20 headlines come to the best possible order. Positions near the top count most, and a must-read counts more than a read. 100 is perfect. | 72 | 63 |
| Wanted posts in top 10 | 10/10 | 7/10 |
| Time for 160 headlines | 3 s | 178 s |