Files
lemonspace_app/.docs/LemonSpace_PRD.md
Matthias Meister 456b910532 feat(docs): update LemonSpace manifest and PRD for v2.0 release
- Updated version from v1.5 to v2.0 in both the LemonSpace Manifest and PRD documents.
- Expanded Phase 1 scope to include video and asset nodes, and integrated non-destructive image editing capabilities.
- Enhanced node taxonomy to reflect 6 categories with 27 node types.
- Added details on offline sync features and optimistic updates in the documentation.
- Improved clarity and structure of the product vision and problem statement sections.
2026-04-06 22:27:21 +02:00

37 KiB
Raw Blame History

🍋 LemonSpace

Product Requirements Document

Self-Hosted, Source-Available Alternative to Freepik Spaces

Version Status Datum Projekt
v2.0 Draft April 2026 lemonspace.app

Changelog

Version Änderung
v0.2 KI-Integrationsstrategie: OpenRouter als primäre AI-Layer, Freepik API auf Stock-Assets reduziert
v0.3 Agent Layer eingeführt: Agent Nodes als Canvas-native Smart Batch Processor
v0.4 Vollständige Node-Taxonomie: fünf Kategorien, Semantik je Node-Typ
v0.5 Auth: Better Auth. Pricing: 4-Tier-Abo, Credit-System 30% Marge. Tailwind v4 bestätigt
v0.6 Lizenz: BSL 1.1 mit 3-Jahres-Change-Date zu Apache 2.0
v0.7 Tech Stack: Redis, Zod, Unsend + Stalwart, Rybbit, Sentry, Cloudflare
v0.8 Text-Overlay Node eingeführt (Kategorie 5: Canvas & Layout)
v0.9 Zwei-Repo-Strategie (Web-App + Landing Page), Auth-Cookie-Sharing
v1.0 Self-Hosting-Strategie, Credit Reservation+Commit, UX-Latenzen/Skeleton-Nodes, Convex Lock-in dokumentiert
v1.1 Monorepo verworfen → Zwei unabhängige Repos (lemonspace-web + lemonspace-landing), Auth-Cookie-Sharing via .lemonspace.io
v1.2 Pricing überarbeitet: Credit-Abstraktion (1 Cr = €0,01 intern), Tiers €8/€59/€119 (Business→Max), Top-Up-System (fix + Custom mit Bonus-Staffel), Marge nach LS-Gebühr + USt validiert
v1.3 Payment: Lemon Squeezy → Polar.sh (niedrigere Gebühren, Better Auth Plugin, Open Source). Gebührenmodell angepasst: 4% + $0,40 + 1,5% intl. + 0,5% Subscription
v1.4 Bildbearbeitung: Neue Kategorie 4 „Bildbearbeitung" mit non-destruktivem Adjustment-Stack (zwischen Transformation und Steuerung). 4 Adjustment-Nodes (Kurven, Farbe, Licht, Detail) + Render-Node. Alle Operationen credit-frei (client-seitig via Canvas API / WebGL). Steuerung → Kat. 5, Canvas & Layout → Kat. 6. Phase 2.
v1.5 Stage 3 Offline Sync: Local-First Canvas mit IndexedDB Queue, Optimistic Updates, ID-Remapping. Magic Link Auth via Better Auth Plugin. react-resizable-panels für Sidebar Resizing. Canvas Modularisierung, Dashboard Dialoge, Auth Race-Härtung.
v2.0 Phase-1-Umfang erweitert: Video- und Asset-Nodes vorgezogen (Phase 2→1). Bildbearbeitungs-Nodes (Kurven, Farbe, Licht, Detail, Render) vorgezogen (Phase 2→1). Vollständige WebGL-basierte Image-Pipeline implementiert (lib/image-pipeline/). Node-Taxonomie hat 6 Kategorien mit 27 Node-Typen. Phase-1-Status-Tabelle aktualisiert.

1. Vision & Zielsetzung

LemonSpace ist eine self-hosted, source-available Alternative zu Freepik Spaces — ein kollaboratives, KI-gestütztes Creative-Workflow-Tool mit einer Infinite-Canvas-Oberfläche. Ziel ist ein freier und erweiterbarer Workspace für kreative Teams, der auf eigener Infrastruktur betrieben werden kann.


2. Problemstellung

Freepik Spaces ist ein leiststarkes Tool für KI-gestützte kreative Workflows, aber:

  • Proprietäres SaaS-Produkt ohne Self-Hosting-Option
  • Nutzer abhängig von Freepiks Pricing und Verfügbarkeit
  • Keine Anpassbarkeit oder Erweiterbarkeit
  • Datenschutzbedenken bei der Speicherung kreativer Assets auf externen Servern

3. Zielgruppe

Segment Primärer Zugang Beschreibung
Designer & kreative Teams Gehostete Version (lemonspace.app) Datensouveränität ohne technischen Aufwand — zahlende Kernkunden
Entwickler & Tech-Teams Self-Hosted Anpassbare KI-Canvas-Plattform auf eigener Infra
Compliance-sensible Unternehmen Self-Hosted Regulatorische Anforderungen, die Cloud-SaaS einschränken
Open-Source-Community Self-Hosted / Contributing Creative-Tools-Ökosystem, BSL-Lizenz bis Change Date

4. Core Features

