◉CLAUDE LABJP
●2.1.301 — Adds the vim % motion, LaTeX math rendering in the VS Code panel, and a retry-watchdog limit for usage-limit waits (10/15)●2.1.299 — Conversations over 200K tokens left idle about 54 minutes get compacted; MCP allow rules now match only the server they name●SONNET 4.5 — Retires on the Claude API on 11/30, 45 days left. Migrate to Sonnet 5.5●WINDOWS — Reports say hooks break silently only on Japanese-locale Windows; check the character encoding first●FAST MODE — Opus 5.5 fast mode is out of research preview and no longer needs the beta header (10/15)●NEW — I Put a Ten-Line Promise File at the To…●2.1.301 — Adds the vim % motion, LaTeX math rendering in the VS Code panel, and a retry-watchdog limit for usage-limit waits (10/15)●2.1.299 — Conversations over 200K tokens left idle about 54 minutes get compacted; MCP allow rules now match only the server they name●SONNET 4.5 — Retires on the Claude API on 11/30, 45 days left. Migrate to Sonnet 5.5●WINDOWS — Reports say hooks break silently only on Japanese-locale Windows; check the character encoding first●FAST MODE — Opus 5.5 fast mode is out of research preview and no longer needs the beta header (10/15)●NEW — I Put a Ten-Line Promise File at the To…
Articles/Claude Code
⟐ Claude Code/2026-05-25Advanced

Notes from Seven Months of Running a Four-Site Auto-Publishing Pipeline with Claude Code and GitHub Actions

Lessons from running Claude Code scheduled tasks to auto-publish 16 articles a day across four Lab sites, including the Helpful Content System index collapse that forced a redesign of the quality gate, with the full Python gate code, token management, and rollback procedure.

claude-code132github-actions4automation109ci-cd8blog-opsquality-gateindie-developer6

✦ Premium Article

Seven months ago, the indexed pages on Claude Lab dropped from 3,500 to 95 in a single week. The cause was unsurprising in hindsight: I had been letting Claude Code write articles on a daily schedule, and Google's Helpful Content System eventually flagged the output as "templated mass-generated thin content." A common story for anyone running an AI-driven blog at scale.

I am Masaki Hirokawa. I have been building iOS and Android apps as a solo developer since 2014 — roughly 50 million cumulative downloads — and currently run four Lab sites (Claude/Gemini/Antigravity/Rork) and two blog sites (Lacrima/Mystery) by myself, all on a Claude Code scheduled pipeline that publishes 16 articles a day. After the index collapse, I rebuilt the quality gate in Python and the pipeline has not crashed the same way since.

These notes cover the quality-gate design that survives 480 posts a month while you sleep, plus the operational habits around GitHub Actions, PAT rotation, and disk management. It is aimed at solo developers running multiple AI-assisted sites in parallel who have been bitten by the same quality-versus-quantity trap.

Why a Quality Gate Had to Be Bolted On

For the first few months, the setup was naive: a scheduled task per site that said "generate four articles per day and push." Topic selection, MDX writing, and git push all happened inside one Claude Code invocation. I assumed Claude was smart enough that machine-readable quality checks would be redundant.

After three months I opened Google Search Console and froze. Claude Lab's indexed pages had collapsed from 3,500 to 95. Monthly clicks went from 2,500 to 200 and impressions from 160K to 48K. There was no manual penalty notice, so this was algorithmic — Helpful Content System, almost certainly.

Re-reading the articles, the cause was visible: templated phrases like "in this article we will discuss," "how did you like it," and "the definitive guide" had crept in everywhere. Each article was fine on its own, but stacked over three months they made the entire site read like an AI template farm. From Google's algorithmic point of view, the same impression.

The lesson is the load-bearing premise of everything that follows. A loop where Claude writes, Claude judges, and Claude pushes — with no human in the middle — drifts toward template degradation. You have to insert one more inescapable, mechanical gate, or it eventually collapses.

Architecture — Four Sites, Four Posts Each, Run While You Sleep

The current shape:

