I run five brands' infrastructure by myself, and as of this week, every one of them publishes a researched blog post daily — before I'm at my desk. The system behind it is what I'd call a content engine fleet, and the design decision that makes it work is the opposite of what most people build first.
Most people building an AI content engine for multiple brands reach for one big agent: a mega-prompt that knows every brand, loops through all the sites, and publishes everywhere in one run. I built the inverse. Five small, scheduled, single-brand agents — each dumb about the other four — bound together by three shared pieces of infrastructure and one written safety doctrine. This post is the architecture, the gating logic, and the rules, exactly as they run on my machine.
The fleet: five jobs, staggered, never overlapping
Each brand gets its own launchd job (macOS's native scheduler — cron works identically elsewhere). The jobs are staggered at 30-minute intervals across a two-hour morning window, so no two agents ever compete for the same machine, credentials, or attention:
| Time | Job | Deploy path |
|---|---|---|
| 06:00 | Agency / playbook site | Local-only deploy script — the agent never pushes to production directly |
| 06:30 | E-commerce brand blog | Astro build → Cloudflare Pages, with explicitly exported API credentials |
| 07:00 | Fintech site #1 | Pre-existing daily pipeline, folded into the shared doctrine |
| 07:30 | Fintech site #2 | Pre-existing daily pipeline, folded into the shared doctrine |
| 08:00 | Travel journal | Pre-existing daily pipeline, folded into the shared doctrine |
Every job runs the same runner script with a per-site prompt file: a headless Claude Code session loads that brand's instructions and executes the pipeline end to end. The per-brand prompt is where voice, hard rules, and deploy constraints live — one brand's agent is forbidden from deploying any way except a local-only safety script; another must export Cloudflare credentials explicitly because sourcing the env file silently falls back to the wrong account. Those constraints would be a nightmare to encode into one shared mega-agent. As five separate prompts, each one is a page of unambiguous instructions.
That's the core thesis: a fleet is not one big agent. It's many small scheduled ones with a shared safety doctrine. The intelligence is distributed; the discipline is centralized. I wrote about the scheduling layer itself in scheduled AI agents that work while you sleep — this fleet is that pattern taken to production across every brand at once.
The pipeline every brand runs
Each job executes the same four steps, in order, with no step skippable:
1. Analytics gate — no writing before inspecting traffic
Step one of every prompt is a hard gate: a shared script (traffic-inspect.py) that pulls Google Search Console, then GA4, then Cloudflare analytics for that site, and writes an insights file the agent must read before choosing a topic.
This is the part I'd defend hardest. Most content calendars are guesses made weeks in advance. Mine is decided at 6AM by what the data said at 5:59. The doctrine, in my own words from the build: double down on what gives us traffic. Topic selection expands adjacent to clusters that are actually growing, and rewrites titles on pages with high impressions but low click-through — moves you can only make if you looked at the numbers first.
Two honesty mechanisms are built into the gate:
- If access to a data source is missing, the script reports the exact one-line fix instead of failing silently.
- If there's no traffic data at all for a site, it says NO TRAFFIC DATA loudly in the log — so the agent can't write a post and imply it made a data-led pick it never made. The pick is logged as merit-based, honestly.
That second point matters more than it looks. An agent that quietly pretends to have evidence is worse than one with no evidence, because you stop checking.
2. Generate — one researched post, to a written quality bar
The agent writes exactly one post, against non-negotiable quality rules written into the doctrine: primary-source research with inline citations and never a fabricated statistic; at least one inline SVG chart of real, sourced numbers; a real, correctly-licensed image that genuinely depicts the subject — and if no correct image exists, none at all, because missing is honest; internal links that actually resolve; and each brand's voice and clean-language rules.
The doctrine states the reasoning plainly: thin, templated, daily-spun content gets a site classified as scaled content abuse regardless of how politely it's submitted. The volume is safe because each post is worth reading. Pace protects the sites; quality is the actual ranking strategy.
3. Deploy — through that brand's safe path only
Each brand deploys its own way, with its own guardrails, encoded in its own prompt. The fleet design means one brand's deploy quirk can never leak into another brand's pipeline.
4. Distribute — legitimate channels only, verified
A shared script (distribute.sh) handles distribution for every brand, and it's as notable for what it refuses to do as for what it does:
- It does: submit the new URL via IndexNow (which reaches Bing, Yandex, Seznam, and several AI crawlers), verify the URL appears in the sitemap, llms.txt, and RSS feed rather than assuming it does, and confirm the page returns a live 200.
- It refuses: Google's Indexing API for articles — that API is for job postings and livestreams only, and using it for blog content violates Google's terms and risks a manual action. It also skips the retired sitemap ping endpoint, which Google shut down in 2023 and which now just 404s. Scripts that "instantly index" articles through the Indexing API are a liability wearing a shortcut costume.
And when it skips something, it reports the skip instead of faking success. That reporting habit — across the gate, the generator, and the distributor — is what makes a five-brand fleet reviewable by one person.
The safe-rollout law: why nothing appears abruptly
The whole fleet obeys one written file, and it exists for a blunt reason I put in its first paragraph: the fastest way to lose the rankings we're building is to look automated. The rules:
- One new post per site per day. A site that publishes 46 posts in an hour is a spam signal. One a day is a publishing habit.
- Backfill in small batches. Legacy posts getting corrected dates are processed at most 12 per run, from a queue that enforces the limit in code — not by good intentions.
- Dates must be defensible.
datePublishedis never rewritten on a live, indexed post. Ever.dateModifiedis stamped only when content genuinely changed — a date bump with no edit is precisely the manipulation the policy exists to prevent. If a post needs nothing, the job logs that and moves on. - Pings only for URLs that actually changed today. Bulk-resubmitting an unchanged archive is the classic manipulation flag.
The same law governs how the fleet itself rolled out: the brands weren't all switched on in one big-bang push. Two pipelines already existed and got folded into the doctrine; the new ones came online under the same pacing rules everything else obeys. Never push all brands at once — a mistake in a shared script hits one site before it can hit five, and a search-engine-facing pattern that reads as automated on one domain doesn't suddenly appear across your whole portfolio in the same week.
How one human reviews a five-brand fleet in minutes
People assume "publishes before I wake up" means "unreviewed." It means the opposite — the review is designed, not improvised:
- Failures find me. The runner alerts on auth, credit, and rate-limit failures. Silent misses don't happen, so a quiet morning genuinely means a clean run.
- Evidence is pre-assembled. Every job writes a dated insights file per site. Reviewing a decision means reading the same file the agent read.
- Honest logs beat green checkmarks. Because every script reports what it skipped and what data it lacked, the log tells me where the fleet was actually evidence-led and where it fell back to judgment.
- The blockers are named. The doctrine keeps a live list of access gaps — each one a one-time grant that makes the engine more evidence-led. The fleet doesn't pretend those gaps away; it works around them and tells me exactly what unlocking each one buys.
My morning review is scanning alerts, spot-reading one or two posts, and occasionally granting an access fix from the blocker list. Minutes, not hours — because the system was built to be auditable, not just autonomous. The economics of which model runs which step is its own topic; I covered that in model tiering for agent fleets.
What I'd tell you to steal
If you're building an AI content engine for multiple brands, the transferable design is this:
- Split by brand, not by function. Five small agents with clean boundaries beat one big agent with a tangled context.
- Stagger the clock. Overlapping jobs create the weirdest failures you'll ever debug.
- Gate on evidence, not a calendar. Make the analytics check step one, and make the "no data" case loud.
- Write the safety doctrine down. Pace limits, date rules, and forbidden shortcuts belong in a file every job obeys — not in your head.
- Make honesty a feature. Scripts that report what they skipped are the only reason one person can supervise five pipelines.
This fleet is the newest wing of the larger operating system I described in how one person runs five brands with AI agent fleets. It went live this week, which makes this post something unusual: not a retrospective, but a dispatch from day one.
FAQ
Is an AI content engine for multiple brands one system or many?
Many, deliberately. Each brand gets its own scheduled job with its own prompt, voice rules, and deploy constraints. What's shared is infrastructure and doctrine: one analytics-inspection script, one distribution script, and one written safe-rollout law every job obeys. Distributed intelligence, centralized discipline.
Doesn't daily AI publishing risk a search penalty?
Volume alone isn't the risk — looking automated is. The fleet's written law caps pace at one post per site per day, forbids rewriting datePublished on live posts, stamps dateModified only on genuine edits, pings only URLs that actually changed, and refuses illegitimate submission channels like the Google Indexing API for articles. Quality rules (primary sources, real charts, real images, resolving links) do the rest, because thin daily content gets classified as scaled content abuse no matter how carefully it's submitted.
How do topics get chosen without a content calendar?
A hard gate: no job writes before running a traffic-inspection script that pulls Search Console, GA4, and Cloudflare data and writes an insights file. Topics expand adjacent to clusters that are demonstrably growing, and high-impression/low-CTR pages get title rewrites. When a site has no analytics access yet, the job says so in the log instead of implying a data-led pick it never made.
How much human oversight does a five-brand fleet actually need?
Minutes a day, if the system is built for audit: failures alert automatically, every decision leaves an insights file, and every script reports what it skipped. The review is scanning alerts, spot-reading output, and granting the occasional one-time access fix — supervision by exception, not by re-doing the work.
This post isn't a case study of someone else's system — it's the live demo of mine, running this morning. If your company needs an operator who designs, ships, and supervises agent fleets like this in production, that's the job I do.
— Italo Campilii