Phase 10 — Marketplace + Power-Features
Status: 10.1 (Marketplace-Plattform) IST UMGESETZT (2026-05-01). Siehe marketplace-implementation.md fuer den Ist-Stand.
10.2-10.6 (Versions-Diff, Y.js-Multi-User, Mobile-Edit, API-v2, Premium-Templates): weiterhin Konzept — die Premium-Templates-Idee ist via Stripe-Connect bereits in 10.1 enthalten.
Geschaetzte Dauer (urspruenglich): Variabel — modular in 10.1..10.6 aufgeteilt, je 1–4 Tage.
Ausgangslage nach Phase 9
Phase 9 hat Export/Import + Clone + Versionierung geliefert. Damit kann ein Schul-Admin einen Flow exportieren als .flow.json, das per E-Mail/GitHub/Forum teilen, eine andere Schule importiert es → fertig.
Was fehlt:
- Zentraler Ort wo curated Templates entdeckbar sind (Marketplace)
- Versions-Diff zwischen v1 und v2 desselben Templates
- Multi-User-Live-Edit (Y.js — wurde in Phase 4.7 entfernt, koennte zurueckkommen)
- Mobile-Edit (heute Read-Only)
- API-Versioning v2 (echte Breaking-Change-Strategie)
- Fixed-Author-Templates / Premium-Templates (Drittanbieter verkauft Templates ueber Marketplace)
Sub-Phasen
10.1 — Marketplace-Plattform: zentrale Template-Registry (~3-4 Tage)
Vision: Schulen koennen kuratierte Process-Engine-Templates entdecken + 1-Click-Aktivieren. Wie n8n-Marketplace oder Zapier-Templates.
Architektur:
┌─────────────────────────────────────────────────────────┐
│ prilog-marketplace (neuer Service oder admin-Modul) │
│ - PostgreSQL-Tabelle marketplace_templates │
│ - Volltextsuche (Postgres tsvector) │
│ - Kategorien: Schul-Workflows, Verein, Kita, ... │
│ - Bewertungen (👍/👎) │
│ - Meta: author, license, lastUpdated, downloads │
└──────────────────────┬──────────────────────────────────┘
│
▼ GET /marketplace/templates
│ POST /marketplace/install/:id
│
┌──────────────────────┴──────────────────────────────────┐
│ prilog-backend-api / Hub im Web-Client │
│ - "Marketplace"-Tab im Flows-Hub │
│ - Liste mit Suchleiste + Kategorie-Filter │
│ - Detail-Page: Beschreibung, Components-Preview, │
│ "Auf Tenant aktivieren"-Button │
│ - One-Click-Install: clone-from-marketplace │
└─────────────────────────────────────────────────────────┘Tabelle:
model MarketplaceTemplate {
id String @id
slug String @unique
name String
description String
category String // 'school' | 'verein' | 'kita' | 'health' | ...
appKind AppKind
authorName String
authorEmail String?
license String // 'MIT' | 'CC-BY-SA' | 'commercial'
payload Json // das `prilog.process-engine/v1` JSON
downloads Int @default(0)
rating Float @default(0)
lastUpdated DateTime
isFeatured Boolean
}Endpoints:
GET /marketplace/templates— paginated, filterbar nachcategory,appKind,q(Volltext)GET /marketplace/templates/:slug— DetailPOST /marketplace/install/:slug— kopiert payload als ProcessTemplate auf den aktuellen Tenant- (Admin)
POST /admin/marketplace/templates— Template hinzufuegen - (Admin)
PUT /admin/marketplace/templates/:slug/feature— featuren
Curation: Erstmal nur Prilog-Team kann Templates hinzufuegen (Admin-Endpoint). Spaeter: Drittanbieter koennen Templates submitten, Prilog reviewt + freischaltet.
Auswirkungen:
- Neuer "Marketplace"-Tab im Flows-Hub
- 5–10 vorgefertigte Templates fuer Demo (Schul-Klingel, Krankmeldung, Notfall, etc.)
- Nicht im Scope: Premium/Bezahl-Templates (wuerde Stripe-Integration brauchen)
10.2 — Versions-Diff (~1 Tag)
Heute: "Neue Version" macht Clone, alte wird archiviert. User kann zwischen Versionen nicht vergleichen.
Phase 10.2:
GET /process/templates/:id/diff/:otherId— liefert strukturierten Diff- Frontend-Page
/flows/:id/diff/:otherId: 3-Spalten-View- Components added (gruen), removed (rot), changed (gelb)
- Edges added/removed/changed
- Config-JSON-Diff pro Component (Monaco-Editor mit diff)
Aufwand: Backend-Diff ist trivial (Set-Vergleich), Frontend mit Monaco-diff ist die meiste Arbeit.
10.3 — Multi-User-Live-Edit (Y.js zurueck) (~2-3 Tage)
Heute: Optimistic local state, save bei Blur. Wenn 2 Admins gleichzeitig im Editor sind → Conflict beim Save (last-write-wins, kann Daten verlieren).
Phase 10.3:
- Y.js als Conflict-free Datenmodell pro ProcessTemplate
- Y.js-Websocket bei
/api/platform/v1/process/templates/:id/yjs - Frontend nutzt y-react-flow (statt direkter setState)
- Persistenz: Y.js-Updates batched in
process_templates.yjsState(Bytes-Spalte) - Awareness: zeige andere User als Cursor + Avatar im Canvas
Aufwand: Y.js-Integration mit React-Flow ist nicht-trivial. Es gibt OSS-Loesungen aber die sind nicht plug-and-play.
Risiko: Y.js + Process-Engine = zwei Wahrheits-Quellen. Was ist authoritativ wenn ein Y.js-Update auf eine geloeschte Component zeigt?
Alternative-Plan: Optimistic-Lock via template.version-Field. Frontend schickt If-Match: <version>-Header. Backend lehnt mit 409 ab wenn Version nicht stimmt. Frontend zeigt "Andere haben editiert — neu laden". Viel einfacher, aber kein "live" Multi-User.
10.4 — Mobile-Edit (~2-3 Tage)
Heute: Mobile zeigt Read-Only-Liste der Components.
Phase 10.4:
- Mobile-Edit-Mode: Add/Remove Components aus der Liste (vertikales scrollen, swipe-to-delete)
- Edge-Editing als Modal: "Wohin soll dieser Component verbinden?" mit Component-Picker
- Properties-Panel als Bottom-Sheet
- Test-Run-Button bleibt sichtbar
- Drag-and-Drop ist out-of-scope (touchscreen-React-Flow ist eine Welt fuer sich)
Aufwand: UI-Polish primaer. Funktional einfach, aber pixel-perfekt mobile braucht Zeit.
10.5 — API-Versioning v2 (~1 Tag, defer bis es noetig ist)
Heute: Alle Endpoints unter /api/platform/v1/process/*. OpenAPI-Spec hat info.version: '1.0.0'.
Trigger fuer v2: wenn ein Drittanbieter-Kunde einen Breaking-Change blockiert. Wir koennen heute Backwards-Compatible bleiben — v2 wird erst noetig wenn:
- ProcessTemplate-Schema sich grundlegend aendert (z.B. components werden nested)
- ComponentKind-Config-Format ist nicht mehr abwaerts-compatible
- Auth-Mechanismus aendert sich
Vorbereitung:
- Routes unter
/v1/aliasen (heute: direkt unter/process/— fuer v2 muessten wir/process/v2/aufmachen) - ProcessTemplate.version-Field bedeutet Template-Version, nicht API-Version — das verwirrt. Doku-Klarstellung.
Defer: kein User braucht v2 heute. Aber ich notiere die Hooks die wir vorgespannt haben:
- OpenAPI hat
x-api-version: v1schon drin - Endpoints sind versionsfaehig (Pfad-Prefix)
10.6 — Premium-Templates / Stripe-Integration (~1 Woche, post-MVP)
Vision: Drittanbieter-Authoren koennen Templates kostenpflichtig im Marketplace anbieten. Schule kauft → bekommt Template + Support.
Architektur:
MarketplaceTemplate.priceCentsFeld- Stripe-Connect fuer Author-Payouts (analog zu billing/developer-payout.service.ts der schon existiert)
- 70/30 Revenue-Split (Author/Prilog)
- Activate-Endpoint prueft erst Subscription, dann clone
Voraussetzung: Marketplace-Plattform (10.1) muss erst da sein. Plus: Stripe-Connect-Onboarding fuer Authors (separate Phase).
Defer: wenn ein Author das aktiv anfragt. Bis dahin alles MIT-Lizenz im Marketplace.
Kombinations-Strategie
Phase 10 ist zu gross fuer "ein Stint". Vorschlag:
- Marketplace 10.1 zuerst — groesster sichtbarer Win, baut auf Phase 9 Export/Import auf (gleiches Format!).
- Versions-Diff 10.2 dann — 1-Tages-Win, schoen polish-Effekt.
- Mobile-Edit 10.4 — vor 10.3 weil weniger Risiko.
- Y.js 10.3 — wenn echte Multi-User-Konflikte auftreten.
- API-v2 + Stripe — defer bis Trigger.
Was NICHT in Phase 10 gehoert
- GUEST-Permissions-Blocker (siehe project_open_items.md) — eigenes Thema, vor Phase 10 prio
- ClamAV — Sicherheit, vor Marketplace prio (Templates koennten Schadcode-Refs in Configs enthalten)
- E2EE-Rooms — orthogonal zur Engine
- App-Store-Vision (project_app_store_vision.md) — anderer Begriff: "Apps" sind Module die ComponentKinds liefern, "Marketplace" sind nur Templates/Configs
Akzeptanz-Kriterien (Marketplace 10.1)
| Kriterium | Verifizierung |
|---|---|
| Marketplace-Tabelle existiert | Prisma-Migration applied |
| 5-10 Default-Templates geseedet | Beim Backend-Start oder via Admin-Endpoint |
| Frontend "Marketplace"-Tab im Hub | Click → Liste sichtbar |
| Suche + Kategorie-Filter funktioniert | Manuell |
| Detail-Page mit Components-Preview | Lese-Endpoint liefert Payload |
| 1-Click-Install kopiert auf Tenant | Verify ProcessTemplate.metadata.marketplaceSlug existiert |
| Downloads-Counter zaehlt hoch | Nach Install |
| Auto-Update bei Marketplace-Update | NICHT in 10.1 — User muss manuell neu installieren |
Risiken
| Risiko | Mitigation |
|---|---|
Marketplace-Templates enthalten boesartige flow.http-request-URLs | SSRF-Block-Liste greift schon (Phase 3.5). Plus: Curation-Pflicht. |
| Drittanbieter-Templates haengen von TenantSecrets ab die der Schul-Admin nicht hat | Marketplace-Detail-Page listet erforderliche Secrets ("Du musst erst stripe_api_key setzen") |
| Updates an Marketplace-Templates erreichen installierte Templates nicht | absichtlich — Templates sind Snapshots zum Install-Zeitpunkt. Unterscheidet sich von "App-Updates" der Engine selbst. |
| Authoren wollen ihre Templates nachtraeglich aendern und installierte Schulen sollen profitieren | Phase 11+: Subscription-Modell, "Update verfuegbar"-Banner im Hub |
Anschluss
- Marketplace baut direkt auf Phase 9 (gleiches
.flow.json-Format) - App-Store-Vision (project_app_store_vision.md): Marketplace ist die Template-Schicht, App-Store ist die Module-Schicht (eigene ComponentKinds)
- ClamAV (project_clamav_plan.md) sollte vorher live sein wenn Marketplace User-Uploads erlaubt
Schaetzung
| Sub | Tage |
|---|---|
| 10.1 Marketplace-Plattform | 3-4 |
| 10.2 Versions-Diff | 1 |
| 10.3 Multi-User-Live-Edit (Y.js) | 2-3 |
| 10.4 Mobile-Edit | 2-3 |
| 10.5 API v2 (defer) | 1 wenn noetig |
| 10.6 Premium + Stripe (defer) | 1 Woche wenn noetig |
| Aktiv geplant: 10.1 + 10.2 + 10.4 | 6-8 |
Was ich nach Phase 9 angefangen habe und nicht beendet ist
Nichts offen. Phase 9 ist sauber abgeschlossen, deployed, getestet (Roundtrip Export/Import). Editor ist marketplace-ready ohne dass Marketplace-Plattform da ist — die Schul-Admins koennen heute schon .flow.json per E-Mail teilen.