Skip to content

feat: add Spotlight dev overlay opt-in and fallow audit config#11580

Closed
DrJKL wants to merge 5 commits into
mainfrom
glary/syntax-998-spotlight-fallow
Closed

feat: add Spotlight dev overlay opt-in and fallow audit config#11580
DrJKL wants to merge 5 commits into
mainfrom
glary/syntax-998-spotlight-fallow

Conversation

@DrJKL

@DrJKL DrJKL commented Apr 23, 2026

Copy link
Copy Markdown
Contributor

PR Created by the Glary-Bot Agent


Summary

Exploratory PR from the Syntax.fm #998 tooling review in #frontend-here-be-dragons. Adds two of the three recommendations from the thread so the team can evaluate real signal before committing to wider adoption:

  • Sentry Spotlight — local dev overlay opt-in
  • Fallow audit config.fallowrc.json with all rules at warn; matching CI workflow YAML is below for a maintainer to add in a follow-up commit (see note at bottom)

Changes

Spotlight (dev-only, opt-in)

  • New __SPOTLIGHT_ENABLED__ Vite define, true only when NODE_ENV=development, DISTRIBUTION !== 'cloud', and SPOTLIGHT=true in env.
  • src/main.ts: when enabled, adds spotlightBrowserIntegration + browserTracingIntegration + consoleLoggingIntegration + enableLogs: true, forces Sentry on with a placeholder DSN so events go to the local sidecar only. Cloud and prod paths are unchanged.
  • Usage documented in CONTRIBUTING.md: run pnpx @spotlightjs/spotlight in one terminal, SPOTLIGHT=true pnpm dev in another, open http://localhost:8969.
  • .env_example: flag documented alongside existing Sentry vars.
  • No new runtime dependencies — Spotlight sidecar runs via pnpx on demand.

Fallow audit config

  • .fallowrc.json: all rules set to warn. Entry points cover src/main.ts, scripts/**, build/** plugins, all Vite/Vitest/Playwright/ESLint configs, apps/*/src/main.ts, packages/*/src/index.ts, stories, and tests. src/lib/litegraph/** and src/locales/** are ignored.

Follow-up: CI workflow to add

The GitHub App used to open this PR lacks the workflows permission, so it cannot push files under .github/workflows/. The workflow below was authored and verified locally (syntactically valid per the repo's own scripts/cicd/check-yaml.sh). A maintainer can drop this into .github/workflows/ci-fallow-audit.yaml in a follow-up commit on this branch:

# Description: Fallow codebase audit in warn-only mode. Surfaces dead code,
# duplication, complexity hotspots, and boundary violations as PR annotations.
# Never fails the build — treat signal as guidance, not a gate.
name: 'CI: Fallow Audit'

on:
  pull_request:
    paths-ignore: ['**/*.md']

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

permissions:
  contents: read

jobs:
  fallow-audit:
    runs-on: ubuntu-latest
    timeout-minutes: 15
    continue-on-error: true
    # Skip for work-in-progress / draft / temp source branches
    if: >-
      !startsWith(github.head_ref, 'wip/') &&
      !startsWith(github.head_ref, 'draft/') &&
      !startsWith(github.head_ref, 'temp/')
    steps:
      - name: Checkout PR
        uses: actions/checkout@v6
        with:
          fetch-depth: 0

      - name: Setup frontend
        uses: ./.github/actions/setup-frontend

      - name: Run fallow audit (warn-only)
        uses: fallow-rs/fallow@v2
        with:
          command: audit
          format: annotations
          config: .fallowrc.json
          auto-changed-since: 'true'
          fail-on-issues: 'false'
          annotations: 'true'
          max-annotations: '50'
        continue-on-error: true

Review Focus

  • src/main.ts — the __SPOTLIGHT_ENABLED__ branch forces Sentry on. In prod/cloud builds the define is false, so the whole path is dead-code eliminated and production behavior is byte-identical.
  • .fallowrc.json entry list — happy to adjust once we see the first audit output. Entries were chosen to give fallow enough seed points to traverse the full module graph without false-positive unused-file spam.

Non-goals (parked)

  • chrome-devtools-mcp — separate MCP config change, not needed in this PR.
  • jscpd / wallace / Lightpanda / clint / Vite+ — intentionally skipped per Slack discussion.

Verification

  • pnpm typecheck clean
  • pnpm lint clean
  • pnpm knip clean
  • pnpm format:check clean
  • Repo's own scripts/cicd/check-yaml.sh and check-json.sh clean (verified on the workflow YAML before it was removed from this branch)
  • Manual smoke test: SPOTLIGHT=true pnpm dev boots cleanly; Spotlight integration verified live in browser (SDK attempts sidecar connection to localhost:8969 and emits envelopes to the placeholder DSN as expected)

Left as Draft so the team can decide on the workflow add and whether the fallow signal is worth promoting rules from warnerror over time.

┆Issue is synchronized with this Notion page by Unito