4.1 Infinite Canvas

  • Zoom, Pan und Navigation auf einem unbegrenzten Canvas
  • Nodes als wiederverwendbare kreative Bausteine
  • Drag & Drop von Assets, KI-Outputs und Mediendateien
  • Gruppierung und Layering von Canvas-Elementen
  • Resizable Sidebar mit Rail-Mode (collapsible)
  • Offline-fähige Sync-Queue (IndexedDB + localStorage)
  • Optimistic Updates mit ID-Remapping

4.2 Node-System

Das Canvas-System basiert auf einem erweiterbaren Node-Modell. Nodes sind typisierte Bausteine, die untereinander verbunden werden und Daten weitergeben. Es gibt sechs Kategorien mit insgesamt 27 Node-Typen.

Single Source of Truth: Die Node-Taxonomie wird zentral in lib/canvas-node-types.ts (Typen), lib/canvas-node-catalog.ts (Katalog) und components/canvas/node-types.ts (React-Flow-Registrierung) verwaltet. Der Katalog bestimmt automatisch den implemented-Status basierend auf vorhandenen React-Flow-Komponenten.

Kategorie 1: Quelle

Quelle-Nodes bringen Inhalte in den Canvas.

Node Beschreibung Phase Implementiert
Bild Upload eigener Bilder (PNG, JPG, WebP) oder Einbindung per URL. Basis-Asset für alle weiteren Operationen. 1
Text Freitextfeld mit Markdown-Support. Enthält Inhalte (Copy, Brief, Beschreibung) — semantisch verschieden vom Prompt-Node. 1
Video Upload von Videodateien oder Einbindung per Link. Darstellung als Thumbnail-Node, Playback im Panel. 1
Asset Stock-Assets (Fotos, Vektoren, Icons), direkt aus dem Asset Browser auf den Canvas gezogen. 1
Farbe / Palette Definiert Farben oder Farbpaletten als Style-Referenz. Kann an KI-Nodes oder Style-Transfer übergeben werden. 2
Prompt Dedizierter Node für Modellinstruktionen. Verbindet sich ausschließlich mit KI-Nodes. Kategorie: KI-Ausgabe. 1

Kategorie 2: KI-Ausgabe

KI-Ausgabe-Nodes sind das Ergebnis einer Modell-Operation. Sie werden vom System erzeugt, nicht vom Nutzer angelegt.

Node Beschreibung Phase Implementiert
KI-Bild (ai-image) Output eines Bildgenerierungs-Calls. Speichert Prompt, verwendetes Modell und Generierungsparameter. 1
KI-Text Output eines Text/Reasoning-Calls. Enthält generierten Copy, Captions, strukturierte Texte. 2
KI-Video Output eines Videogenerierungs-Calls. Keyframe-basierte Generierung aus Bild-Input möglich. 2
Agent-Ausgabe Bundle-Output eines Agent Nodes. Kann mehrere typisierte Sub-Outputs enthalten. 3

Kategorie 3: Transformation

Node Beschreibung Phase Implementiert
Crop / Resize Freie Bildausschnitt-Auswahl direkt auf dem Canvas, mit Aspect-Ratio-Lock. 2
BG entfernen Hintergrundentfernung via rembg. Output ist ein freigestelltes Bild. Batch-Modus möglich. 2
Upscale Hochskalierung via Real-ESRGAN. Unterstützt Faktoren 2×, 4×, 8×. 2
Style Transfer Überträgt visuellen Stil eines Referenzbildes auf einen anderen Input. 3
Gesicht Face Restoration via GFPGAN. Verbessert Gesichtsdetails in generierten oder degradierten Bildern. 3

Kategorie 4: Bildbearbeitung

Bildbearbeitungs-Nodes arbeiten non-destruktiv. Sie verändern das Originalbild nicht, sondern definieren Adjustments, die als Stack auf das Eingangsbild angewendet werden. Erst der Render-Node materialisiert das Ergebnis als neues Bild.

Architektur: WebGL-basierte Image-Pipeline (lib/image-pipeline/)

Die Bildbearbeitung nutzt eine vollständige WebGL-Pipeline für hardwarebeschleunigte Bildverarbeitung direkt im Browser:

lib/image-pipeline/
├── adjustment-types.ts    ← Typen und Default-Werte für alle Adjustments
├── contracts.ts           ← Pipeline-Schnittstellen
├── render-core.ts         ← Kern-Rendering-Logik
├── render-types.ts        ← Render-Typen
├── render-size.ts         ← Größenberechnung
├── source-loader.ts       ← Bildquellen-Lader
├── preview-renderer.ts    ← Echtzeit-Vorschau
├── histogram.ts           ← Histogram-Berechnung
├── histogram-plot.ts      ← Histogram-Visualisierung
├── presets.ts             ← Built-in und User-Presets
├── bridge.ts              ← Worker-Bridge
├── worker-client.ts       ← Web-Worker-Client
├── image-pipeline.worker.ts ← Web-Worker für Hintergrundverarbeitung
└── backend/
    ├── backend-router.ts  ← Backend-Auswahl (WebGL/WASM)
    ├── backend-types.ts   ← Backend-Typen
    ├── capabilities.ts    ← Feature-Erkennung
    ├── feature-flags.ts   ← Backend-Flags
    ├── webgl/
    │   ├── webgl-backend.ts  ← WebGL-Renderer
    │   └── shaders/          ← GLSL-Shader
    │       ├── curves.frag.glsl
    │       ├── color-adjust.frag.glsl
    │       ├── light-adjust.frag.glsl
    │       └── detail-adjust.frag.glsl
    └── wasm/
        ├── wasm-loader.ts    ← WASM-Loader (zukünftig)
        └── wasm-backend.ts   ← WASM-Backend (zukünftig)

