Skip to content

DO NOT SUBMIT - perf: virtualize Vue nodes outside the viewport - #15030

Draft
benjcooley wants to merge 33 commits into
mainfrom
benjcooley/vue-nodes-viewport-culling
Draft

DO NOT SUBMIT - perf: virtualize Vue nodes outside the viewport#15030
benjcooley wants to merge 33 commits into
mainfrom
benjcooley/vue-nodes-viewport-culling

Conversation

@benjcooley

@benjcooley benjcooley commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Summary

Large Nodes 2.0 workflows kept every node mounted in the live DOM. This virtualizes nodes against an expanded viewport while preserving graph/layout state independently of renderer attachment.

Changes

  • Query visible nodes through the canonical layoutStore spatial index; remote and local geometry updates feed the same derived index.
  • Separate visibility decisions from mount admission and departure scheduling. Active interactions stay pinned, mounts are paced, and departures are delayed to avoid edge flicker.
  • Cull links only when endpoint geometry proves they are offscreen. Missing or custom slot geometry falls back to the safe rendering path.
  • Keep renderer slot-readiness coordination out of graph state and count only connectors Vue actually renders.
  • Keep extension compatibility through an explicit per-node culling opt-out.
  • Retain the existing Comfy.VueNodes.ViewportCulling key, but make it choose teardown strategy rather than disable virtualization:
    • Enabled: destroy offscreen node components to minimize retained memory.
    • Disabled (default): detach offscreen DOM while retaining component state with Vue KeepAlive.

There is no public all-nodes-live mode. For graphs below the 150-node threshold, virtualization remains dormant because its overhead is not useful.

Performance

On the 245-node production fixture, viewport virtualization reduced DOM-range pan/zoom interaction time across Chromium, Firefox, and WebKit. Median speedups ranged from 2.3× to 14.3× versus keeping every node live. The same benchmark stayed above #15031's LOD threshold; stacking #15031 introduced no measurable regression.

KeepAlive and destructive unmounting were in the same performance tier. This indicates the main gain comes from removing offscreen trees from active DOM layout/rendering, while the setting provides a legitimate memory-versus-lifecycle tradeoff.

Validation

  • Regression test proves an offscreen KeepAlive node leaves the live DOM and returns as the same element.
  • Focused viewport, spatial-index, slot-sync, link-culling, and interaction suites pass.
  • Production build, typechecks, lint, formatting, knip, full unit CI, and browser CI are required on the final head.

Split from #15016 (part 2 of 3). #15031 adds LOD rendering below its zoom threshold.

@dosubot dosubot Bot added the size:L This PR changes 100-499 lines, ignoring generated files. label Aug 11, 2026
@coderabbitai

coderabbitai Bot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • ✅ Review completed - (🔄 Check again to review again)
📝 Walkthrough

Walkthrough

Added viewport culling for Vue graph nodes with QuadTree indexing, reactive mounting, live-state retention, delayed unmounting, link culling, and a settings bypass. Layout versions now ignore unchanged bounds. Drag cleanup now respects drag ownership.

Changes

Viewport culling

Layer / File(s) Summary
Layout stability and spatial indexing
src/renderer/core/layout/store/layoutStore.ts, src/renderer/core/layout/store/layoutStore.test.ts, src/renderer/core/spatial/nodeCullingIndex.ts, src/renderer/core/spatial/nodeCullingIndex.test.ts
Unchanged node bounds no longer advance layoutVersion. The QuadTree index supports version-based rebuilds, explicit invalidation, unmeasured-node retention, viewport queries, and size reporting.
Reactive viewport mounting
src/renderer/extensions/vueNodes/composables/useViewportCulling.ts, src/renderer/extensions/vueNodes/composables/useViewportCulling.test.ts
Added expanded graph-space bounds, eligibility rules, paced mounting, delayed pruning, refresh triggers, and disposal cleanup.
Live-state and interaction retention
src/renderer/extensions/vueNodes/composables/liveNodeState.ts, src/renderer/extensions/vueNodes/composables/liveNodeState.test.ts, src/renderer/extensions/vueNodes/composables/useNodePointerInteractions.ts, src/renderer/extensions/vueNodes/composables/useNodePointerInteractions.test.ts
Live iframes, active media, link-drag sources, and opted-out node types remain mounted. Drag cleanup clears shared state only for the owning node.
GraphCanvas integration and setting
src/components/graph/GraphCanvas.vue, src/platform/settings/constants/coreSettings.ts, src/schemas/apiSchema.ts
GraphCanvas supplies layout bounds, invalidates the index on membership changes, applies mounted-node culling, clears empty slot synchronization, and supports the Comfy.VueNodes.ViewportCulling setting.
Link visibility culling
src/lib/litegraph/src/measure.ts, src/lib/litegraph/src/LGraphCanvas.ts, src/lib/litegraph/src/linkCulling.test.ts
Link rendering skips links whose endpoint bounds cannot intersect the visible area. Rerouted links and links with computed slot positions retain the existing path.

Estimated code review effort: 4 (Complex) | ~60 minutes

Merge Risk: 🟡 Moderate · up to b3ddd

The change virtualizes Vue graph nodes by mounting only nodes near the viewport, but delayed pruning can still synchronously admit many nodes and defeat the per-refresh mount cap, causing frame-time spikes on large graphs; the culling root also uses a production test-ID lookup. These bounded runtime risks should be fixed or explicitly accepted before merge.

Sequence Diagram(s)

sequenceDiagram
  participant GraphCanvas
  participant useViewportCulling
  participant nodeCullingIndex
  participant VueNodeRenderer
  GraphCanvas->>useViewportCulling: provide node bounds and viewport state
  useViewportCulling->>nodeCullingIndex: query expanded viewport bounds
  nodeCullingIndex-->>useViewportCulling: return intersecting node IDs
  useViewportCulling-->>GraphCanvas: update mounted node IDs
  GraphCanvas->>VueNodeRenderer: render mounted Vue nodes
Loading

Important

Pre-merge checks failed

Please resolve all errors before merging. Addressing warnings is optional.

❌ Failed checks (1 inconclusive)

Check name Status Explanation Resolution
End-To-End Regression Coverage For Fixes ❓ Inconclusive The review context lists changed files and the PR description, but it does not provide the PR title or commit subjects needed to verify the required bug-fix signal. Provide the PR title and commit subjects, then check whether any uses fix-related language.
✅ Passed checks (6 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Website End-To-End Regression Coverage ✅ Passed The changed-file list contains no files under apps/website/src/ or apps/website/public/. This website-specific check is not applicable.
Adr Compliance For Entity/Litegraph Changes ✅ Passed The PR changes src/lib/litegraph for link-visibility culling only; available metadata shows no direct entity mutation, god-object API growth, ECS component methods, or extension-ecosystem changes.
Title check ✅ Passed The title clearly identifies the main change: virtualizing Vue nodes outside the viewport.
Description check ✅ Passed The description covers the summary, core changes, performance impact, validation, and compatibility considerations.
✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Create stacked PR
  • Commit on current branch
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch benjcooley/vue-nodes-viewport-culling

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@github-actions

github-actions Bot commented Aug 11, 2026

Copy link
Copy Markdown

✅ All contributors have signed the CLA. Thank you! This PR is ready to be merged.
Posted by the CLA Assistant Lite bot.

@github-actions

github-actions Bot commented Aug 11, 2026

Copy link
Copy Markdown

🎨 Storybook: ✅ Built — View Storybook

Details

⏰ Completed at: 08/18/2026, 03:37:49 AM UTC

Links

🎭 Playwright: ✅ 1831 passed, 0 failed · 2 flaky

📊 Browser Reports
  • chromium: View Report (✅ 1810 / ❌ 0 / ⚠️ 2 / ⏭️ 5)
  • chromium-2x: View Report (✅ 2 / ❌ 0 / ⚠️ 0 / ⏭️ 0)
  • chromium-0.5x: View Report (✅ 1 / ❌ 0 / ⚠️ 0 / ⏭️ 0)
  • mobile-chrome: View Report (✅ 18 / ❌ 0 / ⚠️ 0 / ⏭️ 0)
  • New-test walkthrough (chromium, recorded video): View Report

📦 Bundle: 8.86 MB gzip 🔴 +7.13 kB

Details

Summary

  • Raw size: 37.4 MB baseline 37.4 MB — 🔴 +27.1 kB
  • Gzip: 8.86 MB baseline 8.85 MB — 🔴 +7.13 kB
  • Brotli: 6.19 MB baseline 6.19 MB — 🔴 +5.23 kB
  • Bundles: 438 current • 438 baseline • 224 added / 224 removed

Category Glance
Graph Workspace 🔴 +17.4 kB (1.39 MB) · Data & Services 🔴 +9.65 kB (3.53 MB) · Vendor & Third-Party 🔴 +19 B (16.8 MB) · Other 🔴 +14 B (14.2 MB) · UI Components 🔴 +2 B (67.1 kB) · Panels & Settings ⚪ 0 B (566 kB) · + 5 more

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

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-CulOoow4.js (removed) 3.71 kB 🟢 -3.71 kB 🟢 -1.86 kB 🟢 -1.62 kB
assets/index-FsILvCWZ.js (new) 3.71 kB 🔴 +3.71 kB 🔴 +1.85 kB 🔴 +1.62 kB

Status: 1 added / 1 removed

Graph Workspace — 1.39 MB (baseline 1.37 MB) • 🔴 +17.4 kB

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-QWPZYiNB.js (new) 1.38 MB 🔴 +1.38 MB 🔴 +302 kB 🔴 +227 kB
assets/GraphView-yjy-S3N7.js (removed) 1.36 MB 🟢 -1.36 MB 🟢 -297 kB 🟢 -223 kB
assets/WidgetCompositor-BysKZhqg.js (removed) 8.17 kB 🟢 -8.17 kB 🟢 -2.76 kB 🟢 -2.46 kB
assets/WidgetCompositor-COvpFvyT.js (new) 8.17 kB 🔴 +8.17 kB 🔴 +2.76 kB 🔴 +2.46 kB

Status: 2 added / 2 removed / 1 unchanged

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

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-BgOz8g9p.js (new) 25 kB 🔴 +25 kB 🔴 +6.24 kB 🔴 +5.52 kB
assets/CloudSurveyView-DV6JNz3s.js (removed) 25 kB 🟢 -25 kB 🟢 -6.24 kB 🟢 -5.52 kB
assets/CloudLayoutView-C6x1XSsv.js (removed) 21.8 kB 🟢 -21.8 kB 🟢 -6.57 kB 🟢 -5.75 kB
assets/CloudLayoutView-J9ZscoAq.js (new) 21.8 kB 🔴 +21.8 kB 🔴 +6.57 kB 🔴 +5.74 kB
assets/OAuthConsentView-B6YA0kwR.js (removed) 15.5 kB 🟢 -15.5 kB 🟢 -4.26 kB 🟢 -3.71 kB
assets/OAuthConsentView-CqXrs6go.js (new) 15.5 kB 🔴 +15.5 kB 🔴 +4.25 kB 🔴 +3.72 kB
assets/UserCheckView-BQ3fpDeO.js (removed) 8.75 kB 🟢 -8.75 kB 🟢 -2.19 kB 🟢 -1.9 kB
assets/UserCheckView-Cowm-EuE.js (new) 8.75 kB 🔴 +8.75 kB 🔴 +2.19 kB 🔴 +1.9 kB
assets/CloudLoginView-DVikaP9U.js (new) 8.74 kB 🔴 +8.74 kB 🔴 +2.56 kB 🔴 +2.27 kB
assets/CloudLoginView-DZFf0QHE.js (removed) 8.74 kB 🟢 -8.74 kB 🟢 -2.55 kB 🟢 -2.26 kB
assets/useCloudAuthPage-BoJtNDAJ.js (removed) 7.08 kB 🟢 -7.08 kB 🟢 -2.51 kB 🟢 -2.2 kB
assets/useCloudAuthPage-CKtTv_X9.js (new) 7.08 kB 🔴 +7.08 kB 🔴 +2.52 kB 🔴 +2.22 kB
assets/CloudSignupView-C_VKtu_b.js (new) 6.96 kB 🔴 +6.96 kB 🔴 +2.28 kB 🔴 +2 kB
assets/CloudSignupView-hGPgDifq.js (removed) 6.96 kB 🟢 -6.96 kB 🟢 -2.27 kB 🟢 -1.99 kB
assets/WidgetTextPreview-cCq9motJ.js (removed) 6.07 kB 🟢 -6.07 kB 🟢 -2.13 kB 🟢 -1.9 kB
assets/WidgetTextPreview-CXymtd3I.js (new) 6.07 kB 🔴 +6.07 kB 🔴 +2.14 kB 🔴 +1.9 kB
assets/CloudSubscriptionRedirectView-BdO9T1M_.js (new) 6.05 kB 🔴 +6.05 kB 🔴 +2.26 kB 🔴 +1.96 kB
assets/CloudSubscriptionRedirectView-BEyJRftp.js (removed) 6.05 kB 🟢 -6.05 kB 🟢 -2.25 kB 🟢 -1.96 kB
assets/UserSelectView-CCyEBeeS.js (new) 5.49 kB 🔴 +5.49 kB 🔴 +1.96 kB 🔴 +1.71 kB
assets/UserSelectView-CdJWqyDr.js (removed) 5.49 kB 🟢 -5.49 kB 🟢 -1.96 kB 🟢 -1.72 kB
assets/CloudForgotPasswordView-B-JixcRn.js (new) 4.97 kB 🔴 +4.97 kB 🔴 +1.73 kB 🔴 +1.49 kB
assets/CloudForgotPasswordView-Bua1O1KK.js (removed) 4.97 kB 🟢 -4.97 kB 🟢 -1.72 kB 🟢 -1.49 kB
assets/CloudAuthTimeoutView-BZYScNOO.js (removed) 4.43 kB 🟢 -4.43 kB 🟢 -1.54 kB 🟢 -1.34 kB
assets/CloudAuthTimeoutView-CjEOBWmT.js (new) 4.43 kB 🔴 +4.43 kB 🔴 +1.54 kB 🔴 +1.33 kB
assets/OAuthLayoutView-Bh7p-Oww.js (new) 1.31 kB 🔴 +1.31 kB 🔴 +701 B 🔴 +586 B
assets/OAuthLayoutView-BPfMdxNK.js (removed) 1.31 kB 🟢 -1.31 kB 🟢 -703 B 🟢 -586 B
assets/CloudSorryContactSupportView-AWlZ_0tP.js (new) 1.14 kB 🔴 +1.14 kB 🔴 +581 B 🔴 +500 B
assets/CloudSorryContactSupportView-kNDO55x3.js (removed) 1.14 kB 🟢 -1.14 kB 🟢 -579 B 🟢 -504 B
assets/layout-4RGb0OFK.js (new) 403 B 🔴 +403 B 🔴 +250 B 🔴 +206 B
assets/layout-CSmyoW6_.js (removed) 403 B 🟢 -403 B 🟢 -252 B 🟢 -207 B
assets/WidgetTextPreview-BuU_qzXE.js (removed) 131 B 🟢 -131 B 🟢 -100 B 🟢 -89 B
assets/WidgetTextPreview-BZPJxzUf.js (new) 131 B 🔴 +131 B 🔴 +100 B 🔴 +89 B

Status: 16 added / 16 removed / 1 unchanged

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

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/KeybindingPanel-BNmT6goE.js (new) 49.4 kB 🔴 +49.4 kB 🔴 +9.95 kB 🔴 +8.8 kB
assets/KeybindingPanel-C2We41Gl.js (removed) 49.4 kB 🟢 -49.4 kB 🟢 -9.95 kB 🟢 -8.8 kB
assets/SecretsPanel-AnnRKVMq.js (new) 33.7 kB 🔴 +33.7 kB 🔴 +7.87 kB 🔴 +6.89 kB
assets/SecretsPanel-CTzsGAHu.js (removed) 33.7 kB 🟢 -33.7 kB 🟢 -7.87 kB 🟢 -6.92 kB
assets/CreditsPanel-BpjJQ7ft.js (removed) 11.5 kB 🟢 -11.5 kB 🟢 -3.21 kB 🟢 -2.81 kB
assets/CreditsPanel-gSnLbOu1.js (new) 11.5 kB 🔴 +11.5 kB 🔴 +3.21 kB 🔴 +2.81 kB
assets/AboutPanel-DIvV9zDL.js (new) 11.2 kB 🔴 +11.2 kB 🔴 +3.03 kB 🔴 +2.72 kB
assets/AboutPanel-DYPKyJWo.js (removed) 11.2 kB 🟢 -11.2 kB 🟢 -3.03 kB 🟢 -2.72 kB
assets/ExtensionPanel-CyNQGxwr.js (new) 9.19 kB 🔴 +9.19 kB 🔴 +2.52 kB 🔴 +2.23 kB
assets/ExtensionPanel-DFYsu_AJ.js (removed) 9.19 kB 🟢 -9.19 kB 🟢 -2.51 kB 🟢 -2.22 kB
assets/ServerConfigPanel-0OEi-ylL.js (removed) 6.09 kB 🟢 -6.09 kB 🟢 -1.94 kB 🟢 -1.72 kB
assets/ServerConfigPanel-DjJgZTGU.js (new) 6.09 kB 🔴 +6.09 kB 🔴 +1.94 kB 🔴 +1.73 kB
assets/UserPanel-BhJTaF0Z.js (new) 5.73 kB 🔴 +5.73 kB 🔴 +1.79 kB 🔴 +1.55 kB
assets/UserPanel-BMXj3L0s.js (removed) 5.73 kB 🟢 -5.73 kB 🟢 -1.78 kB 🟢 -1.54 kB
assets/refreshRemoteConfig-AgtYcSpQ.js (new) 4.24 kB 🔴 +4.24 kB 🔴 +1.51 kB 🔴 +1.34 kB
assets/refreshRemoteConfig-B69WsyfN.js (removed) 4.24 kB 🟢 -4.24 kB 🟢 -1.51 kB 🟢 -1.34 kB
assets/remoteConfig-Cy5Q6Jvt.js (new) 1.51 kB 🔴 +1.51 kB 🔴 +697 B 🔴 +584 B
assets/remoteConfig-DSog39y6.js (removed) 1.51 kB 🟢 -1.51 kB 🟢 -698 B 🟢 -586 B
assets/cloudRemoteConfig-CO0yHpdd.js (removed) 951 B 🟢 -951 B 🟢 -514 B 🟢 -422 B
assets/cloudRemoteConfig-Crw5gxBd.js (new) 951 B 🔴 +951 B 🔴 +513 B 🔴 +433 B
assets/refreshRemoteConfig-DA8lMKo5.js (new) 110 B 🔴 +110 B 🔴 +89 B 🔴 +83 B
assets/refreshRemoteConfig-DBpuA66Z.js (removed) 110 B 🟢 -110 B 🟢 -89 B 🟢 -86 B

Status: 11 added / 11 removed / 15 unchanged

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

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/SignUpForm-BiBB8Fm0.js (new) 13.3 kB 🔴 +13.3 kB 🔴 +4.53 kB 🔴 +3.94 kB
assets/SignUpForm-BksPe5Jb.js (removed) 13.3 kB 🟢 -13.3 kB 🟢 -4.52 kB 🟢 -3.93 kB
assets/PasswordFields-CCEnz_tb.js (new) 4.93 kB 🔴 +4.93 kB 🔴 +1.46 kB 🔴 +1.28 kB
assets/PasswordFields-DxW_fGtd.js (removed) 4.93 kB 🟢 -4.93 kB 🟢 -1.46 kB 🟢 -1.29 kB
assets/auth-BFWox2Nj.js (removed) 3.71 kB 🟢 -3.71 kB 🟢 -1.29 kB 🟢 -1.1 kB
assets/auth-IhuFLq8L.js (new) 3.71 kB 🔴 +3.71 kB 🔴 +1.28 kB 🔴 +1.1 kB
assets/UpdatePasswordContent-KXPZCX0J.js (new) 1.85 kB 🔴 +1.85 kB 🔴 +845 B 🔴 +737 B
assets/UpdatePasswordContent-XFnC32oX.js (removed) 1.85 kB 🟢 -1.85 kB 🟢 -841 B 🟢 -735 B
assets/WorkspaceProfilePic-BBK0nnO5.js (new) 1.6 kB 🔴 +1.6 kB 🔴 +830 B 🔴 +719 B
assets/WorkspaceProfilePic-fQ5PxnHG.js (removed) 1.6 kB 🟢 -1.6 kB 🟢 -829 B 🟢 -721 B
assets/authStore-Cr3i7ftF.js (removed) 128 B 🟢 -128 B 🟢 -104 B 🟢 -105 B
assets/authStore-DQvou-0n.js (new) 128 B 🔴 +128 B 🔴 +104 B 🔴 +104 B
assets/workspaceAuthStore-BoSriHOd.js (new) 108 B 🔴 +108 B 🔴 +99 B 🔴 +104 B
assets/workspaceAuthStore-CwumQcF3.js (removed) 108 B 🟢 -108 B 🟢 -99 B 🟢 -106 B
assets/auth-9extWcD2.js (removed) 105 B 🟢 -105 B 🟢 -96 B 🟢 -87 B
assets/auth-DYpqWYry.js (new) 105 B 🔴 +105 B 🔴 +96 B 🔴 +92 B

Status: 8 added / 8 removed / 3 unchanged

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

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/ComfyHubPublishDialog-C2ESeQmG.js (removed) 90.1 kB 🟢 -90.1 kB 🟢 -19.3 kB 🟢 -16.5 kB
assets/ComfyHubPublishDialog-DCBLetGB.js (new) 90.1 kB 🔴 +90.1 kB 🔴 +19.3 kB 🔴 +16.4 kB
assets/useShareDialog-D9n2Ap6i.js (removed) 23.9 kB 🟢 -23.9 kB 🟢 -5.69 kB 🟢 -5.04 kB
assets/useShareDialog-ymp_GjtI.js (new) 23.9 kB 🔴 +23.9 kB 🔴 +5.69 kB 🔴 +5.04 kB
assets/feedbackDialog-CWtPFy2K.js (removed) 4.45 kB 🟢 -4.45 kB 🟢 -1.87 kB 🟢 -1.59 kB
assets/feedbackDialog-uohaPbtY.js (new) 4.45 kB 🔴 +4.45 kB 🔴 +1.87 kB 🔴 +1.59 kB
assets/useRangeEditor-DlTDFSbX.js (new) 3.29 kB 🔴 +3.29 kB 🔴 +1.14 kB 🔴 +1.04 kB
assets/useRangeEditor-PXjE4V2p.js (removed) 3.29 kB 🟢 -3.29 kB 🟢 -1.14 kB 🟢 -1.03 kB
assets/SubscriptionInactiveMemberDialog-3T36lwRq.js (removed) 2.48 kB 🟢 -2.48 kB 🟢 -998 B 🟢 -851 B
assets/SubscriptionInactiveMemberDialog-CR4dTv8F.js (new) 2.48 kB 🔴 +2.48 kB 🔴 +999 B 🔴 +851 B
assets/useLayerEditor-B1KqVU_J.js (removed) 1.01 kB 🟢 -1.01 kB 🟢 -490 B 🟢 -408 B
assets/useLayerEditor-DuDK9qWa.js (new) 1.01 kB 🔴 +1.01 kB 🔴 +491 B 🔴 +402 B
assets/ComfyHubPublishDialog-Bdqict40.js (removed) 143 B 🟢 -143 B 🟢 -105 B 🟢 -89 B
assets/ComfyHubPublishDialog-D3aP1Dny.js (new) 143 B 🔴 +143 B 🔴 +105 B 🔴 +91 B
assets/useSubscriptionDialog-Dv5knZuB.js (new) 108 B 🔴 +108 B 🔴 +102 B 🔴 +89 B
assets/useSubscriptionDialog-JHhkfGzR.js (removed) 108 B 🟢 -108 B 🟢 -102 B 🟢 -91 B

Status: 8 added / 8 removed

UI Components — 67.1 kB (baseline 67.1 kB) • 🔴 +2 B

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/ComfyQueueButton-C3QCbhiO.js (removed) 14.6 kB 🟢 -14.6 kB 🟢 -3.97 kB 🟢 -3.53 kB
assets/ComfyQueueButton-CWgRuvz-.js (new) 14.6 kB 🔴 +14.6 kB 🔴 +3.97 kB 🔴 +3.53 kB
assets/useTerminalTabs-BHB8Yuzi.js (removed) 11.8 kB 🟢 -11.8 kB 🟢 -3.69 kB 🟢 -3.27 kB
assets/useTerminalTabs-HeWRCtMr.js (new) 11.8 kB 🔴 +11.8 kB 🔴 +3.69 kB 🔴 +3.28 kB
assets/InviteMembersForm-8N_oFt3o.js (new) 8.23 kB 🔴 +8.23 kB 🔴 +2.74 kB 🔴 +2.44 kB
assets/InviteMembersForm-BfMgZExI.js (removed) 8.23 kB 🟢 -8.23 kB 🟢 -2.74 kB 🟢 -2.43 kB
assets/TopbarBadge-BPBhJCay.js (new) 7.65 kB 🔴 +7.65 kB 🔴 +1.84 kB 🔴 +1.62 kB
assets/TopbarBadge-Dq577MyX.js (removed) 7.65 kB 🟢 -7.65 kB 🟢 -1.83 kB 🟢 -1.62 kB
assets/ScrubableNumberInput-qLws4HlF.js (new) 6.49 kB 🔴 +6.49 kB 🔴 +2.17 kB 🔴 +1.92 kB
assets/ScrubableNumberInput-D4JgRtH8.js (removed) 6.49 kB 🟢 -6.49 kB 🟢 -2.17 kB 🟢 -1.92 kB
assets/WidgetInputNumberInput-CrLta6cY.js (removed) 5.83 kB 🟢 -5.83 kB 🟢 -2.07 kB 🟢 -1.85 kB
assets/WidgetInputNumberInput-D006jLCm.js (new) 5.83 kB 🔴 +5.83 kB 🔴 +2.08 kB 🔴 +1.85 kB
assets/Button-D8rCMK2y.js (removed) 4.64 kB 🟢 -4.64 kB 🟢 -1.62 kB 🟢 -1.42 kB
assets/Button-KEKvm1o2.js (new) 4.64 kB 🔴 +4.64 kB 🔴 +1.62 kB 🔴 +1.43 kB
assets/SubscribeButton-DYJvGiQc.js (new) 2.15 kB 🔴 +2.15 kB 🔴 +970 B 🔴 +846 B
assets/SubscribeButton-onqaUcR3.js (removed) 2.15 kB 🟢 -2.15 kB 🟢 -968 B 🟢 -848 B
assets/WidgetButton-CSYAqa39.js (new) 1.93 kB 🔴 +1.93 kB 🔴 +888 B 🔴 +782 B
assets/WidgetButton-10hAQpix.js (removed) 1.93 kB 🟢 -1.93 kB 🟢 -887 B 🟢 -774 B
assets/Input-Dry_O4bD.js (removed) 1.76 kB 🟢 -1.76 kB 🟢 -872 B 🟢 -765 B
assets/Input-qJ7zmOId.js (new) 1.76 kB 🔴 +1.76 kB 🔴 +874 B 🔴 +756 B
assets/UserAvatar-Be3pfDFa.js (removed) 1.24 kB 🟢 -1.24 kB 🟢 -641 B 🟢 -554 B
assets/UserAvatar-I-reJHdR.js (new) 1.24 kB 🔴 +1.24 kB 🔴 +639 B 🔴 +547 B
assets/cloudFeedbackTopbarButton-CBEGa-fO.js (removed) 705 B 🟢 -705 B 🟢 -421 B 🟢 -360 B
assets/cloudFeedbackTopbarButton-ZQHXOF67.js (new) 705 B 🔴 +705 B 🔴 +421 B 🔴 +357 B
assets/ComfyQueueButton-Ccq-OggU.js (new) 128 B 🔴 +128 B 🔴 +99 B 🔴 +92 B
assets/ComfyQueueButton-CjRhjC2t.js (removed) 128 B 🟢 -128 B 🟢 -99 B 🟢 -89 B
assets/toggle-group-D308ZI_Y.js (new) 40 B 🔴 +40 B 🔴 +60 B 🔴 +44 B
assets/toggle-group-DVXGGL47.js (removed) 40 B 🟢 -40 B 🟢 -60 B 🟢 -44 B

Status: 14 added / 14 removed

Data & Services — 3.53 MB (baseline 3.52 MB) • 🔴 +9.65 kB

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/settingStore-BqEMMDKB.js (new) 3.17 MB 🔴 +3.17 MB 🔴 +743 kB 🔴 +558 kB
assets/settingStore-pOoTnsC_.js (removed) 3.16 MB 🟢 -3.16 MB 🟢 -740 kB 🟢 -556 kB
assets/api-CrxSAnMi.js (new) 186 kB 🔴 +186 kB 🔴 +39.8 kB 🔴 +33.3 kB
assets/api-Q7hmgNwS.js (removed) 186 kB 🟢 -186 kB 🟢 -39.8 kB 🟢 -33.4 kB
assets/load3dService-Dk0NF4JA.js (new) 132 kB 🔴 +132 kB 🔴 +29.3 kB 🔴 +24.7 kB
assets/load3dService-YIAhSnQ8.js (removed) 132 kB 🟢 -132 kB 🟢 -29.3 kB 🟢 -24.6 kB
assets/workflowShareService-D98EqpV0.js (new) 16.5 kB 🔴 +16.5 kB 🔴 +4.91 kB 🔴 +4.34 kB
assets/workflowShareService-vveOvl3f.js (removed) 16.5 kB 🟢 -16.5 kB 🟢 -4.91 kB 🟢 -4.34 kB
assets/keybindingService-Atvpr2se.js (removed) 6.89 kB 🟢 -6.89 kB 🟢 -1.73 kB 🟢 -1.49 kB
assets/keybindingService-B8V_-Ins.js (new) 6.89 kB 🔴 +6.89 kB 🔴 +1.73 kB 🔴 +1.5 kB
assets/releaseStore-2jdUkoYI.js (new) 6.72 kB 🔴 +6.72 kB 🔴 +2.03 kB 🔴 +1.77 kB
assets/releaseStore-WgPZk0Or.js (removed) 6.72 kB 🟢 -6.72 kB 🟢 -2.03 kB 🟢 -1.77 kB
assets/dialogStore-DOIs49Q4.js (new) 5.35 kB 🔴 +5.35 kB 🔴 +1.64 kB 🔴 +1.41 kB
assets/dialogStore-mTb5976f.js (removed) 5.35 kB 🟢 -5.35 kB 🟢 -1.64 kB 🟢 -1.43 kB
assets/systemStatsStore-C_uJ-ido.js (new) 4.93 kB 🔴 +4.93 kB 🔴 +1.74 kB 🔴 +1.48 kB
assets/systemStatsStore-rJqqaVpT.js (removed) 4.93 kB 🟢 -4.93 kB 🟢 -1.74 kB 🟢 -1.47 kB
assets/userStore-BF4AN4cs.js (new) 2.38 kB 🔴 +2.38 kB 🔴 +897 B 🔴 +794 B
assets/userStore-DAib1BT8.js (removed) 2.38 kB 🟢 -2.38 kB 🟢 -898 B 🟢 -796 B
assets/serverConfigStore-B_zwQQFs.js (removed) 2.3 kB 🟢 -2.3 kB 🟢 -775 B 🟢 -687 B
assets/serverConfigStore-CyZU9671.js (new) 2.3 kB 🔴 +2.3 kB 🔴 +777 B 🔴 +681 B
assets/audioService-Cr3NxMTt.js (new) 1.71 kB 🔴 +1.71 kB 🔴 +829 B 🔴 +729 B
assets/audioService-DRQy9s0b.js (removed) 1.71 kB 🟢 -1.71 kB 🟢 -830 B 🟢 -732 B
assets/toastStore-5tbj_XwE.js (new) 841 B 🔴 +841 B 🔴 +396 B 🔴 +344 B
assets/toastStore-B_waOwkM.js (removed) 841 B 🟢 -841 B 🟢 -395 B 🟢 -343 B
assets/dialogService-CgZWQ87n.js (removed) 98 B 🟢 -98 B 🟢 -97 B 🟢 -80 B
assets/dialogService-CmOCkq96.js (new) 98 B 🔴 +98 B 🔴 +97 B 🔴 +83 B
assets/releaseStore-DSCALmrN.js (new) 95 B 🔴 +95 B 🔴 +86 B 🔴 +87 B
assets/releaseStore-DUzZYYLF.js (removed) 95 B 🟢 -95 B 🟢 -86 B 🟢 -90 B
assets/settingStore-B1h_YNF8.js (new) 95 B 🔴 +95 B 🔴 +86 B 🔴 +79 B
assets/settingStore-D6KtmHNj.js (removed) 95 B 🟢 -95 B 🟢 -86 B 🟢 -81 B
assets/assetsStore-B_a4n7XI.js (removed) 94 B 🟢 -94 B 🟢 -92 B 🟢 -82 B
assets/assetsStore-C3sy1YFB.js (new) 94 B 🔴 +94 B 🔴 +92 B 🔴 +83 B
assets/api-B1y_2QX0.js (removed) 62 B 🟢 -62 B 🟢 -74 B 🟢 -66 B
assets/api-BBuZkTng.js (new) 62 B 🔴 +62 B 🔴 +74 B 🔴 +66 B

Status: 17 added / 17 removed

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

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useConflictDetection-BsmAK5LD.js (new) 236 kB 🔴 +236 kB 🔴 +53 kB 🔴 +43.1 kB
assets/useConflictDetection-CgPSJaz5.js (removed) 236 kB 🟢 -236 kB 🟢 -53 kB 🟢 -43.2 kB
assets/useLayerEditorSession-B-oDMmcF.js (new) 158 kB 🔴 +158 kB 🔴 +40.8 kB 🔴 +34.3 kB
assets/useLayerEditorSession-C9LesQWz.js (removed) 158 kB 🟢 -158 kB 🟢 -40.8 kB 🟢 -34.3 kB
assets/useLoad3d-7w8sUtTd.js (removed) 25.8 kB 🟢 -25.8 kB 🟢 -5.8 kB 🟢 -5.13 kB
assets/useLoad3d-DDEDLpp5.js (new) 25.8 kB 🔴 +25.8 kB 🔴 +5.8 kB 🔴 +5.15 kB
assets/useLoad3dViewer-BbRoaN4s.js (removed) 21.2 kB 🟢 -21.2 kB 🟢 -4.98 kB 🟢 -4.36 kB
assets/useLoad3dViewer-CUcdXPkm.js (new) 21.2 kB 🔴 +21.2 kB 🔴 +4.99 kB 🔴 +4.36 kB
assets/useImageQuiet-Cm_jUHJ-.js (removed) 19.1 kB 🟢 -19.1 kB 🟢 -6.12 kB 🟢 -5.27 kB
assets/useImageQuiet-CQthfIrn.js (new) 19.1 kB 🔴 +19.1 kB 🔴 +6.12 kB 🔴 +5.27 kB
assets/useImageCrop-DcbqPEEC.js (new) 14.9 kB 🔴 +14.9 kB 🔴 +3.42 kB 🔴 +2.98 kB
assets/useImageCrop-DKFGwUjp.js (removed) 14.9 kB 🟢 -14.9 kB 🟢 -3.42 kB 🟢 -2.98 kB
assets/useDowngradeToPersonal-CCYmVYUe.js (removed) 10.9 kB 🟢 -10.9 kB 🟢 -2.73 kB 🟢 -2.35 kB
assets/useDowngradeToPersonal-CYADr8yv.js (new) 10.9 kB 🔴 +10.9 kB 🔴 +2.74 kB 🔴 +2.35 kB
assets/useFeatureFlags-CKtPaW9V.js (removed) 7.32 kB 🟢 -7.32 kB 🟢 -2.06 kB 🟢 -1.76 kB
assets/useFeatureFlags-CYV6opLO.js (new) 7.32 kB 🔴 +7.32 kB 🔴 +2.06 kB 🔴 +1.74 kB
assets/useTransformState-DE2_JM9c.js (new) 3.54 kB 🔴 +3.54 kB 🔴 +1.55 kB 🔴 +1.29 kB
assets/useTransformState-kcVecowX.js (removed) 3.54 kB 🟢 -3.54 kB 🟢 -1.55 kB 🟢 -1.29 kB
assets/useCompositorLayers-Bp0vOMTr.js (new) 2.94 kB 🔴 +2.94 kB 🔴 +900 B 🔴 +807 B
assets/useCompositorLayers-DgMx1ViI.js (removed) 2.94 kB 🟢 -2.94 kB 🟢 -896 B 🟢 -804 B
assets/useSurveyEligibility-g1bxnz-H.js (removed) 2.89 kB 🟢 -2.89 kB 🟢 -1.11 kB 🟢 -919 B
assets/useSurveyEligibility-wsz0-OoC.js (new) 2.89 kB 🔴 +2.89 kB 🔴 +1.1 kB 🔴 +920 B
assets/useExternalLink-CWTXb2Ka.js (removed) 2.85 kB 🟢 -2.85 kB 🟢 -1.07 kB 🟢 -923 B
assets/useExternalLink-FoCnlalC.js (new) 2.85 kB 🔴 +2.85 kB 🔴 +1.07 kB 🔴 +925 B
assets/assetPreviewUtil-CdD8Wihl.js (removed) 2.35 kB 🟢 -2.35 kB 🟢 -966 B 🟢 -850 B
assets/assetPreviewUtil-DgDcUWVK.js (new) 2.35 kB 🔴 +2.35 kB 🔴 +965 B 🔴 +846 B
assets/useFeatureUsageTracker-CnawJUXx.js (new) 2.07 kB 🔴 +2.07 kB 🔴 +909 B 🔴 +772 B
assets/useFeatureUsageTracker-DOEWwNcv.js (removed) 2.07 kB 🟢 -2.07 kB 🟢 -911 B 🟢 -772 B
assets/downloadUtil-D1cXCR3Y.js (removed) 2.04 kB 🟢 -2.04 kB 🟢 -907 B 🟢 -727 B
assets/downloadUtil-DCyHPmB_.js (new) 2.04 kB 🔴 +2.04 kB 🔴 +907 B 🔴 +725 B
assets/useTypeformEmbed-BQn30AVB.js (new) 2.02 kB 🔴 +2.02 kB 🔴 +1.03 kB 🔴 +850 B
assets/useTypeformEmbed-DgS6lnhj.js (removed) 2.02 kB 🟢 -2.02 kB 🟢 -1.03 kB 🟢 -853 B
assets/useUpstreamValue-Cc7ExZTS.js (removed) 1.99 kB 🟢 -1.99 kB 🟢 -757 B 🟢 -684 B
assets/useUpstreamValue-CS1o2-CP.js (new) 1.99 kB 🔴 +1.99 kB 🔴 +761 B 🔴 +677 B
assets/useWorkspaceTierLabel-DIvh95vh.js (new) 1.93 kB 🔴 +1.93 kB 🔴 +816 B 🔴 +699 B
assets/useWorkspaceTierLabel-kM08FwJD.js (removed) 1.93 kB 🟢 -1.93 kB 🟢 -812 B 🟢 -697 B
assets/useErrorHandling-D6EsddVw.js (removed) 1.49 kB 🟢 -1.49 kB 🟢 -614 B 🟢 -533 B
assets/useErrorHandling-W_mO5D8w.js (new) 1.49 kB 🔴 +1.49 kB 🔴 +614 B 🔴 +521 B
assets/useModalLiftedZIndex-cRwoPvNn.js (removed) 908 B 🟢 -908 B 🟢 -553 B 🟢 -511 B
assets/useModalLiftedZIndex-ex3zq2ac.js (new) 908 B 🔴 +908 B 🔴 +554 B 🔴 +466 B
assets/subscriptionCheckoutUtil-BlQcqfhZ.js (new) 877 B 🔴 +877 B 🔴 +524 B 🔴 +431 B
assets/subscriptionCheckoutUtil-OQjelesV.js (removed) 877 B 🟢 -877 B 🟢 -520 B 🟢 -434 B
assets/useTextFileContent--AalX4CF.js (new) 841 B 🔴 +841 B 🔴 +426 B 🔴 +388 B
assets/useTextFileContent-Bm-ixZo5.js (removed) 841 B 🟢 -841 B 🟢 -427 B 🟢 -376 B
assets/useSessionCookie-BhqVBDQR.js (new) 652 B 🔴 +652 B 🔴 +336 B 🔴 +293 B
assets/useSessionCookie-Z5c5yNwS.js (removed) 652 B 🟢 -652 B 🟢 -334 B 🟢 -292 B
assets/useLoad3d-BAvoO6y_.js (removed) 311 B 🟢 -311 B 🟢 -163 B 🟢 -147 B
assets/useLoad3d-BKLPEUvA.js (new) 311 B 🔴 +311 B 🔴 +162 B 🔴 +147 B
assets/useSessionCookie-BAqaRXaA.js (new) 101 B 🔴 +101 B 🔴 +86 B 🔴 +83 B
assets/useSessionCookie-DxOCa_wG.js (removed) 101 B 🟢 -101 B 🟢 -86 B 🟢 -84 B
assets/useFeatureFlags-BmeXChD6.js (removed) 98 B 🟢 -98 B 🟢 -85 B 🟢 -83 B
assets/useFeatureFlags-BoBBVY5E.js (new) 98 B 🔴 +98 B 🔴 +85 B 🔴 +84 B
assets/useLoad3dViewer-CPGevo_S.js (removed) 98 B 🟢 -98 B 🟢 -85 B 🟢 -90 B
assets/useLoad3dViewer-DXcRO3ko.js (new) 98 B 🔴 +98 B 🔴 +85 B 🔴 +85 B
assets/useCurrentUser-BADz2wCo.js (new) 94 B 🔴 +94 B 🔴 +95 B 🔴 +82 B
assets/useCurrentUser-CfmBL7_n.js (removed) 94 B 🟢 -94 B 🟢 -95 B 🟢 -80 B

Status: 28 added / 28 removed / 10 unchanged

Vendor & Third-Party — 16.8 MB (baseline 16.8 MB) • 🔴 +19 B

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-other-CqYbkn0N.js (new) 2.23 MB 🔴 +2.23 MB 🔴 +483 kB 🔴 +380 kB
assets/vendor-other-DM6QvB0c.js (removed) 2.23 MB 🟢 -2.23 MB 🟢 -483 kB 🟢 -380 kB
assets/vendor-primevue-s3ebRa5k.js (new) 1.69 MB 🔴 +1.69 MB 🔴 +306 kB 🔴 +184 kB
assets/vendor-primevue-CTrQSWXs.js (removed) 1.69 MB 🟢 -1.69 MB 🟢 -306 kB 🟢 -184 kB
assets/vendor-reka-ui-D1THVeO9.js (new) 563 kB 🔴 +563 kB 🔴 +102 kB 🔴 +77.3 kB
assets/vendor-reka-ui-D1e1IYG7.js (removed) 563 kB 🟢 -563 kB 🟢 -102 kB 🟢 -77.3 kB
assets/vendor-vue-core-iYLTU33A.js (new) 349 kB 🔴 +349 kB 🔴 +87.4 kB 🔴 +73.6 kB
assets/vendor-vue-core-yudC0Byk.js (removed) 349 kB 🟢 -349 kB 🟢 -87.4 kB 🟢 -73.6 kB
assets/vendor-vueuse-BAJp6gzS.js (removed) 150 kB 🟢 -150 kB 🟢 -37.7 kB 🟢 -32.3 kB
assets/vendor-vueuse-Dtf6ruqI.js (new) 150 kB 🔴 +150 kB 🔴 +37.7 kB 🔴 +32.3 kB
assets/vendor-i18n-Bf0wYjQy.js (new) 128 kB 🔴 +128 kB 🔴 +29 kB 🔴 +24.8 kB
assets/vendor-i18n-BNoYHpCR.js (removed) 128 kB 🟢 -128 kB 🟢 -29 kB 🟢 -24.8 kB

Status: 6 added / 6 removed / 12 unchanged

Other — 14.2 MB (baseline 14.2 MB) • 🔴 +14 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/core-BpmHRFQn.js (removed) 115 kB 🟢 -115 kB 🟢 -29.7 kB 🟢 -25.1 kB
assets/core-CPfforRZ.js (new) 115 kB 🔴 +115 kB 🔴 +29.7 kB 🔴 +25.1 kB
assets/WidgetSelect-Crvhx2_L.js (new) 88.8 kB 🔴 +88.8 kB 🔴 +20.1 kB 🔴 +17.2 kB
assets/WidgetSelect-BLEGI2Fa.js (removed) 88.8 kB 🟢 -88.8 kB 🟢 -20.1 kB 🟢 -17.2 kB
assets/SubscriptionPanelContentWorkspace-5KD7P-04.js (new) 81.3 kB 🔴 +81.3 kB 🔴 +16.1 kB 🔴 +13.9 kB
assets/SubscriptionPanelContentWorkspace-CFxJM6xk.js (removed) 81.3 kB 🟢 -81.3 kB 🟢 -16.1 kB 🟢 -13.9 kB
assets/Load3D-Duodhcd4.js (new) 73.3 kB 🔴 +73.3 kB 🔴 +12.1 kB 🔴 +10.3 kB
assets/Load3D-H-SEnN6r.js (removed) 73.3 kB 🟢 -73.3 kB 🟢 -12.1 kB 🟢 -10.3 kB
assets/WidgetVideoEdit-CHQtDPqo.js (removed) 67.5 kB 🟢 -67.5 kB 🟢 -15.7 kB 🟢 -13.9 kB
assets/WidgetVideoEdit-D_7H2udI.js (new) 67.5 kB 🔴 +67.5 kB 🔴 +15.7 kB 🔴 +13.9 kB
assets/SubscriptionTransitionPreviewWorkspace-B3Diks6y.js (removed) 66.6 kB 🟢 -66.6 kB 🟢 -13.4 kB 🟢 -11.7 kB
assets/SubscriptionTransitionPreviewWorkspace-CLtdAHSn.js (new) 66.6 kB 🔴 +66.6 kB 🔴 +13.4 kB 🔴 +11.7 kB
assets/WorkspaceSettingsPanelContent-x86_yA_R.js (new) 58.2 kB 🔴 +58.2 kB 🔴 +12.4 kB 🔴 +10.8 kB
assets/WorkspaceSettingsPanelContent-BmKeK-QU.js (removed) 58.2 kB 🟢 -58.2 kB 🟢 -12.4 kB 🟢 -10.8 kB
assets/Preview3d-C6EEITQO.js (new) 50.9 kB 🔴 +50.9 kB 🔴 +8.32 kB 🔴 +7.26 kB
assets/Preview3d-C6gpx9H6.js (removed) 50.9 kB 🟢 -50.9 kB 🟢 -8.32 kB 🟢 -7.25 kB
assets/main-YB0NfYe3.js (new) 45.3 kB 🔴 +45.3 kB 🔴 +13.2 kB 🔴 +11.4 kB
assets/main-BziIBOzh.js (removed) 45.3 kB 🟢 -45.3 kB 🟢 -13.2 kB 🟢 -11.4 kB
assets/SubscriptionRequiredDialogContentUnified-Bnf6GpNF.js (new) 42.7 kB 🔴 +42.7 kB 🔴 +9.39 kB 🔴 +8.18 kB
assets/SubscriptionRequiredDialogContentUnified-DWleEkj_.js (removed) 42.7 kB 🟢 -42.7 kB 🟢 -9.39 kB 🟢 -8.18 kB
assets/LayerEditorContent-K0p9aJw-.js (new) 42.5 kB 🔴 +42.5 kB 🔴 +9.62 kB 🔴 +8.45 kB
assets/LayerEditorContent-Uknyid_k.js (removed) 42.5 kB 🟢 -42.5 kB 🟢 -9.62 kB 🟢 -8.44 kB
assets/WidgetBoundingBoxes-4vz_0AGp.js (new) 33.7 kB 🔴 +33.7 kB 🔴 +9.16 kB 🔴 +8.12 kB
assets/WidgetBoundingBoxes-4X0k0_Kf.js (removed) 33.7 kB 🟢 -33.7 kB 🟢 -9.16 kB 🟢 -8.13 kB
assets/WidgetPainter-C771O19D.js (new) 32.6 kB 🔴 +32.6 kB 🔴 +7.88 kB 🔴 +6.98 kB
assets/WidgetPainter-Fg0Li7ER.js (removed) 32.6 kB 🟢 -32.6 kB 🟢 -7.87 kB 🟢 -6.97 kB
assets/Load3dViewerContent-BMkJRiV5.js (new) 30.8 kB 🔴 +30.8 kB 🔴 +6.29 kB 🔴 +5.46 kB
assets/Load3dViewerContent-D4BrNE7t.js (removed) 30.8 kB 🟢 -30.8 kB 🟢 -6.28 kB 🟢 -5.45 kB
assets/HdrViewerContent-C-iCVYft.js (removed) 29.8 kB 🟢 -29.8 kB 🟢 -8.25 kB 🟢 -7.28 kB
assets/HdrViewerContent-DQFTJpKW.js (new) 29.8 kB 🔴 +29.8 kB 🔴 +8.25 kB 🔴 +7.27 kB
assets/ColorPicker-CIqDS52P.js (new) 29.2 kB 🔴 +29.2 kB 🔴 +7.59 kB 🔴 +6.68 kB
assets/ColorPicker-DVuyaO-B.js (removed) 29.2 kB 🟢 -29.2 kB 🟢 -7.58 kB 🟢 -6.67 kB
assets/SubscriptionRequiredDialogContent-BFg6HUZM.js (new) 26.9 kB 🔴 +26.9 kB 🔴 +6.36 kB 🔴 +5.59 kB
assets/SubscriptionRequiredDialogContent-C96NF7w2.js (removed) 26.9 kB 🟢 -26.9 kB 🟢 -6.35 kB 🟢 -5.59 kB
assets/SubscriptionRequiredDialogContentWorkspace-BbPzqZ0d.js (new) 25.1 kB 🔴 +25.1 kB 🔴 +5.81 kB 🔴 +5.12 kB
assets/SubscriptionRequiredDialogContentWorkspace-Wl9Awzk6.js (removed) 25.1 kB 🟢 -25.1 kB 🟢 -5.81 kB 🟢 -5.11 kB
assets/CreditsTile-DmXSKHU2.js (removed) 24.9 kB 🟢 -24.9 kB 🟢 -6.65 kB 🟢 -5.83 kB
assets/CreditsTile-Dt4LlrQx.js (new) 24.9 kB 🔴 +24.9 kB 🔴 +6.65 kB 🔴 +5.83 kB
assets/initHostTelemetry-Cq5DYaeU.js (removed) 24.5 kB 🟢 -24.5 kB 🟢 -5.82 kB 🟢 -4.82 kB
assets/initHostTelemetry-CzsyzEH6.js (new) 24.5 kB 🔴 +24.5 kB 🔴 +5.81 kB 🔴 +4.82 kB
assets/load3d-aiDQUCuY.js (removed) 22.2 kB 🟢 -22.2 kB 🟢 -5.4 kB 🟢 -4.68 kB
assets/load3d-BQvGacYp.js (new) 22.2 kB 🔴 +22.2 kB 🔴 +5.4 kB 🔴 +4.68 kB
assets/CurrentUserPopoverWorkspace-CcyUGqSd.js (removed) 21.8 kB 🟢 -21.8 kB 🟢 -4.94 kB 🟢 -4.4 kB
assets/CurrentUserPopoverWorkspace-PC2nN4VO.js (new) 21.8 kB 🔴 +21.8 kB 🔴 +4.94 kB 🔴 +4.4 kB
assets/SignInContent-60Xx6PwB.js (removed) 20.6 kB 🟢 -20.6 kB 🟢 -5.18 kB 🟢 -4.53 kB
assets/SignInContent-BPK6EFmj.js (new) 20.6 kB 🔴 +20.6 kB 🔴 +5.18 kB 🔴 +4.53 kB
assets/DialogHeader-DWS3NBW0.js (new) 17.5 kB 🔴 +17.5 kB 🔴 +5.28 kB 🔴 +4.61 kB
assets/DialogHeader-Dk6Kmvng.js (removed) 17.5 kB 🟢 -17.5 kB 🟢 -5.28 kB 🟢 -4.61 kB
assets/WidgetRecordAudio-BrQse1dE.js (removed) 16.6 kB 🟢 -16.6 kB 🟢 -4.6 kB 🟢 -4.1 kB
assets/WidgetRecordAudio-DYOyExNp.js (new) 16.6 kB 🔴 +16.6 kB 🔴 +4.6 kB 🔴 +4.1 kB
assets/i18n-BhIxDOrv.js (new) 15.9 kB 🔴 +15.9 kB 🔴 +4.3 kB 🔴 +3.61 kB
assets/i18n-CTWJmgSG.js (removed) 15.9 kB 🟢 -15.9 kB 🟢 -4.3 kB 🟢 -3.61 kB
assets/WidgetInputNumber-BSodpPWi.js (new) 13.9 kB 🔴 +13.9 kB 🔴 +3.63 kB 🔴 +3.21 kB
assets/WidgetInputNumber-CHalCwY7.js (removed) 13.9 kB 🟢 -13.9 kB 🟢 -3.63 kB 🟢 -3.21 kB
assets/WidgetRange-BinMloQF.js (new) 13.7 kB 🔴 +13.7 kB 🔴 +3.55 kB 🔴 +3.13 kB
assets/WidgetRange-DqcoS7vO.js (removed) 13.7 kB 🟢 -13.7 kB 🟢 -3.55 kB 🟢 -3.13 kB
assets/WaveAudioPlayer-RXMpenFT.js (removed) 12.8 kB 🟢 -12.8 kB 🟢 -3.46 kB 🟢 -3.05 kB
assets/WaveAudioPlayer-SaFwm3Cb.js (new) 12.8 kB 🔴 +12.8 kB 🔴 +3.47 kB 🔴 +3.04 kB
assets/WidgetCurve-D69iI3d_.js (removed) 11.2 kB 🟢 -11.2 kB 🟢 -3.47 kB 🟢 -3.15 kB
assets/WidgetCurve-X2Vp5O-2.js (new) 11.2 kB 🔴 +11.2 kB 🔴 +3.48 kB 🔴 +3.15 kB
assets/AudioPreviewPlayer-BzpWJbe9.js (new) 10.6 kB 🔴 +10.6 kB 🔴 +3.05 kB 🔴 +2.72 kB
assets/AudioPreviewPlayer-CatEWm9H.js (removed) 10.6 kB 🟢 -10.6 kB 🟢 -3.05 kB 🟢 -2.74 kB
assets/TeamWorkspacesDialogContent-BbwVMs7J.js (removed) 10.3 kB 🟢 -10.3 kB 🟢 -2.97 kB 🟢 -2.63 kB
assets/TeamWorkspacesDialogContent-By3ckfBd.js (new) 10.3 kB 🔴 +10.3 kB 🔴 +2.97 kB 🔴 +2.63 kB
assets/SelectValue-DRCcT5sC.js (new) 10.2 kB 🔴 +10.2 kB 🔴 +2.48 kB 🔴 +2.19 kB
assets/SelectValue-a1Tqx-7a.js (removed) 10.2 kB 🟢 -10.2 kB 🟢 -2.48 kB 🟢 -2.2 kB
assets/onboardingCloudRoutes-BP5q6nfE.js (removed) 9.46 kB 🟢 -9.46 kB 🟢 -2.85 kB 🟢 -2.43 kB
assets/onboardingCloudRoutes-FhXvo901.js (new) 9.46 kB 🔴 +9.46 kB 🔴 +2.84 kB 🔴 +2.43 kB
assets/Load3DConfiguration-BPfvR7rt.js (removed) 8.91 kB 🟢 -8.91 kB 🟢 -2.61 kB 🟢 -2.3 kB
assets/Load3DConfiguration-D27QP1Hq.js (new) 8.91 kB 🔴 +8.91 kB 🔴 +2.61 kB 🔴 +2.3 kB
assets/WidgetImageCrop-B-lngUh4.js (removed) 8.49 kB 🟢 -8.49 kB 🟢 -2.66 kB 🟢 -2.35 kB
assets/WidgetImageCrop-C1eWGVbV.js (new) 8.49 kB 🔴 +8.49 kB 🔴 +2.65 kB 🔴 +2.34 kB
assets/SetMemberCreditLimitDialogContent-B6JKakq6.js (new) 8.47 kB 🔴 +8.47 kB 🔴 +2.34 kB 🔴 +2.05 kB
assets/SetMemberCreditLimitDialogContent-D0rFYewC.js (removed) 8.47 kB 🟢 -8.47 kB 🟢 -2.34 kB 🟢 -2.05 kB
assets/nodeTemplates-D8wMGQ4M.js (removed) 8.32 kB 🟢 -8.32 kB 🟢 -2.85 kB 🟢 -2.51 kB
assets/nodeTemplates-rN6nAYQC.js (new) 8.32 kB 🔴 +8.32 kB 🔴 +2.85 kB 🔴 +2.5 kB
assets/WidgetImageCompare-BC-NlSRo.js (new) 8.13 kB 🔴 +8.13 kB 🔴 +2.3 kB 🔴 +2.01 kB
assets/WidgetImageCompare-CuxMACcG.js (removed) 8.13 kB 🟢 -8.13 kB 🟢 -2.3 kB 🟢 -2.02 kB
assets/NightlySurveyController-C4wO_um_.js (removed) 7.5 kB 🟢 -7.5 kB 🟢 -2.55 kB 🟢 -2.23 kB
assets/NightlySurveyController-DDUP_SjS.js (new) 7.5 kB 🔴 +7.5 kB 🔴 +2.56 kB 🔴 +2.24 kB
assets/Popover-CkDGGqlR.js (new) 7.48 kB 🔴 +7.48 kB 🔴 +2.69 kB 🔴 +2.36 kB
assets/Popover-CBCBUnWm.js (removed) 7.48 kB 🟢 -7.48 kB 🟢 -2.68 kB 🟢 -2.36 kB
assets/CloudRunButtonWrapper-4RIoH49D.js (new) 7.29 kB 🔴 +7.29 kB 🔴 +2.29 kB 🔴 +2.01 kB
assets/CloudRunButtonWrapper-DyUl0UoH.js (removed) 7.29 kB 🟢 -7.29 kB 🟢 -2.29 kB 🟢 -2.01 kB
assets/WidgetWithControl-Wo9AHYGk.js (new) 6.48 kB 🔴 +6.48 kB 🔴 +2.64 kB 🔴 +2.34 kB
assets/WidgetWithControl-DU3EWqzC.js (removed) 6.48 kB 🟢 -6.48 kB 🟢 -2.64 kB 🟢 -2.35 kB
assets/missingModelMetadata-B4wREQIr.js (removed) 6.45 kB 🟢 -6.45 kB 🟢 -2.2 kB 🟢 -1.93 kB
assets/missingModelMetadata-DXq29PWf.js (new) 6.45 kB 🔴 +6.45 kB 🔴 +2.21 kB 🔴 +1.93 kB
assets/AnimationControls-BBfB9zMF.js (new) 6.1 kB 🔴 +6.1 kB 🔴 +1.86 kB 🔴 +1.64 kB
assets/AnimationControls-CtllWymA.js (removed) 6.1 kB 🟢 -6.1 kB 🟢 -1.85 kB 🟢 -1.63 kB
assets/CancelSubscriptionDialogContent-BUU97CVc.js (removed) 5.97 kB 🟢 -5.97 kB 🟢 -1.98 kB 🟢 -1.75 kB
assets/CancelSubscriptionDialogContent-TJIU5r8A.js (new) 5.97 kB 🔴 +5.97 kB 🔴 +1.98 kB 🔴 +1.75 kB
assets/load3dPreviewExtensions-BLHaENcu.js (new) 5.88 kB 🔴 +5.88 kB 🔴 +1.81 kB 🔴 +1.6 kB
assets/load3dPreviewExtensions-BPEtkh8f.js (removed) 5.88 kB 🟢 -5.88 kB 🟢 -1.81 kB 🟢 -1.6 kB
assets/DowngradeRemoveMembersDialogContent-BPA7i-Hd.js (removed) 5.58 kB 🟢 -5.58 kB 🟢 -1.89 kB 🟢 -1.64 kB
assets/DowngradeRemoveMembersDialogContent-CSHaDkvJ.js (new) 5.58 kB 🔴 +5.58 kB 🔴 +1.89 kB 🔴 +1.64 kB
assets/launchCancellationFlow-CN1EIJyy.js (removed) 5.18 kB 🟢 -5.18 kB 🟢 -1.78 kB 🟢 -1.56 kB
assets/launchCancellationFlow-SmOpuslx.js (new) 5.18 kB 🔴 +5.18 kB 🔴 +1.78 kB 🔴 +1.56 kB
assets/CreateWorkspaceDialogContent-BP2H90yo.js (new) 5.12 kB 🔴 +5.12 kB 🔴 +1.79 kB 🔴 +1.55 kB
assets/CreateWorkspaceDialogContent-D6AJal7n.js (removed) 5.12 kB 🟢 -5.12 kB 🟢 -1.79 kB 🟢 -1.55 kB
assets/CloudNotificationContent-CoOPRA17.js (removed) 5.05 kB 🟢 -5.05 kB 🟢 -1.76 kB 🟢 -1.51 kB
assets/CloudNotificationContent-DXAZezE-.js (new) 5.05 kB 🔴 +5.05 kB 🔴 +1.76 kB 🔴 +1.51 kB
assets/ChangeMemberRoleDialogContent-Cth9RE1I.js (new) 4.97 kB 🔴 +4.97 kB 🔴 +1.64 kB 🔴 +1.43 kB
assets/ChangeMemberRoleDialogContent-Dwfl-duO.js (removed) 4.97 kB 🟢 -4.97 kB 🟢 -1.64 kB 🟢 -1.43 kB
assets/InviteMemberDialogContent-BhCVBLsM.js (new) 4.96 kB 🔴 +4.96 kB 🔴 +1.65 kB 🔴 +1.44 kB
assets/InviteMemberDialogContent-IqP04Wo5.js (removed) 4.96 kB 🟢 -4.96 kB 🟢 -1.64 kB 🟢 -1.43 kB
assets/EditWorkspaceDialogContent-CNAPMyWZ.js (new) 4.93 kB 🔴 +4.93 kB 🔴 +1.76 kB 🔴 +1.52 kB
assets/EditWorkspaceDialogContent-CY8kOoU-.js (removed) 4.93 kB 🟢 -4.93 kB 🟢 -1.76 kB 🟢 -1.52 kB
assets/PaletteSwatchRow-B-Ru-mfe.js (removed) 4.86 kB 🟢 -4.86 kB 🟢 -1.87 kB 🟢 -1.66 kB
assets/PaletteSwatchRow-Z5S8zJWQ.js (new) 4.86 kB 🔴 +4.86 kB 🔴 +1.87 kB 🔴 +1.66 kB
assets/WidgetTextarea-CHrRu-WY.js (new) 4.83 kB 🔴 +4.83 kB 🔴 +1.89 kB 🔴 +1.64 kB
assets/WidgetTextarea-BGJoj-fR.js (removed) 4.83 kB 🟢 -4.83 kB 🟢 -1.88 kB 🟢 -1.65 kB
assets/saveMesh-CVXjwl0n.js (removed) 4.76 kB 🟢 -4.76 kB 🟢 -1.52 kB 🟢 -1.34 kB
assets/saveMesh-D_k-_kY9.js (new) 4.76 kB 🔴 +4.76 kB 🔴 +1.52 kB 🔴 +1.34 kB
assets/WorkspacePanelContent-Bxew2_ng.js (removed) 4.74 kB 🟢 -4.74 kB 🟢 -1.62 kB 🟢 -1.44 kB
assets/WorkspacePanelContent-BYfH60uN.js (new) 4.74 kB 🔴 +4.74 kB 🔴 +1.63 kB 🔴 +1.43 kB
assets/ValueControlPopover-7AnCIFjB.js (new) 4.49 kB 🔴 +4.49 kB 🔴 +1.55 kB 🔴 +1.38 kB
assets/ValueControlPopover-CNLCdwy3.js (removed) 4.49 kB 🟢 -4.49 kB 🟢 -1.55 kB 🟢 -1.38 kB
assets/ToggleGroupItem--304zFHe.js (new) 4.14 kB 🔴 +4.14 kB 🔴 +1.41 kB 🔴 +1.25 kB
assets/ToggleGroupItem-CedKLrAZ.js (removed) 4.14 kB 🟢 -4.14 kB 🟢 -1.41 kB 🟢 -1.25 kB
assets/ApiNodesSignInContent-DSYJnHFc.js (removed) 4.08 kB 🟢 -4.08 kB 🟢 -1.31 kB 🟢 -1.15 kB
assets/ApiNodesSignInContent-TDUtZkIX.js (new) 4.08 kB 🔴 +4.08 kB 🔴 +1.31 kB 🔴 +1.14 kB
assets/Slider-DOw3QsWJ.js (new) 3.91 kB 🔴 +3.91 kB 🔴 +1.43 kB 🔴 +1.25 kB
assets/Slider-gYmu-6Xc.js (removed) 3.91 kB 🟢 -3.91 kB 🟢 -1.43 kB 🟢 -1.25 kB
assets/DeleteWorkspaceDialogContent-2zSoZAur.js (removed) 3.84 kB 🟢 -3.84 kB 🟢 -1.44 kB 🟢 -1.24 kB
assets/DeleteWorkspaceDialogContent-Dy_4S48c.js (new) 3.84 kB 🔴 +3.84 kB 🔴 +1.44 kB 🔴 +1.23 kB
assets/WidgetBoundingBox-BdH0d_v0.js (new) 3.76 kB 🔴 +3.76 kB 🔴 +1.03 kB 🔴 +899 B
assets/WidgetBoundingBox-DHE_RJSX.js (removed) 3.76 kB 🟢 -3.76 kB 🟢 -1.03 kB 🟢 -900 B
assets/RemoveMemberDialogContent-BJivC9Pz.js (removed) 3.76 kB 🟢 -3.76 kB 🟢 -1.38 kB 🟢 -1.22 kB
assets/RemoveMemberDialogContent-pkVakmS2.js (new) 3.76 kB 🔴 +3.76 kB 🔴 +1.39 kB 🔴 +1.2 kB
assets/WidgetGalleria-BfPBHJUx.js (new) 3.75 kB 🔴 +3.75 kB 🔴 +1.46 kB 🔴 +1.29 kB
assets/WidgetGalleria-BCG27W3j.js (removed) 3.75 kB 🟢 -3.75 kB 🟢 -1.45 kB 🟢 -1.29 kB
assets/RevokeInviteDialogContent-BA4N6AWc.js (new) 3.67 kB 🔴 +3.67 kB 🔴 +1.4 kB 🔴 +1.21 kB
assets/RevokeInviteDialogContent-CT0pLSg-.js (removed) 3.67 kB 🟢 -3.67 kB 🟢 -1.39 kB 🟢 -1.21 kB
assets/LeaveWorkspaceDialogContent-B9SsFTyx.js (removed) 3.67 kB 🟢 -3.67 kB 🟢 -1.38 kB 🟢 -1.19 kB
assets/LeaveWorkspaceDialogContent-DVQfWeE1.js (new) 3.67 kB 🔴 +3.67 kB 🔴 +1.39 kB 🔴 +1.21 kB
assets/WidgetToggleSwitch-BZV2lHHC.js (new) 3.56 kB 🔴 +3.56 kB 🔴 +1.3 kB 🔴 +1.15 kB
assets/WidgetToggleSwitch-IbZX_epq.js (removed) 3.56 kB 🟢 -3.56 kB 🟢 -1.3 kB 🟢 -1.14 kB
assets/InviteMemberUpsellDialogContent-DIKJRfQV.js (new) 3.47 kB 🔴 +3.47 kB 🔴 +1.24 kB 🔴 +1.08 kB
assets/InviteMemberUpsellDialogContent-fOdHoKjx.js (removed) 3.47 kB 🟢 -3.47 kB 🟢 -1.24 kB 🟢 -1.09 kB
assets/workspaceCheckoutTelemetry-B2hrWJKY.js (removed) 3.4 kB 🟢 -3.4 kB 🟢 -1.52 kB 🟢 -1.32 kB
assets/workspaceCheckoutTelemetry-CBNZDSGB.js (new) 3.4 kB 🔴 +3.4 kB 🔴 +1.52 kB 🔴 +1.32 kB
assets/GlobalToast-Cm_WWxkv.js (new) 3.25 kB 🔴 +3.25 kB 🔴 +1.3 kB 🔴 +1.11 kB
assets/GlobalToast-JkutR5Ww.js (removed) 3.25 kB 🟢 -3.25 kB 🟢 -1.3 kB 🟢 -1.11 kB
assets/Media3DTop-BbaYEfns.js (new) 3.21 kB 🔴 +3.21 kB 🔴 +1.26 kB 🔴 +1.11 kB
assets/Media3DTop-Crm8-iWY.js (removed) 3.21 kB 🟢 -3.21 kB 🟢 -1.26 kB 🟢 -1.11 kB
assets/WidgetMarkdown-DaDJXGSo.js (new) 3.07 kB 🔴 +3.07 kB 🔴 +1.26 kB 🔴 +1.11 kB
assets/WidgetMarkdown-DfbocEb7.js (removed) 3.07 kB 🟢 -3.07 kB 🟢 -1.26 kB 🟢 -1.1 kB
assets/WidgetInputText-CgMQDLxA.js (new) 3.04 kB 🔴 +3.04 kB 🔴 +1.27 kB 🔴 +1.14 kB
assets/WidgetInputText-HAihlCzW.js (removed) 3.04 kB 🟢 -3.04 kB 🟢 -1.27 kB 🟢 -1.14 kB
assets/MediaVideoTop-6mKzH6NR.js (new) 2.96 kB 🔴 +2.96 kB 🔴 +1.19 kB 🔴 +1.04 kB
assets/MediaVideoTop-tpKsgZUQ.js (removed) 2.96 kB 🟢 -2.96 kB 🟢 -1.19 kB 🟢 -1.04 kB
assets/load3dAdvanced-CsQzn5P0.js (new) 2.82 kB 🔴 +2.82 kB 🔴 +1.1 kB 🔴 +958 B
assets/load3dAdvanced-Q08tPm5H.js (removed) 2.82 kB 🟢 -2.82 kB 🟢 -1.09 kB 🟢 -956 B
assets/ErrorPanelSurveyCta-BTKaC-oM.js (new) 2.64 kB 🔴 +2.64 kB 🔴 +1.15 kB 🔴 +1.01 kB
assets/ErrorPanelSurveyCta-CBy5P8bC.js (removed) 2.64 kB 🟢 -2.64 kB 🟢 -1.14 kB 🟢 -1.01 kB
assets/Switch-D3DWirTN.js (new) 2.49 kB 🔴 +2.49 kB 🔴 +1.09 kB 🔴 +971 B
assets/Switch-DxGEzj-o.js (removed) 2.49 kB 🟢 -2.49 kB 🟢 -1.09 kB 🟢 -969 B
assets/SubscribeToRun-BFAaTAmA.js (removed) 2.39 kB 🟢 -2.39 kB 🟢 -1.03 kB 🟢 -908 B
assets/SubscribeToRun-Ct9j8SMg.js (new) 2.39 kB 🔴 +2.39 kB 🔴 +1.03 kB 🔴 +907 B
assets/WidgetLayoutField-6_uBG2ip.js (new) 2.38 kB 🔴 +2.38 kB 🔴 +1.03 kB 🔴 +947 B
assets/WidgetLayoutField-gqC5HiqE.js (removed) 2.38 kB 🟢 -2.38 kB 🟢 -1.03 kB 🟢 -903 B
assets/WidgetChart-DhIozH2z.js (removed) 2.36 kB 🟢 -2.36 kB 🟢 -1 kB 🟢 -864 B
assets/WidgetChart-DNLUok7d.js (new) 2.36 kB 🔴 +2.36 kB 🔴 +1 kB 🔴 +864 B
assets/TopBarHeader-BS02SX9t.js (new) 2.01 kB 🔴 +2.01 kB 🔴 +843 B 🔴 +730 B
assets/TopBarHeader-DrGsbvUy.js (removed) 2.01 kB 🟢 -2.01 kB 🟢 -843 B 🟢 -730 B
assets/MediaImageTop-CrgQtw1E.js (new) 1.95 kB 🔴 +1.95 kB 🔴 +926 B 🔴 +808 B
assets/MediaImageTop-DVdFkMJE.js (removed) 1.95 kB 🟢 -1.95 kB 🟢 -927 B 🟢 -795 B
assets/TypeformEmbed-BF59AlIm.js (new) 1.83 kB 🔴 +1.83 kB 🔴 +814 B 🔴 +711 B
assets/TypeformEmbed-DaGPjMO9.js (removed) 1.83 kB 🟢 -1.83 kB 🟢 -810 B 🟢 -713 B
assets/MediaTextTop-Di8nyQwl.js (new) 1.77 kB 🔴 +1.77 kB 🔴 +854 B 🔴 +725 B
assets/MediaTextTop-DJyhV4a3.js (removed) 1.77 kB 🟢 -1.77 kB 🟢 -853 B 🟢 -727 B
assets/WidgetColorPicker-BKw7fh7J.js (removed) 1.69 kB 🟢 -1.69 kB 🟢 -756 B 🟢 -671 B
assets/WidgetColorPicker-BVv2tjF7.js (new) 1.69 kB 🔴 +1.69 kB 🔴 +758 B 🔴 +669 B
assets/Loader-DUmcO9m4.js (removed) 1.64 kB 🟢 -1.64 kB 🟢 -782 B 🟢 -712 B
assets/Loader-XNEOJdGw.js (new) 1.64 kB 🔴 +1.64 kB 🔴 +786 B 🔴 +692 B
assets/WidgetColors-BwYOzrho.js (new) 1.63 kB 🔴 +1.63 kB 🔴 +808 B 🔴 +712 B
assets/WidgetColors-JukJ-xzC.js (removed) 1.63 kB 🟢 -1.63 kB 🟢 -805 B 🟢 -708 B
assets/MediaAudioTop-D-TmmOTi.js (new) 1.62 kB 🔴 +1.62 kB 🔴 +808 B 🔴 +670 B
assets/MediaAudioTop-Wzx3qXOX.js (removed) 1.62 kB 🟢 -1.62 kB 🟢 -807 B 🟢 -669 B
assets/Textarea-CKVsqnaQ.js (new) 1.56 kB 🔴 +1.56 kB 🔴 +815 B 🔴 +712 B
assets/Textarea-DGRWK7cp.js (removed) 1.56 kB 🟢 -1.56 kB 🟢 -812 B 🟢 -714 B
assets/signInSchema-COChp5Pr.js (removed) 1.55 kB 🟢 -1.55 kB 🟢 -555 B 🟢 -486 B
assets/signInSchema-DKKYu9zi.js (new) 1.55 kB 🔴 +1.55 kB 🔴 +554 B 🔴 +489 B
assets/VideoPlayOverlay-BbV0PiIN.js (new) 1.46 kB 🔴 +1.46 kB 🔴 +729 B 🔴 +645 B
assets/VideoPlayOverlay-D2wYJwv2.js (removed) 1.46 kB 🟢 -1.46 kB 🟢 -730 B 🟢 -645 B
assets/ButtonGroup-DxYJgU6C.js (new) 1.24 kB 🔴 +1.24 kB 🔴 +645 B 🔴 +559 B
assets/ButtonGroup-D1QIwxch.js (removed) 1.24 kB 🟢 -1.24 kB 🟢 -645 B 🟢 -562 B
assets/DialogClose-CafgPPnq.js (new) 1.18 kB 🔴 +1.18 kB 🔴 +612 B 🔴 +553 B
assets/DialogClose-gJ1XljK8.js (removed) 1.18 kB 🟢 -1.18 kB 🟢 -611 B 🟢 -548 B
assets/MediaOtherTop-4fILdIP9.js (new) 1.02 kB 🔴 +1.02 kB 🔴 +575 B 🔴 +474 B
assets/MediaOtherTop-Bih2juu_.js (removed) 1.02 kB 🟢 -1.02 kB 🟢 -574 B 🟢 -464 B
assets/cloudSessionCookie-BFTpnRU9.js (new) 933 B 🔴 +933 B 🔴 +431 B 🔴 +379 B
assets/cloudSessionCookie-DelfD7D5.js (removed) 933 B 🟢 -933 B 🟢 -432 B 🟢 -377 B
assets/cloudBadges-CIedb8a0.js (new) 922 B 🔴 +922 B 🔴 +517 B 🔴 +447 B
assets/cloudBadges-MK8sfkBx.js (removed) 922 B 🟢 -922 B 🟢 -513 B 🟢 -441 B
assets/ComfyOrgHeader-DHnXyu2w.js (removed) 906 B 🟢 -906 B 🟢 -496 B 🟢 -432 B
assets/ComfyOrgHeader-pKNbvxm-.js (new) 906 B 🔴 +906 B 🔴 +496 B 🔴 +433 B
assets/Load3DAdvanced-Bl9-MMmh.js (new) 761 B 🔴 +761 B 🔴 +421 B 🔴 +359 B
assets/Load3DAdvanced-DIhuUG7C.js (removed) 761 B 🟢 -761 B 🟢 -423 B 🟢 -360 B
assets/widgetTypes-Cf58xZw1.js (removed) 514 B 🟢 -514 B 🟢 -280 B 🟢 -272 B
assets/widgetTypes-DMVZ050X.js (new) 514 B 🔴 +514 B 🔴 +282 B 🔴 +263 B
assets/vRekaZIndex-ChVi1lXn.js (new) 505 B 🔴 +505 B 🔴 +330 B 🔴 +273 B
assets/vRekaZIndex-DE5prqA2.js (removed) 505 B 🟢 -505 B 🟢 -331 B 🟢 -273 B
assets/nightlyBadges-BetOOXt-.js (removed) 411 B 🟢 -411 B 🟢 -272 B 🟢 -268 B
assets/nightlyBadges-Cu6VJkAN.js (new) 411 B 🔴 +411 B 🔴 +271 B 🔴 +232 B
assets/src-CLoMbfLH.js (new) 407 B 🔴 +407 B 🔴 +289 B 🔴 +245 B
assets/src-CZvY4J5n.js (removed) 407 B 🟢 -407 B 🟢 -290 B 🟢 -245 B
assets/Load3dViewerContent-Bb0FQXVh.js (new) 137 B 🔴 +137 B 🔴 +103 B 🔴 +93 B
assets/Load3dViewerContent-CaYtAihF.js (removed) 137 B 🟢 -137 B 🟢 -103 B 🟢 -96 B
assets/WidgetBoundingBox-CkSvQALG.js (removed) 131 B 🟢 -131 B 🟢 -100 B 🟢 -107 B
assets/WidgetBoundingBox-CliDXyG4.js (new) 131 B 🔴 +131 B 🔴 +100 B 🔴 +106 B
assets/missingModelMetadata-C1D1DGvQ.js (new) 125 B 🔴 +125 B 🔴 +103 B 🔴 +105 B
assets/missingModelMetadata-D5TusP4x.js (removed) 125 B 🟢 -125 B 🟢 -103 B 🟢 -110 B
assets/Load3DAdvanced-DTCvWew7.js (removed) 122 B 🟢 -122 B 🟢 -97 B 🟢 -89 B
assets/Load3DAdvanced-fJ-a_7Vm.js (new) 122 B 🔴 +122 B 🔴 +97 B 🔴 +88 B
assets/WidgetLegacy-Bm145qTA.js (new) 117 B 🔴 +117 B 🔴 +106 B 🔴 +96 B
assets/WidgetLegacy-Dwxg39il.js (removed) 117 B 🟢 -117 B 🟢 -106 B 🟢 -103 B
assets/workflowDraftStoreV2-6tM7y_7m.js (removed) 112 B 🟢 -112 B 🟢 -101 B 🟢 -109 B
assets/workflowDraftStoreV2-OMAhkbLs.js (new) 112 B 🔴 +112 B 🔴 +101 B 🔴 +110 B
assets/Load3D-Bsu1beL8.js (removed) 98 B 🟢 -98 B 🟢 -89 B 🟢 -89 B
assets/Load3D-FJ04H-XY.js (new) 98 B 🔴 +98 B 🔴 +89 B 🔴 +80 B
assets/i18n-C3odoBM3.js (new) 97 B 🔴 +97 B 🔴 +92 B 🔴 +86 B
assets/i18n-ChPltmRa.js (removed) 97 B 🟢 -97 B 🟢 -92 B 🟢 -86 B
assets/changeTracker-BBegIGBK.js (removed) 91 B 🟢 -91 B 🟢 -93 B 🟢 -87 B
assets/changeTracker-D7mbBKjW.js (new) 91 B 🔴 +91 B 🔴 +93 B 🔴 +75 B

Status: 113 added / 113 removed / 172 unchanged

⚡ Performance

⏳ Performance tests in progress…

@benjcooley

Copy link
Copy Markdown
Contributor Author

I have read and agree to the Contributor License Agreement

@benjcooley

Copy link
Copy Markdown
Contributor Author

recheck

@codecov

codecov Bot commented Aug 11, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 87.56757% with 69 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
src/components/graph/GraphCanvas.vue 50.00% 24 Missing ⚠️
...ons/vueNodes/composables/useViewportCullingPins.ts 54.34% 21 Missing ⚠️
...ensions/vueNodes/composables/useViewportCulling.ts 90.80% 8 Missing ⚠️
src/renderer/core/spatial/SpatialIndex.ts 92.47% 7 Missing ⚠️
...renderer/core/canvas/litegraph/slotCalculations.ts 84.61% 2 Missing ⚠️
...ons/vueNodes/composables/useSlotElementTracking.ts 91.30% 1 Missing and 1 partial ⚠️
src/renderer/core/layout/store/layoutStore.ts 98.30% 1 Missing ⚠️
...ns/vueNodes/composables/mountAdmissionScheduler.ts 98.70% 1 Missing ⚠️
...ensions/vueNodes/composables/viewportVisibility.ts 96.87% 1 Missing ⚠️
src/scripts/app.ts 0.00% 1 Missing ⚠️
... and 1 more
@@            Coverage Diff             @@
##             main   #15030      +/-   ##
==========================================
+ Coverage   79.08%   81.80%   +2.71%     
==========================================
  Files        2209     1890     -319     
  Lines      115781   109449    -6332     
  Branches    35204    33159    -2045     
==========================================
- Hits        91569    89533    -2036     
+ Misses      23738    19517    -4221     
+ Partials      474      399      -75     
Flag Coverage Δ
unit 72.99% <87.56%> (+0.10%) ⬆️
website-unit ?

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing lines Coverage Δ
src/lib/litegraph/src/LGraphCanvas.ts 65.50% <ø> (-4.87%) ⬇️
src/lib/litegraph/src/canvas/LinkConnector.ts 51.56% <ø> (-0.44%) ⬇️
src/lib/litegraph/src/measure.ts 88.60% <ø> (-1.84%) ⬇️
src/platform/settings/constants/coreSettings.ts 85.48% <ø> (ø)
src/renderer/core/canvas/vueNodeSlotSync.ts 100.00% <100.00%> (ø)
...c/renderer/core/layout/transform/TransformPane.vue 94.73% <100.00%> (-1.27%) ⬇️
src/renderer/core/layout/types.ts 100.00% <ø> (ø)
...r/extensions/vueNodes/composables/liveNodeState.ts 100.00% <100.00%> (ø)
...ns/vueNodes/composables/mountDepartureScheduler.ts 100.00% <100.00%> (ø)
...vueNodes/composables/useNodePointerInteractions.ts 92.78% <100.00%> (+0.55%) ⬆️
... and 14 more

... and 409 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@benjcooley
benjcooley force-pushed the benjcooley/vue-nodes-viewport-culling branch 3 times, most recently from 755e64e to dc16632 Compare August 11, 2026 05:37
@benjcooley
benjcooley requested review from a team, DrJKL and christian-byrne August 11, 2026 16:28
@christian-byrne christian-byrne added preview-cpu Creates a preview ephemeral environment for this PR (CPU only) and removed preview-cpu Creates a preview ephemeral environment for this PR (CPU only) labels Aug 12, 2026

@christian-byrne christian-byrne left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Reviewed with a multi-agent pass (12 reviewer profiles, mutation-based red/green verification in an isolated worktree, and a cross-model adversarial pass). Findings were deduped and then re-derived against the code at head by an independent verification stage; 17 dropped as unverifiable, wrong, or pre-existing. 17 survive.

Submitting as COMMENT rather than REQUEST_CHANGES because you own the merge call, but flagging explicitly so it does not get lost in the list: C1 is blocking severity. Unmounting any node clears the process-global layoutStore.isDraggingVueNodes, and useNodeDrag is a shared singleton that nulls the drag origin when that flag drops. Before this PR a node only unmounted on deletion or graph swap, so the hook could not run mid-gesture; culling makes unmount camera-driven, and the camera moves during a drag because auto-pan runs. Pinning does not protect against it, because the flag is cleared by the unmount of a different node.

Credit where the review confirmed things rather than found them, so you know what was checked and cleared: the getCullingBounds sign convention is correct against TransformPane, NodeId key types are consistent throughout, the empty-graph and single-node root sizing is fine, the camera is correctly kept out of the node list's reactive graph, and the useThrottleFn(() => fn, ms) inertness trap that made the #6209 culling a no-op is not repeated here. Mutation testing killed 6 of 7 mutants, and both red/green claims in your description hold: deleting the eager-prune branch fails the pan test with expected 60 to be less than 20, and swapping the graph-extent root for QUADTREE_CONFIG.DEFAULT_BOUNDS fails the out-of-bounds test.

Two process notes rather than code findings:

  • The 0.02% pixel-parity claim is the entire justification for the change being safe, and nothing in the repo enforces it. There is no @perf test and no visual-parity check, so both the correctness claim and the speed claim can regress silently. .claude/skills/perf-fix-with-proof/SKILL.md describes the repo's convention here (baseline test lands first, in its own PR).
  • Worth knowing before you invest more in this branch: #14259 is an open draft implementing viewport virtualization, low-zoom LOD, and the FE-1557 slot-geometry-across-unmount work in one PR, and it conflicts with this on the same v-for line. It is setting-gated where this is always-on. Someone should pick before either lands.

Comment thread src/renderer/extensions/vueNodes/composables/useViewportCulling.ts Outdated
Comment thread src/renderer/extensions/vueNodes/composables/useViewportCulling.ts Outdated
Comment thread src/composables/graph/useViewportCulling.ts Outdated
Comment thread src/components/graph/GraphCanvas.vue Outdated
Comment thread src/composables/graph/useViewportCulling.ts Outdated
Comment thread src/renderer/extensions/vueNodes/composables/useViewportCulling.ts
Comment thread src/components/graph/GraphCanvas.vue Outdated
Comment thread src/renderer/core/spatial/nodeCullingIndex.ts Outdated
Comment thread src/renderer/extensions/vueNodes/composables/useViewportCulling.ts Outdated
Comment thread src/renderer/extensions/vueNodes/composables/useViewportCulling.ts Outdated
@benjcooley
benjcooley force-pushed the benjcooley/minimap-large-graph-perf branch from fda0bb1 to 37e86ce Compare August 14, 2026 00:02
@benjcooley
benjcooley force-pushed the benjcooley/vue-nodes-viewport-culling branch from dc16632 to 6be9d69 Compare August 14, 2026 00:02
@github-actions github-actions Bot added the risk:R3 PR risk grade (advisory shadow check; grader-owned) label Aug 14, 2026
@benjcooley
benjcooley force-pushed the benjcooley/minimap-large-graph-perf branch from 37e86ce to 34433df Compare August 14, 2026 00:33
@benjcooley

Copy link
Copy Markdown
Contributor Author

Split the repository-wide AGENTS.md guidance into #15376 so this PR remains focused on viewport-culling behavior. The latest commit only removes that documentation diff; the validated runtime implementation is unchanged.

@benjcooley benjcooley added the New Browser Test Expectations New browser test screenshot should be set by github action label Aug 18, 2026
@github-actions github-actions Bot removed the New Browser Test Expectations New browser test screenshot should be set by github action label Aug 18, 2026
@benjcooley benjcooley added the New Browser Test Expectations New browser test screenshot should be set by github action label Aug 18, 2026
@github-actions github-actions Bot removed the New Browser Test Expectations New browser test screenshot should be set by github action label Aug 18, 2026
@benjcooley benjcooley changed the title perf: virtualize Vue nodes outside the viewport DO NOT SUBMIT - perf: virtualize Vue nodes outside the viewport Aug 18, 2026
@benjcooley
benjcooley disabled auto-merge August 18, 2026 17:47
@benjcooley

Copy link
Copy Markdown
Contributor Author

I am going to replace this PR with a vastly simpler KEEPALIVE only version which basically does almost the same thing.

We can discuss wether to keep this version, but after line by line reviewing by human eyeballs, this is a lot of code.

@benjcooley
benjcooley marked this pull request as draft August 18, 2026 17:59
claude Bot pushed a commit that referenced this pull request Aug 21, 2026
…cture

#15030 (viewport culling) was retired and replaced by #15405, which ships
KeepAlive-only viewport retention (Comfy.VueNodes.ViewportKeepAlive, default
on) with no destructive-unmount mode. Rebase this benchmark onto #15405's
branch and drive it off that setting directly instead of the deleted
useViewportCulling.ts and the now-nonexistent
Comfy.VueNodes.ViewportCullingKeepAlive setting this PR had added.

- Drop the Comfy.VueNodes.ViewportCullingKeepAlive setting and the
  GraphCanvas.vue KeepAlive branch that pointed at it - #15405's GraphCanvas
  already renders through KeepAlive unconditionally, gated by
  Comfy.VueNodes.ViewportKeepAlive.
- Rewrite viewportCullingBenchmark.spec.ts as a two-way KeepAlive on/off
  comparison (no third "destroy" variant, since one no longer exists).
- Drop the mount-admission/departure debounce-settle helpers; KeepAlive
  activation is one throttled refresh (REFRESH_THROTTLE_MS = 100ms in
  useViewportKeepAlive.ts), so settling is a single idleFrames wait.

@christian-byrne christian-byrne left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

@DrJKL — this PR is superseded by #15405 but still carries 7 unresolved threads, all yours. Since closing it would dispose of them silently, here is where each one actually ended up. I verified all of these at the replacement heads rather than reading the replies.

Your blocker Where it lives now
Extension compatibility — no opt-out for extension-owned DOM Restored in #15405 as extensionManager.vueNodes.registerCullingOptOut(nodeType), ref-counted, same store and extensionTypes surface. One deliberate semantic change: it is now admission, not retention — a registered type stays attached wherever it is, rather than only being retained if already attached. That is the right call under KeepAlive (the state it protects is exactly what detachment destroys) but it is your blocker, so worth your confirmation.
Second QuadTree duplicating layoutStore nodeCullingIndex.ts stays deleted; consumers go through layoutStore.queryNodesInBounds(). The SpatialIndexManager hardening was dropped by the rebase onto #15405 and is now restored on #15031unindexableEntries, isIndexable, if (!indexed) rebuild(), batched rebuild, and a fail-open query. Regression test inserts at x: 50_000, outside the ±10000 root.
useViewportCulling implicit state machine Moot — the composable and its four-file split are gone. #15405's KeepAlive path is ~165 lines with one throttle and no admission scheduler, so the state machine you objected to no longer exists rather than having been reorganised.
Pin-set hash collisions Carried over. Pin membership is an explicit reactive Set; the JSON.stringify membership key that replaced the fingerprint is also gone now.
Touch-pan golden Fixed on main in #15356; neither successor changes the golden.
LGraphCanvas link fast-rejection Not present on #15405 or #15031 — that optimisation did not come across. Nothing to confirm, but flagging it since your thread was the only record of it.
Slot-sync readiness ownership Reworked on #15031; the clear is gated on isLowQuality and the re-arm on wasLow && !low, so the release-before-measure case and the cold-start self-undo are both closed.

The general point, since it cost real coverage here: a fix that closed a thread on a retired PR is not a fix that shipped. Two of the above were silently reverted by the restructure — the opt-out API and the SpatialIndex hardening — and neither would have been caught by reviewing the replacements against main. Both are now back with tests.

I have approved #15405 and #15031 with one condition: they land together, or #15031 immediately behind, because #15405 alone has no bound on the activation set at low zoom. That is the answer to your "would it be better to get both it and the successor in together?" — yes.

Suggest closing this PR once you have looked at the opt-out semantics on #15405. You are assigned there.

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

Labels

area:nodes area:vue-migration perf:speed risk:R3 PR risk grade (advisory shadow check; grader-owned) size:XXL This PR changes 1000+ lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants