Skip to content

feat: add trend visualization with sparklines to perf report#9939

Open
christian-byrne wants to merge 2 commits intomainfrom
feat/perf-trend-visualization
Open

feat: add trend visualization with sparklines to perf report#9939
christian-byrne wants to merge 2 commits intomainfrom
feat/perf-trend-visualization

Conversation

@christian-byrne
Copy link
Contributor

@christian-byrne christian-byrne commented Mar 15, 2026

Summary

Add historical trend visualization (ASCII sparklines + directional arrows) to the performance PR report, showing how each metric has moved over recent commits on main.

Changes

  • What: New sparkline(), trendDirection(), trendArrow() functions in perf-stats.ts. New collapsible "Trend" section in the perf report showing per-metric sparklines, direction indicators, and latest values. CI workflow updated to download historical data from the perf-data orphan branch and switched to setup-frontend action with pnpm exec tsx.

Review Focus

  • The trend section only renders when ≥3 historical data points exist (gracefully absent otherwise)
  • trendDirection() uses a split-half mean comparison with ±10% threshold — review whether this sensitivity is appropriate
  • The git archive step in pr-perf-report.yaml is idempotent and fails silently if no perf-history data exists yet on the perf-data branch

┆Issue is synchronized with this Notion page by Unito

@christian-byrne christian-byrne requested a review from a team as a code owner March 15, 2026 04:05
@dosubot dosubot bot added the size:L This PR changes 100-499 lines, ignoring generated files. label Mar 15, 2026
@github-actions
Copy link

github-actions bot commented Mar 15, 2026

🎨 Storybook: ✅ Built — View Storybook

Details

⏰ Completed at: 03/15/2026, 10:37:41 AM UTC

Links

@github-actions
Copy link

github-actions bot commented Mar 15, 2026

🎭 Playwright: ✅ 560 passed, 0 failed · 5 flaky

📊 Browser Reports
  • chromium: View Report (✅ 547 / ❌ 0 / ⚠️ 5 / ⏭️ 10)
  • chromium-2x: View Report (✅ 2 / ❌ 0 / ⚠️ 0 / ⏭️ 0)
  • chromium-0.5x: View Report (✅ 1 / ❌ 0 / ⚠️ 0 / ⏭️ 0)
  • mobile-chrome: View Report (✅ 10 / ❌ 0 / ⚠️ 0 / ⏭️ 0)

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Mar 15, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 6053cd46-7bc3-41bc-9188-a0a797fa872a

📥 Commits

Reviewing files that changed from the base of the PR and between b2d31dc and a712634.

📒 Files selected for processing (1)
  • scripts/perf-stats.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • scripts/perf-stats.ts

📝 Walkthrough

Walkthrough

Adds trend analysis (sparklines, trend direction/arrows, latest values) to perf reports and updates the GitHub Actions workflow to use a frontend setup, download perf history from the perf-data branch via remote fetch, and run the report with pnpm exec tsx.

Changes

Cohort / File(s) Summary
Workflow Configuration
\.github/workflows/pr-perf-report.yaml
Replaced Node setup with a frontend setup action; renamed/repurposed the historical-baseline step to fetch/download perf history from the perf-data branch using a remote-check-and-fetch approach; switched report invocation from npx tsx to pnpm exec tsx.
Perf Stats Utilities + Tests
scripts/perf-stats.ts, scripts/perf-stats.test.ts
Added TrendDirection type and exports: sparkline(values: number[]), trendDirection(values: number[]), and trendArrow(dir) plus tests exercising sparkline outputs, trendDirection behavior, and arrow mapping.
Perf Report Integration
scripts/perf-report.ts
Added getHistoricalTimeSeries() and integrated trend computation and rendering into the report: compute direction, arrow, sparkline, and show latest value per test/metric when ≥3 historical points exist.

Sequence Diagram

sequenceDiagram
    participant GHA as GitHub Actions
    participant History as Perf History
    participant Report as perf-report.ts
    participant Stats as perf-stats.ts
    participant Output as Report Output

    GHA->>History: fetch/download `perf-data` branch archive
    activate History
    History-->>GHA: historical reports archive
    deactivate History

    GHA->>Report: run `pnpm exec tsx scripts/perf-report.ts` with history
    activate Report
    Report->>Report: getHistoricalTimeSeries() → timeSeries per test/metric

    Report->>Stats: sparkline(timeSeries)
    activate Stats
    Stats-->>Report: sparkline string
    deactivate Stats

    Report->>Stats: trendDirection(timeSeries)
    activate Stats
    Stats-->>Report: 'rising' | 'falling' | 'stable'
    deactivate Stats

    Report->>Stats: trendArrow(direction)
    activate Stats
    Stats-->>Report: emoji arrow
    deactivate Stats

    Report->>Output: render Trend section (if ≥3 points) with sparkline, arrow, latest value
    deactivate Report

    Output-->>GHA: perf report artifact with trends
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Poem

🐰 I nibble at numbers, stitch a tiny line,

Sparklines hum, arrows point the climb,
Old runs whisper, new trends hop in,
I fetch the past, then give a grin. ✨

🚥 Pre-merge checks | ✅ 3 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately describes the main change: adding trend visualization with sparklines to the perf report, which is the core feature across all modified files.
Description check ✅ Passed The description covers all required sections with comprehensive detail: Summary explains the feature clearly, Changes section lists What was added, Review Focus highlights critical design decisions and thresholds, and specific implementation details are provided.
End-To-End Regression Coverage For Fixes ✅ Passed PR title uses 'feat:' prefix and contains no bug-fix keywords (fix, fixed, fixes, fixing, bugfix, hotfix), satisfying the first condition of the check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/perf-trend-visualization
📝 Coding Plan
  • Generate coding plan for human review comments

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions
Copy link

github-actions bot commented Mar 15, 2026

📦 Bundle: 4.99 MB gzip 🟢 -101 B

Details

Summary

  • Raw size: 23 MB baseline 23 MB — ⚪ 0 B
  • Gzip: 4.99 MB baseline 4.99 MB — 🟢 -101 B
  • Brotli: 3.85 MB baseline 3.85 MB — 🟢 -64 B
  • Bundles: 235 current • 235 baseline • 112 added / 112 removed

Category Glance
Vendor & Third-Party ⚪ 0 B (9.78 MB) · Other ⚪ 0 B (8.21 MB) · Data & Services ⚪ 0 B (3.17 MB) · Graph Workspace ⚪ 0 B (1.08 MB) · Panels & Settings ⚪ 0 B (460 kB) · Editors & Dialogs ⚪ 0 B (81.8 kB) · + 5 more

App Entry Points — 21.7 kB (baseline 21.7 kB) • ⚪ 0 B

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-BDAf12mI.js (new) 21.7 kB 🔴 +21.7 kB 🔴 +7.71 kB 🔴 +6.64 kB
assets/index-uPDuYeYi.js (removed) 21.7 kB 🟢 -21.7 kB 🟢 -7.71 kB 🟢 -6.64 kB

Status: 1 added / 1 removed

Graph Workspace — 1.08 MB (baseline 1.08 MB) • ⚪ 0 B

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-BxBFwS5Z.js (removed) 1.08 MB 🟢 -1.08 MB 🟢 -230 kB 🟢 -174 kB
assets/GraphView-Czdppi-W.js (new) 1.08 MB 🔴 +1.08 MB 🔴 +230 kB 🔴 +174 kB

Status: 1 added / 1 removed

