Skip to content

experiment(widgets): embeddable same-document Query editor widget - #71089

Closed
mariusandra wants to merge 1 commit into
masterfrom
code-widgets-experiment
Closed

experiment(widgets): embeddable same-document Query editor widget#71089
mariusandra wants to merge 1 commit into
masterfrom
code-widgets-experiment

Conversation

@mariusandra

Copy link
Copy Markdown
Collaborator

Experiment: widgets entry — mount the real Query editor in a foreign app

Draft/experiment — not intended to merge as-is. User-approved companion to PostHog/code#3473, which consumes this branch.

Adds a widgets vite entry (toolbar pattern) exposing window.PostHogWidgets.mountQueryEditor(el, { query, onQueryChange, apiHost, getAccessToken, theme, onClose }){ update, unmount }. Internally: shadow root with injected styles, own React 18 + kea copy, FloatingContainerContext pointing popovers/tooltips inside the shadow root, and the full editable Query/InsightViz editor (series, math, TaxonomicFilter, breakdown/filters) emitting plain query JSON to the host.

  • Auth rides the existing standalone OAuth mode in lib/api.ts, plus one new seam: setOAuthSessionOverride(session, refreshFn) — an in-memory session (never persisted in the host origin) whose 401 path calls the host's token refresh.
  • Only userLogic + teamLogic need explicit mounting; the rest self-mounts via kea connect. loadUserSuccess seeds ApiConfig ids in OAuth mode — no POSTHOG_APP_CONTEXT required.
  • Proven inside PostHog Code (React 19): two React copies coexist in one document, onQueryChange round-trips, live theme flip restyles open popovers. See companion PR for details and the harness.

Bundle: widgets.js 2.03 MB (603 KB gz) + CSS 137 KB gz; ~2.7 MB gz eager mount cost; 186 lazy chunks deferred.

If this graduates from experiment, the maintainability contract would be: keep the entry building, keep tokens on :root, :host, keep FloatingContainerContext honored by portaling primitives, promote setOAuthSessionOverride to a first-class embedded-auth API, and add a size budget like check-toolbar-size.

Screenshots

Taxonomic filter in shadow root

Mounted in the Electron app

🤖 Generated with Claude Code

New standalone 'widgets' entry that exposes window.PostHogWidgets.mountQueryEditor:
the real editable Query/InsightViz editor (series, taxonomic pickers, breakdown,
date range, chart type) mounted into a foreign document with its own React 18 +
kea inside a shadow root — the toolbar pattern, but for the insight editor.

- frontend/src/widgets/: mount API, shadow-root component (FloatingContainerContext
  keeps popovers/tooltips/modals inside the shadow root; [theme] attribute drives
  dark mode), tiny instance store for handle.update(), harness page.
- Auth: reuses the standalone OAuth mode in lib/api. setOAuthSessionOverride()
  seeds an IN-MEMORY session (host apiHost + bearer token, host-provided refresh
  callback) instead of localStorage, so host tokens never persist.
- vite.widgets.config.mts builds dist-widgets/widgets.js (ESM + lazy chunks) and
  widgets.css, linked into the shadow root at runtime; bin/serve-widgets.mjs
  serves it with CORS for cross-origin module loading.
- __unsafeMockContext option seeds userLogic/teamLogic for credential-less
  harness testing.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

🤖 CI report

Bundle size — 🟢 -118.7 KiB (-0.2%)

Uncompressed size of every built .js bundle, compared against the base branch.

Total: 64.69 MiB · 🟢 -118.7 KiB (-0.2%)

