Extension · moselwal/semantic-delivery · MIT

semantic-delivery — ein Inhalt, elf Distributoren.

Schema.org-Anreicherung und Multichannel-Distribution für TYPO3 14. Sechs native Plattform-Adapter (LinkedIn, X/Twitter, Instagram, Facebook, Bluesky, Dev.to) plus fünf Proxy-Adapter (Ayrshare, Buffer, n8n, Late.dev, Webhook). Per-Page-Plattform-Auswahl, Backend-Modul, CLI-Commands. MIT-Lizenz.

Die Realität

Multichannel-Distribution endet meist im Copy-Paste-Loop.

Mit semantic-delivery

  • Auto-Generation von Schema.org-JSON-LD aus Content-Modellen
  • Channel-Transformer pro Kanal (Web/AI/Voice/Social) mit Zeichenlimit-Awareness
  • Direkt-Distribution auf 6 Plattformen, Proxy-Distribution auf 5 weiteren
  • OAuth-Tokens AES-256-CBC verschlüsselt im Backend, mit Refresh-Flow
  • Dev.to-Cross-Posting mit Canonical-URL-Attribution
  • Podcast-Episoden-Detection mit automatischer Job-Erstellung
  • Per-Page-Plattform-Auswahl im Backend — nur konfigurierte Plattformen sichtbar

Bisher

  • Manuelle Anpassung pro Kanal mit jeweils eigenen Zeichenlimits
  • JSON-LD-Schreibarbeit im Template
  • Keine Channel-Detection im Frontend (Web vs AI Agent vs Voice)
  • OAuth-Token-Verwaltung als Side-Project mit Klartext-Speicher
  • Cross-Posting in Blog-Plattformen ohne Canonical-Anbindung
  • Podcast-Episoden-Detection als Cron-Bastelei

Vier Grundbausteine

Channel-Detection-Middleware

Erkennt anhand Headers / User-Agent / Accept, ob die Anfrage von einem AI-Agent, Voice-Assistant, Social-Crawler oder Browser kommt — und liefert das passende Format.

Distributor-Architektur

Auto-Discovery via Symfony-DI. Eigene Distributors implementieren DistributorInterface und tauchen automatisch im Page-Editor auf, sobald die zugehörigen Site-Credentials konfiguriert sind.

Channel-Transformer

Pro Kanal ein eigener Transformer: Web/AI Agent/Voice/Social Media. Kürzung auf Plattform-Limits (z.B. 280 Zeichen X, 300 Graphemes Bluesky), Tonality-Anpassung, Asset-Auswahl.

Schema.org-Anreicherung

JSON-LD wird automatisch aus dem Content-Modell generiert: Article, BlogPosting, NewsArticle, FAQPage, Product, HowTo, Organization, LocalBusiness. Auto-Detect mit manuellem Override pro Seite.

Installation: composer require moselwal/semantic-delivery · MIT-Lizenz

TYPO3: 14.0 · PHP: 8.2+ · Lizenz: MIT · Suggested:moselwal/content-intelligence (KI-gestützte Social-Transformation), moselwal/secret-resolver (%secret()%-Syntax für Plattform-Tokens)

Composer-Repository unter gitlab.moselwal.io einbinden, dann composer require moselwal/semantic-delivery. Anschließend vendor/bin/typo3 database:updateschema.

02 — Plattformen

Elf Distributoren in drei Kategorien

Sechs Plattformen werden direkt über deren native APIs bedient (Direkt-Distribution), eine davon ist eine Long-Form-Blog-Plattform mit Canonical-Attribution. Fünf weitere laufen via etablierten Proxy-Diensten — wenn Sie z.B. ohnehin Buffer oder Ayrshare einsetzen.

Proxy-Dienste

  • Ayrshare — API Key
  • Buffer — Access Token
  • n8n — Webhook-URL
  • Late.dev — API Key
  • Generic Webhook — Custom URL
Proxy

Long-Form Blog

  • Dev.to — API Key · Markdown-Format