Adjustment-Stack:

Bild-Node (Original)
  → Kurven-Node (Kontrast-S-Kurve)
    → Farbe-Node (Sättigung +20, Tint Warm)
      → Detail-Node (Sharpen 40%)
        → Render-Node → Neues Bild (materialisiert)
Node Beschreibung Phase Implementiert
Kurven Tonwert-Kurven (RGB + Einzelkanäle). Kontrollpunkte per Drag auf der Kurve. Presets: Kontrast, Aufhellen, Abdunkeln, Film-Look, Cross-Process. 1
Farbe HSL-Regler (Hue, Saturation, Luminance — global + pro Farbbereich). Color Balance. Temperature/Tint. Presets. 1
Licht Brightness, Contrast, Exposure, Highlights, Shadows, Whites, Blacks. HDR-Tone-Mapping. Vignette. Presets. 1
Detail Unscharf maskieren (Amount, Radius, Threshold). Clarity / Structure. Denoise. Grain. Presets. 1
Render Materialisierer: Wendet den gesamten Adjustment-Stack an und erzeugt ein neues Bild (in Convex Storage). Unterstützt Ausgabe-Auflösung und Format. 1

Credits: Alle Adjustment-Nodes sind credit-frei — die Verarbeitung läuft vollständig im Browser (WebGL). Nur der Render-Node erzeugt serverseitig ein finales Bild (ebenfalls credit-frei).

Technische Umsetzung: Die Entscheidung für WebGL als primäre Rendering-Engine ist getroffen. GLSL-Shader für alle vier Adjustment-Typen sind implementiert. Ein WASM-Backend ist als Alternative vorbereitet (wasm-backend.ts), aber noch nicht aktiv.

Kategorie 5: Steuerung & Flow

Node Semantik Beschreibung Phase Implementiert
Splitter 1 → N Verteilt 1 Input auf N identische oder abgeleitete Outputs. 2
Loop Liste → N Iteriert über eine Liste von Inputs und führt dieselbe verknüpfte Operation für jeden Eintrag aus. 2
Agent N → Plan → N LLM-Orchestrator. Analysiert Inputs, plant strukturierten Ausführungsplan, delegiert Operationen. 2
Mixer / Merge N → 1 Kombiniert N Inputs zu 1 Output durch Überblendung, Komposition oder Selektion. 3
Weiche 1 → Pfad A/B/... Bedingter Router. Leitet den Input anhand einer definierbaren Bedingung auf einen von mehreren Ausgangspfaden. 3

Kategorie 6: Canvas & Layout

Node Beschreibung Phase Implementiert
Gruppe Container für andere Nodes. Unterstützt Collapse/Expand und benannte Scopes. 1
Frame Artboard mit definierter Auflösung. Dient als Export-Boundary. 1
Notiz Annotation auf dem Canvas. Markdown-Support, kein Datenanschluss. 1
Compare Stellt zwei Bilder nebeneinander mit interaktivem Slider dar. 1
Text-Overlay Editierbarer Text-Layer über Bild- oder Video-Nodes innerhalb eines Frames. 2
Kommentar Kollaborations-Node für Reviews. Unterstützt Threads, @mentions und Resolve-Status. 3
Präsentation Definiert Canvas-Bereiche als geordnete Slideshow. Export als PDF möglich. 3

4.3 Agent Nodes

Agent Nodes sind ein spezieller Node-Typ auf dem Canvas. Sie fungieren als Smart Batch Processor: Sie nehmen mehrere Input-Nodes entgegen, orchestrieren komplexe Multi-Step-Workflows über ein Text/Reasoning LLM und produzieren mehrere Output-Nodes direkt auf dem Canvas.

Ausführungsphasen:

  1. Analyse: Agent erhält alle verbundenen Inputs, LLM prüft ob alle nötigen Informationen vorhanden sind
  2. Clarification (optional): Fehlen Angaben, stellt der Agent gezielt Rückfragen direkt am Node
  3. Execution: LLM plant einen strukturierten Output-Plan (JSON), der dann als Batch abgearbeitet wird
  4. Output: Ergebnisse landen als neue Nodes auf dem Canvas, verbunden mit dem Agent Node

Vordefinierte Agent Templates:

Template Typische Inputs Typische Outputs
Instagram Curator Produktfotos, Brand Brief, Zielgruppe Feed Posts, Text-Overlays, Captions, Hashtag-Sets
(weitere folgen)

5. Tech Stack

