Pi
All case studies
02 How · case study
Live

The Automation Stack

33 Jobs Running Before You Wake Up

Thirty-three processes. Nine AI agent profiles. One Mac Mini.

By the time I make coffee, the morning briefing has been written, the grid intelligence snapshot is done, and the content flywheel has already seeded today's ideas.

This is what a one-person media operation looks like when the automation layer actually works.

33
Total launchd jobs running
22
Daily scheduled automation jobs
11
Always-on services
9
Hermes AI agent profiles
5
Content flywheel stages
27
Morning briefing RSS sources
Grid intelligence snapshots per day
20+
Python scripts in automation stack
Timeline
2025

First Local Model Running

Hermes 3 Llama 3.1 8B via llama.cpp. Chat only. The first proof that a local server process could stay alive unattended on a Mac Mini.

Late 2025

First Scheduled Job: Morning Briefing

morning_briefing.py fires at 07:00 daily. 27 RSS sources, BMRS grid data, synthesised into a structured briefing pushed to Obsidian and Telegram. The template for everything that followed.

Early 2026

Grid Intelligence Added (5× Daily)

grid_intelligence.py fires at 06:00, 10:00, 14:00, 18:00, and 22:00. GB electricity grid state captured five times per day into the vault. Five jobs, one script, zero manual effort.

Early 2026

The Env Var Crisis

All scheduled jobs were silently failing. launchd (macOS’s job scheduler) doesn’t load shell profiles — API keys weren’t being injected. The fix: a shared env file and a wrapper script that every job now runs through. All 19 Python plists rebuilt.

2026

Agent Stack Comes Online

Nine Hermes profiles deployed — each a specialist with a different model, system prompt, and cost tier. The Telegram gateway goes live: agent output delivered directly to phone.

2026

Content Flywheel Operational

Five-stage pipeline: Seeds → Propagation → Harvest → Review → Publish. The content_reviewer.py auto-approves items scoring ≥22, surfaces up to 5 per day for manual review. First run: 298 stale backlog items processed in one pass.

2026

Full Stack: 33 Processes, 9 Profiles

The current state. 22 scheduled automation jobs + 11 always-on services. One Mac Mini. One operator.

Build the automation layer first. Then build the product. The automation layer is the part that runs when you're not watching — and that's when most of the value gets created.
Key learnings

1. The boring infrastructure failure is the real failure.

The stack had been building for months before I discovered that every single scheduled job was silently failing. launchd — macOS’s job scheduler — doesn’t load your shell profile. API keys set in your shell profile don’t exist to launchd. Jobs would fire, get no credentials, fail silently, log nothing useful. The fix required rebuilding the infrastructure layer: a single shared environment file, a wrapper script that every job runs through, and updating every plist. Not glamorous. But until this was fixed, 33 jobs meant 33 scheduled failures. The lesson: distributed automation systems have a single point of failure at the credential layer. Fix that first.

2. Separation of concerns across model tiers is non-negotiable.

Nine profiles exist because nine different roles need nine different cost/capability trade-offs. Routing everything through the most capable model wastes money. Routing everything through the cheapest model degrades quality where it matters. The orchestrator handles flywheel coordination. The local profile handles all zero-cost volume work. The researcher and strategist profiles engage Sonnet-class reasoning only when the task justifies it. The routing logic is the product. Getting it right is what makes the stack economically viable.

3. An autonomous review layer changes everything.

Before content_reviewer.py existed, the flywheel seeded content into a growing queue with no exit. 298 items accumulated. The bottleneck was human review — one person can only review so much per day. The solution: an autonomous reviewer that makes the easy calls (auto-approve ≥22, park the obvious misses) and only surfaces the genuinely ambiguous items. Maximum 5 per day for manual review. This pattern generalises: wherever human review is the bottleneck, build an autonomous pre-filter that handles the clear cases and escalates only what needs judgment.

4. The Telegram layer makes it real.

You can build the most sophisticated automation stack in the world and still not use it if the output is buried in a log file. The Telegram gateway changed the relationship between the system and its operator. Morning briefing arrives at 07:00 on the phone — read it like a newspaper. Health report at 07:30 — is everything running? Content ready for review surfaces as a message — approve or park from the phone. The stack is real because the output is present.

Supporting evidence

How I Built a 33-Job Automation Stack on a Mac Mini

launchd, env vars, wrapper scripts, and the infrastructure that makes it all work.

coming

The launchd Credential Failure That Broke Every Scheduled Job

The boring infrastructure failure that nearly killed the automation stack.

coming

Nine AI Agents, One Operator — How the Hermes Stack Works

Nine profiles, nine specialists, one routing layer.

coming

The Content Flywheel: From Seed to Published Post, Zero Manual Steps

Five stages, autonomous review, and what happens when you stop being the bottleneck.

coming