Context
Five Romanian publisher sites in three different niches (general news, sport, business) running side-by-side from a single 32GB Docker host. The brief was to publish daily, in idiomatic Romanian, on a small enough operating budget that the project would not need a single editorial hire after launch.
The constraint that shaped everything: nobody on the team writes Romanian as a first language. So the pipeline had to produce text good enough to read like a local, not “AI-translated”, not “good enough to skim”.
Brief
- Five news sites, distinct niches and editorial voices.
- Romanian-language only, but the pipeline lives in English (operator).
- One Docker host, on a single workstation, no per-site cloud bill.
- 100% unattended after launch, no scheduled human review of generated articles.
- Custom theme per site, designed in Figma, built as a WordPress block theme.
- 12 months of “100% uptime” as the explicit success bar.
Architecture
A single Docker Compose stack on a Gaming PC running WSL2 hosts the whole thing, a shared MariaDB, a shared Ollama, a shared N8N, plus one WordPress + one pipeline container per site.
The article-generation backend is layered: Claude Sonnet (via a local proxy that wraps the Claude Code CLI subscription, so per-article cost is functionally zero) is the primary; if the proxy times out or returns a malformed response, the pipeline falls through to qwen3:14b on Ollama. The fallback runs on the same workstation’s GPU, so there’s never a “both systems down” failure mode unless the host itself is offline.
A small Cloudflare layer sits in front of all five sites: TLS termination, edge caching for the static assets, and DNS.
Outcomes
- 1,200+ articles published across the five sites in the first months after launch.
- 100% uptime since launch, the only outages were planned host reboots, never the pipeline.
- Four custom themes shipped from Figma, with the typography drift between them caught in v2 (see “What I’d do differently”).
- Zero editorial headcount, the founder spends less than 30 minutes a week on the operator console.
- Per-article cost is bounded by the Claude Max subscription Fares already pays for, no per-article API spend.
Screens
[FILL: replace with anonymized screenshots of the operator console + a side-by-side of two of the four custom themes. Avoid screenshots of the public sites themselves, the brand identities are sensitive.]
What’s next
Two items on the next-iteration list:
- Shared object storage, replacing per-container WordPress uploads dirs. The single-host architecture caps comfortable horizontal scaling at the current site count; a shared S3-compatible store (likely Cloudflare R2) would lift that ceiling.
- Per-language editorial styles. Each of the four themes currently shares one tone-of-voice prompt; promoting the prompt to a per-niche style guide would let the sport and business sites diverge stylistically without manual editing.