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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
comingThe launchd Credential Failure That Broke Every Scheduled Job
The boring infrastructure failure that nearly killed the automation stack.
comingNine AI Agents, One Operator — How the Hermes Stack Works
Nine profiles, nine specialists, one routing layer.
comingThe Content Flywheel: From Seed to Published Post, Zero Manual Steps
Five stages, autonomous review, and what happens when you stop being the bottleneck.
coming