Enable Sentry Spotlight (https://spotlightjs.com) as an opt-in local dev
overlay by adding a SPOTLIGHT=true env flag that routes events to a local
sidecar via spotlightBrowserIntegration. Production wiring is unchanged.

Add a new warn-only 'CI: Fallow Audit' GitHub Actions workflow plus a
.fallowrc.json to surface dead code, duplication, complexity, and
boundary-violation signals from fallow as PR annotations without blocking
merges. Rule levels are set to 'warn' so the team can evaluate signal
quality before considering any promotion to a gate.

Context: follow-up on Syntax.fm #998 tooling review in
#frontend-here-be-dragons.
- main.ts: add browserTracingIntegration + consoleLoggingIntegration +
  enableLogs so Spotlight actually shows the traces/logs CONTRIBUTING.md
  advertises, not just errors.
- ci-fallow-audit.yaml: switch from branches-ignore (which filters the
  PR base, not source) to an if-guard on github.head_ref so wip/draft/
  temp branches really skip the audit.
- .fallowrc.json: drop **/build/** from ignorePatterns since
  build/**/*.{ts,mts,js} is an entry pattern for the Vite plugin sources
  and the two were cancelling out.
The GitHub App used for this session lacks the workflows permission, so
it cannot push files under .github/workflows/. The YAML is reproduced
verbatim in the PR description so a maintainer can add it in a follow-up
commit. All other pieces of this PR (Spotlight wiring, .fallowrc.json,
docs) are complete.
@coderabbitai

coderabbitai Bot commented Apr 23, 2026

Copy link
Copy Markdown
Contributor

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: 37f47540-1833-454b-913a-f9ff6d63358a

📥 Commits

Reviewing files that changed from the base of the PR and between ebbbc7c and e071b01.

📒 Files selected for processing (3)
  • .fallowrc.json
  • CONTRIBUTING.md
  • src/main.ts
✅ Files skipped from review due to trivial changes (2)
  • CONTRIBUTING.md
  • .fallowrc.json
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/main.ts

📝 Walkthrough

Walkthrough

Adds an opt‑in Sentry “Spotlight” local dev overlay: build-time flag, runtime/global declarations, test shim, docs and env guide, analyzer config, and Sentry initialization changes to route events to a local Spotlight sidecar when enabled in non-cloud development.

Changes

Cohort / File(s) Summary
Environment & Contributor Docs
​.env_example, CONTRIBUTING.md
Document SPOTLIGHT=true opt-in, steps to run the Spotlight sidecar and view the local UI; clarifies dev-only behavior and how to enable overlay.
Build-time Defines & Test Shims
vite.config.mts, scripts/vite-define-shim.ts, vitest.setup.ts
Introduce __SPOTLIGHT_ENABLED__ define (true when dev ∧ distribution ≠ cloud ∧ SPOTLIGHT=true); add TypeScript shim and test global default false.
Type Declarations
global.d.ts
Add declare const __SPOTLIGHT_ENABLED__: boolean.
Runtime Sentry Initialization
src/main.ts
Sentry.init updated to include __SPOTLIGHT_ENABLED__ in enabled logic, substitute local Spotlight DSN when enabled, enable tracing sampling and logs for Spotlight, and consolidate environment-specific options into sentryEnvironmentOpts.
Static Analysis Config
.fallowrc.json
Add Fallow analyzer config with entry globs, ignore patterns, enabled rules at warn, and analyzer health limits (maxCyclomatic, maxCognitive).

Sequence Diagram(s)

sequenceDiagram
    participant Dev as Developer
    participant App as Frontend App (Sentry SDK)
    participant Sidecar as Spotlight Sidecar (local)
    participant UI as Spotlight Local UI

    Dev->>Sidecar: start spotlight sidecar (listens on local DSN)
    Dev->>App: set SPOTLIGHT=true in dev env
    Note right of App: build-time __SPOTLIGHT_ENABLED__ = true

    App->>App: Sentry.init reads __SPOTLIGHT_ENABLED__
    App->>Sidecar: send captured events/traces (local DSN)
    Sidecar->>UI: store/forward events
    Dev->>UI: open Spotlight UI to inspect events
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Poem

🐰 I nudged a flag and lit a glow,

Local traces now hop and show,
Start the sidecar, set SPOTLIGHT true,
Errors bloom in a tiny view,
A carrot of clarity for you!

🚥 Pre-merge checks | ✅ 7
✅ Passed checks (7 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately summarizes the two main changes: adding Spotlight dev overlay opt-in and Fallow audit config.
Description check ✅ Passed The description comprehensively covers changes, dependencies, design decisions, and provides detailed review focus areas matching the template structure.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
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.
End-To-End Regression Coverage For Fixes ✅ Passed PR uses 'feat:' prefix indicating a feature, not bug-fix language. No bug-fix keywords detected.
Adr Compliance For Entity/Litegraph Changes ✅ Passed PR does not modify files under src/lib/litegraph/, src/ecs/, or graph entity-related files. Changes are limited to configuration, documentation, and tooling.

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

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch glary/syntax-998-spotlight-fallow

Review rate limit: 4/5 reviews remaining, refill in 12 minutes.

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

@github-actions

github-actions Bot commented Apr 23, 2026

Copy link
Copy Markdown

🎨 Storybook: ✅ Built — View Storybook

Details

⏰ Completed at: 05/01/2026, 08:46:57 AM UTC

Links

@github-actions

github-actions Bot commented Apr 23, 2026

Copy link
Copy Markdown

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

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

@github-actions

github-actions Bot commented Apr 23, 2026

Copy link
Copy Markdown

📦 Bundle: 5.27 MB gzip 🔴 +37 kB

Details

Summary

  • Raw size: 24.3 MB baseline 24.1 MB — 🔴 +149 kB
  • Gzip: 5.27 MB baseline 5.23 MB — 🔴 +37 kB
  • Brotli: 4.08 MB baseline 4.05 MB — 🔴 +28.3 kB
  • Bundles: 257 current • 257 baseline • 119 added / 119 removed

Category Glance
Vendor & Third-Party 🔴 +149 kB (10 MB) · App Entry Points 🔴 +361 B (22.9 kB) · Other ⚪ 0 B (8.84 MB) · Data & Services ⚪ 0 B (3.04 MB) · Graph Workspace ⚪ 0 B (1.24 MB) · Panels & Settings ⚪ 0 B (488 kB) · + 5 more

App Entry Points — 22.9 kB (baseline 22.5 kB) • 🔴 +361 B

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-DV5-kRvN.js (new) 22.9 kB 🔴 +22.9 kB 🔴 +8.11 kB 🔴 +6.95 kB
assets/index-Dz-gneXr.js (removed) 22.5 kB 🟢 -22.5 kB 🟢 -7.99 kB 🟢 -6.89 kB

Status: 1 added / 1 removed

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

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-Bc8tWfNL.js (new) 1.24 MB 🔴 +1.24 MB 🔴 +264 kB 🔴 +199 kB
assets/GraphView-D-rieHft.js (removed) 1.24 MB 🟢 -1.24 MB 🟢 -264 kB 🟢 -199 kB

Status: 1 added / 1 removed

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

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-N_S3afr3.js (new) 15.7 kB 🔴 +15.7 kB 🔴 +3.41 kB 🔴 +2.92 kB
assets/CloudSurveyView-vMXZUqEr.js (removed) 15.7 kB 🟢 -15.7 kB 🟢 -3.41 kB 🟢 -2.9 kB
assets/CloudLoginView-CUxhX0w8.js (new) 12.2 kB 🔴 +12.2 kB 🔴 +3.43 kB 🔴 +3.04 kB
assets/CloudLoginView-Cya9m2K0.js (removed) 12.2 kB 🟢 -12.2 kB 🟢 -3.43 kB 🟢 -3.04 kB
assets/CloudSignupView-D-IABvbf.js (new) 9.94 kB 🔴 +9.94 kB 🔴 +2.93 kB 🔴 +2.57 kB
assets/CloudSignupView-Dk0TiN74.js (removed) 9.94 kB 🟢 -9.94 kB 🟢 -2.93 kB 🟢 -2.59 kB
assets/UserCheckView-Ci4cgtDQ.js (new) 9.07 kB 🔴 +9.07 kB 🔴 +2.34 kB 🔴 +2.05 kB
assets/UserCheckView-CIXy6qGa.js (removed) 9.07 kB 🟢 -9.07 kB 🟢 -2.34 kB 🟢 -2.04 kB
assets/CloudLayoutView-DffqHa5i.js (new) 7.7 kB 🔴 +7.7 kB 🔴 +2.44 kB 🔴 +2.11 kB
assets/CloudLayoutView-Ds-yarLP.js (removed) 7.7 kB 🟢 -7.7 kB 🟢 -2.44 kB 🟢 -2.1 kB
assets/CloudForgotPasswordView-CbXnOFIy.js (removed) 6.11 kB 🟢 -6.11 kB 🟢 -2.17 kB 🟢 -1.9 kB
assets/CloudForgotPasswordView-SeATMzt5.js (new) 6.11 kB 🔴 +6.11 kB 🔴 +2.17 kB 🔴 +1.92 kB
assets/CloudAuthTimeoutView-3xNmtMSK.js (new) 5.47 kB 🔴 +5.47 kB 🔴 +2 kB 🔴 +1.75 kB
assets/CloudAuthTimeoutView-DcLErqFX.js (removed) 5.47 kB 🟢 -5.47 kB 🟢 -2 kB 🟢 -1.76 kB
assets/CloudSubscriptionRedirectView-BGlRyRVW.js (removed) 5.25 kB 🟢 -5.25 kB 🟢 -1.99 kB 🟢 -1.76 kB
assets/CloudSubscriptionRedirectView-yF3cJ9xM.js (new) 5.25 kB 🔴 +5.25 kB 🔴 +1.98 kB 🔴 +1.76 kB
assets/UserSelectView-CEQ_BHbD.js (removed) 4.73 kB 🟢 -4.73 kB 🟢 -1.75 kB 🟢 -1.55 kB
assets/UserSelectView-DSDqyI1G.js (new) 4.73 kB 🔴 +4.73 kB 🔴 +1.75 kB 🔴 +1.55 kB

Status: 9 added / 9 removed / 2 unchanged

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

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/KeybindingPanel-C9IrdLZF.js (new) 46.7 kB 🔴 +46.7 kB 🔴 +9.6 kB 🔴 +8.54 kB
assets/KeybindingPanel-Cb7VwN2u.js (removed) 46.7 kB 🟢 -46.7 kB 🟢 -9.61 kB 🟢 -8.55 kB
assets/SecretsPanel-B4PEWprR.js (removed) 22.9 kB 🟢 -22.9 kB 🟢 -5.54 kB 🟢 -4.87 kB
assets/SecretsPanel-Dm3X7HHA.js (new) 22.9 kB 🔴 +22.9 kB 🔴 +5.54 kB 🔴 +4.87 kB
assets/LegacyCreditsPanel-Ch5woOTG.js (removed) 21.7 kB 🟢 -21.7 kB 🟢 -5.89 kB 🟢 -5.2 kB
assets/LegacyCreditsPanel-kRHXNwbs.js (new) 21.7 kB 🔴 +21.7 kB 🔴 +5.89 kB 🔴 +5.19 kB
assets/SubscriptionPanel-BB3qKmxu.js (new) 19.9 kB 🔴 +19.9 kB 🔴 +5.07 kB 🔴 +4.46 kB
assets/SubscriptionPanel-DQOcGKiu.js (removed) 19.9 kB 🟢 -19.9 kB 🟢 -5.07 kB 🟢 -4.46 kB
assets/AboutPanel-Bh3J2viZ.js (new) 12 kB 🔴 +12 kB 🔴 +3.32 kB 🔴 +2.98 kB
assets/AboutPanel-X8zmOxhi.js (removed) 12 kB 🟢 -12 kB 🟢 -3.33 kB 🟢 -2.98 kB
assets/ExtensionPanel-C9nVqYOy.js (new) 9.94 kB 🔴 +9.94 kB 🔴 +2.9 kB 🔴 +2.57 kB
assets/ExtensionPanel-DZgDfZ1o.js (removed) 9.94 kB 🟢 -9.94 kB 🟢 -2.9 kB 🟢 -2.56 kB
assets/ServerConfigPanel-Dnp4YjDU.js (removed) 7.02 kB 🟢 -7.02 kB 🟢 -2.35 kB 🟢 -2.11 kB
assets/ServerConfigPanel-Tzbx4AmN.js (new) 7.02 kB 🔴 +7.02 kB 🔴 +2.35 kB 🔴 +2.09 kB
assets/UserPanel-B580Fs17.js (removed) 6.72 kB 🟢 -6.72 kB 🟢 -2.23 kB 🟢 -1.95 kB
assets/UserPanel-C2YCz3QU.js (new) 6.72 kB 🔴 +6.72 kB 🔴 +2.23 kB 🔴 +1.95 kB
assets/cloudRemoteConfig-B_HzuDTc.js (new) 2.02 kB 🔴 +2.02 kB 🔴 +974 B 🔴 +837 B
assets/cloudRemoteConfig-Dg49MArP.js (removed) 2.02 kB 🟢 -2.02 kB 🟢 -975 B 🟢 -838 B
assets/refreshRemoteConfig-BitZGCr8.js (new) 1.45 kB 🔴 +1.45 kB 🔴 +649 B 🔴 +555 B
assets/refreshRemoteConfig-Cqzhjyz3.js (removed) 1.45 kB 🟢 -1.45 kB 🟢 -649 B 🟢 -550 B

Status: 10 added / 10 removed / 11 unchanged

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

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/auth-Co4N81L2.js (removed) 3.57 kB 🟢 -3.57 kB 🟢 -1.26 kB 🟢 -1.07 kB
assets/auth-DD8nA_5P.js (new) 3.57 kB 🔴 +3.57 kB 🔴 +1.26 kB 🔴 +1.07 kB
assets/SignUpForm-B-arr7vt.js (removed) 3.19 kB 🟢 -3.19 kB 🟢 -1.29 kB 🟢 -1.15 kB
assets/SignUpForm-Y6--BFDN.js (new) 3.19 kB 🔴 +3.19 kB 🔴 +1.29 kB 🔴 +1.15 kB
assets/UpdatePasswordContent-Dnf6b3sP.js (new) 2.87 kB 🔴 +2.87 kB 🔴 +1.29 kB 🔴 +1.15 kB
assets/UpdatePasswordContent-Mu91XNVy.js (removed) 2.87 kB 🟢 -2.87 kB 🟢 -1.29 kB 🟢 -1.14 kB
assets/authStore-Dlu7KfuV.js (removed) 1.16 kB 🟢 -1.16 kB 🟢 -555 B 🟢 -494 B
assets/authStore-Lkfxr0Mc.js (new) 1.16 kB 🔴 +1.16 kB 🔴 +554 B 🔴 +493 B
assets/auth-BFZiWRP7.js (new) 348 B 🔴 +348 B 🔴 +217 B 🔴 +198 B
assets/auth-DtWFY1sG.js (removed) 348 B 🟢 -348 B 🟢 -218 B 🟢 -192 B

Status: 5 added / 5 removed / 2 unchanged

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

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/ComfyHubPublishDialog-CisItntx.js (new) 85.8 kB 🔴 +85.8 kB 🔴 +18.6 kB 🔴 +15.9 kB
assets/ComfyHubPublishDialog-w6Z12L4K.js (removed) 85.8 kB 🟢 -85.8 kB 🟢 -18.6 kB 🟢 -15.9 kB
assets/useShareDialog-BovS-YBn.js (removed) 23.7 kB 🟢 -23.7 kB 🟢 -5.77 kB 🟢 -5.12 kB
assets/useShareDialog-P3fvQA6m.js (new) 23.7 kB 🔴 +23.7 kB 🔴 +5.76 kB 🔴 +5.11 kB
assets/ComfyHubPublishDialog-ByAkYBAH.js (removed) 1.32 kB 🟢 -1.32 kB 🟢 -614 B 🟢 -540 B
assets/ComfyHubPublishDialog-CENbS1Jm.js (new) 1.32 kB 🔴 +1.32 kB 🔴 +611 B 🔴 +536 B
assets/useSubscriptionDialog-5OJRSFpu.js (new) 1.14 kB 🔴 +1.14 kB 🔴 +544 B 🔴 +475 B
assets/useSubscriptionDialog-D72PIPJ2.js (removed) 1.14 kB 🟢 -1.14 kB 🟢 -544 B 🟢 -477 B

Status: 4 added / 4 removed

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

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/ComfyQueueButton-BN1lYO1U.js (new) 13.5 kB 🔴 +13.5 kB 🔴 +3.79 kB 🔴 +3.38 kB
assets/ComfyQueueButton-C1FC-F87.js (removed) 13.5 kB 🟢 -13.5 kB 🟢 -3.79 kB 🟢 -3.38 kB
assets/useTerminalTabs-C-mvYZmy.js (removed) 11 kB 🟢 -11 kB 🟢 -3.71 kB 🟢 -3.27 kB
assets/useTerminalTabs-DCeLos3r.js (new) 11 kB 🔴 +11 kB 🔴 +3.71 kB 🔴 +3.26 kB
assets/SubscribeButton-BhcP91dW.js (removed) 2.42 kB 🟢 -2.42 kB 🟢 -1.05 kB 🟢 -945 B
assets/SubscribeButton-CjEQ4hiY.js (new) 2.42 kB 🔴 +2.42 kB 🔴 +1.05 kB 🔴 +926 B
assets/cloudFeedbackTopbarButton-C1Mb6iOm.js (new) 1.8 kB 🔴 +1.8 kB 🔴 +930 B 🔴 +814 B
assets/cloudFeedbackTopbarButton-DVRYz571.js (removed) 1.8 kB 🟢 -1.8 kB 🟢 -932 B 🟢 -815 B
assets/ComfyQueueButton-BL9KiNGo.js (new) 1.24 kB 🔴 +1.24 kB 🔴 +580 B 🔴 +516 B
assets/ComfyQueueButton-DAyyrvpI.js (removed) 1.24 kB 🟢 -1.24 kB 🟢 -581 B 🟢 -517 B

Status: 5 added / 5 removed / 8 unchanged

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

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/dialogService-CXQBpg1F.js (removed) 1.98 MB 🟢 -1.98 MB 🟢 -455 kB 🟢 -345 kB
assets/dialogService-yxyv2QCr.js (new) 1.98 MB 🔴 +1.98 MB 🔴 +455 kB 🔴 +345 kB
assets/api-BVIlU04f.js (new) 887 kB 🔴 +887 kB 🔴 +212 kB 🔴 +167 kB
assets/api-iG6J0Q0Q.js (removed) 887 kB 🟢 -887 kB 🟢 -212 kB 🟢 -167 kB
assets/load3dService-C3DAq2qu.js (new) 114 kB 🔴 +114 kB 🔴 +24.8 kB 🔴 +21.1 kB
assets/load3dService-C5IY3ciZ.js (removed) 114 kB 🟢 -114 kB 🟢 -24.8 kB 🟢 -21.1 kB
assets/workflowShareService-J3AhEUJi.js (removed) 16.6 kB 🟢 -16.6 kB 🟢 -4.89 kB 🟢 -4.33 kB
assets/workflowShareService-yLwsgpHe.js (new) 16.6 kB 🔴 +16.6 kB 🔴 +4.89 kB 🔴 +4.33 kB
assets/keybindingService-Da-KTTXc.js (new) 13.8 kB 🔴 +13.8 kB 🔴 +3.67 kB 🔴 +3.21 kB
assets/keybindingService-MTWcU24k.js (removed) 13.8 kB 🟢 -13.8 kB 🟢 -3.67 kB 🟢 -3.22 kB
assets/releaseStore-CKMDvvw-.js (new) 8.12 kB 🔴 +8.12 kB 🔴 +2.28 kB 🔴 +2 kB
assets/releaseStore-DJgX2THv.js (removed) 8.12 kB 🟢 -8.12 kB 🟢 -2.28 kB 🟢 -2 kB
assets/userStore-ANYhOoJW.js (removed) 2.24 kB 🟢 -2.24 kB 🟢 -871 B 🟢 -761 B
assets/userStore-PqkXnSL6.js (new) 2.24 kB 🔴 +2.24 kB 🔴 +871 B 🔴 +760 B
assets/audioService-BaeJJ7OZ.js (new) 1.8 kB 🔴 +1.8 kB 🔴 +876 B 🔴 +758 B
assets/audioService-Bgc_Pblr.js (removed) 1.8 kB 🟢 -1.8 kB 🟢 -878 B 🟢 -760 B
assets/releaseStore-BK9n0vKJ.js (removed) 1.16 kB 🟢 -1.16 kB 🟢 -546 B 🟢 -484 B
assets/releaseStore-E3LW4pKb.js (new) 1.16 kB 🔴 +1.16 kB 🔴 +547 B 🔴 +485 B
assets/workflowDraftStore-BGlpOIPQ.js (removed) 1.14 kB 🟢 -1.14 kB 🟢 -544 B 🟢 -478 B
assets/workflowDraftStore-pKqYvAXm.js (new) 1.14 kB 🔴 +1.14 kB 🔴 +543 B 🔴 +477 B
assets/dialogService-C_52_V57.js (removed) 1.13 kB 🟢 -1.13 kB 🟢 -536 B 🟢 -477 B
assets/dialogService-CwARbW9g.js (new) 1.13 kB 🔴 +1.13 kB 🔴 +536 B 🔴 +475 B
assets/settingStore-C7y65Flc.js (new) 1.12 kB 🔴 +1.12 kB 🔴 +538 B 🔴 +472 B
assets/settingStore-DLT0yPdC.js (removed) 1.12 kB 🟢 -1.12 kB 🟢 -538 B 🟢 -474 B
assets/assetsStore-DCOFqI8A.js (new) 1.12 kB 🔴 +1.12 kB 🔴 +538 B 🔴 +476 B
assets/assetsStore-DoE7_LOv.js (removed) 1.12 kB 🟢 -1.12 kB 🟢 -539 B 🟢 -477 B

Status: 13 added / 13 removed / 4 unchanged

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

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useConflictDetection-BEaroL-u.js (removed) 233 kB 🟢 -233 kB 🟢 -51.8 kB 🟢 -42.2 kB
assets/useConflictDetection-BIKi577e.js (new) 233 kB 🔴 +233 kB 🔴 +51.8 kB 🔴 +42.2 kB
assets/useLoad3d-BZd4AMY9.js (new) 22.3 kB 🔴 +22.3 kB 🔴 +5.09 kB 🔴 +4.49 kB
assets/useLoad3d-CIZTvvqt.js (removed) 22.3 kB 🟢 -22.3 kB 🟢 -5.09 kB 🟢 -4.5 kB
assets/useLoad3dViewer-6uGQsoIm.js (new) 20.8 kB 🔴 +20.8 kB 🔴 +4.91 kB 🔴 +4.3 kB
assets/useLoad3dViewer-DPK4p5wg.js (removed) 20.8 kB 🟢 -20.8 kB 🟢 -4.91 kB 🟢 -4.3 kB
assets/useFeatureFlags-DgNTf2P9.js (new) 5.95 kB 🔴 +5.95 kB 🔴 +1.8 kB 🔴 +1.52 kB
assets/useFeatureFlags-DRUwUOFJ.js (removed) 5.95 kB 🟢 -5.95 kB 🟢 -1.8 kB 🟢 -1.53 kB
assets/useCopyToClipboard-BICyu1UX.js (new) 5.29 kB 🔴 +5.29 kB 🔴 +1.86 kB 🔴 +1.57 kB
assets/useCopyToClipboard-Dom6T5xr.js (removed) 5.29 kB 🟢 -5.29 kB 🟢 -1.86 kB 🟢 -1.57 kB
assets/useWorkspaceUI-BxH4AvlO.js (removed) 3.34 kB 🟢 -3.34 kB 🟢 -982 B 🟢 -808 B
assets/useWorkspaceUI-CQH3dpMx.js (new) 3.34 kB 🔴 +3.34 kB 🔴 +982 B 🔴 +811 B
assets/subscriptionCheckoutUtil-DD7JE2yt.js (removed) 3.31 kB 🟢 -3.31 kB 🟢 -1.36 kB 🟢 -1.18 kB
assets/subscriptionCheckoutUtil-JXc_aZZu.js (new) 3.31 kB 🔴 +3.31 kB 🔴 +1.36 kB 🔴 +1.19 kB
assets/assetPreviewUtil-CMPdZAJB.js (removed) 2.27 kB 🟢 -2.27 kB 🟢 -961 B 🟢 -841 B
assets/assetPreviewUtil-CPwUrYk3.js (new) 2.27 kB 🔴 +2.27 kB 🔴 +960 B 🔴 +838 B
assets/useUpstreamValue-DfNxLxIw.js (removed) 2.08 kB 🟢 -2.08 kB 🟢 -804 B 🟢 -711 B
assets/useUpstreamValue-swbYmOCL.js (new) 2.08 kB 🔴 +2.08 kB 🔴 +807 B 🔴 +714 B
assets/useLoad3d-DYcEURt9.js (removed) 1.3 kB 🟢 -1.3 kB 🟢 -604 B 🟢 -541 B
assets/useLoad3d-GkJQqNHA.js (new) 1.3 kB 🔴 +1.3 kB 🔴 +604 B 🔴 +539 B
assets/useLoad3dViewer-DWMDiY3R.js (new) 1.24 kB 🔴 +1.24 kB 🔴 +573 B 🔴 +514 B
assets/useLoad3dViewer-DXZpJowj.js (removed) 1.24 kB 🟢 -1.24 kB 🟢 -573 B 🟢 -516 B
assets/useCurrentUser-Cl3IDcAk.js (removed) 1.12 kB 🟢 -1.12 kB 🟢 -540 B 🟢 -478 B
assets/useCurrentUser-CVcG5FJn.js (new) 1.12 kB 🔴 +1.12 kB 🔴 +539 B 🔴 +474 B
assets/useWorkspaceSwitch-BzwCVQWS.js (new) 747 B 🔴 +747 B 🔴 +383 B 🔴 +331 B
assets/useWorkspaceSwitch-D83B3ZTz.js (removed) 747 B 🟢 -747 B 🟢 -384 B 🟢 -333 B

Status: 13 added / 13 removed / 18 unchanged

Vendor & Third-Party — 10 MB (baseline 9.87 MB) • 🔴 +149 kB

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-sentry-CRwk9Zph.js (new) 417 kB 🔴 +417 kB 🔴 +106 kB 🔴 +85.4 kB
assets/vendor-sentry-CB8yd7t1.js (removed) 268 kB 🟢 -268 kB 🟢 -69.2 kB 🟢 -56.9 kB

Status: 1 added / 1 removed / 15 unchanged

Other — 8.84 MB (baseline 8.84 MB) • ⚪ 0 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/core-4orjbmJf.js (new) 76.6 kB 🔴 +76.6 kB 🔴 +19.8 kB 🔴 +16.9 kB
assets/core-BuI-eOlS.js (removed) 76.6 kB 🟢 -76.6 kB 🟢 -19.8 kB 🟢 -16.9 kB
assets/groupNode-DCRsrD06.js (new) 74.9 kB 🔴 +74.9 kB 🔴 +18.7 kB 🔴 +16.5 kB
assets/groupNode-DxpAFjpY.js (removed) 74.9 kB 🟢 -74.9 kB 🟢 -18.7 kB 🟢 -16.5 kB
assets/WidgetSelect-cyinkW7P.js (new) 67.2 kB 🔴 +67.2 kB 🔴 +14.6 kB 🔴 +12.6 kB
assets/WidgetSelect-dO8OdJVo.js (removed) 67.2 kB 🟢 -67.2 kB 🟢 -14.6 kB 🟢 -12.6 kB
assets/SubscriptionRequiredDialogContentWorkspace-BLo2RsMz.js (removed) 49.3 kB 🟢 -49.3 kB 🟢 -9.41 kB 🟢 -8.06 kB
assets/SubscriptionRequiredDialogContentWorkspace-CZV3HDwy.js (new) 49.3 kB 🔴 +49.3 kB 🔴 +9.41 kB 🔴 +8.04 kB
assets/Load3DControls-_fHPOKIZ.js (new) 46.1 kB 🔴 +46.1 kB 🔴 +7.51 kB 🔴 +6.54 kB
assets/Load3DControls-DQP4JPcR.js (removed) 46.1 kB 🟢 -46.1 kB 🟢 -7.51 kB 🟢 -6.54 kB
assets/WidgetPainter-BONu6b-P.js (new) 34 kB 🔴 +34 kB 🔴 +8.28 kB 🔴 +7.33 kB
assets/WidgetPainter-Dm17JOG_.js (removed) 34 kB 🟢 -34 kB 🟢 -8.29 kB 🟢 -7.34 kB
assets/WorkspacePanelContent-DEivF_-v.js (new) 32.8 kB 🔴 +32.8 kB 🔴 +7 kB 🔴 +6.18 kB
assets/WorkspacePanelContent-EHyUmTy4.js (removed) 32.8 kB 🟢 -32.8 kB 🟢 -7 kB 🟢 -6.18 kB
assets/Load3dViewerContent-7dlfaZt2.js (removed) 28 kB 🟢 -28 kB 🟢 -5.85 kB 🟢 -5.06 kB
assets/Load3dViewerContent-8PFVYpJL.js (new) 28 kB 🔴 +28 kB 🔴 +5.85 kB 🔴 +5.06 kB
assets/SubscriptionRequiredDialogContent-COecVDBK.js (removed) 27.5 kB 🟢 -27.5 kB 🟢 -6.96 kB 🟢 -6.14 kB
assets/SubscriptionRequiredDialogContent-Dbok9RbS.js (new) 27.5 kB 🔴 +27.5 kB 🔴 +6.96 kB 🔴 +6.15 kB
assets/WidgetImageCrop-isVLKkrF.js (new) 24.3 kB 🔴 +24.3 kB 🔴 +6.18 kB 🔴 +5.44 kB
assets/WidgetImageCrop-n59LTrKq.js (removed) 24.3 kB 🟢 -24.3 kB 🟢 -6.19 kB 🟢 -5.46 kB
assets/SubscriptionPanelContentWorkspace-BmImDRHJ.js (removed) 22.2 kB 🟢 -22.2 kB 🟢 -5.18 kB 🟢 -4.57 kB
assets/SubscriptionPanelContentWorkspace-CGUYOFAL.js (new) 22.2 kB 🔴 +22.2 kB 🔴 +5.18 kB 🔴 +4.57 kB
assets/SignInContent-CPSHa5Z-.js (removed) 20.6 kB 🟢 -20.6 kB 🟢 -5.35 kB 🟢 -4.67 kB
assets/SignInContent-CvWl3dja.js (new) 20.6 kB 🔴 +20.6 kB 🔴 +5.35 kB 🔴 +4.67 kB
assets/CurrentUserPopoverWorkspace-ByeYT17_.js (removed) 20.5 kB 🟢 -20.5 kB 🟢 -4.9 kB 🟢 -4.39 kB
assets/CurrentUserPopoverWorkspace-CO9NwkTS.js (new) 20.5 kB 🔴 +20.5 kB 🔴 +4.89 kB 🔴 +4.39 kB
assets/WidgetInputNumber-DK1IWBL9.js (new) 19.1 kB 🔴 +19.1 kB 🔴 +4.84 kB 🔴 +4.29 kB
assets/WidgetInputNumber-SLtu4OXI.js (removed) 19.1 kB 🟢 -19.1 kB 🟢 -4.84 kB 🟢 -4.3 kB
assets/Load3D-B3dV-bHF.js (new) 18.5 kB 🔴 +18.5 kB 🔴 +4.4 kB 🔴 +3.83 kB
assets/Load3D-CTDmRn4Q.js (removed) 18.5 kB 🟢 -18.5 kB 🟢 -4.39 kB 🟢 -3.83 kB
assets/WidgetRecordAudio-DKjRrC7O.js (removed) 17.4 kB 🟢 -17.4 kB 🟢 -5 kB 🟢 -4.47 kB
assets/WidgetRecordAudio-DVCefSDg.js (new) 17.4 kB 🔴 +17.4 kB 🔴 +5 kB 🔴 +4.47 kB
assets/WidgetRange-DChEFv9n.js (removed) 17 kB 🟢 -17 kB 🟢 -4.59 kB 🟢 -4.12 kB
assets/WidgetRange-DnoycRUv.js (new) 17 kB 🔴 +17 kB 🔴 +4.59 kB 🔴 +4.12 kB
assets/load3d-BTxi4V8j.js (removed) 15.7 kB 🟢 -15.7 kB 🟢 -4.56 kB 🟢 -3.94 kB
assets/load3d-hSa0Whk4.js (new) 15.7 kB 🔴 +15.7 kB 🔴 +4.57 kB 🔴 +3.95 kB
assets/WaveAudioPlayer-D4falYkS.js (new) 13.4 kB 🔴 +13.4 kB 🔴 +3.69 kB 🔴 +3.23 kB
assets/WaveAudioPlayer-Xo7zcI3G.js (removed) 13.4 kB 🟢 -13.4 kB 🟢 -3.69 kB 🟢 -3.23 kB
assets/WidgetCurve-B5RIXqIz.js (removed) 12.1 kB 🟢 -12.1 kB 🟢 -3.91 kB 🟢 -3.55 kB
assets/WidgetCurve-Df7JcFrP.js (new) 12.1 kB 🔴 +12.1 kB 🔴 +3.91 kB 🔴 +3.54 kB
assets/TeamWorkspacesDialogContent-CdSo8a9D.js (new) 11.3 kB 🔴 +11.3 kB 🔴 +3.41 kB 🔴 +3.03 kB
assets/TeamWorkspacesDialogContent-MIHr0Qoa.js (removed) 11.3 kB 🟢 -11.3 kB 🟢 -3.41 kB 🟢 -3.03 kB
assets/nodeTemplates-DnhsEX49.js (new) 9.81 kB 🔴 +9.81 kB 🔴 +3.46 kB 🔴 +3.05 kB
assets/nodeTemplates-DOsWKMc_.js (removed) 9.81 kB 🟢 -9.81 kB 🟢 -3.47 kB 🟢 -3.06 kB
assets/NightlySurveyController-Rfdtxclx.js (new) 8.99 kB 🔴 +8.99 kB 🔴 +3.15 kB 🔴 +2.77 kB
assets/NightlySurveyController-W7EbEL6F.js (removed) 8.99 kB 🟢 -8.99 kB 🟢 -3.15 kB 🟢 -2.78 kB
assets/InviteMemberDialogContent-0A3vTHLy.js (removed) 7.91 kB 🟢 -7.91 kB 🟢 -2.51 kB 🟢 -2.2 kB
assets/InviteMemberDialogContent-BfN0Q7L1.js (new) 7.91 kB 🔴 +7.91 kB 🔴 +2.51 kB 🔴 +2.19 kB
assets/Load3DConfiguration-DoF2rsiC.js (removed) 7.82 kB 🟢 -7.82 kB 🟢 -2.31 kB 🟢 -2.02 kB
assets/Load3DConfiguration-HH4PTWwV.js (new) 7.82 kB 🔴 +7.82 kB 🔴 +2.31 kB 🔴 +2.02 kB
assets/onboardingCloudRoutes-B9FdM6z3.js (removed) 6.58 kB 🟢 -6.58 kB 🟢 -2.05 kB 🟢 -1.77 kB
assets/onboardingCloudRoutes-DC5dsfWf.js (new) 6.58 kB 🔴 +6.58 kB 🔴 +2.06 kB 🔴 +1.77 kB
assets/CreateWorkspaceDialogContent-Bbv9JOhy.js (new) 6.12 kB 🔴 +6.12 kB 🔴 +2.22 kB 🔴 +1.94 kB
assets/CreateWorkspaceDialogContent-Dy1no_t3.js (removed) 6.12 kB 🟢 -6.12 kB 🟢 -2.22 kB 🟢 -1.95 kB
assets/WidgetWithControl-BMrblDG0.js (new) 6.02 kB 🔴 +6.02 kB 🔴 +2.4 kB 🔴 +2.13 kB
assets/WidgetWithControl-kE6fJYz7.js (removed) 6.02 kB 🟢 -6.02 kB 🟢 -2.41 kB 🟢 -2.15 kB
assets/FreeTierDialogContent-CCAptoZC.js (removed) 5.99 kB 🟢 -5.99 kB 🟢 -2.12 kB 🟢 -1.86 kB
assets/FreeTierDialogContent-GK3wUsXA.js (new) 5.99 kB 🔴 +5.99 kB 🔴 +2.12 kB 🔴 +1.86 kB
assets/EditWorkspaceDialogContent-BoWk4YNs.js (new) 5.92 kB 🔴 +5.92 kB 🔴 +2.18 kB 🔴 +1.91 kB
assets/EditWorkspaceDialogContent-DnSJg-C6.js (removed) 5.92 kB 🟢 -5.92 kB 🟢 -2.18 kB 🟢 -1.92 kB
assets/WidgetTextarea-BA5uZjSl.js (new) 5.73 kB 🔴 +5.73 kB 🔴 +2.26 kB 🔴 +1.99 kB
assets/WidgetTextarea-BlmafEYg.js (removed) 5.73 kB 🟢 -5.73 kB 🟢 -2.26 kB 🟢 -2.01 kB
assets/Preview3d-bbV2Zxpi.js (removed) 5.7 kB 🟢 -5.7 kB 🟢 -1.91 kB 🟢 -1.67 kB
assets/Preview3d-CGXpXNPl.js (new) 5.7 kB 🔴 +5.7 kB 🔴 +1.91 kB 🔴 +1.67 kB
assets/ValueControlPopover-BAxBJpgv.js (removed) 5.5 kB 🟢 -5.5 kB 🟢 -2 kB 🟢 -1.79 kB
assets/ValueControlPopover-C7aeTC7M.js (new) 5.5 kB 🔴 +5.5 kB 🔴 +2 kB 🔴 +1.78 kB
assets/CancelSubscriptionDialogContent-CWN6ITcW.js (new) 5.46 kB 🔴 +5.46 kB 🔴 +2.04 kB 🔴 +1.79 kB
assets/CancelSubscriptionDialogContent-Dn0qXZLD.js (removed) 5.46 kB 🟢 -5.46 kB 🟢 -2.04 kB 🟢 -1.79 kB
assets/DeleteWorkspaceDialogContent-DA4a-cpq.js (new) 4.82 kB 🔴 +4.82 kB 🔴 +1.86 kB 🔴 +1.62 kB
assets/DeleteWorkspaceDialogContent-JMU4dpTb.js (removed) 4.82 kB 🟢 -4.82 kB 🟢 -1.86 kB 🟢 -1.62 kB
assets/LeaveWorkspaceDialogContent-gjuJ8G7n.js (removed) 4.65 kB 🟢 -4.65 kB 🟢 -1.81 kB 🟢 -1.57 kB
assets/LeaveWorkspaceDialogContent-pd6f62g8.js (new) 4.65 kB 🔴 +4.65 kB 🔴 +1.8 kB 🔴 +1.58 kB
assets/RemoveMemberDialogContent-LJ69Z8UB.js (removed) 4.63 kB 🟢 -4.63 kB 🟢 -1.76 kB 🟢 -1.55 kB
assets/RemoveMemberDialogContent-zBryBREI.js (new) 4.63 kB 🔴 +4.63 kB 🔴 +1.76 kB 🔴 +1.54 kB
assets/RevokeInviteDialogContent-hzYgMR62.js (new) 4.54 kB 🔴 +4.54 kB 🔴 +1.77 kB 🔴 +1.55 kB
assets/RevokeInviteDialogContent-lqWeN-nw.js (removed) 4.54 kB 🟢 -4.54 kB 🟢 -1.77 kB 🟢 -1.55 kB
assets/tierBenefits-BQlbAuW9.js (removed) 4.45 kB 🟢 -4.45 kB 🟢 -1.58 kB 🟢 -1.36 kB
assets/tierBenefits-DMTqJmV3.js (new) 4.45 kB 🔴 +4.45 kB 🔴 +1.58 kB 🔴 +1.36 kB
assets/InviteMemberUpsellDialogContent-BnD5kdQD.js (removed) 4.44 kB 🟢 -4.44 kB 🟢 -1.64 kB 🟢 -1.44 kB
assets/InviteMemberUpsellDialogContent-Bp_qDJO_.js (new) 4.44 kB 🔴 +4.44 kB 🔴 +1.63 kB 🔴 +1.44 kB
assets/cloudSessionCookie-CXGURKqH.js (removed) 4.28 kB 🟢 -4.28 kB 🟢 -1.56 kB 🟢 -1.35 kB
assets/cloudSessionCookie-DL0Qg_KY.js (new) 4.28 kB 🔴 +4.28 kB 🔴 +1.56 kB 🔴 +1.36 kB
assets/Media3DTop-DiqK5w2r.js (removed) 4.01 kB 🟢 -4.01 kB 🟢 -1.7 kB 🟢 -1.5 kB
assets/Media3DTop-jtHkQsE-.js (new) 4.01 kB 🔴 +4.01 kB 🔴 +1.69 kB 🔴 +1.49 kB
assets/saveMesh-EnQY7OCf.js (new) 3.98 kB 🔴 +3.98 kB 🔴 +1.73 kB 🔴 +1.54 kB
assets/saveMesh-j6HyBW1g.js (removed) 3.98 kB 🟢 -3.98 kB 🟢 -1.73 kB 🟢 -1.53 kB
assets/GlobalToast-BKNpKNUX.js (new) 3.05 kB 🔴 +3.05 kB 🔴 +1.26 kB 🔴 +1.07 kB
assets/GlobalToast-BPd_WkJ2.js (removed) 3.05 kB 🟢 -3.05 kB 🟢 -1.26 kB 🟢 -1.07 kB
assets/CloudRunButtonWrapper-Csj4sYk2.js (removed) 2.2 kB 🟢 -2.2 kB 🟢 -1 kB 🟢 -897 B
assets/CloudRunButtonWrapper-D82hSZel.js (new) 2.2 kB 🔴 +2.2 kB 🔴 +1 kB 🔴 +893 B
assets/SubscribeToRun-CQhlOz-1.js (new) 2.13 kB 🔴 +2.13 kB 🔴 +983 B 🔴 +880 B
assets/SubscribeToRun-TUz1s-3M.js (removed) 2.13 kB 🟢 -2.13 kB 🟢 -983 B 🟢 -883 B
assets/MediaAudioTop-C15kFOTm.js (removed) 2.08 kB 🟢 -2.08 kB 🟢 -1.01 kB 🟢 -857 B
assets/MediaAudioTop-S3G923UO.js (new) 2.08 kB 🔴 +2.08 kB 🔴 +1.01 kB 🔴 +857 B
assets/cloudBadges-B8ZrtT_F.js (removed) 1.93 kB 🟢 -1.93 kB 🟢 -961 B 🟢 -832 B
assets/cloudBadges-DanvAdSc.js (new) 1.93 kB 🔴 +1.93 kB 🔴 +960 B 🔴 +831 B
assets/cloudSubscription-ChmIZnuG.js (removed) 1.85 kB 🟢 -1.85 kB 🟢 -885 B 🟢 -768 B
assets/cloudSubscription-CihbBbRj.js (new) 1.85 kB 🔴 +1.85 kB 🔴 +885 B 🔴 +764 B
assets/graphHasMissingNodes-_qFFsMQ5.js (removed) 1.83 kB 🟢 -1.83 kB 🟢 -863 B 🟢 -758 B
assets/graphHasMissingNodes-BB56NlSC.js (new) 1.83 kB 🔴 +1.83 kB 🔴 +862 B 🔴 +778 B
assets/Load3D-BSGxhw4Y.js (removed) 1.55 kB 🟢 -1.55 kB 🟢 -695 B 🟢 -622 B
assets/Load3D-EDje47_t.js (new) 1.55 kB 🔴 +1.55 kB 🔴 +696 B 🔴 +623 B
assets/previousFullPath-0HP4bSiR.js (new) 1.53 kB 🔴 +1.53 kB 🔴 +694 B 🔴 +614 B
assets/previousFullPath-BGYxP_bh.js (removed) 1.53 kB 🟢 -1.53 kB 🟢 -695 B 🟢 -592 B
assets/nightlyBadges-C6kGBWKL.js (new) 1.46 kB 🔴 +1.46 kB 🔴 +731 B 🔴 +646 B
assets/nightlyBadges-MYQPI17h.js (removed) 1.46 kB 🟢 -1.46 kB 🟢 -731 B 🟢 -665 B
assets/Load3dViewerContent-BXHjhJ8Z.js (removed) 1.43 kB 🟢 -1.43 kB 🟢 -650 B 🟢 -587 B
assets/Load3dViewerContent-kcIsNURH.js (new) 1.43 kB 🔴 +1.43 kB 🔴 +650 B 🔴 +575 B
assets/SubscriptionPanelContentWorkspace-DDVIq4bm.js (new) 1.32 kB 🔴 +1.32 kB 🔴 +604 B 🔴 +526 B
assets/SubscriptionPanelContentWorkspace-VBVKFwFO.js (removed) 1.32 kB 🟢 -1.32 kB 🟢 -603 B 🟢 -527 B
assets/WidgetLegacy-Bk3xXzaG.js (new) 1.15 kB 🔴 +1.15 kB 🔴 +551 B 🔴 +484 B
assets/WidgetLegacy-D01luRV4.js (removed) 1.15 kB 🟢 -1.15 kB 🟢 -551 B 🟢 -486 B
assets/changeTracker-BNYU77Bn.js (new) 1.12 kB 🔴 +1.12 kB 🔴 +539 B 🔴 +472 B
assets/changeTracker-SwC1QfKv.js (removed) 1.12 kB 🟢 -1.12 kB 🟢 -540 B 🟢 -470 B

Status: 57 added / 57 removed / 78 unchanged

⚡ Performance Report

canvas-idle: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 68.7 MB heap
canvas-mouse-sweep: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 53.9 MB heap
canvas-zoom-sweep: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 46.0 MB heap
dom-widget-clipping: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 54.6 MB heap
large-graph-idle: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 57.7 MB heap
large-graph-pan: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 78.5 MB heap
large-graph-zoom: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 72.3 MB heap
minimap-idle: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 67.2 MB heap
subgraph-dom-widget-clipping: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 55.3 MB heap
subgraph-idle: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 67.9 MB heap
subgraph-mouse-sweep: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 59.7 MB heap
viewport-pan-sweep: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 67.1 MB heap
vue-large-graph-idle: · 58.1 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 164.2 MB heap
vue-large-graph-pan: · 58.1 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 157.6 MB heap
workflow-execution: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 53.1 MB heap

No regressions detected.

All metrics
Metric Baseline PR (median) Δ Sig
canvas-idle: avg frame time 17ms 17ms +0% z=-0.1
canvas-idle: p95 frame time 17ms 17ms +0%
canvas-idle: layout duration 0ms 0ms +0%
canvas-idle: style recalc duration 9ms 7ms -22% z=-4.2
canvas-idle: layout count 0 0 +0%
canvas-idle: style recalc count 9 9 +0% z=-3.8
canvas-idle: task duration 350ms 304ms -13% z=-2.9
canvas-idle: script duration 17ms 15ms -10% z=-4.5
canvas-idle: TBT 0ms 0ms +0%
canvas-idle: heap used 68.4 MB 68.7 MB +0%
canvas-idle: DOM nodes 18 18 +0% z=-3.6
canvas-idle: event listeners 4 6 +50% z=-1.2
canvas-mouse-sweep: avg frame time 17ms 17ms +0% z=-0.4
canvas-mouse-sweep: p95 frame time 17ms 17ms +1%
canvas-mouse-sweep: layout duration 3ms 3ms -11% z=-2.6
canvas-mouse-sweep: style recalc duration 37ms 29ms -22% z=-4.2
canvas-mouse-sweep: layout count 12 12 +0%
canvas-mouse-sweep: style recalc count 74 71 -4% z=-3.3
canvas-mouse-sweep: task duration 776ms 619ms -20% z=-4.2
canvas-mouse-sweep: script duration 132ms 97ms -26% z=-5.9
canvas-mouse-sweep: TBT 0ms 0ms +0%
canvas-mouse-sweep: heap used 51.2 MB 53.9 MB +5%
canvas-mouse-sweep: DOM nodes -259 -211 -19% z=-105.7
canvas-mouse-sweep: event listeners -129 -122 -5% z=-31.3
canvas-zoom-sweep: avg frame time 17ms 17ms +0% z=0.5
canvas-zoom-sweep: p95 frame time 17ms 17ms +0%
canvas-zoom-sweep: layout duration 1ms 1ms -13% z=-2.2
canvas-zoom-sweep: style recalc duration 17ms 14ms -19% z=-3.6
canvas-zoom-sweep: layout count 6 6 +0%
canvas-zoom-sweep: style recalc count 32 32 +0% z=1.6
canvas-zoom-sweep: task duration 295ms 245ms -17% z=-3.6
canvas-zoom-sweep: script duration 19ms 21ms +6% z=-2.2
canvas-zoom-sweep: TBT 0ms 0ms +0%
canvas-zoom-sweep: heap used 46.3 MB 46.0 MB -1%
canvas-zoom-sweep: DOM nodes 77 79 +3% z=-0.3
canvas-zoom-sweep: event listeners 19 19 +0% z=-0.9
dom-widget-clipping: avg frame time 17ms 17ms +0% z=0.1
dom-widget-clipping: p95 frame time 17ms 17ms -1%
dom-widget-clipping: layout duration 0ms 0ms +0%
dom-widget-clipping: style recalc duration 9ms 7ms -17% z=-3.2
dom-widget-clipping: layout count 0 0 +0%
dom-widget-clipping: style recalc count 12 13 +8% z=-0.2
dom-widget-clipping: task duration 341ms 281ms -17% z=-5.1
dom-widget-clipping: script duration 64ms 48ms -26% z=-6.2
dom-widget-clipping: TBT 0ms 0ms +0%
dom-widget-clipping: heap used 54.8 MB 54.6 MB -0%
dom-widget-clipping: DOM nodes 20 20 +0% z=-1.5
dom-widget-clipping: event listeners 0 2 variance too high
large-graph-idle: avg frame time 17ms 17ms +0% z=-0.2
large-graph-idle: p95 frame time 17ms 17ms +1%
large-graph-idle: layout duration 0ms 0ms +0%
large-graph-idle: style recalc duration 9ms 7ms -24% z=-5.1
large-graph-idle: layout count 0 0 +0%
large-graph-idle: style recalc count 8 10 +25% z=-5.1
large-graph-idle: task duration 529ms 421ms -20% z=-2.2
large-graph-idle: script duration 91ms 68ms -25% z=-3.3
large-graph-idle: TBT 0ms 0ms +0%
large-graph-idle: heap used 58.7 MB 57.7 MB -2%
large-graph-idle: DOM nodes -264 -259 -2% z=-313.9
large-graph-idle: event listeners -127 -125 -2% z=-24.8
large-graph-pan: avg frame time 17ms 17ms +0% z=0.3
large-graph-pan: p95 frame time 17ms 17ms -1%
large-graph-pan: layout duration 0ms 0ms +0%
large-graph-pan: style recalc duration 17ms 17ms -1% z=-0.9
large-graph-pan: layout count 0 0 +0%
large-graph-pan: style recalc count 68 68 +0% z=-2.4
large-graph-pan: task duration 1113ms 847ms -24% z=-5.5
large-graph-pan: script duration 444ms 308ms -31% z=-5.1
large-graph-pan: TBT 0ms 0ms +0%
large-graph-pan: heap used 62.6 MB 78.5 MB +26%
large-graph-pan: DOM nodes -265 -260 -2% z=-169.1
large-graph-pan: event listeners -125 -127 +2% z=-159.3
large-graph-zoom: avg frame time 17ms 17ms +0%
large-graph-zoom: p95 frame time 17ms 17ms +1%
large-graph-zoom: layout duration 7ms 7ms +5%
large-graph-zoom: style recalc duration 17ms 17ms -2%
large-graph-zoom: layout count 60 60 +0%
large-graph-zoom: style recalc count 65 66 +2%
large-graph-zoom: task duration 1262ms 1053ms -17%
large-graph-zoom: script duration 468ms 385ms -18%
large-graph-zoom: TBT 0ms 0ms +0%
large-graph-zoom: heap used 66.0 MB 72.3 MB +10%
large-graph-zoom: DOM nodes -268 -263 -2%
large-graph-zoom: event listeners -123 -123 +0%
minimap-idle: avg frame time 17ms 17ms -0% z=-0.9
minimap-idle: p95 frame time 17ms 17ms -1%
minimap-idle: layout duration 0ms 0ms +0%
minimap-idle: style recalc duration 9ms 7ms -25% z=-3.5
minimap-idle: layout count 0 0 +0%
minimap-idle: style recalc count 9 9 +0% z=-0.8
minimap-idle: task duration 523ms 436ms -17% z=-1.9
minimap-idle: script duration 90ms 75ms -17% z=-2.3
minimap-idle: TBT 0ms 0ms +0%
minimap-idle: heap used 61.2 MB 67.2 MB +10%
minimap-idle: DOM nodes -264 -261 -1% z=-204.8
minimap-idle: event listeners -127 -125 -2% z=-196.2
subgraph-dom-widget-clipping: avg frame time 17ms 17ms +0% z=0.1
subgraph-dom-widget-clipping: p95 frame time 17ms 17ms +0%
subgraph-dom-widget-clipping: layout duration 0ms 0ms +0%
subgraph-dom-widget-clipping: style recalc duration 11ms 10ms -9% z=-2.4
subgraph-dom-widget-clipping: layout count 0 0 +0%
subgraph-dom-widget-clipping: style recalc count 47 48 +2% z=0.1
subgraph-dom-widget-clipping: task duration 352ms 277ms -21% z=-5.5
subgraph-dom-widget-clipping: script duration 119ms 96ms -20% z=-5.2
subgraph-dom-widget-clipping: TBT 0ms 0ms +0%
subgraph-dom-widget-clipping: heap used 55.0 MB 55.3 MB +0%
subgraph-dom-widget-clipping: DOM nodes 19 22 +16% z=-0.2
subgraph-dom-widget-clipping: event listeners 6 8 +33% z=-1.4
subgraph-idle: avg frame time 17ms 17ms -0% z=-0.7
subgraph-idle: p95 frame time 17ms 17ms +1%
subgraph-idle: layout duration 0ms 0ms +0%
subgraph-idle: style recalc duration 9ms 7ms -24% z=-4.7
subgraph-idle: layout count 0 0 +0%
subgraph-idle: style recalc count 9 10 +11% z=-1.4
subgraph-idle: task duration 341ms 279ms -18% z=-2.9
subgraph-idle: script duration 17ms 13ms -22% z=-2.6
subgraph-idle: TBT 0ms 0ms +0%
subgraph-idle: heap used 68.2 MB 67.9 MB -0%
subgraph-idle: DOM nodes 18 20 +11% z=-1.2
subgraph-idle: event listeners 4 6 +50% variance too high
subgraph-mouse-sweep: avg frame time 17ms 17ms -0% z=-0.5
subgraph-mouse-sweep: p95 frame time 17ms 17ms +0%
subgraph-mouse-sweep: layout duration 4ms 4ms -11% z=-2.5
subgraph-mouse-sweep: style recalc duration 36ms 32ms -11% z=-3.0
subgraph-mouse-sweep: layout count 16 16 +0%
subgraph-mouse-sweep: style recalc count 77 77 +0% z=-1.6
subgraph-mouse-sweep: task duration 679ms 545ms -20% z=-3.2
subgraph-mouse-sweep: script duration 93ms 77ms -17% z=-3.6
subgraph-mouse-sweep: TBT 0ms 0ms +0%
subgraph-mouse-sweep: heap used 43.9 MB 59.7 MB +36%
subgraph-mouse-sweep: DOM nodes 60 62 +3% z=-2.2
subgraph-mouse-sweep: event listeners -131 4 -103% variance too high
viewport-pan-sweep: avg frame time 17ms 17ms +0%
viewport-pan-sweep: p95 frame time 17ms 17ms +1%
viewport-pan-sweep: layout duration 0ms 0ms +0%
viewport-pan-sweep: style recalc duration 51ms 52ms +1%
viewport-pan-sweep: layout count 0 0 +0%
viewport-pan-sweep: style recalc count 249 250 +0%
viewport-pan-sweep: task duration 3675ms 3007ms -18%
viewport-pan-sweep: script duration 1254ms 1012ms -19%
viewport-pan-sweep: TBT 0ms 0ms +0%
viewport-pan-sweep: heap used 67.4 MB 67.1 MB -0%
viewport-pan-sweep: DOM nodes -263 -257 -2%
viewport-pan-sweep: event listeners -111 -109 -2%
vue-large-graph-idle: avg frame time 17ms 17ms +0%
vue-large-graph-idle: p95 frame time 17ms 17ms +0%
vue-large-graph-idle: layout duration 0ms 0ms +0%
vue-large-graph-idle: style recalc duration 0ms 0ms +0%
vue-large-graph-idle: layout count 0 0 +0%
vue-large-graph-idle: style recalc count 0 0 +0%
vue-large-graph-idle: task duration 12083ms 10932ms -10%
vue-large-graph-idle: script duration 597ms 511ms -14%
vue-large-graph-idle: TBT 0ms 0ms +0%
vue-large-graph-idle: heap used 164.3 MB 164.2 MB -0%
vue-large-graph-idle: DOM nodes -8331 -8331 +0%
vue-large-graph-idle: event listeners -16462 -16464 +0%
vue-large-graph-pan: avg frame time 17ms 17ms +0%
vue-large-graph-pan: p95 frame time 17ms 17ms +0%
vue-large-graph-pan: layout duration 0ms 0ms +0%
vue-large-graph-pan: style recalc duration 16ms 17ms +9%
vue-large-graph-pan: layout count 0 0 +0%
vue-large-graph-pan: style recalc count 68 65 -4%
vue-large-graph-pan: task duration 14169ms 12878ms -9%
vue-large-graph-pan: script duration 890ms 753ms -15%
vue-large-graph-pan: TBT 25ms 0ms -100%
vue-large-graph-pan: heap used 156.2 MB 157.6 MB +1%
vue-large-graph-pan: DOM nodes -8331 -8331 +0%
vue-large-graph-pan: event listeners -16486 -16462 -0%
workflow-execution: avg frame time 17ms 17ms +0% z=0.6
workflow-execution: p95 frame time 17ms 17ms +0%
workflow-execution: layout duration 1ms 1ms +4% z=-3.1
workflow-execution: style recalc duration 20ms 22ms +15% z=-0.8
workflow-execution: layout count 4 4 +0% z=-1.7
workflow-execution: style recalc count 16 19 +19% z=0.6
workflow-execution: task duration 111ms 101ms -9% z=-2.0
workflow-execution: script duration 25ms 20ms -21% z=-3.1
workflow-execution: TBT 0ms 0ms +0%
workflow-execution: heap used 52.6 MB 53.1 MB +1%
workflow-execution: DOM nodes 154 157 +2% z=-0.5
workflow-execution: event listeners 69 71 +3% z=4.4
Historical variance (last 15 runs)
Metric μ σ CV
canvas-idle: avg frame time 17ms 0ms 0.0%
canvas-idle: layout duration 0ms 0ms 0.0%
canvas-idle: style recalc duration 11ms 1ms 8.2%
canvas-idle: layout count 0 0 0.0%
canvas-idle: style recalc count 11 1 5.0%
canvas-idle: task duration 395ms 31ms 7.9%
canvas-idle: script duration 25ms 2ms 8.8%
canvas-idle: TBT 0ms 0ms 0.0%
canvas-idle: DOM nodes 23 1 5.6%
canvas-idle: event listeners 12 5 40.9%
canvas-mouse-sweep: avg frame time 17ms 0ms 0.0%
canvas-mouse-sweep: layout duration 4ms 0ms 5.4%
canvas-mouse-sweep: style recalc duration 43ms 3ms 7.4%
canvas-mouse-sweep: layout count 12 0 0.0%
canvas-mouse-sweep: style recalc count 79 2 3.0%
canvas-mouse-sweep: task duration 865ms 58ms 6.7%
canvas-mouse-sweep: script duration 136ms 6ms 4.8%
canvas-mouse-sweep: TBT 0ms 0ms 0.0%
canvas-mouse-sweep: DOM nodes 62 3 4.2%
canvas-mouse-sweep: event listeners 8 4 49.4%
canvas-zoom-sweep: avg frame time 17ms 0ms 0.0%
canvas-zoom-sweep: layout duration 1ms 0ms 7.0%
canvas-zoom-sweep: style recalc duration 19ms 2ms 8.0%
canvas-zoom-sweep: layout count 6 0 0.0%
canvas-zoom-sweep: style recalc count 31 0 1.5%
canvas-zoom-sweep: task duration 327ms 23ms 7.1%
canvas-zoom-sweep: script duration 27ms 3ms 11.1%
canvas-zoom-sweep: TBT 0ms 0ms 0.0%
canvas-zoom-sweep: DOM nodes 79 1 1.0%
canvas-zoom-sweep: event listeners 24 5 21.8%
dom-widget-clipping: avg frame time 17ms 0ms 0.0%
dom-widget-clipping: layout duration 0ms 0ms 0.0%
dom-widget-clipping: style recalc duration 10ms 1ms 8.0%
dom-widget-clipping: layout count 0 0 0.0%
dom-widget-clipping: style recalc count 13 0 3.8%
dom-widget-clipping: task duration 365ms 16ms 4.5%
dom-widget-clipping: script duration 68ms 3ms 4.8%
dom-widget-clipping: TBT 0ms 0ms 0.0%
dom-widget-clipping: DOM nodes 22 1 6.4%
dom-widget-clipping: event listeners 8 6 81.2%
large-graph-idle: avg frame time 17ms 0ms 0.0%
large-graph-idle: layout duration 0ms 0ms 0.0%
large-graph-idle: style recalc duration 12ms 1ms 8.6%
large-graph-idle: layout count 0 0 0.0%
large-graph-idle: style recalc count 12 0 2.7%
large-graph-idle: task duration 542ms 54ms 10.0%
large-graph-idle: script duration 102ms 11ms 10.3%
large-graph-idle: TBT 0ms 0ms 0.0%
large-graph-idle: DOM nodes 25 1 3.7%
large-graph-idle: event listeners 26 6 23.2%
large-graph-pan: avg frame time 17ms 0ms 0.0%
large-graph-pan: layout duration 0ms 0ms 0.0%
large-graph-pan: style recalc duration 17ms 1ms 4.6%
large-graph-pan: layout count 0 0 0.0%
large-graph-pan: style recalc count 70 1 0.9%
large-graph-pan: task duration 1082ms 43ms 4.0%
large-graph-pan: script duration 408ms 20ms 4.8%
large-graph-pan: TBT 0ms 0ms 0.0%
large-graph-pan: DOM nodes 19 2 8.7%
large-graph-pan: event listeners 5 1 16.8%
minimap-idle: avg frame time 17ms 0ms 0.0%
minimap-idle: layout duration 0ms 0ms 0.0%
minimap-idle: style recalc duration 10ms 1ms 8.6%
minimap-idle: layout count 0 0 0.0%
minimap-idle: style recalc count 10 1 7.1%
minimap-idle: task duration 527ms 47ms 9.0%
minimap-idle: script duration 98ms 10ms 10.1%
minimap-idle: TBT 0ms 0ms 0.0%
minimap-idle: DOM nodes 19 1 7.1%
minimap-idle: event listeners 5 1 14.4%
subgraph-dom-widget-clipping: avg frame time 17ms 0ms 0.0%
subgraph-dom-widget-clipping: layout duration 0ms 0ms 0.0%
subgraph-dom-widget-clipping: style recalc duration 13ms 1ms 7.4%
subgraph-dom-widget-clipping: layout count 0 0 0.0%
subgraph-dom-widget-clipping: style recalc count 48 1 1.2%
subgraph-dom-widget-clipping: task duration 378ms 18ms 4.9%
subgraph-dom-widget-clipping: script duration 128ms 6ms 4.9%
subgraph-dom-widget-clipping: TBT 0ms 0ms 0.0%
subgraph-dom-widget-clipping: DOM nodes 22 1 5.0%
subgraph-dom-widget-clipping: event listeners 16 6 36.0%
subgraph-idle: avg frame time 17ms 0ms 0.0%
subgraph-idle: layout duration 0ms 0ms 0.0%
subgraph-idle: style recalc duration 10ms 1ms 7.5%
subgraph-idle: layout count 0 0 0.0%
subgraph-idle: style recalc count 11 1 6.0%
subgraph-idle: task duration 370ms 31ms 8.5%
subgraph-idle: script duration 20ms 3ms 13.2%
subgraph-idle: TBT 0ms 0ms 0.0%
subgraph-idle: DOM nodes 22 1 6.9%
subgraph-idle: event listeners 10 7 64.5%
subgraph-mouse-sweep: avg frame time 17ms 0ms 0.0%
subgraph-mouse-sweep: layout duration 5ms 0ms 6.8%
subgraph-mouse-sweep: style recalc duration 42ms 3ms 7.8%
subgraph-mouse-sweep: layout count 16 0 0.0%
subgraph-mouse-sweep: style recalc count 80 2 2.4%
subgraph-mouse-sweep: task duration 766ms 69ms 9.0%
subgraph-mouse-sweep: script duration 101ms 7ms 6.5%
subgraph-mouse-sweep: TBT 0ms 0ms 0.0%
subgraph-mouse-sweep: DOM nodes 67 2 3.3%
subgraph-mouse-sweep: event listeners 8 4 52.6%
workflow-execution: avg frame time 17ms 0ms 0.0%
workflow-execution: layout duration 2ms 0ms 9.4%
workflow-execution: style recalc duration 24ms 2ms 9.1%
workflow-execution: layout count 5 1 11.0%
workflow-execution: style recalc count 18 2 11.5%
workflow-execution: task duration 123ms 11ms 8.8%
workflow-execution: script duration 29ms 3ms 10.2%
workflow-execution: TBT 0ms 0ms 0.0%
workflow-execution: DOM nodes 161 7 4.4%
workflow-execution: event listeners 52 4 8.4%
Trend (last 15 commits on main)
Metric Trend Dir Latest
canvas-idle: avg frame time ▆▃▆▁▆▃▆█▆▆▄▃▃▄▃ ➡️ 17ms
canvas-idle: p95 frame time ➡️ NaNms
canvas-idle: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
canvas-idle: style recalc duration ▇▇▆▆▃█▄▃▄▃▇▄▁▆▇ ➡️ 11ms
canvas-idle: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
canvas-idle: style recalc count █▃▅▂▅▆▃▁▂▁▂▅▆▅▆ ➡️ 12
canvas-idle: task duration ▃▃▃▆▂▃▃▅▆▂█▃▁▃▃ ➡️ 391ms
canvas-idle: script duration ▄▃▅▇▂▅▃▆▇▅█▄▁▅▆ ➡️ 27ms
canvas-idle: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
canvas-idle: heap used ➡️ NaN MB
canvas-idle: DOM nodes █▇▆▅▃▇▃▁▂▂▅▆▆▆▇ ➡️ 24
canvas-idle: event listeners ▅█▅▄▁▅▁▁▁▄▅▅▁▅▄ 📉 11
canvas-mouse-sweep: avg frame time ▆█▆▃▁▃▁▆▆▁▃▆▆▃▃ ➡️ 17ms
canvas-mouse-sweep: p95 frame time ➡️ NaNms
canvas-mouse-sweep: layout duration ▁▃▂▄▁▂▁▃▆▂█▇▆▄▃ ➡️ 4ms
canvas-mouse-sweep: style recalc duration ▄▄▂▄▁▂▃▃▅▄█▆▂▄▄ ➡️ 43ms
canvas-mouse-sweep: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 12
canvas-mouse-sweep: style recalc count █▅▄▃▂▂▁▄▄▅▆▅▂▇▄ ➡️ 79
canvas-mouse-sweep: task duration █▆▄▂▂▃▂▄▄▅█▆▁▆▄ ➡️ 868ms
canvas-mouse-sweep: script duration ▄▅▄▆▄▆▆▆▅▅█▆▁▅▆ ➡️ 139ms
canvas-mouse-sweep: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
canvas-mouse-sweep: heap used ➡️ NaN MB
canvas-mouse-sweep: DOM nodes █▅▃▃▁▂▂▃▂▄▆▅▃▅▅ ➡️ 64
canvas-mouse-sweep: event listeners █▁▁▁▁▁▇▁▁▁██▇▁█ 📈 13
canvas-zoom-sweep: avg frame time ▅▅█▄▅▁▁▁▅▁▁▅▄▅▁ ➡️ 17ms
canvas-zoom-sweep: p95 frame time ➡️ NaNms
canvas-zoom-sweep: layout duration ▆▅▅▄▁▁█▅▃▅▇▆▁▂▆ ➡️ 1ms
canvas-zoom-sweep: style recalc duration ▆▅▄▆▅▃█▆▇▅▇▄▁▃▅ ➡️ 20ms
canvas-zoom-sweep: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 6
canvas-zoom-sweep: style recalc count ▁▁▃▄▆▃▆█▄▄▆▁▆▁▆ ➡️ 32
canvas-zoom-sweep: task duration ▄▂▁▇▂▂▄▅▆▃█▄▁▁▅ ➡️ 338ms
canvas-zoom-sweep: script duration ▃▃▂▇▂▂▅▇▆▅█▄▁▂▆ ➡️ 30ms
canvas-zoom-sweep: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
canvas-zoom-sweep: heap used ➡️ NaN MB
canvas-zoom-sweep: DOM nodes ▄▃▁▅█▁▃▆▄▅▅▃▃▄▃ ➡️ 79
canvas-zoom-sweep: event listeners ▁▁▂▅█▂▁▅▁▅▅▄▁▅▁ ➡️ 19
dom-widget-clipping: avg frame time ▂▄▅▅▂▄█▇▅▇▇▅▅▁▇ ➡️ 17ms
dom-widget-clipping: p95 frame time ➡️ NaNms
dom-widget-clipping: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
dom-widget-clipping: style recalc duration ▆▆▂▆▄▃██▄▁▆▇▆▃▅ ➡️ 10ms
dom-widget-clipping: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
dom-widget-clipping: style recalc count ▇█▅█▅▄█▇▇▁▇▄▇▂▅ ➡️ 13
dom-widget-clipping: task duration ▃▃▁▅▄▃▅▆▅▂▇█▁▅▅ ➡️ 371ms
dom-widget-clipping: script duration ▅▄▄▆▆▅▇▇▆▃█▇▁▇▇ ➡️ 71ms
dom-widget-clipping: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
dom-widget-clipping: heap used ➡️ NaN MB
dom-widget-clipping: DOM nodes ▇▇▄▇▅▄█▇▅▁▅▄▇▃▄ ➡️ 21
dom-widget-clipping: event listeners ▅▅▅▅▁▅██▁▁▁▁█▁▁ 📉 2
large-graph-idle: avg frame time ▅▅▅▅▅▂▁▂▄▅▄▂▂▅█ ➡️ 17ms
large-graph-idle: p95 frame time ➡️ NaNms
large-graph-idle: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
large-graph-idle: style recalc duration ▅▅▅▆▄▅▃▄▅▅▆█▁▄▆ ➡️ 13ms
large-graph-idle: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
large-graph-idle: style recalc count █▆█▃▃▁▃▆▃▆▆▃▆██ ➡️ 12
large-graph-idle: task duration ▂▃▂▆▂▃▃▇▅▃██▁▂▅ ➡️ 569ms
large-graph-idle: script duration ▄▅▄▆▄▅▅▇▆▅█▆▁▃▆ ➡️ 110ms
large-graph-idle: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
large-graph-idle: heap used ➡️ NaN MB
large-graph-idle: DOM nodes ▆█▅▂▅▃▁▂▃▅▅▆▂▆▅ ➡️ 25
large-graph-idle: event listeners ███▇██▄▁▄▇▇█▂█▇ ➡️ 29
large-graph-pan: avg frame time ▆▃▃▆█▃▁█▆▆▆▆█▁▆ ➡️ 17ms
large-graph-pan: p95 frame time ➡️ NaNms
large-graph-pan: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
large-graph-pan: style recalc duration ▃▂▄▄▁▅▂▂▁▄▄█▃▁▂ ➡️ 17ms
large-graph-pan: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
large-graph-pan: style recalc count ▆▃█▂▃▂▂▂▁▇▅▃█▆▃ ➡️ 69
large-graph-pan: task duration ▄▃▄▆▄▄▄▆▄▄█▆▁▂▅ ➡️ 1100ms
large-graph-pan: script duration ▅▄▅▆▆▅▄▆▄▅█▄▁▄▅ ➡️ 413ms
large-graph-pan: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
large-graph-pan: heap used ➡️ NaN MB
large-graph-pan: DOM nodes ▅▃▆▂▄▁▃▁▁▅▁▂█▅▂ ➡️ 18
large-graph-pan: event listeners █▆█▁▁▆▁▁▃▆▁▃██▃ ➡️ 5
minimap-idle: avg frame time ▃▆▆▃█▁█▆▆▃▃▆█▆█ ➡️ 17ms
minimap-idle: p95 frame time ➡️ NaNms
minimap-idle: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
minimap-idle: style recalc duration ▄█▁█▅▅█▅▅▃▅▁▁▄▆ ➡️ 10ms
minimap-idle: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
minimap-idle: style recalc count ▃▅▂▄█▃▆▁▂▅▂▁▅▆▃ ➡️ 9
minimap-idle: task duration ▃▄▁▅▁▃▄▅▇▃█▅▁▁▅ ➡️ 547ms
minimap-idle: script duration ▄▆▃▇▃▅▆▆▇▅█▅▁▃▆ ➡️ 106ms
minimap-idle: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
minimap-idle: heap used ➡️ NaN MB
minimap-idle: DOM nodes ▃▅▂▄█▃▆▁▂▅▂▁▅▆▃ ➡️ 19
minimap-idle: event listeners ▃▃▆▁▁▁▃▁▁▆▁▃█▆▁ ➡️ 4
subgraph-dom-widget-clipping: avg frame time ▅▄▄▄▄▄█▄▄▄▃▁▆▃▃ ➡️ 17ms
subgraph-dom-widget-clipping: p95 frame time ➡️ NaNms
subgraph-dom-widget-clipping: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-dom-widget-clipping: style recalc duration ▂▄▃▅▅▃▂▅▇▃▄█▁▄▆ ➡️ 14ms
subgraph-dom-widget-clipping: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
subgraph-dom-widget-clipping: style recalc count ▇█▆▃▆▃▁▆█▇▃▆▇█▅ ➡️ 48
subgraph-dom-widget-clipping: task duration ▂▃▃▆▅▅▂▅█▂▆█▁▂▇ ➡️ 398ms
subgraph-dom-widget-clipping: script duration ▃▃▃▄▅▅▂▄█▂▅▇▁▂▅ ➡️ 131ms
subgraph-dom-widget-clipping: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-dom-widget-clipping: heap used ➡️ NaN MB
subgraph-dom-widget-clipping: DOM nodes ▅▇▅▂▅▂▁▅▅▅▁▇▅█▄ ➡️ 22
subgraph-dom-widget-clipping: event listeners ▅▅▅▂▅▁▅██▁▁█▅█▅ 📈 16
subgraph-idle: avg frame time ▆▆█▁▆▃▆▆▆▃▆▁▃▆█ ➡️ 17ms
subgraph-idle: p95 frame time ➡️ NaNms
subgraph-idle: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-idle: style recalc duration ▁▇▃▆▂▄▂▃▃▆▆▄▃▇█ ➡️ 12ms
subgraph-idle: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
subgraph-idle: style recalc count ▃▆▃▃▂▅▁▂▁▆▃▃██▇ ➡️ 12
subgraph-idle: task duration ▁▃▁▇▁▁▃▆▅▂█▅▁▁▄ ➡️ 378ms
subgraph-idle: script duration ▁▃▂▇▁▂▃▇▆▂█▅▂▁▅ ➡️ 22ms
subgraph-idle: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-idle: heap used ➡️ NaN MB
subgraph-idle: DOM nodes ▃▅▃▂▁▄▁▂▁▅▃▂▇█▇ ➡️ 24
subgraph-idle: event listeners ▁▅▁▁▁▁▁▁▁▅▄▁███ 📈 21
subgraph-mouse-sweep: avg frame time ▅▄▁▃▃▄▆▄▆▃▃█▁▃▃ ➡️ 17ms
subgraph-mouse-sweep: p95 frame time ➡️ NaNms
subgraph-mouse-sweep: layout duration ▁▄▄▄▃▃▅▅▅▂█▇▂▃▆ ➡️ 5ms
subgraph-mouse-sweep: style recalc duration ▃▂▄▅▂▃▄▅█▃█▆▁▂▅ ➡️ 43ms
subgraph-mouse-sweep: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 16
subgraph-mouse-sweep: style recalc count ▅▂▅▅▁▄▃▅█▅▆▄▂▄▅ ➡️ 81
subgraph-mouse-sweep: task duration ▃▂▄▅▂▄▄▅▇▄█▆▁▃▅ ➡️ 785ms
subgraph-mouse-sweep: script duration ▄▅▄▇▅▅▆▇▆▅██▁▄▆ ➡️ 105ms
subgraph-mouse-sweep: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-mouse-sweep: heap used ➡️ NaN MB
subgraph-mouse-sweep: DOM nodes ▅▁▄▅▁▄▃▃█▅▅▄▂▅▃ ➡️ 66
subgraph-mouse-sweep: event listeners ▇▁▂▇▁▂▂▂█▇▂▂▇▇▂ 📈 5
workflow-execution: avg frame time ▆▆▆▄▆▆▃▄▁▄█▆▅▄▆ ➡️ 17ms
workflow-execution: p95 frame time ➡️ NaNms
workflow-execution: layout duration ▁▆▁▃▂▄▃▂▃▃▅█▄▂▅ ➡️ 2ms
workflow-execution: style recalc duration ▃▇▅▇▁▅▆▇█▁██▂▄▆ ➡️ 25ms
workflow-execution: layout count ▁█▂▃▂▃▃▁▃▃▄▃▂▃▂ ➡️ 5
workflow-execution: style recalc count ▃█▅▇▁▄▅▆▅▅▅▅▄▄▂ ➡️ 15
workflow-execution: task duration ▂▅▄▅▁▄▆▆▆▁▇█▁▃▃ ➡️ 120ms
workflow-execution: script duration ▄▃▄▄▃▅▄▅▆▂▇█▁▃▄ ➡️ 29ms
workflow-execution: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
workflow-execution: heap used ➡️ NaN MB
workflow-execution: DOM nodes ▂█▃▆▁▄▃▅▃█▃▃▄▃▁ ➡️ 152
workflow-execution: event listeners ▅███▁▅███▁██▅█▅ ➡️ 49
Raw data
{
  "timestamp": "2026-05-01T09:00:12.653Z",
  "gitSha": "ec074a05d0aafb31ebb5000152ec4e3ba7af64f6",
  "branch": "glary/syntax-998-spotlight-fallow",
  "measurements": [
    {
      "name": "canvas-idle",
      "durationMs": 2045.6100000000106,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 6.9869999999999965,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 330.2440000000001,
      "heapDeltaBytes": 23119916,
      "heapUsedBytes": 72427200,
      "domNodes": 16,
      "jsHeapTotalBytes": 14942208,
      "scriptDurationMs": 17.419999999999998,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "canvas-idle",
      "durationMs": 2009.6360000000004,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 7.516,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 304.417,
      "heapDeltaBytes": 23383872,
      "heapUsedBytes": 72018516,
      "domNodes": 20,
      "jsHeapTotalBytes": 15466496,
      "scriptDurationMs": 15.231,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-idle",
      "durationMs": 1989.736999999991,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 7.104000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 291.13100000000003,
      "heapDeltaBytes": 22715132,
      "heapUsedBytes": 71020316,
      "domNodes": 18,
      "jsHeapTotalBytes": 14942208,
      "scriptDurationMs": 13.813,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1691.4560000000165,
      "styleRecalcs": 72,
      "styleRecalcDurationMs": 29.241000000000003,
      "layouts": 12,
      "layoutDurationMs": 3.1029999999999998,
      "taskDurationMs": 618.535,
      "heapDeltaBytes": 18211356,
      "heapUsedBytes": 66132088,
      "domNodes": 55,
      "jsHeapTotalBytes": 15990784,
      "scriptDurationMs": 99.358,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 2201.5140000000883,
      "styleRecalcs": 69,
      "styleRecalcDurationMs": 32.564,
      "layouts": 18,
      "layoutDurationMs": 3.498,
      "taskDurationMs": 611.899,
      "heapDeltaBytes": 8072140,
      "heapUsedBytes": 56476812,
      "domNodes": -211,
      "jsHeapTotalBytes": 16379904,
      "scriptDurationMs": 89.17999999999999,
      "eventListeners": -122,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1695.920000000001,
      "styleRecalcs": 71,
      "styleRecalcDurationMs": 27.583000000000002,
      "layouts": 12,
      "layoutDurationMs": 2.9949999999999997,
      "taskDurationMs": 640.924,
      "heapDeltaBytes": -3660300,
      "heapUsedBytes": 44753360,
      "domNodes": -262,
      "jsHeapTotalBytes": 15855616,
      "scriptDurationMs": 97.36800000000001,
      "eventListeners": -129,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1718.498000000011,
      "styleRecalcs": 32,
      "styleRecalcDurationMs": 13.558,
      "layouts": 6,
      "layoutDurationMs": 0.5660000000000001,
      "taskDurationMs": 244.58,
      "heapDeltaBytes": 542348,
      "heapUsedBytes": 49530268,
      "domNodes": 79,
      "jsHeapTotalBytes": 15466496,
      "scriptDurationMs": 20.569000000000003,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1721.053999999981,
      "styleRecalcs": 33,
      "styleRecalcDurationMs": 13.526000000000002,
      "layouts": 6,
      "layoutDurationMs": 0.544,
      "taskDurationMs": 231.741,
      "heapDeltaBytes": -71944,
      "heapUsedBytes": 48252256,
      "domNodes": 79,
      "jsHeapTotalBytes": 14680064,
      "scriptDurationMs": 15.632,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.669999999999998,
      "p95FrameDurationMs": 16.799999999999727
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1717.3510000000078,
      "styleRecalcs": 32,
      "styleRecalcDurationMs": 16.247999999999998,
      "layouts": 6,
      "layoutDurationMs": 0.5450000000000002,
      "taskDurationMs": 293.49,
      "heapDeltaBytes": 209264,
      "heapUsedBytes": 48024240,
      "domNodes": 79,
      "jsHeapTotalBytes": 14942208,
      "scriptDurationMs": 27.749999999999996,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000273
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 476.22200000000703,
      "styleRecalcs": 12,
      "styleRecalcDurationMs": 6.694999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 281.09000000000003,
      "heapDeltaBytes": 9035420,
      "heapUsedBytes": 57292364,
      "domNodes": 19,
      "jsHeapTotalBytes": 15466496,
      "scriptDurationMs": 46.345000000000006,
      "eventListeners": 2,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000273
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 422.4490000000287,
      "styleRecalcs": 13,
      "styleRecalcDurationMs": 7.377,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 266.748,
      "heapDeltaBytes": 9312232,
      "heapUsedBytes": 58469056,
      "domNodes": 21,
      "jsHeapTotalBytes": 15204352,
      "scriptDurationMs": 47.67900000000001,
      "eventListeners": 2,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000273
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 471.4410000000271,
      "styleRecalcs": 13,
      "styleRecalcDurationMs": 8.196,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 284.106,
      "heapDeltaBytes": 9082052,
      "heapUsedBytes": 56832908,
      "domNodes": 20,
      "jsHeapTotalBytes": 14942208,
      "scriptDurationMs": 51.225,
      "eventListeners": 2,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2014.5570000000248,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 6.816000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 420.76199999999994,
      "heapDeltaBytes": 5293384,
      "heapUsedBytes": 62316000,
      "domNodes": -256,
      "jsHeapTotalBytes": -757760,
      "scriptDurationMs": 67.885,
      "eventListeners": -125,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "large-graph-idle",
      "durationMs": 1998.6450000000104,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 7.198999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 419.527,
      "heapDeltaBytes": 1746432,
      "heapUsedBytes": 60427852,
      "domNodes": -261,
      "jsHeapTotalBytes": 5009408,
      "scriptDurationMs": 65.71499999999999,
      "eventListeners": -125,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "large-graph-idle",
      "durationMs": 1999.9099999999999,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 6.841,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 438.47200000000004,
      "heapDeltaBytes": 2271556,
      "heapUsedBytes": 60462276,
      "domNodes": -259,
      "jsHeapTotalBytes": 5271552,
      "scriptDurationMs": 68.37,
      "eventListeners": -125,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2085.5150000000435,
      "styleRecalcs": 69,
      "styleRecalcDurationMs": 16.924000000000003,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 846.8930000000001,
      "heapDeltaBytes": 26255476,
      "heapUsedBytes": 84034728,
      "domNodes": -257,
      "jsHeapTotalBytes": 3379200,
      "scriptDurationMs": 308.20399999999995,
      "eventListeners": -125,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2071.2859999999864,
      "styleRecalcs": 68,
      "styleRecalcDurationMs": 15.946000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 838.0989999999999,
      "heapDeltaBytes": 23069132,
      "heapUsedBytes": 82336600,
      "domNodes": -260,
      "jsHeapTotalBytes": 6000640,
      "scriptDurationMs": 296.967,
      "eventListeners": -127,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000012,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2089.9429999999484,
      "styleRecalcs": 67,
      "styleRecalcDurationMs": 16.615000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 991.957,
      "heapDeltaBytes": -642108,
      "heapUsedBytes": 63031556,
      "domNodes": -265,
      "jsHeapTotalBytes": 7548928,
      "scriptDurationMs": 384.2829999999999,
      "eventListeners": -127,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 3089.0249999999924,
      "styleRecalcs": 66,
      "styleRecalcDurationMs": 17.075999999999997,
      "layouts": 60,
      "layoutDurationMs": 7.116999999999999,
      "taskDurationMs": 1052.74,
      "heapDeltaBytes": 15442600,
      "heapUsedBytes": 75813508,
      "domNodes": -263,
      "jsHeapTotalBytes": -233472,
      "scriptDurationMs": 384.683,
      "eventListeners": -123,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 3053.3349999999473,
      "styleRecalcs": 66,
      "styleRecalcDurationMs": 16.879,
      "layouts": 60,
      "layoutDurationMs": 6.789000000000001,
      "taskDurationMs": 1035.8839999999998,
      "heapDeltaBytes": 8420468,
      "heapUsedBytes": 69027836,
      "domNodes": -263,
      "jsHeapTotalBytes": 5533696,
      "scriptDurationMs": 377.43899999999996,
      "eventListeners": -123,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 3121.4610000000675,
      "styleRecalcs": 67,
      "styleRecalcDurationMs": 19.150999999999996,
      "layouts": 60,
      "layoutDurationMs": 7.5760000000000005,
      "taskDurationMs": 1124.4990000000003,
      "heapDeltaBytes": 15258368,
      "heapUsedBytes": 75861300,
      "domNodes": -262,
      "jsHeapTotalBytes": -233472,
      "scriptDurationMs": 414.39400000000006,
      "eventListeners": -123,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "minimap-idle",
      "durationMs": 2016.313000000025,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 6.690999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 435.502,
      "heapDeltaBytes": 2860276,
      "heapUsedBytes": 62951548,
      "domNodes": -261,
      "jsHeapTotalBytes": 552960,
      "scriptDurationMs": 65.95,
      "eventListeners": -125,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "minimap-idle",
      "durationMs": 2022.4279999999908,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 6.571000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 429.70900000000006,
      "heapDeltaBytes": 12961388,
      "heapUsedBytes": 70990520,
      "domNodes": -259,
      "jsHeapTotalBytes": 28672,
      "scriptDurationMs": 74.99600000000001,
      "eventListeners": -123,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "minimap-idle",
      "durationMs": 2020.5809999999929,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 8.106000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 524.414,
      "heapDeltaBytes": 10606400,
      "heapUsedBytes": 70454728,
      "domNodes": -261,
      "jsHeapTotalBytes": -495616,
      "scriptDurationMs": 86.503,
      "eventListeners": -125,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 454.00699999999006,
      "styleRecalcs": 48,
      "styleRecalcDurationMs": 10.544999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 277.037,
      "heapDeltaBytes": 8840340,
      "heapUsedBytes": 57523400,
      "domNodes": 22,
      "jsHeapTotalBytes": 16515072,
      "scriptDurationMs": 94.403,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000273
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 441.26700000003893,
      "styleRecalcs": 48,
      "styleRecalcDurationMs": 9.886,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 275.358,
      "heapDeltaBytes": 9917692,
      "heapUsedBytes": 59121536,
      "domNodes": 22,
      "jsHeapTotalBytes": 15466496,
      "scriptDurationMs": 95.522,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000273
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 487.7129999999852,
      "styleRecalcs": 48,
      "styleRecalcDurationMs": 10.417000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 291.637,
      "heapDeltaBytes": 9182012,
      "heapUsedBytes": 57969660,
      "domNodes": 20,
      "jsHeapTotalBytes": 15728640,
      "scriptDurationMs": 98.646,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000273
    },
    {
      "name": "subgraph-idle",
      "durationMs": 1998.3760000000075,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 6.2540000000000004,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 278.90000000000003,
      "heapDeltaBytes": 1234252,
      "heapUsedBytes": 69854244,
      "domNodes": 17,
      "jsHeapTotalBytes": 17920000,
      "scriptDurationMs": 13.259999999999998,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2008.2660000000487,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 6.746,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 265.164,
      "heapDeltaBytes": 22514504,
      "heapUsedBytes": 71236864,
      "domNodes": 20,
      "jsHeapTotalBytes": 14417920,
      "scriptDurationMs": 10.757000000000001,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2007.9010000000608,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 14.33,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 289.43700000000007,
      "heapDeltaBytes": 22505396,
      "heapUsedBytes": 71329216,
      "domNodes": 21,
      "jsHeapTotalBytes": 14942208,
      "scriptDurationMs": 14.540999999999999,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1712.4979999999823,
      "styleRecalcs": 76,
      "styleRecalcDurationMs": 32.457,
      "layouts": 16,
      "layoutDurationMs": 3.879,
      "taskDurationMs": 544.702,
      "heapDeltaBytes": 13985872,
      "heapUsedBytes": 62631952,
      "domNodes": 62,
      "jsHeapTotalBytes": 15204352,
      "scriptDurationMs": 77.248,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.663333333333338,
      "p95FrameDurationMs": 16.700000000000273
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1686.2200000000485,
      "styleRecalcs": 77,
      "styleRecalcDurationMs": 29.441000000000003,
      "layouts": 16,
      "layoutDurationMs": 3.5700000000000003,
      "taskDurationMs": 508.05699999999996,
      "heapDeltaBytes": 14386440,
      "heapUsedBytes": 62980608,
      "domNodes": 64,
      "jsHeapTotalBytes": 14942208,
      "scriptDurationMs": 74.517,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.663333333333338,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1701.8829999999525,
      "styleRecalcs": 78,
      "styleRecalcDurationMs": 32.601000000000006,
      "layouts": 16,
      "layoutDurationMs": 3.973,
      "taskDurationMs": 603.423,
      "heapDeltaBytes": -4092100,
      "heapUsedBytes": 43798428,
      "domNodes": -256,
      "jsHeapTotalBytes": 14544896,
      "scriptDurationMs": 83.02499999999999,
      "eventListeners": -129,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 8132.661999999982,
      "styleRecalcs": 250,
      "styleRecalcDurationMs": 51.793000000000006,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 3006.641,
      "heapDeltaBytes": 16901864,
      "heapUsedBytes": 75064616,
      "domNodes": -256,
      "jsHeapTotalBytes": 5214208,
      "scriptDurationMs": 1024.1749999999997,
      "eventListeners": -109,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000012,
      "p95FrameDurationMs": 16.80000000000109
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 8132.632999999942,
      "styleRecalcs": 250,
      "styleRecalcDurationMs": 50.315000000000005,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 2901.181,
      "heapDeltaBytes": 11515352,
      "heapUsedBytes": 67785332,
      "domNodes": -257,
      "jsHeapTotalBytes": 7311360,
      "scriptDurationMs": 975.4549999999999,
      "eventListeners": -111,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 8133.4869999999455,
      "styleRecalcs": 250,
      "styleRecalcDurationMs": 53.91599999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 3244.071,
      "heapDeltaBytes": 12389632,
      "heapUsedBytes": 70358512,
      "domNodes": -259,
      "jsHeapTotalBytes": 7049216,
      "scriptDurationMs": 1012.3009999999999,
      "eventListeners": -109,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.80000000000109
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 10942.64800000002,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 10905.905,
      "heapDeltaBytes": -34703092,
      "heapUsedBytes": 172159296,
      "domNodes": -8331,
      "jsHeapTotalBytes": 24440832,
      "scriptDurationMs": 501.205,
      "eventListeners": -16464,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.220000000000073,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 10967.660000000024,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 10931.528999999999,
      "heapDeltaBytes": -26594136,
      "heapUsedBytes": 171929124,
      "domNodes": -8336,
      "jsHeapTotalBytes": 25751552,
      "scriptDurationMs": 511.311,
      "eventListeners": -16466,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.223333333333358,
      "p95FrameDurationMs": 16.80000000000291
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 11263.811000000032,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 11240.199,
      "heapDeltaBytes": -41124316,
      "heapUsedBytes": 172316316,
      "domNodes": -8331,
      "jsHeapTotalBytes": 26800128,
      "scriptDurationMs": 528.278,
      "eventListeners": -16464,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.223333333333358,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 12905.654999999968,
      "styleRecalcs": 65,
      "styleRecalcDurationMs": 17.072000000000003,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 12878.265,
      "heapDeltaBytes": -32909212,
      "heapUsedBytes": 165258616,
      "domNodes": -8331,
      "jsHeapTotalBytes": -4132864,
      "scriptDurationMs": 735.562,
      "eventListeners": -16460,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.223333333333358,
      "p95FrameDurationMs": 16.80000000000291
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 13066.508999999996,
      "styleRecalcs": 65,
      "styleRecalcDurationMs": 17.052999999999983,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 13044.346000000001,
      "heapDeltaBytes": -43115612,
      "heapUsedBytes": 153329376,
      "domNodes": -8339,
      "jsHeapTotalBytes": -2297856,
      "scriptDurationMs": 753.332,
      "eventListeners": -16488,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.223333333333358,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 12801.870000000008,
      "styleRecalcs": 65,
      "styleRecalcDurationMs": 16.887999999999987,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 12775.414,
      "heapDeltaBytes": -19132616,
      "heapUsedBytes": 176658616,
      "domNodes": -8331,
      "jsHeapTotalBytes": -11296768,
      "scriptDurationMs": 757.5099999999999,
      "eventListeners": -16462,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.776666666666763,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "workflow-execution",
      "durationMs": 439.82200000004923,
      "styleRecalcs": 19,
      "styleRecalcDurationMs": 21.721000000000004,
      "layouts": 4,
      "layoutDurationMs": 1.1440000000000001,
      "taskDurationMs": 101.039,
      "heapDeltaBytes": 5277268,
      "heapUsedBytes": 56490340,
      "domNodes": 168,
      "jsHeapTotalBytes": 262144,
      "scriptDurationMs": 19.744999999999997,
      "eventListeners": 71,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "workflow-execution",
      "durationMs": 441.6840000000093,
      "styleRecalcs": 19,
      "styleRecalcDurationMs": 22.403,
      "layouts": 4,
      "layoutDurationMs": 0.9119999999999998,
      "taskDurationMs": 99.248,
      "heapDeltaBytes": 5044920,
      "heapUsedBytes": 55078140,
      "domNodes": 157,
      "jsHeapTotalBytes": 262144,
      "scriptDurationMs": 18.768,
      "eventListeners": 71,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "workflow-execution",
      "durationMs": 445.96999999998843,
      "styleRecalcs": 18,
      "styleRecalcDurationMs": 24.744000000000003,
      "layouts": 4,
      "layoutDurationMs": 1.099,
      "taskDurationMs": 114.05699999999999,
      "heapDeltaBytes": 5154156,
      "heapUsedBytes": 55707292,
      "domNodes": 156,
      "jsHeapTotalBytes": 0,
      "scriptDurationMs": 24.473000000000003,
      "eventListeners": 71,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000273
    }
  ]
}

@coderabbitai coderabbitai Bot 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.

Actionable comments posted: 1

🧹 Nitpick comments (1)
src/main.ts (1)

62-101: Add a focused test matrix for Spotlight Sentry config.

Please add unit coverage for Spotlight on/off with/without DSN to lock in dsn, enabled, and tracesSampleRate behavior.

Based on learnings: "Applies to src/**/*.test.ts : Write tests for all changes, especially bug fixes to catch future regressions".

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/main.ts` around lines 62 - 101, Add unit tests that exercise the
Sentry.init config in main.ts for the four combinations of __SPOTLIGHT_ENABLED__
true/false and sentryDsn present/empty; for each combination assert the
resulting config's dsn, enabled, and tracesSampleRate values match expected
behavior (when __SPOTLIGHT_ENABLED__ && !sentryDsn -> dsn ===
'https://spotlight@local/0', enabled === true; when sentryDsn provided -> dsn
=== sentryDsn; enabled should be __SENTRY_ENABLED__ || __SPOTLIGHT_ENABLED__;
tracesSampleRate should be 1.0 when isCloud || __SPOTLIGHT_ENABLED__ else 0), by
mocking or spying on Sentry.init to capture its argument and using test cases
that toggle __SPOTLIGHT_ENABLED__, sentryDsn, and isCloud to validate
Sentry.init was called with correct properties.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/main.ts`:
- Around line 66-69: The dsn assignment currently uses the placeholder only when
__SPOTLIGHT_ENABLED__ && !sentryDsn, which still allows a real sentryDsn to be
used when spotlight is enabled; change the dsn logic so that whenever
__SPOTLIGHT_ENABLED__ is true it always returns the local placeholder
('https://spotlight@local/0') regardless of sentryDsn. Locate the dsn property
assignment in src/main.ts and update the condition to check
__SPOTLIGHT_ENABLED__ alone (using the symbols dsn, __SPOTLIGHT_ENABLED__, and
sentryDsn) so Spotlight mode forces the local DSN always.

---

Nitpick comments:
In `@src/main.ts`:
- Around line 62-101: Add unit tests that exercise the Sentry.init config in
main.ts for the four combinations of __SPOTLIGHT_ENABLED__ true/false and
sentryDsn present/empty; for each combination assert the resulting config's dsn,
enabled, and tracesSampleRate values match expected behavior (when
__SPOTLIGHT_ENABLED__ && !sentryDsn -> dsn === 'https://spotlight@local/0',
enabled === true; when sentryDsn provided -> dsn === sentryDsn; enabled should
be __SENTRY_ENABLED__ || __SPOTLIGHT_ENABLED__; tracesSampleRate should be 1.0
when isCloud || __SPOTLIGHT_ENABLED__ else 0), by mocking or spying on
Sentry.init to capture its argument and using test cases that toggle
__SPOTLIGHT_ENABLED__, sentryDsn, and isCloud to validate Sentry.init was called
with correct properties.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: f734d1ba-c4ce-46d2-9f40-d9ae021f8198

📥 Commits

Reviewing files that changed from the base of the PR and between 39e1877 and 5be4813.

📒 Files selected for processing (8)
  • .env_example
  • .fallowrc.json
  • CONTRIBUTING.md
  • global.d.ts
  • scripts/vite-define-shim.ts
  • src/main.ts
  • vite.config.mts
  • vitest.setup.ts

Comment thread src/main.ts Outdated
Comment on lines +66 to +69
dsn:
__SPOTLIGHT_ENABLED__ && !sentryDsn
? 'https://spotlight@local/0'
: sentryDsn,

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.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Verify current DSN branching for Spotlight mode.
rg -n -C2 "__SPOTLIGHT_ENABLED__ && !sentryDsn|spotlight@local/0|dsn:" src/main.ts

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 400


🏁 Script executed:

# Check for Spotlight-related setup and any tests
rg -n "Spotlight|spotlight" src/main.ts | head -20

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 325


🏁 Script executed:

# Look for related test files or configuration references
fd -t f "test|spec" --path "src" | xargs grep -l "Spotlight\|__SPOTLIGHT" 2>/dev/null || echo "No tests found with Spotlight references"

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 361


🏁 Script executed:

# Check where __SPOTLIGHT_ENABLED__ is defined to understand its purpose
rg -n "__SPOTLIGHT_ENABLED__" src/ --type ts -B 2 -A 2

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 948


🏁 Script executed:

# Search for any Spotlight integration or sidecar-related configuration
rg -n "sidecar|spotlight@local" src/ --type ts -B 3 -A 3

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 861


🏁 Script executed:

# Check the full Sentry initialization block to understand the complete intent
cat -n src/main.ts | sed -n '59,100p'

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 1947


🏁 Script executed:

# Look for environment variable definitions to understand when sentryDsn is set
rg -n "sentryDsn|__SPOTLIGHT_ENABLED__|__SENTRY_ENABLED__" src/ --type ts | grep -E "=|const|let|var" | head -20

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 110


🏁 Script executed:

# Search for any documentation or comments about Spotlight DSN behavior
rg -n -B 5 -A 5 "spotlight@local" src/

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 677


🏁 Script executed:

# Get the full sentryDsn definition and surrounding context
cat -n src/main.ts | sed -n '50,60p'

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 534


🏁 Script executed:

# Search web documentation for Spotlight behavior
web_search
Sentry Spotlight integration local events sidecar redirect DSN

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 165


🌐 Web query:

Sentry Spotlight integration local sidecar event redirection how it works

💡 Result:

Sentry Spotlight is a local development tool that uses a Sidecar server for real-time debugging of errors, traces, logs, and performance data without sending to production Sentry servers. How the local Sidecar event redirection integration works: 1. Run the Spotlight Sidecar: Use npx @spotlightjs/spotlight (starts on http://localhost:8969 by default), desktop app, Docker, or CLI. The Sidecar is a lightweight local proxy server. 2. Configure Sentry SDK: Enable via environment variable SENTRY_SPOTLIGHT=1 (auto-detects default URL) or explicitly set spotlight: true or spotlight: "http://localhost:8969/stream" in SDK init. Supports most SDKs (Node.js, Python, Java, Ruby, PHP, browser, etc.). 3. Event Redirection/Duplication in SDK: - SDKs implement a separate SpotlightTransport or pipeline that clones every envelope (errors, transactions, sessions, profiles, etc.) before sending to the production Sentry DSN. - Clone ensures original flow unaffected. - Forces 100% sample rate, enables PII, bypasses sampling/rate limits for Spotlight. - Sends cloned envelope via HTTP POST to Sidecar's /stream endpoint (same semantics as Sentry server). - Non-blocking: Failures (e.g., sidecar down) use exponential backoff retries then silently drop; normal Sentry sending continues unaffected. 4. Sidecar Processing: - Receives envelopes via HTTP POST. - Validates, stores in memory. - Streams real-time to connected clients via Server-Sent Events (SSE) at /stream. - Provides APIs for querying history (e.g., for MCP/AI tools). 5. UI/Consumption: View in browser UI (localhost:8969), desktop app, spotlight tail CLI for terminal streaming, or MCP server for AI integration. This "redirection" is actually duplication: events go to both production Sentry (if DSN set) and local Sidecar simultaneously for dev debugging. Diagram: Your Application → Sentry SDK → [Clone] → Sidecar (localhost:8969/stream) → [SSE] → UI/CLI/MCP ↓ Production Sentry (unaffected)

Citations:


🌐 Web query:

Spotlight.js Sentry DSN configuration events stay local

💡 Result:

Spotlight.js Sentry DSN configuration events stay local by routing Sentry SDK telemetry to the local Spotlight “sidecar” instead of to Sentry’s production servers. How it works (from the official Spotlight/Sentry integration docs): 1) Enable the Spotlight integration in your SDK with the special DSN/Spotlight settings. Spotlight runs locally and uses a local stream endpoint by default at http://localhost:8969/stream. - In the Sentry Spotlight SDK integration spec, enabling is done via the spotlight option: true enables Spotlight using the default URL (http://localhost:8969/stream), and a string enables using the provided URL. - SDKs also support the SENTRY_SPOTLIGHT environment variable to point SDKs at the local Spotlight server/stream. 2) The DSN you configure for development should be a placeholder that points to Spotlight, not your real Sentry project. Spotlight’s docs show using dsn: "https://spotlight@local/0" as a placeholder, while enabling spotlight/spotlightBrowserIntegration. 3) The Spotlight integration sends a local copy of events to the Spotlight sidecar and then the local Spotlight UI consumes those events via a local /stream endpoint (SSE). Spotlight is explicitly described as “Sentry for Development” that runs locally (including the sidecar) and lets you see events without needing production Sentry monitoring. Practical configuration pattern (as shown in Spotlight docs for web/Next.js): - Use a placeholder DSN for dev (e.g. https://spotlight@local/0). - Enable Spotlight in Sentry.init using spotlight: true (or spotlight: process.env.SENTRY_SPOTLIGHT === '1') and/or enable the browser integration spotlightBrowserIntegration. - Ensure SENTRY_SPOTLIGHT is set only in development so events go to your local Spotlight instance. If you want, tell me which Sentry SDK/framework you’re using (e.g., @sentry/nextjs, @sentry/node, browser SDK, etc.) and how you currently configure DSN, and I’ll translate the above into an exact config snippet for that setup.

Citations:


Force local DSN whenever Spotlight is enabled.

The current logic allows a production Sentry DSN to be used when Spotlight is enabled, which contradicts the comment's claim that "events are redirected to the sidecar and never leave the machine." Spotlight actually duplicates events to both the local sidecar AND the production Sentry endpoint simultaneously. To ensure development events stay local-only in Spotlight mode, always use the placeholder DSN.

🔧 Proposed fix
-  dsn:
-    __SPOTLIGHT_ENABLED__ && !sentryDsn
-      ? 'https://spotlight@local/0'
-      : sentryDsn,
+  dsn: __SPOTLIGHT_ENABLED__ ? 'https://spotlight@local/0' : sentryDsn,
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
dsn:
__SPOTLIGHT_ENABLED__ && !sentryDsn
? 'https://spotlight@local/0'
: sentryDsn,
dsn: __SPOTLIGHT_ENABLED__ ? 'https://spotlight@local/0' : sentryDsn,
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/main.ts` around lines 66 - 69, The dsn assignment currently uses the
placeholder only when __SPOTLIGHT_ENABLED__ && !sentryDsn, which still allows a
real sentryDsn to be used when spotlight is enabled; change the dsn logic so
that whenever __SPOTLIGHT_ENABLED__ is true it always returns the local
placeholder ('https://spotlight@local/0') regardless of sentryDsn. Locate the
dsn property assignment in src/main.ts and update the condition to check
__SPOTLIGHT_ENABLED__ alone (using the symbols dsn, __SPOTLIGHT_ENABLED__, and
sentryDsn) so Spotlight mode forces the local DSN always.

@codecov

codecov Bot commented Apr 23, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 0% with 12 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
src/main.ts 0.00% 12 Missing ⚠️
@@             Coverage Diff             @@
##             main   #11580       +/-   ##
===========================================
- Coverage   71.26%   54.96%   -16.31%     
===========================================
  Files        1486     1377      -109     
  Lines       83612    70312    -13300     
  Branches    23040    18662     -4378     
===========================================
- Hits        59584    38644    -20940     
- Misses      23144    31123     +7979     
+ Partials      884      545      -339     
Flag Coverage Δ
e2e ?
unit 54.96% <0.00%> (-0.01%) ⬇️

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

Files with missing lines Coverage Δ
src/main.ts 0.00% <0.00%> (-51.86%) ⬇️

... and 992 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.

DrJKL and others added 2 commits May 1, 2026 00:09
- Extract Sentry env opts (cloud/spotlight/silent) for readability
- Hoist SPOTLIGHT_PLACEHOLDER_DSN constant
- Move enableLogs into spotlight branch
- Add PowerShell variant for SPOTLIGHT=true in CONTRIBUTING.md
- Tune .fallowrc.json: cover storybook + package configs,
  exclude generated registry/manager types, tools/, .github/

Amp-Thread-ID: https://ampcode.com/threads/T-019de261-3205-769d-a3c0-e7a363ea5896
Co-authored-by: Amp <amp@ampcode.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants