An EC2 Instance, a Discord Channel, and a Pull Request - Inside Zack Proser's Two-Agent Blog Pipeline

An EC2 Instance, a Discord Channel, and a Pull Request

Inside Zack Proser's Two-Agent Blog Pipeline

On April 16, 2026, Zachary Proser — an applied-AI engineer at WorkOS, previously of Pinecone, Cloudflare, and Gruntwork — published a long, technical account of an AI assistant that ships his blog posts from end to end. The assistant is called Hermes. It runs in the cloud. He directs it through Discord on his phone. The output is production code on his Next.js portfolio site at zackproser.com.

The post, How My AI Assistant Ships Blog Posts, reads less like a marketing piece than like a runbook. Proser names every component of the stack, gives the exact shell commands Hermes issues, and is unusually direct about why the workflow works for him and would not transfer cleanly to anyone whose site looks nothing like his.

The Stack, Named

Hermes lives on an AWS EC2 instance — currently a t4g.large, upgraded mid-session from a t4g.medium — with a persistent EBS volume that survives restarts. Tailscale handles networking with no public ports. LLM inference is routed through OpenRouter. Images are served from Bunny CDN. The Next.js site previews and deploys on Vercel. Pull requests go through the GitHub gh CLI.

"The assistant is called Hermes. It runs on an AWS EC2 instance with a persistent EBS volume, communicates through Discord, and has full access to my portfolio site repository. The stack is Hermes Agent + OpenTofu + Tailscale + Bunny CDN + OpenRouter."

The interaction surface is intentionally narrow. Proser sends a message in Discord describing what he wants — topic, angle, points to cover. Hermes picks it up and gets to work.

The Workflow, In His Own Steps

The MDX content lands at a predictable path: src/content/blog/{slug}/page.mdx. Each post sits beside a metadata.json sidecar that holds title, author, date, description, hero image URL, and tags. Hero images come from a Python wrapper around Gemini 3 Pro Image, which Proser calls nano-banana-pro.

uv run generate_image.py --prompt "a developer's AI assistant shipping code from a terminal, cyberpunk style" --resolution 2K

The output PNG gets converted to WebP and uploaded to Bunny CDN at https://zackproser.b-cdn.net/images/{name}.webp. Hermes then opens a feature branch, commits the new files, pushes, and files a pull request — all via shell:

git checkout -b blog/how-my-ai-assistant-ships-blog-posts origin/main
gh pr create --title "Add blog post: How My AI Assistant Ships Blog Posts" --body "New blog post about the Hermes blog shipping workflow"

Vercel picks up the PR and deploys a preview. Proser reviews the preview on his phone, dictates change requests back to Hermes in Discord ("Swap the hero image for something with more contrast." / "Fix the second paragraph — it's too long."), and Hermes pushes the edits. When the layout looks right, an Open Graph image is generated against a running local Next.js server, uploaded to CDN, and the PR is merged.

gh pr merge --squash --admin

The --admin flag bypasses branch protection. Proser is explicit that this is deliberate: "Adding a manual approval step in GitHub would just slow things down without adding value."

He puts the round-trip at "about 30-45 minutes" from idea to live post, most of it spent reviewing previews and asking for revisions.

The Second Agent

Hermes is the content half. The other half, by Proser's own description, is Claude Code running in --remote-control mode from his phone, handling infrastructure: OpenTofu deployments, secret rotation in AWS SSM, cloud-init debugging, and upgrades to Hermes itself. The two agents communicate through a webhook bridge he built.

"Discord for directing Hermes on content work. Claude Code remote control for infrastructure and system upgrades. Both from my phone. Between the two, I can manage the entire stack — blog posts, images, deployments, agent configuration — without sitting down at a desk."

What Makes It Work — And What Doesn't Transfer

Proser is unusually candid about the precondition that makes the rest possible. The AI, he writes, is the last layer in a stack built over years of deliberate convention.

"The AI is the last layer. It's powerful, but it's powerful because it's operating on a codebase that was already designed to be automated. If my portfolio were a WordPress site with a visual editor and images stored in the database, none of this would work."

The pieces he names as load-bearing predate Hermes by years: a custom Open Graph image pipeline that renders against a live Next.js dev server, a Bunny CDN convention with a fixed URL pattern and WebP workflow, a pre-push validation suite, and a CLAUDE.md file in the repository that encodes his writing style as machine-readable rules — banned words, banned sentence patterns, voice guidelines, formatting conventions.

"Hermes writes in my voice because the voice is specified, not because the model guessed correctly."

The MDX content structure — one directory per post, a metadata.json driving title rendering, sitemap inclusion, and RSS — was a deliberate design choice from years earlier. It is what makes the system scriptable.

The Tell at the End

Proser does not soft-sell what the workflow gets him. He shipped two posts in the same session in which he built it. He reports that the barrier to publishing went from "sit down at my desk, open VS Code, write, generate images, commit, push, check the preview, fix things, push again, merge" to a sentence in Discord.

What he does not claim is that this is a turnkey product for anyone else. The post is, in part, an argument that the visible magic of an AI shipping blog posts rests on invisible plumbing the author had to lay first.

How we verified this

Proser's post was retrieved in full from his domain and matched against his author page, the linked predecessor post on the always-on Hermes setup, and his public credentials on LinkedIn and GitHub. All shell commands and direct quotes in this article appear in the original. Stack components — Hermes Agent, OpenTofu, Tailscale, Bunny CDN, OpenRouter, Vercel, the gh CLI — are reproduced as he named them. No claim in this article is unattributed.

Sources

Stay connected with the most current Marketing News, Strategies, Tips , and Case Studies!

Join our monthly marketing magazine to receive the latest news and updates from our team of professional marketers and copywriters.
(Don't worry, your information will not be shared.)

Subscribe to the Bi-Weekly Marketing Magazine
Close