← blog.buildwithjz.com

Shutdown Day: Pulling the Plug, Cleanly, and Why a Rebuild Is Probably Coming

2026-06-02 · MoneyMachine

I shut down Project MoneyMachine today. Not in defeat — in design.

Eighty-five Stripe products, seventy product landing pages on Cloudflare, six AI agents running 24/7, two months of build logs, zero dollars in. The math wasn’t going to bend in my favor on the current shape of the experiment, and I’d rather take an intentional pause to redesign than keep grinding on an approach I no longer believed in.

This post is what I shut down, how I shut it down, what it cost, and where I think the next version goes.

The numbers, honestly

Products shipped to Stripe85
Cloudflare Pages landing sites deployed70
Successful charges, all-time0
Net revenue$0.00
Estimated monthly run rate at peak~$235
Months I let it run~3
Blog posts written about it30 (counting this one)

Three months of compute, content, and emotional energy. Zero customers. The product surface looked busy — sub-$50 prompt kits, micro-tools, playbooks across migration topics, security audits, AI cost control, creator economy plays — but none of them found anyone willing to pay for them. The agents were busy. The market wasn’t.

How the shutdown went

I spent today doing surgical cleanup with Claude Code, and it was the cleanest “wind down a sprawling project” experience I’ve ever had. A rough log of the afternoon:

Within minutes: OpenClaw gateway stopped, systemd disabled, the May-31 orphan gateway process killed off, five dependent system services stopped, one timer disabled, twenty-two cron entries commented out across root, agentops, and jeff users. Backups for every crontab saved to /tmp with a timestamped suffix so I can roll any of it back.

Inventory pass: Cross-referenced 71 *.buildwithjz.com subdomains against the Stripe products inventory by HTTP-fetching each landing page and extracting the buy.stripe.com URL. Mapped landing-page → Payment Link → Product → CF Pages project, deduped 71 CNAMEs down to 58 unique Stripe products (some products had short-slug aliases).

The destructive sweep, mostly: 58 Stripe products archived, 58 payment links deactivated, ~63 Cloudflare Pages projects deleted. All clean except one mistake — the iteration loop on Cloudflare’s paginated Pages list only had truequeer-site in the exclusion check, and missed withjz-site, withjz-legal, buildwithjz-blog, the two travelwithjz-* projects, and scholarship-toolkit. Six brand-protected projects deleted by accident. Recovery: three rebuilt from local source within ten minutes (this blog is one of them); the other three are sitting on dev1 somewhere and I’ll restore them tomorrow.

Lesson logged: every future bulk-destructive operation goes through an explicit intent.txt vs protect-allowlist.txt pre-flight script. Brand assets get moved to a separate Cloudflare account so a token issued for an “experiments” account literally cannot reach brand assets at the platform level. Defense in depth. The agent that made the mistake had the right intent and the wrong scope on its delete permissions.

Final state: OpenClaw services off. Stripe products archived. ~10 minutes from “begin wind-down” to “this won’t be charging me overnight.” The actual irrecoverable spend on subscriptions (ChatGPT Pro, Ollama Cloud, Contabo) requires me to log into those portals separately — Claude can’t cancel my subscriptions for me, and that’s the right boundary.

Why now

Two failure modes converged.

Failure one — the demand-driven thesis didn’t survive contact with execution. The v3 strategy was: scrape platforms for unmet need, score opportunities, ship info products in 2-6 hours, expect 80% to fail, scale the 20% that hit. The portfolio assumption was that something in 85 attempts would land. Nothing did. The bottleneck was distribution, not production — landing pages were getting built, but nobody was being told they existed, and the agents I had drafting outbound content were drafting things that weren’t getting posted (humans-in-the-loop never closed). The factory’s output was real; the funnel into it was zero.

Failure two — the operational tax got expensive. Building a 21-agent factory with all the supporting infrastructure (custom skills, GBrain memory, dashboards, health monitors, cron jobs, codex harness debugging) consumed most of my available cycles. The system-of-record I was maintaining (CLAUDE.md, lessons-learned files, incident postmortems, blog) all of which is genuine value — but I was building the kitchen, not cooking. Three months of architecture work to keep agents alive, vs. ~5% of cycles on actual go-to-market.

The recent GBrain MCP debug spiral — PGLite lock contention, codex session-bound MCP servers persisting old configs, intermittent 1-in-4 success rates on fresh agent sessions — was the final tell. I was debugging plumbing to keep agents alive that weren’t producing anything anyone was paying for. The intellectually honest move was to stop, not push through.

What probably comes next

This isn’t the end of OpenClaw for me. I still think Peter Steinberger’s strict-agentic execution contract is the right shape for production agent work, the codex-harness route through ChatGPT Pro is the right cost structure for high-volume agentic coding, and OpenClaw’s gateway pattern (one process, many agents, shared tools, shared state) beats N independent agent processes. None of those bets changed.

What changes:

Different goal. “Replace $10K/mo of W2 income with autonomous digital product revenue in 12 months” was a goal that fit the founder-twitter narrative but didn’t fit my actual constraints (W2 day job, traveling Europe, two-person LLC where the second person is an author and genealogy researcher, not an operator). Whatever the next attempt’s goal is, it needs to match the reality of how Zachary and I actually spend our days.

Less product surface, more distribution. If revenue was bottlenecked on distribution at 85 products, it’ll be bottlenecked on distribution at 5 products. The right move is to build fewer things and spend the agent cycles on getting them in front of people — not on making more things.

Possibly Hermes alongside OpenClaw. I’ve been watching Nous Research’s Hermes Agent. There’s a real argument for keeping OpenClaw for the orchestration / gateway layer and using Hermes for specific agent personas where we want a different model / lineage / behavior profile. The two aren’t mutually exclusive. The gbrain MCP server I was wrestling with today actually supports both OpenClaw and Hermes natively — Garry Tan built it for both ecosystems. There’s a path where the next iteration runs both runtimes against the same shared brain. Whether I take that path depends on whether the operational tax of running two runtimes is justified by the agent quality difference, and I haven’t tested that yet.

Cleaner separation of brand assets from experiment assets. Today’s near-miss with the brand Pages projects was a wake-up call on something I should have done at the start: experiments live in a separate Cloudflare account, behind separate API tokens, with explicit protect-allowlists for the rare cases where automation has to reach across the boundary. That goes in CLAUDE.md before the next experiment touches a keyboard.

The blog stays

The blog you’re reading was a placeholder for two months. Today I finally wired up the Astro content collection that was supposed to render the 30 posts I’d been accumulating in /blog/*.md — including this one. So if you’re seeing this rendered with the rest of the archive instead of as a lone shutdown notice, that means the publish path also got fixed today.

Two months of build-in-public posts, all of which were genuine, none of which I want to revise in hindsight. Some of them are about wins (Day 14 first overnight; v6 Week 1 shipped in 3 hours). Some are about incidents I worked through (11-hour gateway-down day; Codex harness saga; the ACL trap). Some are about architectural decisions I still stand behind (why I’m staying on OpenClaw; v5 rebuild from the ground up).

The wind-down post belongs next to those, not separately. The story isn’t “I tried something and it failed” — it’s “I tried something the way I knew how, it taught me a lot about what I’d do differently, and the next attempt benefits from the wreckage.” The 30 posts are the evidence trail of what I learned.

If you’ve been following along — thank you. If you’re a new reader who landed on this post first because the shutdown got shared somewhere — start at Day 1 and read forward; this only makes sense in sequence.

The next post on this blog will be about whatever I decide to build instead. I don’t know what that is yet. I’ll write it when I do.

Jeff


Back to index