Views & Navigation — 75.3 kB (baseline 75.3 kB) • ⚪ 0 B

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-Ct2vtnH6.js (new) 15.6 kB 🔴 +15.6 kB 🔴 +3.38 kB 🔴 +2.88 kB
assets/CloudSurveyView-D2edo4Nb.js (removed) 15.6 kB 🟢 -15.6 kB 🟢 -3.38 kB 🟢 -2.88 kB
assets/CloudLoginView-CsmtmqbE.js (removed) 11.8 kB 🟢 -11.8 kB 🟢 -3.26 kB 🟢 -2.89 kB
assets/CloudLoginView-Z-RXjwNX.js (new) 11.8 kB 🔴 +11.8 kB 🔴 +3.27 kB 🔴 +2.88 kB
assets/CloudSignupView-B9Qw9HUi.js (removed) 9.52 kB 🟢 -9.52 kB 🟢 -2.76 kB 🟢 -2.42 kB
assets/CloudSignupView-DK_pmR9A.js (new) 9.52 kB 🔴 +9.52 kB 🔴 +2.75 kB 🔴 +2.42 kB
assets/UserCheckView-Bg1nSua0.js (removed) 9.01 kB 🟢 -9.01 kB 🟢 -2.31 kB 🟢 -2.01 kB
assets/UserCheckView-D37wko1M.js (new) 9.01 kB 🔴 +9.01 kB 🔴 +2.31 kB 🔴 +2 kB
assets/CloudLayoutView-BhaKXe46.js (removed) 7.3 kB 🟢 -7.3 kB 🟢 -2.26 kB 🟢 -1.96 kB
assets/CloudLayoutView-QkULP_29.js (new) 7.3 kB 🔴 +7.3 kB 🔴 +2.27 kB 🔴 +1.98 kB
assets/CloudForgotPasswordView-CPgnCI75.js (new) 5.73 kB 🔴 +5.73 kB 🔴 +1.99 kB 🔴 +1.76 kB
assets/CloudForgotPasswordView-DLiKOBTc.js (removed) 5.73 kB 🟢 -5.73 kB 🟢 -1.99 kB 🟢 -1.75 kB
assets/CloudAuthTimeoutView-9-xseZx5.js (new) 5.09 kB 🔴 +5.09 kB 🔴 +1.83 kB 🔴 +1.6 kB
assets/CloudAuthTimeoutView-Cb8nKasF.js (removed) 5.09 kB 🟢 -5.09 kB 🟢 -1.83 kB 🟢 -1.6 kB
assets/CloudSubscriptionRedirectView-B43pTpt1.js (new) 4.93 kB 🔴 +4.93 kB 🔴 +1.83 kB 🔴 +1.62 kB
assets/CloudSubscriptionRedirectView-Cx4sYJg8.js (removed) 4.93 kB 🟢 -4.93 kB 🟢 -1.84 kB 🟢 -1.62 kB
assets/UserSelectView-CG9_DJPw.js (new) 4.67 kB 🔴 +4.67 kB 🔴 +1.73 kB 🔴 +1.53 kB
assets/UserSelectView-DZjJn7Nz.js (removed) 4.67 kB 🟢 -4.67 kB 🟢 -1.73 kB 🟢 -1.53 kB
assets/CloudSorryContactSupportView-DVucrv0K.js 1.21 kB 1.21 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/layout-BE0wPzm2.js 385 B 385 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 9 added / 9 removed

Panels & Settings — 460 kB (baseline 460 kB) • ⚪ 0 B

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/KeybindingPanel-BMPiGj6n.js (removed) 28.8 kB 🟢 -28.8 kB 🟢 -6.14 kB 🟢 -5.46 kB
assets/KeybindingPanel-cuhqtlai.js (new) 28.8 kB 🔴 +28.8 kB 🔴 +6.14 kB 🔴 +5.47 kB
assets/SecretsPanel-B8XD4RjJ.js (new) 22.3 kB 🔴 +22.3 kB 🔴 +5.41 kB 🔴 +4.75 kB
assets/SecretsPanel-BQxjBKaw.js (removed) 22.3 kB 🟢 -22.3 kB 🟢 -5.41 kB 🟢 -4.75 kB
assets/LegacyCreditsPanel-80ElA9nQ.js (removed) 21.2 kB 🟢 -21.2 kB 🟢 -5.67 kB 🟢 -4.99 kB
assets/LegacyCreditsPanel-b85IuZqB.js (new) 21.2 kB 🔴 +21.2 kB 🔴 +5.66 kB 🔴 +4.99 kB
assets/SubscriptionPanel-CSXBczO3.js (removed) 19.1 kB 🟢 -19.1 kB 🟢 -4.82 kB 🟢 -4.24 kB
assets/SubscriptionPanel-DH0zIE2R.js (new) 19.1 kB 🔴 +19.1 kB 🔴 +4.82 kB 🔴 +4.25 kB
assets/AboutPanel-DhkawPjD.js (new) 11.9 kB 🔴 +11.9 kB 🔴 +3.3 kB 🔴 +2.96 kB
assets/AboutPanel-eVCKm6ge.js (removed) 11.9 kB 🟢 -11.9 kB 🟢 -3.3 kB 🟢 -2.95 kB
assets/ExtensionPanel-CT9RoOvH.js (new) 9.54 kB 🔴 +9.54 kB 🔴 +2.71 kB 🔴 +2.41 kB
assets/ExtensionPanel-I4Dy5Kfu.js (removed) 9.54 kB 🟢 -9.54 kB 🟢 -2.71 kB 🟢 -2.41 kB
assets/ServerConfigPanel-BBJpgImU.js (removed) 6.62 kB 🟢 -6.62 kB 🟢 -2.19 kB 🟢 -1.96 kB
assets/ServerConfigPanel-CrbOYKZ2.js (new) 6.62 kB 🔴 +6.62 kB 🔴 +2.19 kB 🔴 +1.95 kB
assets/UserPanel-BpzWVl7A.js (removed) 6.33 kB 🟢 -6.33 kB 🟢 -2.05 kB 🟢 -1.8 kB
assets/UserPanel-BueM9TRe.js (new) 6.33 kB 🔴 +6.33 kB 🔴 +2.05 kB 🔴 +1.8 kB
assets/cloudRemoteConfig-C1bt4Zs2.js (removed) 1.62 kB 🟢 -1.62 kB 🟢 -800 B 🟢 -681 B
assets/cloudRemoteConfig-DCuYDxFn.js (new) 1.62 kB 🔴 +1.62 kB 🔴 +796 B 🔴 +684 B
assets/refreshRemoteConfig-BXVvUQPz.js (removed) 1.45 kB 🟢 -1.45 kB 🟢 -650 B 🟢 -552 B
assets/refreshRemoteConfig-DJAYnZdl.js (new) 1.45 kB 🔴 +1.45 kB 🔴 +648 B 🔴 +551 B
assets/config-BazmIiy7.js 1.79 kB 1.79 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-4x1YHshq.js 28.9 kB 28.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-9RehNOAa.js 28.9 kB 28.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CgIImzXZ.js 34.4 kB 34.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-ChUKcC_S.js 28 kB 28 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CyVE159k.js 30.1 kB 30.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DcAJ3VeS.js 32.6 kB 32.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DcxL5WJ9.js 24 kB 24 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DPGGy1ee.js 30.7 kB 30.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-fYZUwZW3.js 27.9 kB 27.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-JqHYHJz0.js 38.8 kB 38.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-WgI_mXzx.js 24.6 kB 24.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 10 added / 10 removed

User & Accounts — 16.6 kB (baseline 16.6 kB) • ⚪ 0 B

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/auth-CfRxak0n.js (new) 3.57 kB 🔴 +3.57 kB 🔴 +1.26 kB 🔴 +1.07 kB
assets/auth-DkFcza7K.js (removed) 3.57 kB 🟢 -3.57 kB 🟢 -1.26 kB 🟢 -1.07 kB
assets/SignUpForm-DmF_4VqQ.js (removed) 3.18 kB 🟢 -3.18 kB 🟢 -1.29 kB 🟢 -1.15 kB
assets/SignUpForm-DoMnmDnE.js (new) 3.18 kB 🔴 +3.18 kB 🔴 +1.29 kB 🔴 +1.15 kB
assets/UpdatePasswordContent-B9ST6WzY.js (new) 2.44 kB 🔴 +2.44 kB 🔴 +1.09 kB 🔴 +974 B
assets/UpdatePasswordContent-YMtAgfvz.js (removed) 2.44 kB 🟢 -2.44 kB 🟢 -1.09 kB 🟢 -969 B
assets/firebaseAuthStore-BhSiORGJ.js (new) 788 B 🔴 +788 B 🔴 +384 B 🔴 +342 B
assets/firebaseAuthStore-wUFa0V9V.js (removed) 788 B 🟢 -788 B 🟢 -385 B 🟢 -344 B
assets/auth-4WdtoQUg.js (removed) 313 B 🟢 -313 B 🟢 -198 B 🟢 -173 B
assets/auth-Blqjkvrf.js (new) 313 B 🔴 +313 B 🔴 +198 B 🔴 +179 B
assets/PasswordFields-DcCUqFkG.js 4.68 kB 4.68 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WorkspaceProfilePic-CVvFhrNa.js 1.66 kB 1.66 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 5 added / 5 removed

Editors & Dialogs — 81.8 kB (baseline 81.8 kB) • ⚪ 0 B

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useShareDialog-CbAkVjUC.js (removed) 81 kB 🟢 -81 kB 🟢 -16.9 kB 🟢 -14.5 kB
assets/useShareDialog-Cf9eVASp.js (new) 81 kB 🔴 +81 kB 🔴 +16.9 kB 🔴 +14.5 kB
assets/useSubscriptionDialog-BFEVInuM.js (removed) 736 B 🟢 -736 B 🟢 -378 B 🟢 -329 B
assets/useSubscriptionDialog-DYZ6a9NQ.js (new) 736 B 🔴 +736 B 🔴 +376 B 🔴 +328 B

Status: 2 added / 2 removed

