On this page
6. Apps — what runs where
| App | Port | Tech | Purpose |
|---|---|---|---|
web | 5173 | React 18 + Vite + React-Router-v6 | Editor-SPA — Dashboard, Markdown-Editor, Live-Preview, Deploy-Panel |
preview | 4173 | React 18 + Vite | Iframe-Renderer — receives postMessage, renders via render-engine |
api | 3000 | Express 5 + tsx watch | REST-API — all endpoints under /api/*, Session-Auth |
converter | 8001 | FastAPI + uvicorn | Python-Microservice — DOCX/PDF/PPTX/XLSX/HTML/EPUB → Markdown |
landing | 4178 | Static HTML (serve) | Marketing-Landing — what visitors see before logging in |
Each app has its own package.json with a dev script and can be started in parallel via turbo dev.
Why an Iframe for the Preview?
CSS and JS isolation. The Pack tokens set :root CSS variables which, without an Iframe, would style the editor UI itself. Additionally, the Preview app sends postMessages back (Click-to-Edit clicks) which we verify at the origin.