┌─────────────────────────────────────────────────┐
│ Cowork scheduled tasks (16 tasks, 02-17 JST)    │
│   - claudelab-premium-thu     02:00              │
│   - gemilab-premium-thu       02:45              │
│   - antigravitylab-premium    04:00              │
│   - rorklab-premium           04:45              │
│   ... (4 sites x 4/day = 16/day)                 │
└──────────────────┬──────────────────────────────┘
                   │ each task launches Claude Code
                   ▼
┌─────────────────────────────────────────────────┐
│ Claude Code (per task)                           │
│  1. Read SKILL.md                                │
│  2. Pick a topic with no overlap                 │
│  3. Generate MDX (JA + EN)                       │
│  4. Run article_gate.py  ← machine gate          │
│  5. If violations: discard, regenerate (max 3x)  │
│  6. Verify JA/EN count parity                    │
│  7. git push (persistent /tmp/repos/{site}/)     │
└──────────────────┬──────────────────────────────┘
                   │ push triggers
                   ▼
┌─────────────────────────────────────────────────┐
│ Cloudflare Pages CI                              │
│  - prebuild: node generate-content.mjs            │
│    (MDX→JSON + consistency + link validation)    │
│  - build: next build                              │
│  - deploy: Cloudflare Workers                     │
└─────────────────────────────────────────────────┘

Three points matter. (1) Claude Code does not only write — it also discards. (2) The quality gate lives in a separate Python process (article_gate.py) outside Claude's context, so judgment is not done by the same model that wrote the text. (3) The post-push validation in generate-content.mjs runs again in CI, giving you two independent sieves.

The bias problem is the reason. If you ask Claude to evaluate Claude's own output, the evaluation is generous. A dumb regex script that just counts pattern matches has none of that empathy, and Claude has to discard articles it personally liked when they trip a rule. That inescapability is what holds the pipeline together post-collapse.

✦

Thank you for reading this far.

Continue Reading

What follows includes implementation code, benchmarks, and practical content we hope you'll find useful. This site runs without ads — server and development costs are supported entirely by members like you. If it's been helpful, we'd be truly grateful for your support.

WHAT YOU'LL LEARN
✦A full picture of running a four-site, four-articles-per-day auto-publishing pipeline solo with Claude Code and GitHub Actions — including the role design that survives 480 posts per month without breaking.
✦The complete Python quality-gate code, derived from a real Helpful Content System incident where one site's indexed pages collapsed from 3,500 to 95 in a week, with each rule mapped to the failure mode it prevents.
✦Operations patterns for unattended overnight runs: GitHub PAT rotation, automatic disk reclamation, and autonomous error recovery — the things that actually let you sleep while the pipeline pushes.
Secure payment via Stripe · Cancel anytime
✦

Unlock This Article

Get full access to the rest of this article. Buy once, read anytime. This site is ad-free — your support goes directly toward keeping it running.

or
Unlock all articles with Membership →
Share

Thank You for Reading

Claude Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • ✦Copy-paste ready implementation code
  • ✦New advanced guides published daily
  • ✦$5/mo or $10 for lifetime access
View Membership →

Related Articles

⟐ Claude Code2026-04-30
Composing Claude Code Skills — Building Automation a Single Skill Can't Reach
A practical guide to going beyond one-skill-at-a-time and composing multiple Claude Code Skills into real workflows. Pipeline, branching, and meta-skill patterns with full implementation examples and the failure modes you should design against.
⟐ Claude Code2026-04-08
iOS Test Automation with Claude Code — Where XCTest, Swift Testing, and XCUITest Each Belong
How I rebuilt an iOS test suite with Claude Code: where XCTest, Swift Testing, and XCUITest each belong, the pipefail trap that turns failed tests green in CI, and a hook that hands only test failures back to Claude.
⟐ Claude Code2026-03-28
Running Claude Code × Playwright E2E Tests in Production — Pitfalls and Decision Criteria
Implementation patterns for running E2E tests with Claude Code and Playwright in production, plus how to measure whether the investment pays back. Includes the Cloudflare Workers and Pages preview deployment pitfalls, and a decision framework that indie developers can use to judge whether E2E tests are worth the investment.