UI Components — 59 kB (baseline 59 kB) • ⚪ 0 B

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/ComfyQueueButton-DH1GX6IY.js (removed) 14.3 kB 🟢 -14.3 kB 🟢 -4 kB 🟢 -3.58 kB
assets/ComfyQueueButton-wbra5Dx7.js (new) 14.3 kB 🔴 +14.3 kB 🔴 +4 kB 🔴 +3.57 kB
assets/useTerminalTabs-BvuXh0C8.js (new) 10.4 kB 🔴 +10.4 kB 🔴 +3.5 kB 🔴 +3.09 kB
assets/useTerminalTabs-ofJT_47R.js (removed) 10.4 kB 🟢 -10.4 kB 🟢 -3.5 kB 🟢 -3.08 kB
assets/SubscribeButton-B3JA2jNZ.js (new) 2.42 kB 🔴 +2.42 kB 🔴 +1.05 kB 🔴 +917 B
assets/SubscribeButton-BE0eovsh.js (removed) 2.42 kB 🟢 -2.42 kB 🟢 -1.04 kB 🟢 -918 B
assets/cloudFeedbackTopbarButton-Dg6YYM_C.js (new) 1.43 kB 🔴 +1.43 kB 🔴 +740 B 🔴 +659 B
assets/cloudFeedbackTopbarButton-DTNhstw4.js (removed) 1.43 kB 🟢 -1.43 kB 🟢 -741 B 🟢 -663 B
assets/ComfyQueueButton-CcIqKrjO.js (new) 793 B 🔴 +793 B 🔴 +391 B 🔴 +353 B
assets/ComfyQueueButton-CWalOw-X.js (removed) 793 B 🟢 -793 B 🟢 -394 B 🟢 -352 B
assets/Button-CzCLfUsG.js 3.42 kB 3.42 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudBadge-B8l4Ioh2.js 1.17 kB 1.17 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/FormSearchInput-BpEgMicB.js 3.94 kB 3.94 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ScrubableNumberInput-Dx7LngHp.js 6.27 kB 6.27 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/toggle-group-By5E1G-i.js 4.03 kB 4.03 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/TopbarBadge-Bnm3BoM3.js 7.53 kB 7.53 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserAvatar-XBmTe5nW.js 1.24 kB 1.24 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetButton-C5HuExH9.js 2.04 kB 2.04 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 5 added / 5 removed

Data & Services — 3.17 MB (baseline 3.17 MB) • ⚪ 0 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/dialogService-CdvXzRgr.js (removed) 2.15 MB 🟢 -2.15 MB 🟢 -495 kB 🟢 -370 kB
assets/dialogService-T425cutO.js (new) 2.15 MB 🔴 +2.15 MB 🔴 +495 kB 🔴 +370 kB
assets/api-Bsz7cux6.js (removed) 862 kB 🟢 -862 kB 🟢 -206 kB 🟢 -162 kB
assets/api-ByzHWETs.js (new) 862 kB 🔴 +862 kB 🔴 +206 kB 🔴 +162 kB
assets/load3dService-BGQPaUue.js (new) 93.3 kB 🔴 +93.3 kB 🔴 +19.8 kB 🔴 +17 kB
assets/load3dService-CYtnHqzJ.js (removed) 93.3 kB 🟢 -93.3 kB 🟢 -19.8 kB 🟢 -17 kB
assets/extensionStore-BbSosmCv.js (new) 19.9 kB 🔴 +19.9 kB 🔴 +6.7 kB 🔴 +5.86 kB
assets/extensionStore-BRPzNv33.js (removed) 19.9 kB 🟢 -19.9 kB 🟢 -6.7 kB 🟢 -5.87 kB
assets/workflowShareService-v0Uv9ITF.js (removed) 14.1 kB 🟢 -14.1 kB 🟢 -4.32 kB 🟢 -3.8 kB
assets/workflowShareService-yqwXIiWd.js (new) 14.1 kB 🔴 +14.1 kB 🔴 +4.32 kB 🔴 +3.8 kB
assets/releaseStore-DMpKjnSv.js (removed) 8.07 kB 🟢 -8.07 kB 🟢 -2.25 kB 🟢 -1.98 kB
assets/releaseStore-DrofPYLj.js (new) 8.07 kB 🔴 +8.07 kB 🔴 +2.25 kB 🔴 +1.97 kB
assets/keybindingService-C-qQIdbn.js (new) 6.99 kB 🔴 +6.99 kB 🔴 +1.74 kB 🔴 +1.5 kB
assets/keybindingService-Dre4LgTP.js (removed) 6.99 kB 🟢 -6.99 kB 🟢 -1.73 kB 🟢 -1.49 kB
assets/userStore-CcClchDx.js (new) 2.24 kB 🔴 +2.24 kB 🔴 +869 B 🔴 +766 B
assets/userStore-uUsw0KB0.js (removed) 2.24 kB 🟢 -2.24 kB 🟢 -869 B 🟢 -765 B
assets/bootstrapStore-ceewq-F2.js (removed) 2.11 kB 🟢 -2.11 kB 🟢 -891 B 🟢 -807 B
assets/bootstrapStore-CPSjsVgN.js (new) 2.11 kB 🔴 +2.11 kB 🔴 +892 B 🔴 +807 B
assets/audioService-BehI35KS.js (removed) 1.75 kB 🟢 -1.75 kB 🟢 -865 B 🟢 -746 B
assets/audioService-CcOFbeoI.js (new) 1.75 kB 🔴 +1.75 kB 🔴 +864 B 🔴 +744 B
assets/releaseStore-DdV9BELo.js (removed) 760 B 🟢 -760 B 🟢 -384 B 🟢 -340 B
assets/releaseStore-T20Jlouw.js (new) 760 B 🔴 +760 B 🔴 +382 B 🔴 +346 B
assets/workflowDraftStore-CaUW2jTI.js (removed) 736 B 🟢 -736 B 🟢 -378 B 🟢 -334 B
assets/workflowDraftStore-DkumSsnI.js (new) 736 B 🔴 +736 B 🔴 +375 B 🔴 +337 B
assets/dialogService-B9_w395O.js (removed) 725 B 🟢 -725 B 🟢 -366 B 🟢 -329 B
assets/dialogService-qGFi_6g1.js (new) 725 B 🔴 +725 B 🔴 +364 B 🔴 +328 B
assets/settingStore-CRtgLrMt.js (new) 723 B 🔴 +723 B 🔴 +367 B 🔴 +331 B
assets/settingStore-DhHRUWXp.js (removed) 723 B 🟢 -723 B 🟢 -373 B 🟢 -328 B
assets/assetsStore-C9PfcxQt.js (removed) 722 B 🟢 -722 B 🟢 -369 B 🟢 -329 B
assets/assetsStore-vqVwA8Fk.js (new) 722 B 🔴 +722 B 🔴 +367 B 🔴 +332 B
assets/serverConfigStore-BMw7voHC.js 2.35 kB 2.35 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 15 added / 15 removed

