Skip to content

feat(workflows): provision a managed sandbox email sender - #601

Draft
Silthus wants to merge 5 commits into
workflows-sandbox-delivery/daily-capsfrom
workflows-sandbox-product/sender-row
Draft

Silthus wants to merge 5 commits into
workflows-sandbox-delivery/daily-capsfrom
workflows-sandbox-product/sender-row

Conversation

@Silthus

@Silthus Silthus commented Oct 27, 2026 •

Copy link
Copy Markdown
Owner

Problem

Stack

Impact

Pays into Workflows activation (first billed action after a team creates its first workflow), through the sandbox funnel step. This PR alone moves nothing a user sees. It makes the sandbox row safe to exist.

Merge Danger

Caution

🔴 Merge risk: high · two-way door (merge-risk rubric)

Changes

  • With workflows-sandbox-sender on and three settings present, POST /api/projects/:id/integrations/email_sandbox_sender/ creates or refreshes one managed email sender for the project.
  • The sender sends from a PostHog address, under the organization name ("Acme via PostHog"), and is saved as verified.
  • Users cannot verify, edit or delete it, read its domain status, make it the project default, or add their own sender on the sandbox domain. Each returns 400 "The sandbox sender is managed by PostHog."
  • The workflow email step picker and the template test-send picker leave it out. A project with only the sandbox sender sees "No email senders configured yet".
  • Sends through it take the worker's sandbox route, which lands below this PR in its own Node PRs.
  • Setup status, data suggestions, the default sender and the Channels email summary ignore it.
  • SES_SANDBOX_TENANT_NAME joins the required settings, so the endpoint stays unavailable until the shared tenant is configured.
  • Mechanical: generated API client, facade exports, and the internal sending doc.

Production lines (tests, generated types, docs excluded): 220, from git diff --numstat against #604.

How did you test this code?

Live run on the slice tip

  • Live run of the V1 tip 1c08de0b9b4 on a PostHog preview. Stubs: a local SES endpoint that records each call, and example.com seeded as a valid MX domain.
  • Channels created the sandbox sender. A test send to a verified member was accepted and reached SES with the sandbox tenant, its configuration set, the fixed From address and the footer.
  • A test send to an address outside the organization was skipped before SES.
  • Shadow diff reused from 9b5065fbbfa: this rebuild changed only the PR's docs lines and its base.

Lane gate on the head, run on a Fleet box:

  • Typecheck: frontend (pnpm --filter=@posthog/frontend typescript:check) reports no errors on the stack head.
  • Python types (uv run mypy --cache-fine-grained .): no issues.
  • Pre-push hogli ci:preflight --strict: 0 failures (ruff, oxfmt, size, complexity, semgrep devex).
  • Backend: posthog/api/test/test_integration.py, posthog/models/test/integration/, and the Workflows sandbox, setup, config and suggestion suites: 1214 passed. The sender suites passed again after the review fixes: 483 passed on a fresh scratch test database.
  • Frontend: EmailTemplater, lib/integrations and the Workflows Channels suites: 316 passed.
  • CI: not run. Fork CI cannot run because the fork lacks the GitHub App secret. The mix-lanes check on the fork compares each layer with master, so it flags this layer until the Node PRs below it land.

Test rationale:

  • test_sandbox_sender.py: provisioning, the 404 for each missing setting (now including the tenant name), API-key scope, and that users cannot change the managed row. Carried from feat(workflows): provision a managed sandbox email sender #426 with the tenant-name case added. Its status case returned 500 before the review fix.
  • messageTemplateTestSendLogic.test.ts: the default test-send sender skips a sandbox row listed first. It failed before the review fix.
  • EmailTemplater.test.tsx: the sandbox row is absent from both pickers, and a sandbox-only project reads as having no sender. Extends the existing picker test.
  • channelSummary.test.ts, defaultEmailSender.test.ts: the sandbox row neither counts as a set-up email channel nor becomes the default sender.

