content-distribution-receiver
content-distribution-receiver — target side for multi-site content distribution. Receives signed snapshots from content-distribution-source, validates the signature and maps UUIDs onto the local ID space.
One central editorial TYPO3 (the “source”) pushes content to n downstream TYPO3 instances (the “targets”). Editors keep working in the familiar backend; the distribution triggers on workspace-to-live publish, signs the payload with Ed25519 and delivers a DAG-structured snapshot — referenced via UUIDv7, never via TYPO3 UID. The companion moselwal/content-distribution-receiver receives the snapshot and writes it into the local schema.
moselwal/semantic-delivery distributes content to external channels — LinkedIn, Buffer, n8n, generic webhooks. It knows nothing about:
content-distribution-source fills exactly this gap. It reuses the SSRF-safe URL validator, the Ed25519 key infrastructure from moselwal/content-provenance and the rate-limit / nonce patterns from moselwal/webmcp.
moselwal/content-distribution-sourcemoselwal/content-provenance for Vault-backed key providers, moselwal/structured-content for relations and annotationsacked.Snapshots reference all records by origin_uuid (UUIDv7) — never by TYPO3 UID. This lets the receiver resolve foreign keys against its own ID space without UIDs colliding between instances.
Distribution is only triggered when a record is staged to live in a TYPO3 workspace. Drafts never leak. The trigger is a TYPO3-14 event listener with a DataHandler hook as a fallback.
KeyProviderInterface from moselwal/content-provenance — file-based or Vault-backed, rotatable.pages with all tt_content childrensys_file_reference plus sys_file (binary fetched via signed URL, never inlined)sys_file_metadata, sys_categorysettings.yaml
composer require moselwal/content-distribution-source
vendor/bin/typo3 extension:setup
Schema migrations add origin_uuid columns to pages, tt_content, sys_file* and the package tables tx_cdsource_target and tx_cdsource_outbox.
# Register a target instance
vendor/bin/typo3 cdsource:targets:add \
--label="Production EN" \
--base-url="https://en.example.com" \
--subscribed-tables="pages,tt_content,sys_file_reference" \
--subscribed-languages="0,1"
# Process the outbox (from cron or scheduler)
vendor/bin/typo3 cdsource:outbox:process
| Command | Purpose |
|---|---|
cdsource:targets:list | List configured targets |
cdsource:targets:add | Register a target instance |
cdsource:targets:test | Send a probe ping to a target |
cdsource:outbox:process | Send all pending and retryable entries |
cdsource:outbox:retry | Re-enqueue failed entries |
cdsource:outbox:purge | Clean up old acked entries |
Strict DDD 4-layer architecture, enforced via deptrac:
| Layer | May depend on |
|---|---|
| Domain | Moselwal\ContentProvenance\* (interface only) |
| Application | Domain, ContentProvenance |
| Infrastructure | Application, Domain, Framework, ContentProvenance, StructuredContent |
| Presentation | Application, Domain, Framework |
License GPL-2.0-or-later (see repo). Codebase guidance: CLAUDE.md inside the package.
Setting up TYPO3-to-TYPO3 distribution?
If you maintain editorial content centrally and want to push it to several TYPO3 brand sites without going headless and without breaking the editor workflow, content-distribution-source is the right layer. Get in touch for architecture advice, multi-site setup and migration from existing syndication solutions.
Or email us directly: kontakt@moselwal.de
This package carries the multi-site and multi-region syndication in TYPO3 Kubernetes and is part of sovereign platforms as described under Open Source & Digital Sovereignty. Managed variant: AI-Ready CMS as a Service.