Files
public/docs/content-pipeline.md
T
thesabear febbf2e44c docs: deepen cron-scheduler, content-pipeline, iac-pipeline, and disaster-recovery
Completes the full depth pass across all 16 docs - real tech names,
why-this-vs-the-alternative reasoning, heavy cross-linking between
every doc, ranked/specific tradeoffs instead of generic hedges.
2026-08-22 08:13:49 +03:00

3.5 KiB

📝 Content Pipeline

Warning

Still under active development — this covers the current shape, not a finished architecture. Included deliberately: a portfolio that only shows finished, polished systems doesn't show how something gets built, only how it ends up. This one's mid-build.

The intended shape

flowchart LR
    Idea["Idea"] --> Draft["Drafting"]
    Draft --> Review["Review"]
    Review --> Approved["Approved"]
    Approved --> Published["Published"]

    Approved -.glue via n8n.-> Storage["Nextcloud<br/>draft/asset staging"]
    Approved -.glue via n8n.-> Blog["Ghost<br/>published blog"]
    Approved -.planned, not yet wired.-> Social["Social platforms<br/>via Postiz"]

A NocoDB table tracks content ideas through a status pipeline, with n8n gluing the stages together — the same n8n instance mentioned in docs/orchestration.md's ecosystem, here doing content workflow instead of infrastructure maintenance. Approved content flows through to Nextcloud (draft/asset staging) and out to Ghost, a self-hosted blog. A separate, still-incomplete leg is meant to fan approved posts out to social platforms automatically via Postiz.

A deliberate constraint, not a limitation stumbled into

Tip

Postiz is single-origin by design — its frontend/backend URLs are baked to one specific public hostname at configuration time, so it deliberately has no presence in either internal DNS zone described in docs/dns-naming.md; any other hostname hitting it fails CORS. This mirrors the exact reasoning in docs/dns-naming.md for why genuinely public apps skip the internal zone model entirely: a social-publishing tool has no legitimate internal-only caller, so giving it internal DNS presence would just be attack surface with no corresponding benefit. This was a conscious choice, verified against Postiz's own architecture, not a workaround discovered after something broke.

A real surprise in scale

Important

Postiz's real deployment footprint is 8 containers, not the app+database+cache most people would guess from its marketing page — it bundles its own Temporal workflow engine (mandatory as of Postiz v2.12.0 for all background jobs, including scheduled posting itself, not an optional add-on) plus that engine's own Postgres database and Elasticsearch-based visibility store. Provisioning this stack meant sizing for 8 containers' worth of resource overhead, not the 3 the app's own documentation implies at a glance — a useful reminder, worth stating plainly, that a tool's advertised simplicity and its actual operational footprint on the host running docs/iac-pipeline.md's hardened images can be very different things, and that finding out matters before capacity planning, not after.

What's actually built vs. what's still wiring up

Piece Status
NocoDB → n8n → Nextcloud/Ghost Most built-out, working end to end
AI-assisted drafting step Still being wired up
Social-publishing fan-out via Postiz Still being wired up — see the notification-routing gap in docs/notifications.md, which also hasn't caught up to this app yet

Related: docs/dns-naming.md, docs/orchestration.md, docs/notifications.md · Stacks: stacks/productivity/postiz/, stacks/productivity/nocodb-content/, stacks/productivity/ghost/