Utilities & Hooks — 68.9 kB (baseline 68.9 kB) • ⚪ 0 B

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useLoad3dViewer-BSJ3HtLL.js (removed) 15.1 kB 🟢 -15.1 kB 🟢 -3.42 kB 🟢 -3.03 kB
assets/useLoad3dViewer-D_IUw48V.js (new) 15.1 kB 🔴 +15.1 kB 🔴 +3.42 kB 🔴 +3.02 kB
assets/useLoad3d-DrprIIwt.js (new) 14.6 kB 🔴 +14.6 kB 🔴 +3.65 kB 🔴 +3.23 kB
assets/useLoad3d-sV4PKRUa.js (removed) 14.6 kB 🟢 -14.6 kB 🟢 -3.65 kB 🟢 -3.23 kB
assets/useFeatureFlags-B4RdRbXy.js (removed) 5.78 kB 🟢 -5.78 kB 🟢 -1.75 kB 🟢 -1.48 kB
assets/useFeatureFlags-CrJdZzCp.js (new) 5.78 kB 🔴 +5.78 kB 🔴 +1.75 kB 🔴 +1.48 kB
assets/useWorkspaceUI--R3vc9aT.js (removed) 3.34 kB 🟢 -3.34 kB 🟢 -978 B 🟢 -812 B
assets/useWorkspaceUI-9Q7zlurX.js (new) 3.34 kB 🔴 +3.34 kB 🔴 +980 B 🔴 +811 B
assets/subscriptionCheckoutUtil-BWXrwXTa.js (removed) 3.04 kB 🟢 -3.04 kB 🟢 -1.31 kB 🟢 -1.15 kB
assets/subscriptionCheckoutUtil-S_74enGz.js (new) 3.04 kB 🔴 +3.04 kB 🔴 +1.31 kB 🔴 +1.15 kB
assets/useUpstreamValue-BkvWtA1F.js (removed) 2.08 kB 🟢 -2.08 kB 🟢 -803 B 🟢 -718 B
assets/useUpstreamValue-hdR_UcUr.js (new) 2.08 kB 🔴 +2.08 kB 🔴 +804 B 🔴 +713 B
assets/useErrorHandling-BPMjGFrB.js (removed) 1.54 kB 🟢 -1.54 kB 🟢 -649 B 🟢 -550 B
assets/useErrorHandling-CFa-bGgr.js (new) 1.54 kB 🔴 +1.54 kB 🔴 +648 B 🔴 +554 B
assets/audioUtils-Bm2Ei2cL.js (removed) 958 B 🟢 -958 B 🟢 -564 B 🟢 -497 B
assets/audioUtils-D7h2ARzZ.js (new) 958 B 🔴 +958 B 🔴 +563 B 🔴 +452 B
assets/useLoad3d-bwU1gre1.js (new) 859 B 🔴 +859 B 🔴 +422 B 🔴 +381 B
assets/useLoad3d-DMHSimja.js (removed) 859 B 🟢 -859 B 🟢 -423 B 🟢 -377 B
assets/useLoad3dViewer-D_qhI7S0.js (new) 838 B 🔴 +838 B 🔴 +408 B 🔴 +371 B
assets/useLoad3dViewer-DKIfFtdF.js (removed) 838 B 🟢 -838 B 🟢 -407 B 🟢 -366 B
assets/useWorkspaceSwitch-DQdPI0Lh.js (new) 747 B 🔴 +747 B 🔴 +385 B 🔴 +330 B
assets/useWorkspaceSwitch-nYjZQ3CY.js (removed) 747 B 🟢 -747 B 🟢 -385 B 🟢 -329 B
assets/useCurrentUser-B6dVLIDt.js (removed) 722 B 🟢 -722 B 🟢 -372 B 🟢 -330 B
assets/useCurrentUser-C29ur8JW.js (new) 722 B 🔴 +722 B 🔴 +369 B 🔴 +329 B
assets/_plugin-vue_export-helper-DqNI4win.js 365 B 365 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/assetMetadataUtils-Cu1m4aen.js 4.78 kB 4.78 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/colorUtil-BoDX6eKf.js 8.89 kB 8.89 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/envUtil-BOOGgtql.js 489 B 489 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/markdownRendererUtil-AGO63igr.js 1.59 kB 1.59 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SkeletonUtils-BrLYgVOH.js 133 B 133 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useExternalLink-_Rbq0GZz.js 3.04 kB 3.04 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 12 added / 12 removed

Vendor & Third-Party — 9.78 MB (baseline 9.78 MB) • ⚪ 0 B

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-axios-B-zaJ78_.js 93 kB 93 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-chart-QIvOlSgA.js 411 kB 411 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-firebase-x5F51RZV.js 1.01 MB 1.01 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-i18n-TjUfhse9.js 140 kB 140 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-markdown-BAquA4iy.js 110 kB 110 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-other-DD8n2cnE.js 1.76 MB 1.76 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-primevue-DGRjWEoA.js 1.75 MB 1.75 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-reka-ui-CCjqphhL.js 474 kB 474 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-sentry-Dn2jSJwd.js 267 kB 267 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-three-D0iKHrgP.js 1.83 MB 1.83 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-tiptap-bePjZBYs.js 737 kB 737 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vue-core-Ba0aGEmU.js 328 kB 328 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vueuse-DrtiTSko.js 136 kB 136 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-xterm-DZ7n4cB7.js 374 kB 374 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-yjs-B0izGxZ6.js 246 kB 246 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-zod-W_VsqAhz.js 111 kB 111 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Other — 8.21 MB (baseline 8.21 MB) • ⚪ 0 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/core-D9C4jBBe.js (removed) 75.7 kB 🟢 -75.7 kB 🟢 -19.5 kB 🟢 -16.7 kB
assets/core-DPoIFXZd.js (new) 75.7 kB 🔴 +75.7 kB 🔴 +19.5 kB 🔴 +16.7 kB
assets/groupNode-B4pDwBGq.js (new) 73.9 kB 🔴 +73.9 kB 🔴 +18.5 kB 🔴 +16.3 kB
assets/groupNode-CUsPgvya.js (removed) 73.9 kB 🟢 -73.9 kB 🟢 -18.5 kB 🟢 -16.2 kB
assets/WidgetSelect-B96StZUD.js (removed) 63.2 kB 🟢 -63.2 kB 🟢 -13.8 kB 🟢 -11.9 kB
assets/WidgetSelect-Dp_rSlU-.js (new) 63.2 kB 🔴 +63.2 kB 🔴 +13.8 kB 🔴 +11.9 kB
assets/SubscriptionRequiredDialogContentWorkspace-Bud5LsP7.js (new) 47.1 kB 🔴 +47.1 kB 🔴 +8.75 kB 🔴 +7.58 kB
assets/SubscriptionRequiredDialogContentWorkspace-DMboqq_F.js (removed) 47.1 kB 🟢 -47.1 kB 🟢 -8.75 kB 🟢 -7.56 kB
assets/WidgetPainter-DF5QG3R2.js (new) 33.1 kB 🔴 +33.1 kB 🔴 +8.01 kB 🔴 +7.11 kB
assets/WidgetPainter-O7lk9fU_.js (removed) 33.1 kB 🟢 -33.1 kB 🟢 -8.01 kB 🟢 -7.12 kB
assets/Load3DControls-fwpJcQL-.js (new) 32.1 kB 🔴 +32.1 kB 🔴 +5.47 kB 🔴 +4.75 kB
assets/Load3DControls-M-DM_foc.js (removed) 32.1 kB 🟢 -32.1 kB 🟢 -5.47 kB 🟢 -4.76 kB
assets/WorkspacePanelContent-D89zd_1C.js (removed) 29.7 kB 🟢 -29.7 kB 🟢 -6.22 kB 🟢 -5.45 kB
assets/WorkspacePanelContent-Tnb6ikP2.js (new) 29.7 kB 🔴 +29.7 kB 🔴 +6.22 kB 🔴 +5.46 kB
assets/SubscriptionRequiredDialogContent-Cf0KAPCW.js (removed) 26.1 kB 🟢 -26.1 kB 🟢 -6.61 kB 🟢 -5.83 kB
assets/SubscriptionRequiredDialogContent-CZTMxlG7.js (new) 26.1 kB 🔴 +26.1 kB 🔴 +6.62 kB 🔴 +5.83 kB
assets/Load3dViewerContent-D6-o6THj.js (removed) 24.3 kB 🟢 -24.3 kB 🟢 -5.32 kB 🟢 -4.63 kB
assets/Load3dViewerContent-DzoX6hJF.js (new) 24.3 kB 🔴 +24.3 kB 🔴 +5.32 kB 🔴 +4.62 kB
assets/WidgetImageCrop-Crs4AVBS.js (removed) 23.1 kB 🟢 -23.1 kB 🟢 -5.75 kB 🟢 -5.08 kB
assets/WidgetImageCrop-DlQzN948.js (new) 23.1 kB 🔴 +23.1 kB 🔴 +5.74 kB 🔴 +5.06 kB
assets/SubscriptionPanelContentWorkspace-3t6ZqIGW.js (removed) 22.2 kB 🟢 -22.2 kB 🟢 -5.17 kB 🟢 -4.55 kB
assets/SubscriptionPanelContentWorkspace-vkRi-_Lj.js (new) 22.2 kB 🔴 +22.2 kB 🔴 +5.17 kB 🔴 +4.55 kB
assets/CurrentUserPopoverWorkspace-CPF6HRuj.js (new) 20.8 kB 🔴 +20.8 kB 🔴 +5 kB 🔴 +4.47 kB
assets/CurrentUserPopoverWorkspace-J3ru3ZDU.js (removed) 20.8 kB 🟢 -20.8 kB 🟢 -4.99 kB 🟢 -4.45 kB
assets/SignInContent-DlBu4Qtl.js (removed) 20 kB 🟢 -20 kB 🟢 -5.16 kB 🟢 -4.5 kB
assets/SignInContent-DzJJYw8X.js (new) 20 kB 🔴 +20 kB 🔴 +5.16 kB 🔴 +4.5 kB
assets/WidgetInputNumber-CawAZXiI.js (new) 19.1 kB 🔴 +19.1 kB 🔴 +4.84 kB 🔴 +4.29 kB
assets/WidgetInputNumber-DiFHcxf7.js (removed) 19.1 kB 🟢 -19.1 kB 🟢 -4.84 kB 🟢 -4.3 kB
assets/WidgetRecordAudio-cJOQUbus.js (removed) 17.9 kB 🟢 -17.9 kB 🟢 -5.09 kB 🟢 -4.57 kB
assets/WidgetRecordAudio-DOysXtoO.js (new) 17.9 kB 🔴 +17.9 kB 🔴 +5.09 kB 🔴 +4.57 kB
assets/Load3D-7isBbLgw.js (removed) 16.8 kB 🟢 -16.8 kB 🟢 -4.11 kB 🟢 -3.6 kB
assets/Load3D-D0ZjlOLl.js (new) 16.8 kB 🔴 +16.8 kB 🔴 +4.11 kB 🔴 +3.59 kB
assets/load3d-Cn-tWdQM.js (removed) 14.8 kB 🟢 -14.8 kB 🟢 -4.2 kB 🟢 -3.65 kB
assets/load3d-DuwtEcU1.js (new) 14.8 kB 🔴 +14.8 kB 🔴 +4.2 kB 🔴 +3.65 kB
assets/WidgetCurve-CIUTRDfC.js (removed) 11.7 kB 🟢 -11.7 kB 🟢 -3.89 kB 🟢 -3.5 kB
assets/WidgetCurve-ZVpf1HJa.js (new) 11.7 kB 🔴 +11.7 kB 🔴 +3.89 kB 🔴 +3.51 kB
assets/AudioPreviewPlayer-Bs9L4alo.js (removed) 11.2 kB 🟢 -11.2 kB 🟢 -3.3 kB 🟢 -2.96 kB
assets/AudioPreviewPlayer-D9rPINM7.js (new) 11.2 kB 🔴 +11.2 kB 🔴 +3.3 kB 🔴 +2.96 kB
assets/nodeTemplates-B8ejHKqt.js (new) 9.33 kB 🔴 +9.33 kB 🔴 +3.28 kB 🔴 +2.88 kB
assets/nodeTemplates-CNE8y3JL.js (removed) 9.33 kB 🟢 -9.33 kB 🟢 -3.28 kB 🟢 -2.88 kB
assets/InviteMemberDialogContent-BkX1RVjI.js (new) 7.53 kB 🔴 +7.53 kB 🔴 +2.35 kB 🔴 +2.09 kB
assets/InviteMemberDialogContent-D5zKdiTW.js (removed) 7.53 kB 🟢 -7.53 kB 🟢 -2.35 kB 🟢 -2.06 kB
assets/Load3DConfiguration-BsMQytxc.js (new) 6.55 kB 🔴 +6.55 kB 🔴 +2.03 kB 🔴 +1.77 kB
assets/Load3DConfiguration-c6spx2uU.js (removed) 6.55 kB 🟢 -6.55 kB 🟢 -2.03 kB 🟢 -1.77 kB
assets/onboardingCloudRoutes-BF4DV5re.js (new) 6.15 kB 🔴 +6.15 kB 🔴 +1.91 kB 🔴 +1.67 kB
assets/onboardingCloudRoutes-DUZc9cXi.js (removed) 6.15 kB 🟢 -6.15 kB 🟢 -1.91 kB 🟢 -1.67 kB
assets/WidgetWithControl-_92tRn2q.js (new) 5.76 kB 🔴 +5.76 kB 🔴 +2.25 kB 🔴 +2.02 kB
assets/WidgetWithControl-Csf-VHBt.js (removed) 5.76 kB 🟢 -5.76 kB 🟢 -2.25 kB 🟢 -2.01 kB
assets/CreateWorkspaceDialogContent-CHkm1jX7.js (new) 5.71 kB 🔴 +5.71 kB 🔴 +2.05 kB 🔴 +1.78 kB
assets/CreateWorkspaceDialogContent-DCUqI38T.js (removed) 5.71 kB 🟢 -5.71 kB 🟢 -2.05 kB 🟢 -1.78 kB
assets/FreeTierDialogContent-7M_RSxaE.js (removed) 5.54 kB 🟢 -5.54 kB 🟢 -1.93 kB 🟢 -1.72 kB
assets/FreeTierDialogContent-DiTH-Y83.js (new) 5.54 kB 🔴 +5.54 kB 🔴 +1.93 kB 🔴 +1.7 kB
assets/EditWorkspaceDialogContent-DfrNFhel.js (new) 5.51 kB 🔴 +5.51 kB 🔴 +2.01 kB 🔴 +1.76 kB
assets/EditWorkspaceDialogContent-F3__FwVP.js (removed) 5.51 kB 🟢 -5.51 kB 🟢 -2.01 kB 🟢 -1.76 kB
assets/ValueControlPopover-B54jkHBi.js (new) 5.1 kB 🔴 +5.1 kB 🔴 +1.82 kB 🔴 +1.63 kB
assets/ValueControlPopover-DvyMoOlv.js (removed) 5.1 kB 🟢 -5.1 kB 🟢 -1.82 kB 🟢 -1.63 kB
assets/Preview3d-BKh069uI.js (new) 5.08 kB 🔴 +5.08 kB 🔴 +1.67 kB 🔴 +1.47 kB
assets/Preview3d-BZRhFtST.js (removed) 5.08 kB 🟢 -5.08 kB 🟢 -1.67 kB 🟢 -1.46 kB
assets/WidgetTextarea-BZXxo41e.js (removed) 5.03 kB 🟢 -5.03 kB 🟢 -1.96 kB 🟢 -1.73 kB
assets/WidgetTextarea-Dj6cG6c0.js (new) 5.03 kB 🔴 +5.03 kB 🔴 +1.96 kB 🔴 +1.73 kB
assets/CancelSubscriptionDialogContent-CJJSM4fG.js (new) 4.98 kB 🔴 +4.98 kB 🔴 +1.84 kB 🔴 +1.61 kB
assets/CancelSubscriptionDialogContent-CxLneyiG.js (removed) 4.98 kB 🟢 -4.98 kB 🟢 -1.84 kB 🟢 -1.62 kB
assets/tierBenefits-m5c9GWBG.js (removed) 4.47 kB 🟢 -4.47 kB 🟢 -1.58 kB 🟢 -1.36 kB
assets/tierBenefits-TAebnb4D.js (new) 4.47 kB 🔴 +4.47 kB 🔴 +1.58 kB 🔴 +1.36 kB
assets/DeleteWorkspaceDialogContent-CebRwDMQ.js (new) 4.41 kB 🔴 +4.41 kB 🔴 +1.69 kB 🔴 +1.47 kB
assets/DeleteWorkspaceDialogContent-DA1kh0m1.js (removed) 4.41 kB 🟢 -4.41 kB 🟢 -1.69 kB 🟢 -1.47 kB
assets/LeaveWorkspaceDialogContent-CAJR2asJ.js (new) 4.24 kB 🔴 +4.24 kB 🔴 +1.63 kB 🔴 +1.42 kB
assets/LeaveWorkspaceDialogContent-DCIp9Ugs.js (removed) 4.24 kB 🟢 -4.24 kB 🟢 -1.64 kB 🟢 -1.42 kB
assets/RemoveMemberDialogContent-C2fmW_vf.js (new) 4.22 kB 🔴 +4.22 kB 🔴 +1.59 kB 🔴 +1.39 kB
assets/RemoveMemberDialogContent-DPkLmf6a.js (removed) 4.22 kB 🟢 -4.22 kB 🟢 -1.59 kB 🟢 -1.39 kB
assets/RevokeInviteDialogContent-BAR3SX7U.js (removed) 4.13 kB 🟢 -4.13 kB 🟢 -1.6 kB 🟢 -1.4 kB
assets/RevokeInviteDialogContent-BM8Hzl5d.js (new) 4.13 kB 🔴 +4.13 kB 🔴 +1.6 kB 🔴 +1.4 kB
assets/InviteMemberUpsellDialogContent-B-w_12oG.js (removed) 4.03 kB 🟢 -4.03 kB 🟢 -1.46 kB 🟢 -1.28 kB
assets/InviteMemberUpsellDialogContent-F3iFe9aK.js (new) 4.03 kB 🔴 +4.03 kB 🔴 +1.46 kB 🔴 +1.28 kB
assets/cloudSessionCookie-BOvBv9vD.js (removed) 3.9 kB 🟢 -3.9 kB 🟢 -1.38 kB 🟢 -1.2 kB
assets/cloudSessionCookie-CxT3Z-1g.js (new) 3.9 kB 🔴 +3.9 kB 🔴 +1.38 kB 🔴 +1.2 kB
assets/saveMesh-CEBNZmvn.js (new) 3.42 kB 🔴 +3.42 kB 🔴 +1.46 kB 🔴 +1.3 kB
assets/saveMesh-CsHAopF7.js (removed) 3.42 kB 🟢 -3.42 kB 🟢 -1.46 kB 🟢 -1.3 kB
assets/GlobalToast-Cjv7DJFT.js (removed) 3.04 kB 🟢 -3.04 kB 🟢 -1.26 kB 🟢 -1.08 kB
assets/GlobalToast-CMNCLCeE.js (new) 3.04 kB 🔴 +3.04 kB 🔴 +1.26 kB 🔴 +1.08 kB
assets/SubscribeToRun-C0FoHOG1.js (removed) 2.13 kB 🟢 -2.13 kB 🟢 -977 B 🟢 -878 B
assets/SubscribeToRun-DqlUSMkw.js (new) 2.13 kB 🔴 +2.13 kB 🔴 +977 B 🔴 +855 B
assets/CloudRunButtonWrapper-C2pnbGLy.js (new) 1.76 kB 🔴 +1.76 kB 🔴 +806 B 🔴 +723 B
assets/CloudRunButtonWrapper-Cnd5nz8f.js (removed) 1.76 kB 🟢 -1.76 kB 🟢 -809 B 🟢 -740 B
assets/cloudBadges-BFj982Lk.js (removed) 1.53 kB 🟢 -1.53 kB 🟢 -788 B 🟢 -692 B
assets/cloudBadges-DHrW1YLm.js (new) 1.53 kB 🔴 +1.53 kB 🔴 +785 B 🔴 +690 B
assets/previousFullPath-DVhcI05Z.js (removed) 1.53 kB 🟢 -1.53 kB 🟢 -692 B 🟢 -619 B
assets/previousFullPath-mOkcVzdH.js (new) 1.53 kB 🔴 +1.53 kB 🔴 +694 B 🔴 +603 B
assets/cloudSubscription-DjlC2zAs.js (removed) 1.45 kB 🟢 -1.45 kB 🟢 -706 B 🟢 -612 B
assets/cloudSubscription-DttyQg5b.js (new) 1.45 kB 🔴 +1.45 kB 🔴 +705 B 🔴 +609 B
assets/Load3D-BZdIuFk_.js (removed) 1.07 kB 🟢 -1.07 kB 🟢 -495 B 🟢 -445 B
assets/Load3D-ropgFbPz.js (new) 1.07 kB 🔴 +1.07 kB 🔴 +495 B 🔴 +440 B
assets/nightlyBadges-Bv7Nb0P7.js (new) 1.06 kB 🔴 +1.06 kB 🔴 +552 B 🔴 +500 B
assets/nightlyBadges-CXBjvDM_.js (removed) 1.06 kB 🟢 -1.06 kB 🟢 -553 B 🟢 -500 B
assets/Load3dViewerContent-BLgza3xE.js (new) 993 B 🔴 +993 B 🔴 +466 B 🔴 +420 B
assets/Load3dViewerContent-v1-Tit22.js (removed) 993 B 🟢 -993 B 🟢 -465 B 🟢 -417 B
assets/SubscriptionPanelContentWorkspace-BSjC8tUU.js (removed) 920 B 🟢 -920 B 🟢 -438 B 🟢 -379 B
assets/SubscriptionPanelContentWorkspace-CZR3uB0S.js (new) 920 B 🔴 +920 B 🔴 +436 B 🔴 +377 B
assets/graphHasMissingNodes-D19uvR0n.js (new) 822 B 🔴 +822 B 🔴 +414 B 🔴 +349 B
assets/graphHasMissingNodes-DekfbCCj.js (removed) 822 B 🟢 -822 B 🟢 -413 B 🟢 -348 B
assets/WidgetLegacy-CjsY5Eh6.js (removed) 744 B 🟢 -744 B 🟢 -384 B 🟢 -340 B
assets/WidgetLegacy-ytrmdwm0.js (new) 744 B 🔴 +744 B 🔴 +382 B 🔴 +339 B
assets/changeTracker-B-VESS32.js (removed) 720 B 🟢 -720 B 🟢 -370 B 🟢 -330 B
assets/changeTracker-Bo4Vdz8-.js (new) 720 B 🔴 +720 B 🔴 +368 B 🔴 +331 B
assets/AnimationControls-D_ssPKpl.js 4.78 kB 4.78 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ApiNodesSignInContent-122DuhFE.js 2.86 kB 2.86 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/auto-Da_dLKSr.js 1.7 kB 1.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/BaseViewTemplate-BO4bu8SW.js 1.92 kB 1.92 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/comfy-logo-single--m8ho-x0.js 272 B 272 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ComfyOrgHeader-B5_02-pL.js 960 B 960 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-6C7uscef.js 16.9 kB 16.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-aHWGoXwC.js 15.3 kB 15.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-B0dAi43J.js 16.1 kB 16.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Bm9EUr3J.js 17.2 kB 17.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Bp4kggpz.js 17.8 kB 17.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CfrqwZHT.js 16.3 kB 16.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CWNMjnpx.js 15.4 kB 15.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-D6U7YFhN.js 17.8 kB 17.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DC5sgzz0.js 19.1 kB 19.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Dm1AG3mI.js 16.3 kB 16.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-pcbFneET.js 16.3 kB 16.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/constants-CDJrbKEX.js 766 B 766 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/i18n-CfPFpEth.js 553 kB 553 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/i18n-E31GmVX_.js 137 B 137 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Loader-D9NTeFNU.js 1.26 kB 1.26 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BIs1qLld.js 204 kB 204 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BUVqJDoB.js 187 kB 187 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BYJEKs0c.js 162 kB 162 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CBpFsmCa.js 168 kB 168 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CduD3FWK.js 165 kB 165 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CE7GagrW.js 143 kB 143 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CO5hcLH6.js 171 kB 171 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Cpo91t82.js 144 kB 144 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Db-L7jAY.js 196 kB 196 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DbpvTHsj.js 228 kB 228 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-ULS0BFNt.js 163 kB 163 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Media3DTop-lR1JiQqq.js 1.98 kB 1.98 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaAudioTop-DDwe88_i.js 1.59 kB 1.59 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaImageTop-B3Ndzn8y.js 2.02 kB 2.02 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaOtherTop-DLyNtqwJ.js 1.07 kB 1.07 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaTextTop-BPdj4Cu9.js 1.06 kB 1.06 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaVideoTop-DKoWz3mq.js 2.94 kB 2.94 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/NightlySurveyController-BJ7Yfxt0.js 9.5 kB 9.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BhazHjGG.js 373 kB 373 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BHJWB8Hi.js 411 kB 411 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BLiR_Cci.js 423 kB 423 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BwxSR87L.js 500 kB 500 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-C109fHHV.js 459 kB 459 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CeR-W4r5.js 406 kB 406 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CVv25Zq-.js 369 kB 369 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CYNwkBlA.js 403 kB 403 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DGeylh_m.js 458 kB 458 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Dimlxn51.js 407 kB 407 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DXcKksxR.js 398 kB 398 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/OBJLoader2WorkerModule-DTMpvldF.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Popover-xbED3XYT.js 3.77 kB 3.77 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/rolldown-runtime-DBfy44LZ.js 2.02 kB 2.02 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SelectValue-BkB8Nehs.js 9.8 kB 9.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/signInSchema-Cp3pGVrA.js 1.56 kB 1.56 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Slider-BYG1u0oC.js 3.57 kB 3.57 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/src-C5oPOZUH.js 290 B 290 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscriptionBenefits-CecH6qXS.js 2.28 kB 2.28 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/telemetry-7ZMuZPoG.js 443 B 443 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Textarea-BCdbAQYh.js 1.42 kB 1.42 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/types-BqIM6TDt.js 313 B 313 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/VideoPlayOverlay-BEMiTJfJ.js 1.51 kB 1.51 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widget-DloL8--t.js 3.5 kB 3.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-BR7_6Tzc.js 3.62 kB 3.62 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-C7hcUvUl.js 283 B 283 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetChart-Br2tE61m.js 2.41 kB 2.41 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetColorPicker-7LajmWlG.js 16.2 kB 16.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetGalleria-BP4f8SEB.js 3.8 kB 3.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetImageCompare-DRrbKltR.js 7.78 kB 7.78 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetInputText-DZD-PABh.js 3.09 kB 3.09 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetLayoutField-DQtrhTV6.js 2.37 kB 2.37 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetMarkdown-CifbFnvo.js 3.13 kB 3.13 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetPropFilter-U-tRpxOF.js 1.52 kB 1.52 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetToggleSwitch-CMqqTQxu.js 3.73 kB 3.73 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetTypes-ju3asrao.js 416 B 416 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 52 added / 52 removed

