Performance
The embed must feel invisible until clicked. Budgets are enforced in CI.
Size budgets
| Bundle | Budget (gzip) |
|---|---|
widget.js loader | ≤ 5 KB |
widget-ui.js | ≤ 40 KB |
pnpm check:sizeLoad path
- Async
widget.js(~4–5 KB) GET /v1/widget/:pk/config(edge-cacheable)- Render mascot launcher (SVG in Shadow DOM)
- On open → download
widget-ui.jsonce → mount panel POST /v1/feedback→ 201 → async email
Forbidden in widget packages
No React, Supabase clients, analytics SDKs, date libraries, or UI kits in packages/widget / widget-ui.