File Size Δ vs base
posthog-app/src/scenes/onboarding/Onboarding.js 47.0 KiB 🟢 -748.9 KiB (-94.1%)
exporter/_parent/products/alerts/frontend/views/EditAlertModal.js 119.4 KiB 🔺 +118.0 KiB (+8079.1%)
render-query/src/render-query/render-query.js 21.37 MiB 🔺 +104.3 KiB (+0.5%)
exporter/src/queries/schema.js 1.10 MiB 🔺 +94.3 KiB (+9.1%)
posthog-app/src/queries/schema.js 1.10 MiB 🔺 +94.3 KiB (+9.1%)
exporter/src/exporter/scenes/ExporterNotebookScene.js 3.11 MiB 🟢 -93.2 KiB (-2.8%)
posthog-app/src/scenes/quickstart/Quickstart.js 78.1 KiB 🔺 +78.1 KiB (new)
posthog-app/src/scenes/inbox/InboxScene.js 689.8 KiB 🔺 +31.0 KiB (+4.7%)
posthog-app/src/scenes/heatmaps/scenes/heatmap/HeatmapNewScene.js 29.0 KiB 🔺 +23.2 KiB (+395.9%)
posthog-app/_parent/products/tracing/frontend/TracingScene.js 86.9 KiB 🟢 -22.4 KiB (-20.5%)
posthog-app/_parent/products/pulse/frontend/PulseScene.js 17.5 KiB 🔺 +17.5 KiB (new)
posthog-app/_parent/products/replay_vision/frontend/replay_scanners/ReplayScanner.js 95.5 KiB 🔺 +12.9 KiB (+15.6%)
posthog-app/src/scenes/heatmaps/scenes/heatmap/HeatmapRecordingScene.js 3.8 KiB 🟢 -12.5 KiB (-76.5%)
posthog-app/src/scenes/experiments/Experiment.js 234.0 KiB 🔺 +12.0 KiB (+5.4%)
posthog-app/_parent/products/stamphog/frontend/scenes/StamphogScene/StamphogScene.js 11.8 KiB 🔺 +11.8 KiB (new)
posthog-app/_parent/products/workflows/frontend/WorkflowsScene.js 74.6 KiB 🔺 +11.5 KiB (+18.2%)
posthog-app/_parent/products/alerts/frontend/views/InsightAlerts.js 11.3 KiB 🔺 +11.3 KiB (new)
posthog-app/_parent/products/cohorts/frontend/staff/CohortsStaffToolsScene.js 11.1 KiB 🔺 +11.1 KiB (new)
exporter/src/exporter/scenes/ExporterDashboardScene.js 282.2 KiB 🔺 +10.2 KiB (+3.7%)
posthog-app/src/scenes/hog-functions/HogFunctionScene.js 51.3 KiB 🟢 -10.0 KiB (-16.4%)
posthog-app/_parent/products/customer_analytics/frontend/CustomerAnalyticsScene.js 130.2 KiB 🔺 +9.7 KiB (+8.1%)
posthog-app/src/scenes/App.js 32.1 KiB 🔺 +9.7 KiB (+43.1%)
posthog-app/_parent/products/engineering_analytics/frontend/scenes/EngineeringAnalyticsTeamScene.js 8.2 KiB 🔺 +8.2 KiB (new)
posthog-app/_parent/products/review_hog/frontend/CodeReviewScene.js 52.9 KiB 🔺 +7.8 KiB (+17.2%)
posthog-app/_parent/products/metrics/frontend/MetricsScene.js 46.4 KiB 🔺 +7.4 KiB (+19.1%)
posthog-app/_parent/products/managed_migrations/frontend/ManagedMigration.js 24.1 KiB 🔺 +7.4 KiB (+44.5%)
posthog-app/_parent/products/replay_vision/frontend/replay_scanners/ScannerEditorScene.js 23.7 KiB 🟢 -6.5 KiB (-21.6%)
posthog-app/_parent/products/workflows/frontend/Workflows/WorkflowScene.js 125.8 KiB 🔺 +5.9 KiB (+4.9%)
posthog-app/_parent/products/mcp_analytics/frontend/MCPAnalyticsScene.js 140.4 KiB 🟢 -5.3 KiB (-3.7%)
posthog-app/_parent/products/alerts/frontend/AlertsScene.js 4.7 KiB 🔺 +4.7 KiB (new)
posthog-app/_parent/products/conversations/frontend/scenes/ticket/SupportTicketScene.js 46.2 KiB 🔺 +4.4 KiB (+10.4%)
posthog-app/_parent/products/ai_observability/frontend/evaluations/AIObservabilityEvaluation.js 58.2 KiB 🟢 -4.0 KiB (-6.5%)
posthog-app/_parent/products/engineering_analytics/frontend/scenes/EngineeringAnalyticsScene.js 70.6 KiB 🔺 +3.9 KiB (+5.9%)
posthog-app/_parent/products/tracing/frontend/TracingOperationScene.js 15.7 KiB 🔺 +3.9 KiB (+32.5%)
posthog-app/_parent/products/data_warehouse/frontend/scenes/SchemaScene/SchemaScene.js 38.9 KiB 🔺 +3.9 KiB (+11.0%)
posthog-app/_parent/products/posthog_ai/frontend/components/tool/builtinToolRenderers.js 9.5 KiB 🔺 +3.6 KiB (+61.3%)
posthog-app/_parent/products/error_tracking/frontend/scenes/ErrorTrackingFingerprintScene/ErrorTrackingFingerprintScene.js 3.3 KiB 🔺 +3.3 KiB (new)
posthog-app/_parent/products/logs/frontend/components/LogsAlerting/LogsAlertingSection.js 3.2 KiB 🔺 +3.2 KiB (new)
posthog-app/src/scenes/AuthenticatedShell.js 219.2 KiB 🟢 -3.1 KiB (-1.4%)
posthog-app/_parent/products/ai_observability/frontend/prompts/LLMPromptScene.js 41.9 KiB 🔺 +2.3 KiB (+5.9%)
posthog-app/_parent/products/posthog_ai/frontend/components/tool/EditDiffRenderer.js 1.6 KiB 🟢 -2.1 KiB (-57.8%)
posthog-app/src/scenes/feature-flags/FeatureFlag.js 96.6 KiB 🔺 +2.1 KiB (+2.3%)
posthog-app/_parent/products/error_tracking/frontend/scenes/ErrorTrackingScene/ErrorTrackingScene.js 47.7 KiB 🔺 +2.1 KiB (+4.5%)
posthog-app/_parent/products/ai_observability/frontend/evaluations/EvaluationTemplates.js 2.9 KiB 🔺 +2.0 KiB (+216.3%)
posthog-app/_parent/products/error_tracking/frontend/scenes/ErrorTrackingIssueScene/ErrorTrackingIssueScene.js 104.6 KiB 🔺 +1.9 KiB (+1.8%)
posthog-app/_parent/products/replay_vision/frontend/replay_scanners/VisionActionRunScene.js 6.1 KiB 🟢 -1.7 KiB (-21.8%)
exporter/src/lib/components/ActivityLog/describers.js 129.9 KiB 🔺 +1.7 KiB (+1.3%)
exporter/src/exporter/scenes/ExporterInterviewScene.js 304.6 KiB 🔺 +1.7 KiB (+0.5%)
posthog-app/src/scenes/max/Max.js 23.9 KiB 🔺 +1.6 KiB (+7.1%)
posthog-app/src/scenes/heatmaps/scenes/heatmap/HeatmapScene.js 9.9 KiB 🟢 -1.5 KiB (-12.9%)
posthog-app/src/scenes/data-pipelines/legacy-plugins/LegacyPluginScene.js 20.9 KiB 🟢 -1.5 KiB (-6.5%)
posthog-app/src/scenes/insights/InsightScene.js 39.0 KiB 🔺 +1.4 KiB (+3.7%)
posthog-app/_parent/products/mcp_analytics/frontend/MCPAnalyticsToolDetail.js 18.2 KiB 🔺 +1.4 KiB (+8.1%)
posthog-app/src/scenes/session-recordings/player/modal/SessionPlayerModal.js 10.9 KiB 🔺 +1.3 KiB (+13.0%)
posthog-app/src/scenes/surveys/wizard/SurveyWizard.js 68.6 KiB 🟢 -1.2 KiB (-1.7%)
posthog-app/src/scenes/project-homepage/ProjectHomepage.js 30.9 KiB 🔺 +1.1 KiB (+3.8%)
posthog-app/_parent/products/replay_vision/frontend/replay_scanners/VisionActionScene.js 8.7 KiB 🔺 +1.1 KiB (+14.4%)
posthog-app/src/lib/components/ActivityLog/describers.js 132.1 KiB 🔺 +1.1 KiB (+0.8%)
posthog-app/_parent/products/ai_observability/frontend/AIObservabilityScene.js 120.9 KiB 🔺 +1.1 KiB (+0.9%)
posthog-app/_parent/products/logs/frontend/scenes/LogsAlertDetailScene/LogsAlertDetailScene.js 25.5 KiB 🟢 -1.0 KiB (-3.9%)