Bereich Technologie Version / Hinweis
Frontend Framework Next.js 16.1.1 — App Router, Server Components
Styling Tailwind CSS v4
UI Komponenten ShadCN/UI Aktuelle stabile Version
Backend / Realtime Convex Self-hosted via convex-backend
Authentifizierung Better Auth + Magic Link Self-hosted, open-source, Magic Link via -sh/better-auth plugin
Canvas / Flow @xyflow/react ehem. react-flow-renderer
Drag & Drop dnd-kit Empfohlen über react-dnd (bessere Performance)
Deployment Coolify VPS-Deployment für alle Self-hosted Services
Payment Polar.sh MoR, VAT-Handling, Better Auth Plugin (@polar-sh/better-auth)
Input Validation Zod Frontend + Backend, Convex Mutations
In-Memory Store Redis Self-hosted via Coolify
Rate Limiting Redis-backed Next.js Middleware / Route Handler
E-Mail Unsend + Stalwart Self-hosted via Coolify
Analytics Rybbit Self-hosted via Coolify
Error Tracking Sentry Cloud Free Tier (5.000 Errors/Monat)
DNS / DDoS / CDN Cloudflare Domain-Routing, DDoS-Schutz, Asset-Caching
Panel Resizing react-resizable-panels ShadCN UI Komponente für Resizable Layouts
Image Pipeline WebGL + GLSL Shaders Hardware-beschleunigte Bildverarbeitung im Browser
Offline Sync IndexedDB + localStorage Canvas-Sync-Queue, Snapshot-Persistenz, Optimistic Updates
Package Manager pnpm Je Repo

Zwei-Repo-Strategie

Statt eines Monorepos werden zwei unabhängige Repositories gepflegt. Zwischen den Repos gibt es keinen geteilten Code — die Landing Page hat keine Abhängigkeit auf Convex-Schemas, Node-Types oder andere App-Logik.

Repo Domain Inhalt
lemonspace-web app.lemonspace.io Next.js App (Canvas, Dashboard, Auth, AI, Convex)
lemonspace-landing lemonspace.io Next.js Marketing Site

Auth-Cookie-Sharing: BetterAuth setzt einen Session-Cookie auf .lemonspace.io (Dot-Prefix = gilt für alle Subdomains). Die Landing Page liest diesen Cookie, um den Login-State zu erkennen und zwischen "Get Started" und "Dashboard" Button zu wechseln. Die Landing Page führt keine Auth-Operationen durch — sie liest nur den Cookie.

Self-Hosting-Strategie

Self-Hosting richtet sich primär an technisch versierte Nutzer und Entwickler. Die gehostete Version (lemonspace.app) ist der empfohlene Weg für alle anderen — insbesondere für Designer und kreative Teams ohne DevOps-Erfahrung.

Das Self-Hosting-Paket umfasst:

  • docker-compose.yml — fasst alle Services zusammen: Next.js, Convex, Redis, Stalwart, Rybbit, rembg, Real-ESRGAN, GFPGAN
  • .env.example — alle Umgebungsvariablen mit Kommentaren und Standardwerten
  • Setup-README — Schritt-für-Schritt-Anleitung (Voraussetzungen: Docker + Coolify oder plain Docker)

Hinweis: Self-hosted KI-Services (rembg, Real-ESRGAN, GFPGAN) bleiben in separaten Repositories mit eigenem Docker/Infra-Lifecycle und werden über Coolify unabhängig deployt.

Convex: Architektonische Entscheidung & Lock-in

Convex liefert Realtime-Sync, File Storage und Background Jobs out-of-the-box, ohne dass eine eigene WebSocket-Infrastruktur, S3-Integration und Queue-Lösung zusammengestückelt werden muss. Dieser Geschwindigkeitsvorteil rechtfertigt den bewussten Vendor Lock-in.

Risiko (bewusst akzeptiert): Der gesamte Realtime-, Storage- und Job-Stack ist an Convex gebunden. Eine spätere Migration ist aufwändig. Es wird keine künstliche Abstraktionsschicht eingebaut, da sie den Kernvorteil von Convex aufheben würde.

Dokumentierter Migrationspfad bei Skalierung: Convex Cloud mit EU-Standort. Convex bietet das eigene Migrations-Tooling und kennt das Ökosystem. Self-hosted Convex bleibt die Default-Strategie für Phase 1.


6. KI-Integrationsstrategie

Zwei LLM-Rollen im System

Rolle Zweck Beispielmodelle Aufgerufen von
Text / Reasoning Agent-Logik, Planung, Clarification, Copywriting Claude 3.5 Sonnet, GPT-4o Agent Node
Image Generation Bildgenerierung auf dem Canvas Gemini 2.5 Flash Image, Flux.1 Pro, GPT-5 Image Canvas-Aktionen + Agent Node

OpenRouter — Image Generation

Modell OpenRouter ID Stärke ~Kosten/Bild
Gemini 2.5 Flash Image google/gemini-2.5-flash-image Multi-Turn Editing, günstig ~€0,020,04
FLUX.2 Klein 4B black-forest-labs/flux.2-klein-4b Photorealismus, schnellstes Flux ~€0,010,03
Seedream 4.5 bytedance-seed/seedream-4.5 Editing-Konsistenz, Portraits ~€0,04
Gemini 3.1 Flash Image google/gemini-3.1-flash-image-preview Pro-Qualität bei Flash-Speed ~€0,040,08
GPT-5 Image Mini openai/gpt-5-image-mini Gutes Preis-Leistungs-Verhältnis ~€0,040,08
Riverflow V2 Fast sourceful/riverflow-v2-fast Custom Font Rendering, schnell ~€0,02
Riverflow V2 Pro sourceful/riverflow-v2-pro Text-Rendering, 4K Output ~€0,150,33
Gemini 3 Pro Image google/gemini-3-pro-image-preview Multi-Image, 4K, bestes Text-Rendering ~€0,080,15
GPT-5 Image openai/gpt-5-image Instruction Following, Text in Bild ~€0,100,20

Aktuell aktiviertes Modell (Phase 1)

Modell ID Credits Tier-Zugang
Gemini 2.5 Flash Image google/gemini-2.5-flash-image 4 Cr Alle Tiers

Weitere Modelle werden in Phase 2 freigeschaltet (Modellauswahl-UI im Canvas).

Self-hosted Services

Service Funktion Credits
rembg Hintergrundentfernung Kostenlos
Real-ESRGAN Upscaling (2×, 4×, 8×) Kostenlos
GFPGAN Face Restoration Kostenlos

7. High-Level Architektur

┌──────────────────────────────────────────────────────────┐
│ Next.js Frontend                                         │
│ Infinite Canvas (@xyflow/react + dnd-kit)                │
│                                                          │
│ Node-Kategorien:                                         │
│ [Quelle] [KI-Ausgabe] [Transformation]                   │
│ [Bildbearbeitung] [Steuerung] [Canvas & Layout]          │
│                                                          │
│ Image Pipeline:                                          │
│ WebGL + GLSL Shaders (client-seitig, credit-frei)        │
│ IndexedDB Sync Queue (offline-fähig)                     │
└───────────────────────┬──────────────────────────────────┘
                        │
              ┌─────────▼─────────┐
               │  Convex Backend   │
               │  (Self-hosted)    │
               │  - Realtime Sync  │
               │  - File Storage   │
               │  - Auth           │
               │  - Modell-Router  │
               │  - Agent Executor │
               └──┬────────┬───┬───┘
                  │        │   │
     ┌────────────▼──┐ ┌───▼──────────────┐ ┌──▼──────────┐
     │  OpenRouter   │ │ Self-hosted KI   │ │ Freepik API │
     │ Image Gen +   │ │ rembg / ESRGAN   │ │  (Assets)   │
     │ Text/Reason   │ │ GFPGAN           │ └─────────────┘
     └───────────────┘ └──────────────────┘

8. Datenmodell (High-Level)

Canvas & Node

Canvas
├── id, name, ownerId, createdAt / updatedAt
└── nodes[]

Node (Basis)
├── id, canvasId
├── type (image | text | prompt | color | video | asset |
│        ai-image | ai-text | ai-video | agent-output |
│        crop | bg-remove | upscale | style-transfer | face-restore |
│        curves | color-adjust | light-adjust | detail-adjust | render |
│        splitter | loop | agent | mixer | switch |
│        group | frame | note | compare | text-overlay | comment | presentation)
├── position { x, y }
├── size { width, height }
├── data (je nach Typ)
├── status (idle | analyzing | clarifying | executing | done | error)
├── statusMessage?
├── retryCount?
├── parentId?
├── zIndex?
└── createdAt

Credit-System

CreditBalance
├── id, userId
├── balance          // verfügbare Credits
├── reserved         // aktuell gesperrte Credits (laufende Jobs)
├── available        // computed: balance - reserved
├── monthlyAllocation // Credits aus dem Abo (50/400/3300/6700)
└── updatedAt

CreditTransaction
├── id, userId
├── amount           // positiv = Gutschrift, negativ = Verbrauch (in Credits)
├── type             // subscription | topup | usage | reservation | refund
├── status           // committed | reserved | released | failed
├── description      // z.B. "Bildgenerierung  Gemini 2.5 Flash Image (4 Cr)"
├── nodeId?          // Referenz auf den auslösenden Node
├── canvasId?        // Zugehöriger Canvas
├── openRouterCost?  // tatsächliche OpenRouter-Kosten in €
├── model?           // OpenRouter Model ID
└── createdAt

Subscription
├── id, userId
├── tier             // free | starter | pro | max | business
├── status           // active | cancelled | past_due | trialing
├── currentPeriodStart / currentPeriodEnd
└── polarSubscriptionId?

Adjustment Presets

AdjustmentPreset
├── id, userId
├── name             // Benutzerdefinierter Name
├── nodeType         // curves | color-adjust | light-adjust | detail-adjust
├── params           // Typ-spezifische Parameter (v.any())
└── createdAt

9. Pricing & Credit-System

Credit-Abstraktion

Nutzer arbeiten mit Credits statt mit Euro-Beträgen. Ein Credit entspricht intern €0,01 OpenRouter-Kosten (interner Wechselkurs, wird dem Nutzer nicht kommuniziert). Die Abstraktion entkoppelt das Pricing von API-Preisschwankungen und ermöglicht flexible Anpassungen.

Abo-Stufen

Preise kalkuliert mit ≥28% Netto-Marge nach Polar Gebühr (4% + $0,40 + 1,5% intl. + 0,5% Subscription) und 19% USt.

Tier Preis/Monat Credits/Monat Echte Marge €/Credit Zielgruppe
Free €0 50 €0,50 (Akquise) gratis Testen & Evaluieren
Starter €8 400 ~€2,00 (33%) €0,0200 Einzelnutzer, Einstieg
Pro €59 3.300 ~€13,71 (29%) €0,0179 Aktive Creator
Max €119 6.700 ~€27,61 (29%) Teams, hoher Durchsatz

Credit-Nachkauf (Top-Up)

Fixe Top-Up-Pakete + frei wählbarer Custom-Betrag (€5200). Top-Ups sind pro Credit immer teurer als das entsprechende Abo — regelmäßige Nachkäufer werden zum Upgrade animiert.

Fixe Pakete:

Paket Preis Credits Marge €/Credit
Klein €5 250 ~31% €0,0200
Mittel €10 500 ~34% €0,0200
Groß €20 1.000 ~36% €0,0200
XL €50 3.000 ~24% €0,0167

Custom Top-Up (€5200): Bonus steigt stufenweise mit dem Betrag. Formel: Credits = FLOOR(Netto × 0,70 × (1 + Bonus) ÷ Kurs). UI zeigt live: "€X → Y Credits".

Bereich Bonus Min. Marge
€59,99 0% ~30%
€1019,99 3% ~28%
€2049,99 6% ~26%
€5099,99 10% ~23%
€100200 13% ~21%

Credit-Preise pro Operation

Credits = ROUND(API-Kosten × Markup ÷ Kurs). Agent-Calls haben höheren Markup (Wertschöpfung durch Orchestrierung).

Operation Modell API-Kosten Markup Credits Tier-Zugang
Bildgenerierung (Standard) Gemini 2.5 Flash Image ~€0,04 2× 4 Cr Alle Tiers
Bildgenerierung (Budget) FLUX.2 Klein 4B ~€0,02 2× 4 Cr Alle Tiers
Bildgenerierung (Standard+) Gemini 3.1 Flash Image ~€0,06 2× 12 Cr Alle Tiers
Bildgenerierung (Premium) GPT-5 Image Mini ~€0,08 2× 16 Cr Ab Starter
Bildgenerierung (Ultra) GPT-5 Image ~€0,18 2× 36 Cr Ab Starter
Bildgen. (Pro Text/4K) Riverflow V2 Pro ~€0,33 1,5× 50 Cr Ab Starter
Agent Reasoning (leicht) Claude Sonnet ~€0,03 3× 9 Cr Ab Starter
Agent Reasoning (mittel) Claude Sonnet ~€0,06 2,5× 15 Cr Ab Starter
Agent-Run (komplex) Multi-Step Workflow ~€0,15 2,5× 38 Cr Ab Starter
BG-Entfernung rembg (self-hosted) €0 0 Cr Alle Tiers
Upscaling Real-ESRGAN (self-hosted) €0 0 Cr Alle Tiers
Face Restoration GFPGAN (self-hosted) €0 0 Cr Alle Tiers
Canvas-Operationen €0 0 Cr Alle Tiers
Bildbearbeitung (Kurven, Farbe, Licht, Detail) WebGL (client-seitig) €0 0 Cr Alle Tiers
Render (Adjustment-Stack materialisieren) Server-seitig (Canvas API) €0 0 Cr Alle Tiers
Export (PNG/ZIP) €0 0 Cr Alle Tiers

Credit Reservation + Commit

Credits werden vor jedem KI-Call reserviert und erst nach erfolgreichem Abschluss committed. Bei Fehler werden reservierte Credits automatisch freigegeben — kein manueller Refund-Prozess nötig.

Flow:

1. RESERVE → CreditTransaction (type: reservation, status: reserved)
   CreditBalance.reserved += estimated_credits
   CreditBalance.available = balance - reserved

2a. SUCCESS → Transaction status: committed
    CreditBalance.balance -= actual_credits
    CreditBalance.reserved -= estimated_credits

2b. FAILURE → Transaction status: released
    CreditBalance.reserved -= estimated_credits
    (balance bleibt unverändert — voller Refund)

Preisbasis: Credit-Preise pro Operation sind fix definiert (siehe Tabelle). Der interne Wechselkurs (1 Credit = €0,01 OR-Kosten) ist ein internes Kalkulationsinstrument. Bei API-Preisänderungen werden die Credit-Preise pro Operation angepasst — nicht der Wechselkurs.

Agent Partial Failure

Bei Agent-Workflows läuft Reservation + Commit pro Suboperation. Schlägt Step 3 von 5 fehl: Steps 1+2 sind committed, Step 3 wird released, Steps 4+5 werden nicht mehr reserviert. Nur tatsächlich verbrauchte Credits werden berechnet.


10. UX-Strategie für Latenzen

KI-Operationen haben inhärente Wartezeiten. Einzelne Bildgenerierungen dauern 315 Sekunden, Agent-Workflows 2060+ Sekunden. Die UI überbrückt diese Wartezeiten durch optimistische Darstellung direkt am Node — kein globales Loading-Banner, kein blockierendes Modal.

Node-Status-Modell

Jeder ausführende Node zeigt seinen Zustand visuell direkt auf dem Canvas:

idle → analyzing → clarifying → executing (Step X/N) → done | error

Agent Nodes zeigen zusätzlich den Step-Progress während der Execution ("Generating Feed Post 2/3"). Bei Fehler wechselt der Node in einen Error-State mit kurzem Hinweis direkt am Node ("Timeout — Credits wurden nicht abgebucht").

Skeleton Nodes

Sobald der Agent seinen Execution-Plan (JSON) erstellt hat, kennt das System Anzahl und Typ aller Output-Nodes. Ab diesem Moment werden Skeleton-Nodes auf dem Canvas platziert — noch bevor ein einziger API-Call für die Generierung läuft.

Agent Status: analyzing
→ Plan fertig: 3x KI-Bild, 2x KI-Text, 1x Text-Overlay
→ 6 Skeleton-Nodes erscheinen auf dem Canvas, korrekt positioniert
→ Agent Status: executing (1/6)
→ Skeletons füllen sich der Reihe nach mit echten Outputs
  • Skeleton-Nodes sind bereits verschiebbar und arrangierbar bevor der Output fertig ist
  • Sobald der Output fertig ist, ersetzt er den Skeleton in-place — Position bleibt erhalten
  • Visuell: gedimmter Node-Rahmen mit Shimmer-Effekt, Node-Typ-Icon sichtbar (Bild vs. Text)

Browser Notifications (Tab-Wechsel)

  • Opt-in Browser Notifications API: wenn der Nutzer den Tab verlässt und der Job fertig wird, native Browser-Benachrichtigung
  • Nicht erzwungen — Nutzer die im Tab bleiben sehen den Node-Status direkt

Offline-Sync & Optimistic Updates

  • IndexedDB-Sync-Queue (lib/canvas-op-queue.ts): Persistente Queue für Canvas-Mutations mit Retry-Backoff und 24h-TTL
  • localStorage-Cache (lib/canvas-local-persistence.ts): Snapshot + leichtgewichtiger Op-Mirror für sofortige UI-Pins/Recovery
  • Optimistic IDs: Temporäre Nodes/Edges erhalten optimistic_-Prefix, werden durch echte Convex-IDs ersetzt
  • ID-Remapping: Folge-Operationen werden automatisch auf neue IDs remappt

11. Entwicklungsphasen

Phase 1 — Foundation (MVP)

Nodes (15 implementiert):

  • Quelle: Bild , Text , Video , Asset
  • KI-Ausgabe: Prompt , KI-Bild (ai-image)
  • Bildbearbeitung: Kurven , Farbe , Licht , Detail , Render
  • Canvas & Layout: Gruppe , Frame , Notiz , Compare

Infrastruktur & Features:

Task Status
Projektsetup: Next.js 16 + Tailwind v4 + ShadCN Erledigt
Convex Self-hosted Backend Erledigt
Basis-Canvas mit @xyflow/react Erledigt
Drag & Drop von Bildern Erledigt
Authentifizierung via Better Auth + Magic Link Erledigt
OpenRouter Integration (Gemini 2.5 Flash Image) Erledigt
Credit-System: Balance, Reservation+Commit Erledigt
Abo-Verwaltung: Free/Starter/Pro/Max Tiers Erledigt
Polar Integration: Checkout, Webhooks Erledigt
Credit-Nachkauf: Fixe Top-Ups + Custom Erledigt
Node-Status-Modell (idle/executing/done/error) Erledigt
WebGL Image Pipeline (Adjustments) Erledigt
Resizable Sidebar mit Rail-Mode Erledigt
Offline Sync (IndexedDB Queue) Erledigt
Optimistic Updates + ID-Remapping Erledigt
Auth Race-Härtung Erledigt
Canvas Modularisierung Erledigt
Asset Browser (Stock-Fotos, Vektoren) Erledigt
Video Browser Erledigt
Connection Policy (Edge-Validierung) Erledigt
Adjustment Presets (Built-in + User-defined) Erledigt
docker-compose.yml + .env.example + Setup-README ☐ Offen

Phase 2 — KI-Features

Nodes:

  • Quelle: Farbe / Palette
  • KI-Ausgabe: KI-Text, KI-Video
  • Transformation: Crop / Resize, BG entfernen, Upscale
  • Steuerung: Splitter, Loop, Agent
  • Canvas & Layout: Text-Overlay

Infrastruktur & Features:

Task Status
Vollständige OpenRouter Image Gen Integration (alle 9 Modelle) ☐ Offen
Experten-Modus: Modellauswahl-UI im Canvas AI Panel ☐ Offen
OpenRouter Text/Reasoning Integration (Claude 3.5 Sonnet) ☐ Offen
Agent Node: Analyse, Clarification, Execution, Output ☐ Offen
Skeleton-Nodes: Platzierung nach Plan-Erstellung ☐ Offen
Browser Notifications API (opt-in, Tab-Wechsel) ☐ Offen
Erster Agent Template: Instagram Curator ☐ Offen
Self-hosted KI-Services (rembg, Real-ESRGAN) ☐ Offen
Prompt-History und Re-Generation ☐ Offen
Text-Overlay Node ☐ Offen

Phase 3 — Kollaboration & Polish

Nodes:

  • Transformation: Style Transfer, Gesicht (GFPGAN)
  • Steuerung: Mixer, Weiche
  • Canvas & Layout: Kommentar, Präsentation

Infrastruktur & Features:

Task Status
Echtzeit-Kollaboration via Convex Subscriptions ☐ Offen
Kommentar- und Annotations-System ☐ Offen
Versions-History ☐ Offen
Weitere Agent Templates ☐ Offen
Export-Funktionen (PNG, PDF, ZIP) ☐ Offen
Performance-Optimierung für große Canvases ☐ Offen