@christian-byrne christian-byrne requested a review from DrJKL March 15, 2026 04:08
@github-actions
Copy link

github-actions bot commented Mar 15, 2026

⚡ Performance Report

⚠️ 1 regression detected

Metric Baseline PR (n=3) Δ Sig
subgraph-mouse-sweep: DOM nodes 78 96 +23% ⚠️ z=2.8
All metrics
Metric Baseline PR (n=3) Δ Sig
canvas-idle: style recalcs 12 13 +3% z=1.1
canvas-idle: layouts 0 0 +0% variance too high
canvas-idle: task duration 362ms 365ms +1% z=-0.6
canvas-idle: DOM nodes 37 39 +5% z=0.9
canvas-idle: script duration 22ms 22ms -1% z=-0.8
canvas-idle: event listeners 12 12 +0% variance too high
canvas-mouse-sweep: style recalcs 81 78 -5% z=-2.3
canvas-mouse-sweep: layouts 12 12 +0%
canvas-mouse-sweep: task duration 923ms 825ms -11% z=-1.7
canvas-mouse-sweep: DOM nodes 66 62 -7% z=-3.0
canvas-mouse-sweep: script duration 136ms 136ms -1% z=-0.8
canvas-mouse-sweep: event listeners 6 5 -22%
dom-widget-clipping: style recalcs 14 14 +0%
dom-widget-clipping: layouts 0 0 +0% variance too high
dom-widget-clipping: task duration 343ms 346ms +1% z=-0.6
dom-widget-clipping: DOM nodes 23 23 +0% z=-0.7
dom-widget-clipping: script duration 65ms 65ms -1% z=-0.8
dom-widget-clipping: event listeners 2 2 +0% variance too high
large-graph-idle: style recalcs 13 14 +8%
large-graph-idle: layouts 1 1 +50%
large-graph-idle: task duration 493ms 497ms +1%
large-graph-idle: DOM nodes 53 68 +29%
large-graph-idle: script duration 93ms 90ms -3%
large-graph-idle: event listeners 17 22 +29%
large-graph-pan: style recalcs 70 70 +0%
large-graph-pan: layouts 0 0 +0%
large-graph-pan: task duration 1001ms 1038ms +4%
large-graph-pan: DOM nodes 22 21 -3%
large-graph-pan: script duration 387ms 409ms +6%
large-graph-pan: event listeners 6 6 +0%
subgraph-dom-widget-clipping: style recalcs 51 49 -5% z=-2.6
subgraph-dom-widget-clipping: layouts 1 0 -100%
subgraph-dom-widget-clipping: task duration 376ms 360ms -4% z=-1.5
subgraph-dom-widget-clipping: DOM nodes 53 22 -58% z=-130.8
subgraph-dom-widget-clipping: script duration 125ms 122ms -3% z=-1.9
subgraph-dom-widget-clipping: event listeners 19 8 -59%
subgraph-idle: style recalcs 13 12 -5% z=0.1
subgraph-idle: layouts 0 0 -100% variance too high
subgraph-idle: task duration 351ms 347ms -1% z=-0.8
subgraph-idle: DOM nodes 39 24 -38% z=-0.6
subgraph-idle: script duration 18ms 19ms +1% z=-0.6
subgraph-idle: event listeners 12 6 -49% variance too high
subgraph-mouse-sweep: style recalcs 78 81 +4% z=-0.0
subgraph-mouse-sweep: layouts 16 17 +2%
subgraph-mouse-sweep: task duration 666ms 741ms +11% z=-0.3
subgraph-mouse-sweep: DOM nodes 78 96 +23% ⚠️ z=2.8
subgraph-mouse-sweep: script duration 98ms 96ms -2% z=-0.9
subgraph-mouse-sweep: event listeners 11 16 +45%
Historical variance (last 2 runs)
Metric μ σ CV
canvas-idle: style recalcs 12 1 8.1%
canvas-idle: layouts 0 0 141.4%
canvas-idle: task duration 400ms 54ms 13.5%
canvas-idle: DOM nodes 30 10 35.0%
canvas-idle: script duration 26ms 6ms 22.2%
canvas-idle: event listeners 9 4 52.7%
canvas-mouse-sweep: style recalcs 83 2 2.8%
canvas-mouse-sweep: layouts 12 0 0.0%
canvas-mouse-sweep: task duration 991ms 97ms 9.7%
canvas-mouse-sweep: DOM nodes 67 2 2.8%
canvas-mouse-sweep: script duration 144ms 11ms 7.8%
canvas-mouse-sweep: event listeners 6 0 0.0%
dom-widget-clipping: style recalcs 14 0 0.0%
dom-widget-clipping: layouts 0 0 141.4%
dom-widget-clipping: task duration 372ms 41ms 10.9%
dom-widget-clipping: DOM nodes 30 10 32.0%
dom-widget-clipping: script duration 70ms 8ms 10.8%
dom-widget-clipping: event listeners 5 4 82.9%
subgraph-dom-widget-clipping: style recalcs 51 1 1.4%
subgraph-dom-widget-clipping: layouts 1 0 0.0%
subgraph-dom-widget-clipping: task duration 391ms 21ms 5.3%
subgraph-dom-widget-clipping: DOM nodes 53 0 0.4%
subgraph-dom-widget-clipping: script duration 127ms 3ms 2.2%
subgraph-dom-widget-clipping: event listeners 19 0 0.0%
subgraph-idle: style recalcs 12 1 10.0%
subgraph-idle: layouts 0 0 141.4%
subgraph-idle: task duration 384ms 46ms 11.9%
subgraph-idle: DOM nodes 31 12 37.9%
subgraph-idle: script duration 21ms 4ms 18.4%
subgraph-idle: event listeners 9 4 52.7%
subgraph-mouse-sweep: style recalcs 81 4 5.5%
subgraph-mouse-sweep: layouts 16 0 0.0%
subgraph-mouse-sweep: task duration 804ms 195ms 24.2%
subgraph-mouse-sweep: DOM nodes 82 5 6.3%
subgraph-mouse-sweep: script duration 106ms 11ms 10.8%
subgraph-mouse-sweep: event listeners 11 0 0.0%
Raw data
{
  "timestamp": "2026-03-15T10:43:15.060Z",
  "gitSha": "3ba1b519aa4e425ffd5dcb2219c141fd1c0d56dc",
  "branch": "feat/perf-trend-visualization",
  "measurements": [
    {
      "name": "canvas-idle",
      "durationMs": 2059.3709999999987,
      "styleRecalcs": 12,
      "styleRecalcDurationMs": 11.26,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 357.009,
      "heapDeltaBytes": 436916,
      "domNodes": 24,
      "jsHeapTotalBytes": 23330816,
      "scriptDurationMs": 21.296000000000003,
      "eventListeners": 6
    },
    {
      "name": "canvas-idle",
      "durationMs": 2026.0189999999625,
      "styleRecalcs": 12,
      "styleRecalcDurationMs": 10.71,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 362.85599999999994,
      "heapDeltaBytes": 1380668,
      "domNodes": 24,
      "jsHeapTotalBytes": 18350080,
      "scriptDurationMs": 22.169,
      "eventListeners": 6
    },
    {
      "name": "canvas-idle",
      "durationMs": 2052.696000000026,
      "styleRecalcs": 14,
      "styleRecalcDurationMs": 15.097,
      "layouts": 1,
      "layoutDurationMs": 0.2050000000000001,
      "taskDurationMs": 376.158,
      "heapDeltaBytes": 1439064,
      "domNodes": 68,
      "jsHeapTotalBytes": 16777216,
      "scriptDurationMs": 21.823999999999998,
      "eventListeners": 23
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 2007.4400000000026,
      "styleRecalcs": 85,
      "styleRecalcDurationMs": 52.051,
      "layouts": 12,
      "layoutDurationMs": 3.574,
      "taskDurationMs": 1006.2060000000001,
      "heapDeltaBytes": -2972412,
      "domNodes": 70,
      "jsHeapTotalBytes": 16515072,
      "scriptDurationMs": 148.439,
      "eventListeners": 6
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1816.0160000000474,
      "styleRecalcs": 75,
      "styleRecalcDurationMs": 37.934,
      "layouts": 12,
      "layoutDurationMs": 3.655,
      "taskDurationMs": 744.761,
      "heapDeltaBytes": -3402340,
      "domNodes": 59,
      "jsHeapTotalBytes": 18874368,
      "scriptDurationMs": 130.214,
      "eventListeners": 4
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1744.0129999999954,
      "styleRecalcs": 73,
      "styleRecalcDurationMs": 34.095,
      "layouts": 12,
      "layoutDurationMs": 3.342,
      "taskDurationMs": 722.7979999999999,
      "heapDeltaBytes": -3455072,
      "domNodes": 56,
      "jsHeapTotalBytes": 19136512,
      "scriptDurationMs": 127.916,
      "eventListeners": 4
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 545.439000000016,
      "styleRecalcs": 14,
      "styleRecalcDurationMs": 11.164000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 341.245,
      "heapDeltaBytes": 11768676,
      "domNodes": 23,
      "jsHeapTotalBytes": 17825792,
      "scriptDurationMs": 64.68499999999999,
      "eventListeners": 2
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 578.661000000011,
      "styleRecalcs": 14,
      "styleRecalcDurationMs": 10.278,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 358.886,
      "heapDeltaBytes": 12732068,
      "domNodes": 23,
      "jsHeapTotalBytes": 16252928,
      "scriptDurationMs": 65.84700000000001,
      "eventListeners": 2
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 580.3150000000414,
      "styleRecalcs": 14,
      "styleRecalcDurationMs": 10.092,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 339.344,
      "heapDeltaBytes": 12905032,
      "domNodes": 24,
      "jsHeapTotalBytes": 14417920,
      "scriptDurationMs": 63.164,
      "eventListeners": 2
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2007.1950000000243,
      "styleRecalcs": 14,
      "styleRecalcDurationMs": 14.176,
      "layouts": 1,
      "layoutDurationMs": 0.2270000000000002,
      "taskDurationMs": 500.1720000000001,
      "heapDeltaBytes": 17537228,
      "domNodes": 68,
      "jsHeapTotalBytes": 9437184,
      "scriptDurationMs": 91.834,
      "eventListeners": 23
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2025.6909999999948,
      "styleRecalcs": 14,
      "styleRecalcDurationMs": 13.652999999999999,
      "layouts": 1,
      "layoutDurationMs": 0.23700000000000002,
      "taskDurationMs": 497.131,
      "heapDeltaBytes": -9163828,
      "domNodes": 68,
      "jsHeapTotalBytes": 8626176,
      "scriptDurationMs": 89.88499999999999,
      "eventListeners": 23
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2031.2829999999735,
      "styleRecalcs": 14,
      "styleRecalcDurationMs": 13.262,
      "layouts": 1,
      "layoutDurationMs": 0.1929999999999998,
      "taskDurationMs": 494.3070000000001,
      "heapDeltaBytes": 17205488,
      "domNodes": 69,
      "jsHeapTotalBytes": 8626176,
      "scriptDurationMs": 89.576,
      "eventListeners": 21
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2095.702999999986,
      "styleRecalcs": 70,
      "styleRecalcDurationMs": 15.991999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1085.134,
      "heapDeltaBytes": 3622568,
      "domNodes": 20,
      "jsHeapTotalBytes": 9498624,
      "scriptDurationMs": 451.89,
      "eventListeners": 6
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2091.980000000035,
      "styleRecalcs": 70,
      "styleRecalcDurationMs": 16.532999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1010.4090000000001,
      "heapDeltaBytes": 1539328,
      "domNodes": 20,
      "jsHeapTotalBytes": 8445952,
      "scriptDurationMs": 390.1329999999999,
      "eventListeners": 6
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2103.11200000001,
      "styleRecalcs": 71,
      "styleRecalcDurationMs": 18.294000000000004,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1017.898,
      "heapDeltaBytes": 3825736,
      "domNodes": 24,
      "jsHeapTotalBytes": 9236480,
      "scriptDurationMs": 386.355,
      "eventListeners": 6
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 565.9089999999765,
      "styleRecalcs": 49,
      "styleRecalcDurationMs": 12.906,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 357.12300000000005,
      "heapDeltaBytes": 12652224,
      "domNodes": 23,
      "jsHeapTotalBytes": 16252928,
      "scriptDurationMs": 120.51799999999999,
      "eventListeners": 8
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 600.4790000000071,
      "styleRecalcs": 48,
      "styleRecalcDurationMs": 11.827,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 354.521,
      "heapDeltaBytes": 6112460,
      "domNodes": 22,
      "jsHeapTotalBytes": 12058624,
      "scriptDurationMs": 121.89500000000001,
      "eventListeners": 8
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 578.4290000000283,
      "styleRecalcs": 49,
      "styleRecalcDurationMs": 14.988,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 368.788,
      "heapDeltaBytes": 12850380,
      "domNodes": 22,
      "jsHeapTotalBytes": 13631488,
      "scriptDurationMs": 123.221,
      "eventListeners": 8
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2002.699000000007,
      "styleRecalcs": 12,
      "styleRecalcDurationMs": 9.846999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 337.30499999999995,
      "heapDeltaBytes": 717244,
      "domNodes": 24,
      "jsHeapTotalBytes": 17825792,
      "scriptDurationMs": 18.211,
      "eventListeners": 6
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2002.4839999999813,
      "styleRecalcs": 12,
      "styleRecalcDurationMs": 11.513999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 365.579,
      "heapDeltaBytes": -25276,
      "domNodes": 24,
      "jsHeapTotalBytes": 19136512,
      "scriptDurationMs": 20.136000000000003,
      "eventListeners": 6
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2021.8899999999849,
      "styleRecalcs": 12,
      "styleRecalcDurationMs": 10.592999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 339.05400000000003,
      "heapDeltaBytes": 344984,
      "domNodes": 24,
      "jsHeapTotalBytes": 18350080,
      "scriptDurationMs": 17.400000000000002,
      "eventListeners": 6
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1708.328999999992,
      "styleRecalcs": 79,
      "styleRecalcDurationMs": 41.367000000000004,
      "layouts": 17,
      "layoutDurationMs": 4.915,
      "taskDurationMs": 689.3720000000001,
      "heapDeltaBytes": -7013676,
      "domNodes": 107,
      "jsHeapTotalBytes": 19398656,
      "scriptDurationMs": 97.93499999999999,
      "eventListeners": 21
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1689.1710000000444,
      "styleRecalcs": 77,
      "styleRecalcDurationMs": 36.982,
      "layouts": 16,
      "layoutDurationMs": 4.2700000000000005,
      "taskDurationMs": 637.381,
      "heapDeltaBytes": -7615956,
      "domNodes": 64,
      "jsHeapTotalBytes": 18612224,
      "scriptDurationMs": 93.329,
      "eventListeners": 4
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1991.4549999999736,
      "styleRecalcs": 86,
      "styleRecalcDurationMs": 48.105999999999995,
      "layouts": 17,
      "layoutDurationMs": 4.428999999999999,
      "taskDurationMs": 895.992,
      "heapDeltaBytes": -6718368,
      "domNodes": 118,
      "jsHeapTotalBytes": 16515072,
      "scriptDurationMs": 96.64299999999999,
      "eventListeners": 23
    }
  ]
}