Setzt automatisch eine Canonical-URL zurück zur Original-TYPO3-Seite — keine SEO-Strafe für Cross-Posting.

Direkt

Social Media (Short-Form)

  • Bluesky — App Password · 300 Graphemes
  • LinkedIn — OAuth 2.0 · 3.000 Zeichen
  • X / Twitter — Bearer Token · 280 Zeichen
  • Instagram — Page Access Token · 2.200 Zeichen
  • Facebook — Page Access Token · 63.000 Zeichen
Direkt
03 — Backend & Operations

Backend, CLI und Operations

semantic-delivery wird ohne Backend-Erweiterungen geliefert, die niemand bedient — das Backend-Modul ist von vornherein redaktionsbereit, die CLI-Commands sind cron-tauglich, der OAuth-Service speichert Tokens AES-256-CBC verschlüsselt.

DDD + Tests

4-Layer-DDD (Domain / Application / Infrastructure / Presentation), strikt enforced via deptrac. PHPStan Level 8, PER-CS3x0, PHPUnit Unit + Functional Tests. Vier Datenbank-Tabellen (channel_content, distribution_job, schema_cache, oauth_token).

OAuth-Token-Service

Für Plattformen mit OAuth 2.0 + Refresh: Tokens werden mit AES-256-CBC verschlüsselt im Backend gespeichert (Encryption-Key des TYPO3). API für Storage, Lookup, Refresh und Expiry-Check ist im Service-Container.

CLI-Commands

semantic-delivery:detect-episodes erkennt neue Podcast-Episoden und legt Distribution-Jobs an (mit --dry-run und --auto-publish). semantic-delivery:process-jobs arbeitet die Queue ab.

Backend-Modul

Unter Content → Semantic Delivery (Admin-Zugriff): Preview pro Plattform vor Publish, Job-Queue-Verwaltung, Log mit externen URLs der erfolgreichen Distributionen. Pro Seite eigener „Semantic Delivery“-Tab mit Plattform-Checkbox-Liste.

Datenbank- und Seiten-Felder

Tabellen

TabelleZweck
tx_semanticdelivery_channel_contentChannel-spezifische Content-Varianten
tx_semanticdelivery_distribution_jobJob-Queue für Distributionen
tx_semanticdelivery_schema_cacheGecachte Schema.org-Daten
tx_semanticdelivery_oauth_tokenVerschlüsselte OAuth-Tokens je Plattform

Page-Felder

FeldTypBeschreibung
tx_semanticdelivery_schema_typeSelectSchema.org-Typ überschreiben (Default: Auto-Detect)
tx_semanticdelivery_channelsCheckBoxAuslieferungskanäle (Website, AI Agent, Voice, Social Media)
tx_semanticdelivery_distribution_enabledCheckDistribution für diese Seite aktivieren
tx_semanticdelivery_distribution_platformsCheckBoxZielplattformen (dynamisch gefüllt)

Der Plattform-Selector zeigt nur Plattformen, für die in der aktuellen Site Credentials hinterlegt sind. Redakteur:innen können so kein Ziel auswählen, das fehlschlagen würde.

Unterstützte Plattformen

Social Media (Short-Form)

PlattformDistributorAuthLimit
BlueskyBlueskyDistributorApp Password300 Grapheme
LinkedInLinkedInDistributorOAuth 2.0 Access Token3.000 Zeichen
X/TwitterTwitterXDistributorBearer Token280 Zeichen
InstagramInstagramDistributorPage Access Token2.200 Zeichen
FacebookFacebookDistributorPage Access Token63.000 Zeichen

Blog-Plattformen (Long-Form)

PlattformDistributorAuthFormat
Dev.toDevToDistributorAPI KeyMarkdown

Blog-Distributoren setzen automatisch ein Canonical zurück auf die TYPO3-Originalseite. Hinweis: Medium gibt keine neuen API-Tokens mehr aus; der MediumDistributor wurde entfernt.

Proxy-Dienste