Posted automatically by build-bundle-size-report · uncompressed bytes from dist-report

Eager graph — within budget

How 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 import() / React.lazy chunks are not counted.

Root Eager (shipped) Δ vs base Budget
entry (logged-out pages, app bootstrap)
src/index.tsx
1.24 MiB · 22 files 🔺 +14.2 KiB (+1.1%) ███░░░░░░░ 27.5% of 4.51 MiB
authenticated shell (every logged-in page)
src/scenes/AuthenticatedShell.tsx
8.25 MiB · 3,015 files 🔺 +97.2 KiB (+1.2%) ████████░░ 84.9% of 9.71 MiB

🟢 node_modules/monaco-editor/ stays out of src/index.tsx
🟢 src/lib/components/ActivityLog/describers stays out of src/index.tsx
🟢 [object Object] stays out of src/index.tsx
🟢 [object Object] stays out of src/index.tsx
🟢 node_modules/monaco-editor/ stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/lib/components/ActivityLog/describers stays out of src/scenes/AuthenticatedShell.tsx
🟢 [object Object] stays out of src/scenes/AuthenticatedShell.tsx
🟢 [object Object] stays out of src/scenes/AuthenticatedShell.tsx

Largest files eagerly shipped from src/index.tsx
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.5 KiB ../node_modules/.pnpm/posthog-js@1.407.2/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
236.0 KiB src/taxonomy/core-filter-definitions-by-group.json
226.1 KiB ../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/dist/module.js
167.1 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
105.8 KiB src/lib/api.ts
94.0 KiB ../packages/quill/packages/quill/dist/index.js
93.3 KiB ../node_modules/.pnpm/prosemirror-view@1.40.1/node_modules/prosemirror-view/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 — 🔺 +43.54 MiB (+3.3%)

