Skip to main content
Docs

6. Apps — what runs where

AppPortTechPurpose
web5173React 18 + Vite + React-Router-v6Editor-SPA — Dashboard, Markdown-Editor, Live-Preview, Deploy-Panel
preview4173React 18 + ViteIframe-Renderer — receives postMessage, renders via render-engine
api3000Express 5 + tsx watchREST-API — all endpoints under /api/*, Session-Auth
converter8001FastAPI + uvicornPython-Microservice — DOCX/PDF/PPTX/XLSX/HTML/EPUB → Markdown
landing4178Static 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.

Why Python for the Converter? PDF parsing is significantly better in the Python ecosystem (pdfplumber, MarkItDown). Instead of rebuilding that in Node → standalone service, only HTTP interface.#