PlattformDistributorAuth
AyrshareAyrshareDistributorAPI Key
BufferBufferDistributorAccess Token
n8nN8nDistributorWebhook URL
Late.devLateDevDistributorAPI Key
Generic WebhookWebhookDistributorCustom URL

Setup

1. Distribution in den Site Settings aktivieren

 

semanticDelivery:
  channels:
    socialMedia:
      enabled: true
  distribution:
    enabled: true
    defaultDistributor: 'bluesky'

 

2. Plattform-Credentials konfigurieren

Credentials liegen pro Site in config/sites/<name>/config.yaml. Sensible Tokens nutzen die %secret()%-Syntax (siehe moselwal/secret-resolver), öffentliche Identifier landen direkt im YAML.

Nur Plattformen mit gefülltem Primär-Credential erscheinen im Backend-Editor. Plattformen ohne Credential sind ausgeblendet — fehlerhafte Auswahl ist somit ausgeschlossen.

3. Datenbankschema aktualisieren

 

vendor/bin/typo3 database:updateschema

 

4. Plattformen pro Seite auswählen

Im TYPO3-Backend hat jede Seite einen Tab Semantic Delivery:

  1. Enable Distribution aktivieren
  2. Zielplattformen auswählen (nur konfigurierte sind sichtbar)
  3. Speichern und publizieren

Das Distributionssystem respektiert diese Auswahl — Seiten gehen nur an die markierten Plattformen.

CLI, Backend-Modul und Erweiterung

CLI-Befehle

 

# Neue Podcast-Episoden erkennen
vendor/bin/typo3 semantic-delivery:detect-episodes --dry-run
vendor/bin/typo3 semantic-delivery:detect-episodes
vendor/bin/typo3 semantic-delivery:detect-episodes --auto-publish

# Pending-Jobs verarbeiten
vendor/bin/typo3 semantic-delivery:process-jobs

 

Empfohlener Cron

 

*/15 * * * * cd /app && vendor/bin/typo3 semantic-delivery:detect-episodes
*/5  * * * * cd /app && vendor/bin/typo3 semantic-delivery:process-jobs

 

Backend-Modul

Verfügbar unter Content → Semantic Delivery (Admin-Zugriff):

Eigenen Distributor ergänzen

  1. Klasse anlegen, die DistributorInterface in Classes/Infrastructure/Distribution/ implementiert
  2. Optional einen TransformerInterface in Classes/Infrastructure/Transformer/
  3. Credential-Mapping in DistributionPlatformItemsProcFunc::CREDENTIAL_KEYS ergänzen
  4. Site-Setting in settings.definitions.yaml und settings.yaml hinzufügen

Sobald Credentials hinterlegt sind, taucht die Plattform automatisch im Page-Editor auf. OAuth-Tokens werden über den OAuthTokenService verwaltet und at-rest mit AES-256-CBC unter dem TYPO3 Encryption Key verschlüsselt.

Quellcode & Doku

TYPO3 Extension Repository

Nicht im offiziellen TER — Installation ausschließlich über Composer. Extension-Key: semantic_delivery.

Composer-Package

moselwal/semantic-delivery via Moselwal-Composer-Repo. MIT-Lizenz, frei nutzbar.

Composer-Repo öffnen

GitLab (Source of Truth)

Primäres Repository inkl. CI/CD, Tests und Composer-Package-Registry.

gitlab.moselwal.io/development/moselwal/semantic-delivery

GitHub

Mirror auf GitHub (Platzhalter — vor Publish verifizieren).

github.com/moselwal/semantic-delivery
Nächster Schritt

Eigene Plattform fehlt?

Auto-Discovery macht das Anlegen eines neuen Distributors zu einer Frage von zwei Klassen — Implement DistributorInterface, optional einen Transformer, Credential-Mapping in DistributionPlatformItemsProcFunc::CREDENTIAL_KEYS ergänzen, fertig. Wenn Sie das selbst machen wollen: Doku im Repo. Wenn wir es bauen sollen: sprechen Sie uns an.

Custom-Distributor besprechen

Oder direkt schreiben: kontakt@moselwal.de