Total size of the built frontend/dist folder (all assets), compared against the base branch.

Total: 1358.73 MiB · 🔺 +43.54 MiB (+3.3%)

toolbar-size — eager 2.18 MiB within budget

What the toolbar ships to customer pages, measured from the esbuild output (minified, post-tree-shake). The eager set is the entry plus everything statically imported from it — fetched before any feature runs; deferred chunks load lazily. The eager guardrail is 5.72 MiB. Each output file must also stay below 10 MB, where CloudFront stops compressing it. The module boundary is enforced separately by check-toolbar-graph.

Metric Size Δ vs base Budget
Eager (shipped)
entry + static imports
2.18 MiB · 17 files (no base measurement) ████░░░░░░ 38.1% of 5.72 MiB
Deferred (lazy) 2.07 MiB · 33 files (no base measurement) n/a — loads on demand
Loader dist/toolbar.js 1.1 KiB (no base measurement) █░░░░░░░░░ 5.8% of 19.5 KiB
Largest eagerly-shipped chunks
Size File
713.9 KiB dist/toolbar/toolbar-app-LCNSOSSY.css
545.1 KiB dist/toolbar/chunk-chunk-QLM5HYJB.js
484.2 KiB dist/toolbar/chunk-chunk-JSRFT4OP.js
133.6 KiB dist/toolbar/chunk-chunk-N4Y5SKCH.js
131.8 KiB dist/toolbar/chunk-chunk-T5KY5WYR.js
71.0 KiB dist/toolbar/toolbar-app-2N3ASZ4F.js
69.0 KiB dist/toolbar/chunk-chunk-27JL52RE.js
35.6 KiB dist/toolbar/chunk-chunk-G6GTV2WP.js
20.9 KiB dist/toolbar/chunk-chunk-46QHR4PU.js
12.2 KiB dist/toolbar/chunk-chunk-PIK3PADE.js

Posted automatically by check-toolbar-size · sizes are toolbar output bytes (shipped, post-tree-shake) from the esbuild metafile

@trunk-io

trunk-io Bot commented Jul 15, 2026

Copy link
Copy Markdown

Static BadgeStatic BadgeStatic BadgeStatic Badge

View Full Report ↗︎Docs

@scheduled-actions-posthog

Copy link
Copy Markdown
Contributor

This PR hasn't seen activity in a week! Should it be merged, closed, or further worked on? If you want to keep it open, please remove the stale label – otherwise this will be closed in another week. If you want to permanently keep it open, use the waiting label.

@trunk-io

trunk-io Bot commented Jul 28, 2026

Copy link
Copy Markdown

Merging to master in this repository is managed by Trunk.

  • To merge this pull request, check the box to the left or comment /trunk merge below.

After your PR is submitted to the merge queue, this comment will be automatically updated with its status. If the PR fails, failure details will also be posted here

@scheduled-actions-posthog

Copy link
Copy Markdown
Contributor

This PR hasn't seen activity in a week! Should it be merged, closed, or further worked on? If you want to keep it open, please remove the stale label – otherwise this will be closed in another week. If you want to permanently keep it open, use the waiting label.

@scheduled-actions-posthog

Copy link
Copy Markdown
Contributor

This PR was closed due to lack of activity. Feel free to reopen if it's still relevant.

@mariusandra
mariusandra deleted the code-widgets-experiment branch August 25, 2026 10:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant