Rendering Architecture
heycreo uses one shared render core and two export targets. The Studio preview and both backends consume the same layout, text-fit, and element logic so what you see in the editor matches what gets exported.
Overview
packages/studio-domain editor document model
│
packages/render-engine shared render core
│
┌────┴────────────────────┐
│ │
renderers/browser renderers/remotion
(Playwright HTML) (Remotion bundle)
PNG / JPEG / WebP / PDF MP4 / WebM
│ │
└──────────┬──────────────┘
│
frontend Studio
(live canvas / Player)
| Path | Role |
|---|---|
| Studio (frontend) | Live preview and editing |
packages/render-engine | Elements, auto-layout, text fitting, animation math |
renderers/browser | Single-file HTML for image/PDF export (and mobile WebView) |
renderers/remotion | Composition bundle for video export |
The API worker picks the target via render-selector: images/PDF prefer the
browser renderer; video uses Remotion when its bundle is available.
Live Preview
While editing templates you see changes instantly:
- Real-time updates as you modify text, images, or layout
- Interactive editing with immediate visual feedback
- Same render core as export (not a separate screenshot path)
Export
- Images: PNG, JPEG, WebP via the browser renderer
- PDF: browser renderer (+ optional CMYK prepress via Ghostscript)
- Video: MP4 / WebM via Remotion
- Batch: multiple sizes/exports through the worker queues
Consistency
- Shared engine under
packages/render-engine - Visual regression snapshots gate both render targets in CI
- Preview and export are meant to stay in lockstep; report any drift
Best Practices
- Preview first — verify the design in the Studio before exporting
- Test different content lengths — especially with auto-resize text
- Spot-check exports after changing the render engine or a renderer
See also
- Text Auto-Resize — automatic text sizing
- Layout Engine — container layout system