12. Offene Entscheidungen

Thema Entscheidung / Status
Authentifizierung Better Auth (self-hosted, open-source)
Tailwind v4 v4 ist Standard, keine Migration nötig
Pricing / Credit-System Credit-Abstraktion (1 Cr = €0,01 intern), 4 Tiers, Reservation+Commit, Top-Up
Payment Provider Polar (Merchant of Record, VAT-Handling)
Self-Hosting-Strategie docker-compose.yml + .env.example + README
Convex Lock-in Bewusst akzeptiert; Migrations-Pfad: Convex Cloud EU
OpenRouter Image-Modelle 9 Modelle definiert, Phase 1: nur Gemini 2.5 Flash aktiv
Lizenz BSL 1.1, 3 Jahre Change Date, Apache 2.0
Repo-Strategie Zwei unabhängige Repos, Auth-Cookie-Sharing
Job Queue Convex native (Phase 1), externe Lösung bei Bedarf
E-Mail Unsend + Stalwart, self-hosted
Analytics Rybbit, self-hosted
Error Tracking Sentry Cloud (Free Tier)
Cache-Strategie Cloudflare (Edge) + Redis (Application)
E2E-Testing Kein E2E in Phase 1
UX-Latenzen Node-Status-Modell, Skeleton-Nodes
Credit Fehlerbehandlung Reservation + Commit
Bildbearbeitung: Rendering-Engine WebGL + GLSL Shader als primäre Engine. WASM-Backend vorbereitet
Bildbearbeitung: Preset-Persistierung User-Presets in Convex (adjustmentPresets-Tabelle)
Offline Sync IndexedDB Queue + localStorage Cache + Optimistic Updates
Kollaborationstiefe Cursor-Sync, gleichzeitige Edits, Kommentare
Agent Clarification UX Inline am Node vs. Modal vs. Chat-Sidebar
Agent Template Format Markdown-Datei vs. strukturiertes JSON-Schema
Weiche: Bedingungslogik Visueller Rule-Builder vs. Ausdruckssprache
Mixer: Blend Modes min. Normal, Multiply, Screen, Overlay
Canvas-Export PNG, PDF, ZIP (Phase 3, Library TBD)

13. Nicht-funktionale Anforderungen

Anforderung Beschreibung
Self-hostable Vollständiger Betrieb auf eigenem VPS möglich; docker-compose.yml als primäres Deployment-Artefakt
Source Available BSL 1.1 — Quellcode öffentlich, kommerzielle Nutzung lizenzpflichtig (siehe Abschnitt 15)
Performance Canvas mit 100+ Nodes ohne spürbare Verzögerung
Datenschutz Keine externen Tracking-Dienste; Ausnahme: Sentry Cloud für Error Tracking
Skalierbarkeit Convex-Backend skaliert mit wachsender Nutzerzahl; Migrations-Pfad: Convex Cloud EU
Sicherheit Rate Limiting auf allen API-Endpunkten via Redis, DDoS-Schutz via Cloudflare
UX-Resilienz Alle KI-Operationen zeigen Status direkt am Node; Skeleton-Nodes bei Agent-Workflows
Credit-Integrität Reservation+Commit-Mechanismus verhindert Credit-Verlust bei fehlgeschlagenen API-Calls
Offline-Fähigkeit Canvas-Sync via IndexedDB Queue; Optimistic Updates mit ID-Remapping

14. Nächste Schritte

  1. docker-compose.yml + .env.example + Setup-README ausarbeiten
  2. Vollständige OpenRouter Integration (alle 9 Modelle + Modellauswahl-UI)
  3. Agent Node: Analyse, Clarification, Execution, Output
  4. Self-hosted KI-Services (rembg, Real-ESRGAN, GFPGAN)
  5. Transformation-Nodes (Crop/Resize, BG entfernen, Upscale)
  6. Echtzeit-Kollaboration via Convex Subscriptions

15. Lizenzmodell

Die Software wird unter der Business Source License 1.1 (BSL 1.1) veröffentlicht. Der vollständige Quellcode ist öffentlich einsehbar, auditierbar und für private/persönliche Nutzung kostenlos. Kommerzielle Nutzung erfordert eine separate Lizenzvereinbarung.

Parameter

Parameter Wert
Lizenz Business Source License 1.1
Change Date 3 Jahre nach Veröffentlichung jedes Releases
Change License Apache License 2.0
Additional Use Grant Nutzung ausschließlich für private und persönliche, nicht-kommerzielle Zwecke

Kommerzielle Lizenzen (geplant)

Lizenz Zielgruppe Details
Small Business Unternehmen ≤ 10 Mitarbeiter Preis und Konditionen TBD
Enterprise Unternehmen > 10 Mitarbeiter Preis und Konditionen TBD
OEM / Reseller Einbettung in Drittprodukte Individuelle Vereinbarung

Positionierung: LemonSpace wird als „Source Available" bzw. „Fair Source" positioniert — nicht als „Open Source" im Sinne der OSI-Definition. Der Quellcode ist vollständig öffentlich und transparent; Nutzungsrechte sind eingeschränkt bis zum Erreichen des Change Date.


LemonSpace PRD v2.0 — April 2026