6. Apps — was läuft wo
| App | Port | Tech | Zweck |
|---|---|---|---|
web | 5173 | React 18 + Vite + React-Router-v6 | Editor-SPA — Dashboard, Markdown-Editor, Live-Preview, Deploy-Panel |
preview | 4173 | React 18 + Vite | Iframe-Renderer — empfängt postMessage, rendert via render-engine |
api | 3000 | Express 5 + tsx watch | REST-API — alle Endpoints unter /api/*, Session-Auth |
converter | 8001 | FastAPI + uvicorn | Python-Microservice — DOCX/PDF/PPTX/XLSX/HTML/EPUB → Markdown |
landing | 4178 | Static HTML (serve) | Marketing-Landing — was Besucher sehen, bevor sie einloggen |
Jede App hat ein eigenes package.json mit dev-Script und ist via turbo dev parallel startbar.
Warum ein Iframe für die Preview?
CSS- und JS-Isolation. Die Pack-Tokens setzen :root-CSS-Variablen, die ohne Iframe das Editor-UI selbst stylen würden. Außerdem schickt die Preview-App postMessages zurück (Click-to-Edit-Klicks), die wir am Origin verifizieren.
Warum Python für den Converter?
PDF-Parsing ist im Python-Ökosystem deutlich besser (pdfplumber, MarkItDown). Statt das in Node nachzubauen → standalone Service, nur HTTP-Schnittstelle.