Proof (fleet proof, on a preview of the stack head, which carries this head's files unchanged):

  • Live run: POST email_sandbox_sender creates the row "Hogflix via PostHog"; email/status on it returns 400 "The sandbox sender is managed by PostHog.".
  • Shadow diff, master against the stack head, with the same stored rows: email/status on the sandbox row goes from a 500 error page to that 400, and making it the project default goes from 200 to 400. The integration list and detail, own-sender status, setup status, reputation and every own-sender save are unchanged. The worker change belongs to fix(cdp): skip email sends through the sandbox sender in the worker #611, the save changes to feat(workflows): validate sandbox sender use at save time #603.
  • Prod shape: gap, accepted under a standing rule until read-only production access is available.
  • Review: round 1 by GPT-6.1 Sol, three findings. The test-send picker and the email/status 500 are fixed here. The setup guide count is fixed in feat(workflows): show the managed sandbox sender in channels #602, where the row first appears. The final read found nothing.

Release status

  • This change is behind a feature flag and is not available to users

Docs update

docs/internal/workflows-email-sending-tiers.md names the tenant setting and the worker skip.

🤖 Agent context

Autonomy: Human-driven (agent-assisted)

Agent: Claude Code, Claude Opus 5.5 (carving and new code); review by GPT-6.1 Sol

Decisions

Question Answer Who Where
Slice order of the sandbox sender stack Option B: the Channels row moves into V1 so a team has a sender to test from; V1's worker PRs land first 👍 Accepted default map
Sends through the sandbox row before its delivery route exists The worker skips them with a logged reason and success: false, instead of falling through the provider switch as a success 🤖 Agent Silthus/personal#200 (resolution)
Where the worker skip lands Nowhere: #611 is closed, and the worker's sandbox route lands below this PR 👍 Accepted default map
Setup guide count of the sandbox row (review round 1) Fixed in #602, where Channels first provisions the row 🤖 Agent Silthus/personal#200 (resolution)
Tenant setting for the endpoint SES_SANDBOX_TENANT_NAME is required, taken from #453 into the first PR 🤖 Agent Silthus/personal#200 (resolution)
PR size of the Channels slice Split into this PR and the Channels row PR to stay under about 400 production lines 🤖 Agent Silthus/personal#200 (resolution)

Involvement: no grilling rounds; one design pass (GPT-6.1 Sol); one review round and one final read (GPT-6.1 Sol); proof captured.

🤖 Generated with Claude Code

@Silthus Silthus self-assigned this Oct 27, 2026
@github-actions

github-actions Bot commented Oct 27, 2026 •

Copy link
Copy Markdown

🤖 CI report

⚠️ Complexity (TypeScript) — 3 functions above the limit (max 26)

Cyclomatic complexity above the limit in changed typescript files (10 for production files, 15 for test files). Warn only: worth simplifying when you next touch these functions.

Function Location Complexity Limit
getIntegrationNameFromKind frontend/src/lib/integrations/utils.ts:145 26 10
NativeEmailTemplaterForm frontend/src/scenes/hog-functions/email-templater/EmailTemplater.tsx:536 15 10
NativeEmailIntegrationChoice frontend/src/scenes/hog-functions/email-templater/EmailTemplater.tsx:273 13 10
⚠️ Bundle size — 🔺 +203.0 KiB (+0.3%)

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

Total: 77.11 MiB · 🔺 +203.0 KiB (+0.3%)

File Size Δ vs base
render-query/src/render-query/render-query.js 24.94 MiB 🔺 +44.0 KiB (+0.2%)
posthog-app/_parent/products/dashboards/frontend/dashboards/Dashboards.js 41.1 KiB 🔺 +41.1 KiB (new)
posthog-app/src/scenes/dashboard/dashboards/Dashboards.js removed 🟢 -41.1 KiB (-100.0%)
posthog-app/src/scenes/authentication/auth/Auth.js 39.2 KiB 🔺 +39.2 KiB (new)
posthog-app/_parent/products/ai_observability/frontend/evaluations/AIObservabilityEvaluation.js 151.1 KiB 🔺 +38.0 KiB (+33.6%)
posthog-app/_parent/products/workflows/frontend/Transactional/TransactionalScene.js 32.5 KiB 🔺 +32.5 KiB (new)
posthog-app/src/scenes/authentication/signup/Signup.js removed 🟢 -20.9 KiB (-100.0%)
posthog-app/src/scenes/authentication/login/Login.js removed 🟢 -12.4 KiB (-100.0%)
posthog-app/_parent/products/apm/frontend/ApplicationObservabilityScene.js 24.0 KiB 🔺 +12.2 KiB (+103.6%)
exporter/src/exporter/exporter.js 32.1 KiB 🔺 +11.2 KiB (+53.6%)
posthog-app/_parent/products/dashboards/frontend/dashboards/templates/DashboardTemplateCopyScene.js 10.8 KiB 🔺 +10.8 KiB (new)
posthog-app/src/scenes/dashboard/dashboards/templates/DashboardTemplateCopyScene.js removed 🟢 -10.7 KiB (-100.0%)
posthog-app/src/scenes/web-analytics/WebAnalyticsScene.js 247.8 KiB 🔺 +10.4 KiB (+4.4%)
posthog-app/_parent/products/product_analytics/frontend/insights/savedInsights/SavedInsights.js 41.4 KiB 🟢 -9.2 KiB (-18.1%)
exporter/_parent/products/product_analytics/frontend/insights/editor/filters/WebAnalyticsEditorFilters.js 8.5 KiB 🔺 +8.5 KiB (new)
exporter/src/scenes/insights/EditorFilters/WebAnalyticsEditorFilters.js removed 🟢 -8.5 KiB (-100.0%)
posthog-app/src/scenes/experiments/Experiment.js 418.0 KiB 🔺 +8.0 KiB (+2.0%)
posthog-app/_parent/products/workflows/frontend/WorkflowsScene.js 62.9 KiB 🔺 +6.9 KiB (+12.3%)
posthog-app/_parent/products/product_analytics/frontend/insights/editor/filters/WebAnalyticsEditorFilters.js 6.0 KiB 🔺 +6.0 KiB (new)
posthog-app/src/scenes/insights/EditorFilters/WebAnalyticsEditorFilters.js removed 🟢 -6.0 KiB (-100.0%)
posthog-app/_parent/products/workflows/frontend/Broadcasts/BroadcastsScene.js 32.2 KiB 🔺 +5.9 KiB (+22.5%)
exporter/src/exporter/scenes/ExporterNotebookScene.js 3.90 MiB 🔺 +3.2 KiB (+0.1%)
posthog-app/_parent/products/signals/frontend/inbox/InboxScene.js 515.0 KiB 🔺 +2.8 KiB (+0.5%)
exporter/src/queries/schema.js 1.27 MiB 🟢 -2.1 KiB (-0.2%)
posthog-app/src/queries/schema.js 1.27 MiB 🟢 -2.1 KiB (-0.2%)
posthog-app/_parent/products/replay_vision/frontend/replay_scanners/ScannerEditorScene.js 83.8 KiB 🔺 +1.7 KiB (+2.1%)
posthog-app/src/scenes/analytics/AnalyticsList.js 29.9 KiB 🔺 +1.1 KiB (+3.9%)
posthog-app/src/scenes/authentication/auth/loginLogic.js 1.1 KiB 🔺 +1.1 KiB (new)
posthog-app/src/scenes/authentication/login/loginLogic.js removed 🟢 -1.1 KiB (-100.0%)
posthog-app/_parent/products/replay_vision/frontend/observations/ReplayObservation.js 41.1 KiB 🔺 +1013 B (+2.5%)

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

⚠️ Eager graph — 3 over 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.01 MiB · 25 files 🔺 +10.1 KiB (+1.0%) █████████░ 88.1% of 1.14 MiB
logged-out boot: index + App + bootApp (preloaded by every page, including /login)
src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
2.97 MiB · 621 files 🔺 +12.1 KiB (+0.4%) ██████████ 98.1% of 3.03 MiB
🟡 authenticated shell (every logged-in page)
src/scenes/AuthenticatedShell.tsx
7.59 MiB · 2,566 files 🔺 +113.2 KiB (+1.5%) ██████████ 101.2% of 7.50 MiB
dashboard scene
src/scenes/dashboard/Dashboard.tsx
9.96 MiB · 3,731 files 🔺 +28.8 KiB (+0.3%) ██████████ 99.4% of 10.01 MiB
🟡 today home path
src/scenes/AuthenticatedShell.tsx + src/scenes/project-homepage/ProjectHomepage.tsx + src/scenes/project-homepage/today/TodayHome.tsx
7.77 MiB · 2,659 files 🔺 +119.7 KiB (+1.5%) ██████████ 100.4% of 7.74 MiB
🟡 AI-first home path
src/scenes/AuthenticatedShell.tsx + src/scenes/project-homepage/ProjectHomepage.tsx + src/scenes/project-homepage/ai-first/AiFirstHomepage.tsx
8.01 MiB · 2,652 files 🔺 +120.4 KiB (+1.5%) ██████████ 101.4% of 7.91 MiB
events scene
src/scenes/activity/explore/EventsScene.tsx
9.40 MiB · 3,512 files 🔺 +27.0 KiB (+0.3%) ██████████ 98.0% of 9.59 MiB
web analytics scene
src/scenes/web-analytics/WebAnalyticsScene.tsx
10.34 MiB · 3,763 files 🔺 +34.3 KiB (+0.3%) ██████████ 95.4% of 10.83 MiB
replay detail scene
src/scenes/session-recordings/detail/SessionRecordingDetail.tsx
8.42 MiB · 3,088 files 🔺 +15.9 KiB (+0.2%) █████████░ 88.9% of 9.47 MiB

🟢 node_modules/monaco-editor/ stays out of src/index.tsx
🟢 src/lib/components/ActivityLog/describers stays out of src/index.tsx
🟢 node_modules/@posthog/brand/dist/generated/hoggies/svg/ stays out of src/index.tsx
🟢 node_modules/@posthog/brand/dist/generated/hoggies/components/ stays out of src/index.tsx
🟢 node_modules/monaco-editor/ stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/layout/navigation-3000/navigationLogic.tsx stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/scenes/dashboard/dashboardLogic.tsx stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/lib/lemon-ui/LemonMarkdown/ stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/lib/components/RichContentEditor/ stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/lib/components/CodeSnippet/ stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/taxonomy/core-filter-definitions-by-group.json stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 node_modules/zod/ stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/scenes/billing/billingLogic.tsx stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/lib/components/ProductEmptyState/productSetupPreloadLogic.ts stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 node_modules/monaco-editor/ stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/lib/components/ActivityLog/describers stays out of src/scenes/AuthenticatedShell.tsx
🟢 products/dashboards/frontend/widgets/previews/ stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/scenes/session-recordings/player/sessionRecordingPlayerLogic.ts stays out of src/scenes/AuthenticatedShell.tsx
🟢 products/wizard/frontend/runs/WizardRunDetailsDrawer.tsx stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/layout/today/TodayShell.tsx stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/layout/today/TodayContextPanelFloating.tsx stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/layout/today/TodaySidePanel.tsx stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/layout/today/TodayTopBar.tsx stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/layout/today/todayRailItems.tsx stays out of src/scenes/AuthenticatedShell.tsx
🟢 zod/v4/locales/de.js stays out of src/scenes/AuthenticatedShell.tsx
🟢 node_modules/@posthog/brand/dist/generated/hoggies/svg/ stays out of src/scenes/AuthenticatedShell.tsx
🟢 node_modules/@posthog/brand/dist/generated/hoggies/components/ stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/scenes/session-recordings/playlist/SessionRecordingsPlaylist.tsx stays out of src/scenes/dashboard/Dashboard.tsx
🟢 src/scenes/web-analytics/tiles/WebAnalyticsTile.tsx stays out of src/scenes/dashboard/Dashboard.tsx
🟢 src/queries/validators.js stays out of src/scenes/dashboard/Dashboard.tsx
🟢 src/scenes/project-homepage/ai-first/AiFirstHomepage.tsx stays out of src/scenes/AuthenticatedShell.tsx + src/scenes/project-homepage/ProjectHomepage.tsx + src/scenes/project-homepage/today/TodayHome.tsx
🟢 src/scenes/project-homepage/today/TodayReportPage.tsx stays out of src/scenes/AuthenticatedShell.tsx + src/scenes/project-homepage/ProjectHomepage.tsx + src/scenes/project-homepage/today/TodayHome.tsx
🟢 src/queries/Query/Query.tsx stays out of src/scenes/AuthenticatedShell.tsx + src/scenes/project-homepage/ProjectHomepage.tsx + src/scenes/project-homepage/today/TodayHome.tsx
🟢 packages/quill/packages/charts/ stays out of src/scenes/AuthenticatedShell.tsx + src/scenes/project-homepage/ProjectHomepage.tsx + src/scenes/project-homepage/today/TodayHome.tsx
🟢 products/posthog_ai/frontend/components/tool/widgets/VisualizationWidget.tsx stays out of src/scenes/AuthenticatedShell.tsx + src/scenes/project-homepage/ProjectHomepage.tsx + src/scenes/project-homepage/ai-first/AiFirstHomepage.tsx
🟢 products/posthog_ai/frontend/components/tool/widgets/RecordingsWidget.tsx stays out of src/scenes/AuthenticatedShell.tsx + src/scenes/project-homepage/ProjectHomepage.tsx + src/scenes/project-homepage/ai-first/AiFirstHomepage.tsx
🟢 src/queries/Query/Query.tsx stays out of src/scenes/AuthenticatedShell.tsx + src/scenes/project-homepage/ProjectHomepage.tsx + src/scenes/project-homepage/ai-first/AiFirstHomepage.tsx
🟢 products/posthog_ai/frontend/api/primitives.ts stays out of src/scenes/AuthenticatedShell.tsx + src/scenes/project-homepage/ProjectHomepage.tsx + src/scenes/project-homepage/ai-first/AiFirstHomepage.tsx
🟢 src/scenes/notebooks/Notebook/notebookLogic.ts stays out of src/scenes/AuthenticatedShell.tsx + src/scenes/project-homepage/ProjectHomepage.tsx + src/scenes/project-homepage/ai-first/AiFirstHomepage.tsx
🟢 src/scenes/session-recordings/playlist/SessionRecordingsPlaylist.tsx stays out of src/scenes/activity/explore/EventsScene.tsx
🟢 src/scenes/web-analytics/tiles/WebAnalyticsTile.tsx stays out of src/scenes/activity/explore/EventsScene.tsx
🟢 src/queries/validators.js stays out of src/scenes/activity/explore/EventsScene.tsx
🟢 src/scenes/web-analytics/LiveMetricsDashboard/LiveWebAnalyticsMetrics.tsx stays out of src/scenes/web-analytics/WebAnalyticsScene.tsx
🟢 products/product_analytics/frontend/insights/trends/WorldMap/countryVectors.tsx stays out of src/scenes/web-analytics/WebAnalyticsScene.tsx
🟢 src/scenes/settings/SettingsMap.tsx stays out of src/scenes/session-recordings/detail/SessionRecordingDetail.tsx
🟢 @jspm/core/nodelibs/browser/fs stays out of src/scenes/session-recordings/detail/SessionRecordingDetail.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.7 KiB ../node_modules/.pnpm/@jspm+core@2.1.0/node_modules/@jspm/core/nodelibs/browser/process.js
4.0 KiB ../node_modules/.pnpm/scheduler@0.23.2/node_modules/scheduler/cjs/scheduler.production.min.js
1.7 KiB ../node_modules/.pnpm/base64-js@1.5.1/node_modules/base64-js/index.js
1.7 KiB src/index.tsx
1.6 KiB src/lib/utils/bootTiming.ts
1.2 KiB src/RootErrorBoundary.tsx
949 B src/scenes/ChunkLoadErrorBoundary.tsx
Largest files eagerly shipped from src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
Size File
322.9 KiB ../node_modules/.pnpm/posthog-js@1.438.23_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.mjs
217.5 KiB ../node_modules/.pnpm/@posthog+icons@0.39.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.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
102.1 KiB src/products.tsx
86.1 KiB src/lib/api.ts
68.3 KiB src/lib/lemon-ui/icons/icons.tsx
41.9 KiB ../node_modules/.pnpm/@dnd-kit+core@6.0.8_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@dnd-kit/core/dist/core.esm.js
36.4 KiB ../node_modules/.pnpm/kea@4.0.0-pre.6_patch_hash=139b8d1f1304f9d9da452a9a1244c94ea679dbcb85687d8999563146879fb6f5_react@18.3.1/node_modules/kea/lib/index.cjs.js
27.0 KiB ../node_modules/.pnpm/tailwind-merge@2.2.2/node_modules/tailwind-merge/dist/bundle-mjs.mjs
24.6 KiB ../node_modules/.pnpm/buffer@6.0.3/node_modules/buffer/index.js
Largest files eagerly shipped from src/scenes/AuthenticatedShell.tsx
Size File
322.9 KiB ../node_modules/.pnpm/posthog-js@1.438.23_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.mjs
286.4 KiB src/taxonomy/core-filter-definitions-by-group.json
239.9 KiB ../packages/quill/packages/quill/dist/index.js
217.5 KiB ../node_modules/.pnpm/@posthog+icons@0.39.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.js
153.8 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
102.1 KiB src/products.tsx
94.5 KiB ../node_modules/.pnpm/@tiptap+core@3.20.6_@tiptap+pm@3.20.6/node_modules/@tiptap/core/dist/index.js
92.5 KiB ../node_modules/.pnpm/prosemirror-view@1.40.1/node_modules/prosemirror-view/dist/index.js
86.1 KiB src/lib/api.ts
Largest files eagerly shipped from src/scenes/dashboard/Dashboard.tsx
Size File
322.9 KiB ../node_modules/.pnpm/posthog-js@1.438.23_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.mjs
286.4 KiB src/taxonomy/core-filter-definitions-by-group.json
239.9 KiB ../packages/quill/packages/quill/dist/index.js
217.5 KiB ../node_modules/.pnpm/@posthog+icons@0.39.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.js
153.8 KiB ../node_modules/.pnpm/re2js@0.4.1/node_modules/re2js/build/index.esm.js
144.1 KiB ../packages/quill/packages/primitives/dist/index.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
102.1 KiB src/products.tsx
94.5 KiB ../node_modules/.pnpm/@tiptap+core@3.20.6_@tiptap+pm@3.20.6/node_modules/@tiptap/core/dist/index.js
92.5 KiB ../node_modules/.pnpm/prosemirror-view@1.40.1/node_modules/prosemirror-view/dist/index.js
Largest files eagerly shipped from src/scenes/AuthenticatedShell.tsx + src/scenes/project-homepage/ProjectHomepage.tsx + src/scenes/project-homepage/today/TodayHome.tsx
Size File
322.9 KiB ../node_modules/.pnpm/posthog-js@1.438.23_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.mjs
286.4 KiB src/taxonomy/core-filter-definitions-by-group.json
239.9 KiB ../packages/quill/packages/quill/dist/index.js
217.5 KiB ../node_modules/.pnpm/@posthog+icons@0.39.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.js
153.8 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
102.1 KiB src/products.tsx
94.5 KiB ../node_modules/.pnpm/@tiptap+core@3.20.6_@tiptap+pm@3.20.6/node_modules/@tiptap/core/dist/index.js
92.5 KiB ../node_modules/.pnpm/prosemirror-view@1.40.1/node_modules/prosemirror-view/dist/index.js
86.1 KiB src/lib/api.ts
Largest files eagerly shipped from src/scenes/AuthenticatedShell.tsx + src/scenes/project-homepage/ProjectHomepage.tsx + src/scenes/project-homepage/ai-first/AiFirstHomepage.tsx
Size File
322.9 KiB ../node_modules/.pnpm/posthog-js@1.438.23_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.mjs
286.4 KiB src/taxonomy/core-filter-definitions-by-group.json
239.9 KiB ../packages/quill/packages/quill/dist/index.js
217.5 KiB ../node_modules/.pnpm/@posthog+icons@0.39.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.js
153.8 KiB ../node_modules/.pnpm/re2js@0.4.1/node_modules/re2js/build/index.esm.js
144.1 KiB ../packages/quill/packages/primitives/dist/index.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
102.1 KiB src/products.tsx
94.5 KiB ../node_modules/.pnpm/@tiptap+core@3.20.6_@tiptap+pm@3.20.6/node_modules/@tiptap/core/dist/index.js
92.5 KiB ../node_modules/.pnpm/prosemirror-view@1.40.1/node_modules/prosemirror-view/dist/index.js
Largest files eagerly shipped from src/scenes/activity/explore/EventsScene.tsx
Size File
322.9 KiB ../node_modules/.pnpm/posthog-js@1.438.23_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.mjs
286.4 KiB src/taxonomy/core-filter-definitions-by-group.json
239.9 KiB ../packages/quill/packages/quill/dist/index.js
217.5 KiB ../node_modules/.pnpm/@posthog+icons@0.39.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.js
153.8 KiB ../node_modules/.pnpm/re2js@0.4.1/node_modules/re2js/build/index.esm.js
144.1 KiB ../packages/quill/packages/primitives/dist/index.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
102.1 KiB src/products.tsx
94.5 KiB ../node_modules/.pnpm/@tiptap+core@3.20.6_@tiptap+pm@3.20.6/node_modules/@tiptap/core/dist/index.js
92.5 KiB ../node_modules/.pnpm/prosemirror-view@1.40.1/node_modules/prosemirror-view/dist/index.js
Largest files eagerly shipped from src/scenes/web-analytics/WebAnalyticsScene.tsx
Size File
322.9 KiB ../node_modules/.pnpm/posthog-js@1.438.23_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.mjs
286.4 KiB src/taxonomy/core-filter-definitions-by-group.json
239.9 KiB ../packages/quill/packages/quill/dist/index.js
217.5 KiB ../node_modules/.pnpm/@posthog+icons@0.39.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.js
182.9 KiB src/queries/validators.js
153.8 KiB ../node_modules/.pnpm/re2js@0.4.1/node_modules/re2js/build/index.esm.js
144.1 KiB ../packages/quill/packages/primitives/dist/index.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
102.1 KiB src/products.tsx
94.5 KiB ../node_modules/.pnpm/@tiptap+core@3.20.6_@tiptap+pm@3.20.6/node_modules/@tiptap/core/dist/index.js
Largest files eagerly shipped from src/scenes/session-recordings/detail/SessionRecordingDetail.tsx
Size File
322.9 KiB ../node_modules/.pnpm/posthog-js@1.438.23_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.mjs
316.1 KiB ../node_modules/.pnpm/posthog-js@1.438.23_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/rrweb.js
286.4 KiB src/taxonomy/core-filter-definitions-by-group.json
239.9 KiB ../packages/quill/packages/quill/dist/index.js
217.5 KiB ../node_modules/.pnpm/@posthog+icons@0.39.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.js
153.8 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
102.1 KiB src/products.tsx
94.5 KiB ../node_modules/.pnpm/@tiptap+core@3.20.6_@tiptap+pm@3.20.6/node_modules/@tiptap/core/dist/index.js
92.5 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 PostHog#32479

✅ Toolbar bundle — eager 2.30 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.30 MiB · 18 files 🔺 +9.5 KiB (+0.4%) ████░░░░░░ 40.3% of 5.72 MiB
Deferred (lazy) 2.11 MiB · 40 files no change n/a — loads on demand
Loader dist/toolbar.js 1.2 KiB no change █░░░░░░░░░ 6.0% of 19.5 KiB
Largest eagerly-shipped chunks
Size File
914.9 KiB dist/toolbar/toolbar-app-IWMSDEIE.css
694.7 KiB dist/toolbar/chunk-chunk-QC5IAHEQ.js
259.9 KiB dist/toolbar/chunk-chunk-WGO24YVJ.js
131.8 KiB dist/toolbar/chunk-chunk-FDH2IBXT.js
130.4 KiB dist/toolbar/chunk-chunk-BMYOU6DS.js
74.8 KiB dist/toolbar/toolbar-app-X2KXA7ED.js
69.0 KiB dist/toolbar/chunk-chunk-TSAL54PB.js
35.6 KiB dist/toolbar/chunk-chunk-ZN36Z66T.js
21.7 KiB dist/toolbar/chunk-chunk-DSUUMA6S.js
6.8 KiB dist/toolbar/chunk-chunk-DV7IWQNF.js

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

✅ Dist folder size — 🔺 +2.89 MiB (+0.3%)

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

Total: 972.19 MiB · 🔺 +2.89 MiB (+0.3%)

ℹ️ MCP UI apps size — 35 app(s), 29001.2 KB JS

Built size of each MCP UI app (main.js + styles.css).

App JS CSS
debug 844.3 KB 211.1 KB
explain-chart 1005.6 KB 211.1 KB
action 767.7 KB 211.1 KB
action-list 835.3 KB 211.1 KB
cohort 766.7 KB 211.1 KB
cohort-list 834.3 KB 211.1 KB
email-template 766.6 KB 211.1 KB
error-details 771.6 KB 211.1 KB
error-issue 768.9 KB 211.1 KB
error-issue-list 836.8 KB 211.1 KB
experiment 832.4 KB 211.1 KB
experiment-list 836.1 KB 211.1 KB
experiment-results 835.0 KB 211.1 KB
feature-flag 834.7 KB 211.1 KB
feature-flag-list 838.4 KB 211.1 KB
feature-flag-testing 770.0 KB 211.1 KB
inline-scan 767.2 KB 211.1 KB
insight-actors 833.8 KB 211.1 KB
llm-costs 831.1 KB 211.1 KB
session-recording 769.0 KB 211.1 KB
survey 768.3 KB 211.1 KB
survey-global-stats 831.1 KB 211.1 KB
survey-list 836.0 KB 211.1 KB
survey-stats 831.1 KB 211.1 KB
trace-span 767.1 KB 211.1 KB
trace-span-list 835.2 KB 211.1 KB
vision-observation-list 834.4 KB 211.1 KB
workflow 767.1 KB 211.1 KB
workflow-list 834.7 KB 211.1 KB
workflow-setup-status 766.7 KB 211.1 KB
query-results 1087.6 KB 211.1 KB
render-ui 1187.2 KB 211.1 KB
visual-review-snapshots 771.6 KB 211.1 KB
workflow-data-suggestions 769.4 KB 211.1 KB
workflow-sending-rules 768.1 KB 211.1 KB

Silthus and others added 5 commits October 28, 2026 09:28
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit e7d8226)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 5da89ec)
…faults

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 525bfee)
…status

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 53c404e)

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant