experiment(embed): bootable embedded mode for the webapp inside PostHog Code#71087
experiment(embed): bootable embedded mode for the webapp inside PostHog Code#71087mariusandra wants to merge 2 commits into
Conversation
EXPERIMENT: adds an `embed` vite entry that boots the full app inside an iframe served by PostHog Code's local auth-injecting proxy. Tracking is disabled (no JS_POSTHOG_API_KEY -> posthog-js opts out, exporter pattern), and a postMessage bridge syncs navigation (kea-router push / locationChanged) and theme both ways. themeLogic gains an embedForcedTheme override so the host window's light/dark choice wins over user/system preference. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
🤖 CI report✅ Bundle size — 🟢 -7.8 KiB (-0.0%)Uncompressed size of every built Total: 64.79 MiB · 🟢 -7.8 KiB (-0.0%)
Posted automatically by build-bundle-size-report · uncompressed bytes from dist-report ✅ Eager graph — within budgetHow much code each root ships on the eager path — downloaded and parsed before the surface is interactive. Measured from the esbuild output chunks (post-tree-shake, static imports only); lazy
🟢 Largest files eagerly shipped from
|
| Size | File |
|---|---|
| 126.8 KiB | ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js |
| 24.6 KiB | ../node_modules/.pnpm/buffer@6.0.3/node_modules/buffer/index.js |
| 6.3 KiB | ../node_modules/.pnpm/react@18.3.1/node_modules/react/cjs/react.production.min.js |
| 4.5 KiB | ../node_modules/.pnpm/@jspm+core@2.1.0/node_modules/@jspm/core/nodelibs/browser/process.js |
| 3.9 KiB | ../node_modules/.pnpm/scheduler@0.23.2/node_modules/scheduler/cjs/scheduler.production.min.js |
| 1.4 KiB | ../node_modules/.pnpm/base64-js@1.5.1/node_modules/base64-js/index.js |
| 1.3 KiB | src/RootErrorBoundary.tsx |
| 912 B | ../node_modules/.pnpm/ieee754@1.2.1/node_modules/ieee754/index.js |
| 789 B | src/scenes/ChunkLoadErrorBoundary.tsx |
| 762 B | src/index.tsx |
Largest files eagerly shipped from src/scenes/AuthenticatedShell.tsx
| Size | File |
|---|---|
| 281.1 KiB | ../node_modules/.pnpm/posthog-js@1.401.0/node_modules/posthog-js/dist/rrweb.js |
| 267.7 KiB | ../node_modules/.pnpm/@posthog+icons@0.38.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.js |
| 235.5 KiB | src/taxonomy/core-filter-definitions-by-group.json |
| 222.7 KiB | ../node_modules/.pnpm/posthog-js@1.401.0/node_modules/posthog-js/dist/module.js |
| 164.0 KiB | src/queries/validators.js |
| 154.3 KiB | ../node_modules/.pnpm/re2js@0.4.1/node_modules/re2js/build/index.esm.js |
| 126.8 KiB | ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js |
| 106.1 KiB | src/lib/api.ts |
| 93.3 KiB | ../node_modules/.pnpm/prosemirror-view@1.40.1/node_modules/prosemirror-view/dist/index.js |
| 92.7 KiB | ../packages/quill/packages/quill/dist/index.js |
Posted automatically by check-eager-graph · sizes are eager output bytes (shipped, post-tree-shake) from the esbuild metafile · part of #32479
✅ Dist folder size — 🟢 -20.2 KiB (-0.0%)
Total size of the built frontend/dist folder (all assets), compared against the base branch.
Total: 1308.70 MiB · 🟢 -20.2 KiB (-0.0%)
- navigationLogic gains an embedMode reducer (seeded from window.__POSTHOG_EMBED__, like themeLogic's embedForcedTheme) that forces navigation mode 'none': no PanelLayout sidebar, no top bar, no side panel — scene content takes the full iframe. mode='none' is the existing tested path used by onboarding's hidden-navbar variants. - embed bridge intercepts window.open and <a target="_blank"> clicks on same-origin URLs and forwards them to the host as `openTab` messages, so "open in new tab" affordances become host browser tabs instead of being dropped. External URLs keep native behavior; in-app kea-router pushes still navigate in place. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Experiment: run the webapp inside PostHog Code (desktop app)
Adds an
embedvite entry that boots the full webapp inside an iframe hosted by the PostHog Code desktop app, which serves it behind a local same-origin proxy that injects the desktop's OAuth token into/api/*calls (so no CORS and no session cookie needed).frontend/src/embed/index.tsx— new entry: clearsJS_POSTHOG_API_KEY(posthog-js opts out, exporter/render-query pattern), sets__POSTHOG_EMBED__, reads?__posthog_embed_theme=, dynamic-imports the main entry + the bridge.frontend/src/embed/bridge.ts— postMessage protocol: host→iframenavigate(viarouter.actions.push) andsetTheme; iframe→hostreadyandrouteChanged. Also interceptswindow.openand capture-phase clicks on<a target="_blank">: same-origin URLs forward to the host asopenTab(the host opens them as its own browser tabs), external URLs keep native behavior.themeLogic— newembedForcedThemereducer checked first inisDarkModeOn, so the embedding host's theme wins over user/system preference.navigationLogic— newembedModereducer (seeded from__POSTHOG_EMBED__, same pattern asembedForcedTheme) that short-circuits themodeselector to'none', the existing tested no-chrome path: no PanelLayout sidebar, no top bar, no SidePanel — the scene fills the iframe while all nav logics stay mounted.frontend/vite.config.mtsrollup inputs, sovite buildemits it alongsideexporter/render_query/toolbar.Verified live from the desktop app against us.posthog.com: notebooks (including embedded insights executing queries), feature flags, and dashboards scenes render chrome-less; navigation, theme, and new-tab intents bridge both directions.
Known limitation surfaced by this experiment: DRF actions without
required_scopes403 under token auth — typed query subresources (/query/TrendsQuery/etc.),tags,user_product_list. Fixing that class upstream would unlock Activity/Persons/insight-creation in embedded mode (and Python/DuckDB notebook cells in PostHog Code).Screenshots (webapp running chrome-less inside the desktop app)
🤖 Generated with Claude Code