- Add sparkline(), trendDirection(), trendArrow() to perf-stats.ts
- Add collapsible 'Trend' section to perf-report.ts showing ASCII
  sparklines and directional arrows for each metric over last N
  commits on main
- Add historical data download step to pr-perf-report.yaml from
  perf-data orphan branch
- Switch pr-perf-report.yaml to setup-frontend action and pnpm exec
- Add tests for all new functions (sparkline, trendDirection, trendArrow)
@christian-byrne christian-byrne force-pushed the feat/perf-trend-visualization branch from 4068979 to b2d31dc Compare March 15, 2026 10:32
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
scripts/perf-stats.ts (1)

86-104: Consider the zero-baseline edge case.

When firstMean === 0 but secondMean > 0, the function returns 'stable' to avoid division by zero. This is a safe fallback, but it masks what could be a significant upward trend (e.g., a metric that was previously zero and is now non-zero).

If this scenario is unlikely for the performance metrics being tracked, the current behavior is acceptable. Otherwise, consider treating it as 'rising' when secondMean > 0 and firstMean === 0.

Optional: Handle zero-baseline as rising
-  if (firstMean === 0) return 'stable'
+  if (firstMean === 0) return secondMean > 0 ? 'rising' : 'stable'
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@scripts/perf-stats.ts` around lines 86 - 104, The current trendDirection
function returns 'stable' when firstMean === 0 to avoid division by zero, which
hides cases where secondMean > 0; update trendDirection to explicitly handle the
zero-baseline: if firstMean === 0 and secondMean > 0 return 'rising' (and if
both are 0 keep 'stable'), otherwise compute changePct as before using
((secondMean - firstMean) / firstMean) * 100 to determine
'rising'/'falling'/'stable' while avoiding division by zero; refer to the
function trendDirection and the variables firstMean, secondMean, and changePct
when making the change.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@scripts/perf-stats.ts`:
- Around line 86-104: The current trendDirection function returns 'stable' when
firstMean === 0 to avoid division by zero, which hides cases where secondMean >
0; update trendDirection to explicitly handle the zero-baseline: if firstMean
=== 0 and secondMean > 0 return 'rising' (and if both are 0 keep 'stable'),
otherwise compute changePct as before using ((secondMean - firstMean) /
firstMean) * 100 to determine 'rising'/'falling'/'stable' while avoiding
division by zero; refer to the function trendDirection and the variables
firstMean, secondMean, and changePct when making the change.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: daf48065-805c-4f22-b1c5-8ad9d68733b1

📥 Commits

Reviewing files that changed from the base of the PR and between 4068979 and b2d31dc.

📒 Files selected for processing (4)
  • .github/workflows/pr-perf-report.yaml
  • scripts/perf-report.ts
  • scripts/perf-stats.test.ts
  • scripts/perf-stats.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • scripts/perf-stats.test.ts

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

Labels

size:L This PR changes 100-499 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants