Skip to content

fix: rewrite Ogg parser for multi-page packets (#9256)#9322

Open
xeinherjer-dev wants to merge 34 commits into
Comfy-Org:mainfrom
xeinherjer-dev:fix-ogg-syntax-9256
Open

fix: rewrite Ogg parser for multi-page packets (#9256)#9322
xeinherjer-dev wants to merge 34 commits into
Comfy-Org:mainfrom
xeinherjer-dev:fix-ogg-syntax-9256

Conversation

@xeinherjer-dev

@xeinherjer-dev xeinherjer-dev commented Mar 1, 2026

Copy link
Copy Markdown

The previous implementation used naive regex matching on binary data converted to strings. This approach failed entirely when a large prompt caused the OpusTags packet to span multiple Ogg pages.

This commit replaces the fragile string search with a robust binary parser that strictly follows the Ogg logical bitstream and Vorbis Comments specifications. It correctly handles Ogg lacing and reassembles segmented packets, ensuring that large JSON metadata is successfully extracted.

Also adds unit tests (ogg.test.ts) to verify the correct parsing of both standard and multi-page Ogg files.

Summary

Replaced the fragile string-based Ogg metadata extraction with a robust binary parser to successfully load workflows from large multi-page Ogg files.

Changes

  • What:
    • Completely rewrote the Ogg metadata parser to correctly handle Ogg lacing and reassemble segmented OpusTags multi-page packets.
    • Refactored file reading logic to use the modern file.arrayBuffer() API, replacing FileReader and manual Promises to reduce overhead and improve processing efficiency.
    • Added comprehensive unit tests (ogg.test.ts).

Review Focus

Please review the binary parsing logic (specifically the handling of Ogg lacing and multi-page segments) and the newly added test cases in ogg.test.ts.

Fixes #9256

Screenshots (if applicable)

  • Unit Test Coverage: Verified 100% test coverage for ogg.ts with 8 test cases covering both standard and multi-page Ogg files.
  • Manual Verification: Confirmed that dragging and dropping a large multi-page Ogg file successfully loads the expected workflow without errors.
image

Reference Diagram

ogg_opus_data_flow_en_1772437600957

┆Issue is synchronized with this Notion page by Unito

@xeinherjer-dev
xeinherjer-dev requested a review from a team as a code owner March 1, 2026 14:19
@dosubot dosubot Bot added the size:L This PR changes 100-499 lines, ignoring generated files. label Mar 1, 2026
@github-actions

github-actions Bot commented Mar 1, 2026

Copy link
Copy Markdown

🎨 Storybook: loading Building...

@github-actions

github-actions Bot commented Mar 1, 2026

Copy link
Copy Markdown

🎭 Playwright: ⏳ Running...

@coderabbitai

coderabbitai Bot commented Mar 1, 2026

Copy link
Copy Markdown
Contributor

Note

Reviews paused

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

Use the following commands to manage reviews:

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

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Refactors Ogg/Opus metadata extraction to read files into an ArrayBuffer, demux Ogg pages, reconstruct OpusTags packets across page boundaries, and parse Vorbis comments into JSON. Adds a comprehensive Vitest suite covering multi-page metadata, truncations, corrupted pages, and malformed comments. getOggMetadata now returns Promise.

Changes

Cohort / File(s) Summary
Ogg Metadata Test Suite
src/scripts/metadata/ogg.test.ts
Adds Vitest tests and helper createOggWithOpusTags to synthesize Ogg pages and OpusTags; covers valid extraction, multi-page metadata, truncated/corrupted pages, malformed comments, and edge cases.
Ogg Metadata Parser Refactor
src/scripts/metadata/ogg.ts
Replaces FileReader/browser parsing with in-memory ArrayBuffer flow; adds extractOpusTags and parseVorbisComments, reconstructs OpusTags across OggS pages with bounds checks, robust error handling, and updates getOggMetadata(file: File): Promise<ComfyMetadata>.

Sequence Diagram(s)

sequenceDiagram
    participant Client as Calling Code
    participant Ogg as getOggMetadata()
    participant Parser as OggPageParser
    participant Extractor as extractOpusTags()
    participant Vorbis as parseVorbisComments()

    Client->>Ogg: call getOggMetadata(file)
    Ogg->>Ogg: read file into ArrayBuffer
    Ogg->>Parser: scan for OggS pages and headers
    loop per OggS page
        Parser->>Parser: parse header and segment table
        Parser->>Extractor: emit segments (flag OpusTags segments)
    end
    Extractor->>Extractor: concatenate OpusTags segments (strip OggS/segment tables)
    Extractor->>Vorbis: pass reconstructed OpusTags packet
    Vorbis->>Vorbis: parse Vorbis comments → extract JSON fields
    Vorbis->>Ogg: return { prompt?, workflow? }
    Ogg->>Client: resolve Promise with metadata
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Poem

🐰 I stitched the pages where OggS once tore,

Bits hummed together and JSON could soar,
Tags reunited, the workflow set free —
Hops of delight and a crunchy carrot tea! 🥕

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately summarizes the main change: rewriting the Ogg parser to handle multi-page packets, which is the primary focus of the PR.
Description check ✅ Passed The description follows the template structure with Summary, Changes, and Review Focus sections, includes the Fixes reference, provides clear explanations of what changed and why, and includes supporting documentation (screenshots and diagrams).
Linked Issues check ✅ Passed The PR successfully addresses all requirements from issue #9256: it rewrites getOggMetadata to properly parse binary Ogg data, handles multi-page OpusTags packets through lacing and segment reconstruction, discards page headers correctly, and adds comprehensive unit tests validating both standard and multi-page scenarios.
Out of Scope Changes check ✅ Passed All code changes are directly related to the PR objectives: ogg.ts implements the rewritten parser logic, ogg.test.ts provides comprehensive test coverage for the new implementation, and file reading refactoring to use arrayBuffer() is a necessary modernization for the binary parsing approach.

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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

❤️ Share

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

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: b8d6459b06

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/scripts/metadata/ogg.ts Outdated
Comment thread src/scripts/metadata/ogg.ts

@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: 4

🤖 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/scripts/metadata/ogg.test.ts`:
- Around line 229-241: The test block around the `it('should safely handle:
${name}')` case currently treats any thrown error as a successful outcome;
change it so the expectation is deterministic by explicitly asserting one
behavior: either assert the promise resolves and then expect result.prompt and
result.workflow to be undefined (using `await
expect(getOggMetadata(file)).resolves.toMatchObject({ prompt: undefined,
workflow: undefined })` or equivalent), or if a specific error is expected,
assert `await expect(getOggMetadata(file)).rejects.toThrow(/* specific error or
RangeError */)`. Update the same pattern for the other similar test case that
uses `getOggMetadata` to ensure thrown errors are asserted with
`rejects.toThrow` rather than treated as success.
- Around line 247-251: Update the scenarios declaration to replace the unsafe
type "expectedPrompt?: any" with a concrete type such as "expectedPrompt?:
Record<string, unknown>" and then make the runtime check explicit in the test
logic that consumes it (where scenarios is iterated and expectedPrompt is
inspected) by using "expectedPrompt !== undefined" instead of a truthiness
check; reference the "scenarios" variable and the "expectedPrompt" field so you
update both the interface and the place in the test that branches on
expectedPrompt.

In `@src/scripts/metadata/ogg.ts`:
- Around line 51-55: The loop that builds OGG page segments (using
pageSegmentsCount, lengthsOffset, dataOffset, segmentLength, and data.subarray)
does not validate that segmentLength fits within remaining bytes and can
silently truncate corrupted lacing values; before calling
data.subarray(dataOffset, dataOffset + segmentLength) validate that
segmentLength is non-negative and that dataOffset + segmentLength <= data.length
(and that lengthsOffset + i is within bounds), and if not either throw a
descriptive error or handle the corruption path (e.g., mark packet invalid) so
corrupted segment lengths cannot produce truncated/incorrect segment buffers.
- Around line 89-117: The Vorbis comment parsing (uses packetView.getUint32,
readIndex, packetData.subarray, decoder.decode, and JSON.parse to populate
prompt and workflow) can throw on truncated/corrupt packets; add defensive
checks before every getUint32 and subarray/decoder.decode to ensure (readIndex +
4) <= packetData.byteLength before reading lengths and (readIndex +
commentLength) <= packetData.byteLength before slicing, and if a length is
invalid bail out of the loop or skip that comment; wrap decoder.decode and
JSON.parse calls for keys 'prompt' and 'workflow' in try/catch and on error skip
assigning or set prompt/workflow to null/default, and ensure readIndex is never
advanced past packetData.byteLength so parsing gracefully falls back instead of
throwing.

ℹ️ Review info

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 59c3215 and b8d6459.

📒 Files selected for processing (2)
  • src/scripts/metadata/ogg.test.ts
  • src/scripts/metadata/ogg.ts

Comment thread src/scripts/metadata/ogg.test.ts Outdated
Comment thread src/scripts/metadata/ogg.test.ts
Comment thread src/scripts/metadata/ogg.ts
Comment thread src/scripts/metadata/ogg.ts
@dosubot dosubot Bot added size:XL This PR changes 500-999 lines, ignoring generated files. and removed size:L This PR changes 100-499 lines, ignoring generated files. labels Mar 1, 2026

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

🧹 Nitpick comments (5)
b1.sh (1)

2-2: Use pnpm dlx instead of npx.

The project guidelines specify using pnpm dlx or pnpx for running packages, not npx.

Suggested fix
-pnpm install && npx nx build
+pnpm install && pnpm dlx nx build

Or, if nx is a project dependency, simply use:

pnpm install && pnpm exec nx build

Based on learnings: "Use pnpm as the package manager; for arbitrary packages not in scripts, use pnpx or pnpm dlx, never npx".

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

In `@b1.sh` at line 2, Replace the use of npx in the script command ("pnpm install
&& npx nx build") with a pnpm-compatible runner per project guidelines: either
use "pnpm dlx" to run nx or, if nx is a project dependency, use "pnpm exec nx
build" (keep the initial "pnpm install &&" intact); update the command in b1.sh
accordingly so it no longer uses npx.
src/scripts/metadata/ogg.test.ts (2)

368-384: Consider simplifying the assertion pattern.

The toSatisfy callback that runs nested expects and returns true is unconventional. A direct assertion would be clearer.

Simplified assertion
       for (const { name, createBuffer, expectedPrompt } of scenarios) {
         it(`should appropriately handle: ${name}`, async () => {
           const file = new File(
             [createBuffer()],
             `test_${name.replace(/\s+/g, '_')}.ogg`
           )
-          await expect(getOggMetadata(file)).resolves.toSatisfy((result) => {
-            if (expectedPrompt) {
-              expect(result.prompt).toEqual(expectedPrompt)
-            } else {
-              expect(result.prompt).toBeUndefined()
-            }
-            expect(result.workflow).toBeUndefined()
-            return true
-          })
+          const result = await getOggMetadata(file)
+          if (expectedPrompt !== undefined) {
+            expect(result.prompt).toEqual(expectedPrompt)
+          } else {
+            expect(result.prompt).toBeUndefined()
+          }
+          expect(result.workflow).toBeUndefined()
         })
       }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/scripts/metadata/ogg.test.ts` around lines 368 - 384, Replace the
unconventional expect(...).resolves.toSatisfy(...) pattern in the test loop with
a direct awaited assertion: call getOggMetadata(file) with await, store the
result, then use straightforward assertions against result (e.g., assert
result.prompt equals expectedPrompt or is undefined, and assert result.workflow
is undefined). Update the test block around the scenarios loop and the it
callback to await getOggMetadata(file) and perform direct expect(...) checks
against the returned object (referencing getOggMetadata and the local variables
name/createBuffer/expectedPrompt).

306-319: Consider simplifying the assertion pattern.

The current pattern chains .then() with resolves.not.toThrow(). A cleaner approach would assert the resolved value directly.

Simplified assertion
       for (const { name, createBuffer } of scenarios) {
         it(`should safely handle: ${name}`, async () => {
           const file = new File(
             [createBuffer()],
             `test_${name.replace(/\s+/g, '_')}.ogg`
           )
-          await expect(
-            getOggMetadata(file).then((result) => {
-              expect(result.prompt).toBeUndefined()
-              expect(result.workflow).toBeUndefined()
-            })
-          ).resolves.not.toThrow()
+          const result = await getOggMetadata(file)
+          expect(result.prompt).toBeUndefined()
+          expect(result.workflow).toBeUndefined()
         })
       }

This makes the test intention clearer: the function should resolve (not throw) and return undefined values.

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

In `@src/scripts/metadata/ogg.test.ts` around lines 306 - 319, The test currently
uses getOggMetadata(file).then(...) combined with .resolves.not.toThrow(), which
is awkward; change the assertion to assert the resolved value directly by
awaiting or using expect(...).resolves and checking that the resolved object has
prompt and workflow undefined (e.g.
expect(getOggMetadata(file)).resolves.toEqual/expect.objectContaining({ prompt:
undefined, workflow: undefined })). Update the test inside the loop that
references getOggMetadata and the temporary File so it directly asserts the
resolved value instead of chaining .then() with resolves.not.toThrow().
src/scripts/metadata/ogg.ts (1)

114-114: Consider adding explicit types for prompt and workflow.

The variables are declared without types, which will cause them to be implicitly typed as unknown after assignment or undefined before. For clarity, consider explicit typing.

Optional improvement
-  let prompt, workflow
+  let prompt: unknown
+  let workflow: unknown
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/scripts/metadata/ogg.ts` at line 114, Declare explicit types for the two
variables so they aren't implicitly unknown/undefined: replace the loose
declaration of prompt and workflow with typed declarations (for example, let
prompt: string | undefined; let workflow: Workflow | undefined). If Workflow is
a domain type, import or define the Workflow interface/type near where workflow
is used; otherwise pick a concrete shape (e.g., Record<string, any> or a
specific interface) or a safer union (unknown | ...) and narrow it where used.
Ensure all subsequent code compiles against the chosen types and update any
imports or type definitions accordingly.
b3.sh (1)

2-2: Developer convenience script with hardcoded external path.

This script assumes a specific directory structure exists at ../ComfyUI_windows_portable/. Consider adding a shebang (#!/bin/bash) and a check that the target directory exists before copying.

Also, verify whether python_embeded is intentional or a typo of python_embedded.

Optional improvement
+#!/bin/bash
+set -e
+
+TARGET_DIR="../ComfyUI_windows_portable/python_embeded/Lib/site-packages/comfyui_frontend_package/static/"
+
+if [ ! -d "$TARGET_DIR" ]; then
+  echo "Error: Target directory does not exist: $TARGET_DIR"
+  exit 1
+fi
 
-cp -Rf dist/* ../ComfyUI_windows_portable/python_embeded/Lib/site-packages/comfyui_frontend_package/static/
+cp -Rf dist/* "$TARGET_DIR"
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@b3.sh` at line 2, Add a bash shebang and guard the hardcoded copy by checking
the target directory exists before running the cp in b3.sh: ensure the file
starts with "#!/bin/bash", verify the destination path
"../ComfyUI_windows_portable/python_embeded/Lib/site-packages/comfyui_frontend_package/static/"
exists (and exit with a clear error if not), and confirm whether
"python_embeded" in that path is a typo that should be "python_embedded" and
correct it if needed.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@b1.sh`:
- Line 2: Replace the use of npx in the script command ("pnpm install && npx nx
build") with a pnpm-compatible runner per project guidelines: either use "pnpm
dlx" to run nx or, if nx is a project dependency, use "pnpm exec nx build" (keep
the initial "pnpm install &&" intact); update the command in b1.sh accordingly
so it no longer uses npx.

In `@b3.sh`:
- Line 2: Add a bash shebang and guard the hardcoded copy by checking the target
directory exists before running the cp in b3.sh: ensure the file starts with
"#!/bin/bash", verify the destination path
"../ComfyUI_windows_portable/python_embeded/Lib/site-packages/comfyui_frontend_package/static/"
exists (and exit with a clear error if not), and confirm whether
"python_embeded" in that path is a typo that should be "python_embedded" and
correct it if needed.

In `@src/scripts/metadata/ogg.test.ts`:
- Around line 368-384: Replace the unconventional
expect(...).resolves.toSatisfy(...) pattern in the test loop with a direct
awaited assertion: call getOggMetadata(file) with await, store the result, then
use straightforward assertions against result (e.g., assert result.prompt equals
expectedPrompt or is undefined, and assert result.workflow is undefined). Update
the test block around the scenarios loop and the it callback to await
getOggMetadata(file) and perform direct expect(...) checks against the returned
object (referencing getOggMetadata and the local variables
name/createBuffer/expectedPrompt).
- Around line 306-319: The test currently uses getOggMetadata(file).then(...)
combined with .resolves.not.toThrow(), which is awkward; change the assertion to
assert the resolved value directly by awaiting or using expect(...).resolves and
checking that the resolved object has prompt and workflow undefined (e.g.
expect(getOggMetadata(file)).resolves.toEqual/expect.objectContaining({ prompt:
undefined, workflow: undefined })). Update the test inside the loop that
references getOggMetadata and the temporary File so it directly asserts the
resolved value instead of chaining .then() with resolves.not.toThrow().

In `@src/scripts/metadata/ogg.ts`:
- Line 114: Declare explicit types for the two variables so they aren't
implicitly unknown/undefined: replace the loose declaration of prompt and
workflow with typed declarations (for example, let prompt: string | undefined;
let workflow: Workflow | undefined). If Workflow is a domain type, import or
define the Workflow interface/type near where workflow is used; otherwise pick a
concrete shape (e.g., Record<string, any> or a specific interface) or a safer
union (unknown | ...) and narrow it where used. Ensure all subsequent code
compiles against the chosen types and update any imports or type definitions
accordingly.

ℹ️ Review info

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b8d6459 and c7a7df4.

📒 Files selected for processing (5)
  • b1.sh
  • b2.sh
  • b3.sh
  • src/scripts/metadata/ogg.test.ts
  • src/scripts/metadata/ogg.ts

@xeinherjer-dev

Copy link
Copy Markdown
Author

Note: The PR size increased to XL because I added test codes to cover the new JSON parsing fixes and maintain 100% coverage.

@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: 2

🤖 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/scripts/metadata/ogg.ts`:
- Line 39: The loop boundary check in the Ogg parsing code (the while using
offset, OGG_HEADER_SIZE and data.length) incorrectly uses '<' and therefore
skips pages whose header is exactly OGG_HEADER_SIZE bytes (27 bytes, 0
segments); change the condition from using strict less-than to allow equality
(use <= semantics) so the parser accepts minimal valid Ogg pages while still
ensuring you don't read past the buffer.
- Line 1: The function getOggMetadata lacks explicit TypeScript types: define an
OggMetadata interface describing the returned metadata shape, annotate
getOggMetadata to return Promise<OggMetadata>, and add explicit types for the
local variables prompt and workflow where they are declared; also change all
catch clause variables to type unknown and narrow them before usage (e.g., using
typeof or instance checks) to avoid implicit any propagation.

ℹ️ Review info

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between c7a7df4 and 9e868e1.

📒 Files selected for processing (2)
  • src/scripts/metadata/ogg.test.ts
  • src/scripts/metadata/ogg.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/scripts/metadata/ogg.test.ts

Comment thread src/scripts/metadata/ogg.ts Outdated
Comment thread src/scripts/metadata/ogg.ts Outdated
@github-actions

github-actions Bot commented Mar 2, 2026

Copy link
Copy Markdown

📦 Bundle: 4.47 MB gzip 🔴 +644 B

Details

Summary

  • Raw size: 21 MB baseline 21 MB — 🔴 +2.5 kB
  • Gzip: 4.47 MB baseline 4.47 MB — 🔴 +644 B
  • Brotli: 3.45 MB baseline 3.45 MB — 🔴 +379 B
  • Bundles: 228 current • 228 baseline • 108 added / 108 removed

Category Glance
Data & Services 🔴 +2.5 kB (2.58 MB) · Vendor & Third-Party ⚪ 0 B (8.84 MB) · Other ⚪ 0 B (7.89 MB) · Graph Workspace ⚪ 0 B (1.03 MB) · Panels & Settings ⚪ 0 B (436 kB) · Views & Navigation ⚪ 0 B (72.1 kB) · + 5 more

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

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-C3bgCHSg.js (new) 17.9 kB 🔴 +17.9 kB 🔴 +6.34 kB 🔴 +5.48 kB
assets/index-C90-5aEZ.js (removed) 17.9 kB 🟢 -17.9 kB 🟢 -6.35 kB 🟢 -5.52 kB

Status: 1 added / 1 removed

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

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-Bx2i-zJ9.js (removed) 1.03 MB 🟢 -1.03 MB 🟢 -220 kB 🟢 -166 kB
assets/GraphView-CbsMcx2b.js (new) 1.03 MB 🔴 +1.03 MB 🔴 +220 kB 🔴 +166 kB

Status: 1 added / 1 removed

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

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-DMYx9eyz.js (new) 15.5 kB 🔴 +15.5 kB 🔴 +3.32 kB 🔴 +2.82 kB
assets/CloudSurveyView-e8A20CJi.js (removed) 15.5 kB 🟢 -15.5 kB 🟢 -3.32 kB 🟢 -2.82 kB
assets/CloudLoginView-D7G_AA5-.js (removed) 11.4 kB 🟢 -11.4 kB 🟢 -3.19 kB 🟢 -2.83 kB
assets/CloudLoginView-Db_hZVb0.js (new) 11.4 kB 🔴 +11.4 kB 🔴 +3.19 kB 🔴 +2.82 kB
assets/CloudSignupView-BZabtK28.js (removed) 9.37 kB 🟢 -9.37 kB 🟢 -2.69 kB 🟢 -2.36 kB
assets/CloudSignupView-DiQIKECL.js (new) 9.37 kB 🔴 +9.37 kB 🔴 +2.7 kB 🔴 +2.36 kB
assets/UserCheckView-CPCyv2p_.js (new) 8.41 kB 🔴 +8.41 kB 🔴 +2.23 kB 🔴 +1.94 kB
assets/UserCheckView-CuEufoLZ.js (removed) 8.41 kB 🟢 -8.41 kB 🟢 -2.23 kB 🟢 -1.94 kB
assets/CloudLayoutView-CvvfQwxr.js (removed) 6.43 kB 🟢 -6.43 kB 🟢 -2.1 kB 🟢 -1.82 kB
assets/CloudLayoutView-Dh-Ousms.js (new) 6.43 kB 🔴 +6.43 kB 🔴 +2.1 kB 🔴 +1.83 kB
assets/CloudForgotPasswordView-BFC4QOsj.js (removed) 5.56 kB 🟢 -5.56 kB 🟢 -1.93 kB 🟢 -1.7 kB
assets/CloudForgotPasswordView-DO1ZpyZ-.js (new) 5.56 kB 🔴 +5.56 kB 🔴 +1.93 kB 🔴 +1.7 kB
assets/CloudAuthTimeoutView-Bwm35fCh.js (new) 4.91 kB 🔴 +4.91 kB 🔴 +1.77 kB 🔴 +1.55 kB
assets/CloudAuthTimeoutView-HHwIX9Mg.js (removed) 4.91 kB 🟢 -4.91 kB 🟢 -1.77 kB 🟢 -1.55 kB
assets/CloudSubscriptionRedirectView-CbuiN7Ad.js (new) 4.75 kB 🔴 +4.75 kB 🔴 +1.79 kB 🔴 +1.58 kB
assets/CloudSubscriptionRedirectView-ZGmd1yz1.js (removed) 4.75 kB 🟢 -4.75 kB 🟢 -1.79 kB 🟢 -1.58 kB
assets/UserSelectView-Dgho0wJI.js (new) 4.5 kB 🔴 +4.5 kB 🔴 +1.64 kB 🔴 +1.46 kB
assets/UserSelectView-hxl4hjmd.js (removed) 4.5 kB 🟢 -4.5 kB 🟢 -1.64 kB 🟢 -1.46 kB
assets/CloudSorryContactSupportView-Bypca0av.js 1.02 kB 1.02 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/layout-C8IrwMzw.js 296 B 296 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 9 added / 9 removed

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

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/SecretsPanel-CCJdz6mf.js (removed) 21.5 kB 🟢 -21.5 kB 🟢 -5.31 kB 🟢 -4.66 kB
assets/SecretsPanel-DDQLmeF7.js (new) 21.5 kB 🔴 +21.5 kB 🔴 +5.31 kB 🔴 +4.66 kB
assets/LegacyCreditsPanel-CcDP4K6b.js (removed) 20.6 kB 🟢 -20.6 kB 🟢 -5.56 kB 🟢 -4.89 kB
assets/LegacyCreditsPanel-nArA8ZdK.js (new) 20.6 kB 🔴 +20.6 kB 🔴 +5.56 kB 🔴 +4.9 kB
assets/SubscriptionPanel-BclpIeOM.js (new) 18.6 kB 🔴 +18.6 kB 🔴 +4.72 kB 🔴 +4.15 kB
assets/SubscriptionPanel-DSbnP-fm.js (removed) 18.6 kB 🟢 -18.6 kB 🟢 -4.72 kB 🟢 -4.15 kB
assets/KeybindingPanel-CT-hFoV5.js (new) 12.3 kB 🔴 +12.3 kB 🔴 +3.52 kB 🔴 +3.13 kB
assets/KeybindingPanel-Dyzo7Isc.js (removed) 12.3 kB 🟢 -12.3 kB 🟢 -3.52 kB 🟢 -3.12 kB
assets/AboutPanel-BLuSqhfa.js (new) 9.79 kB 🔴 +9.79 kB 🔴 +2.73 kB 🔴 +2.47 kB
assets/AboutPanel-D70L6P23.js (removed) 9.79 kB 🟢 -9.79 kB 🟢 -2.73 kB 🟢 -2.46 kB
assets/ExtensionPanel-BaWyI_jr.js (new) 9.38 kB 🔴 +9.38 kB 🔴 +2.65 kB 🔴 +2.36 kB
assets/ExtensionPanel-BIaE8qY-.js (removed) 9.38 kB 🟢 -9.38 kB 🟢 -2.65 kB 🟢 -2.36 kB
assets/ServerConfigPanel-CdHjcTR6.js (removed) 6.44 kB 🟢 -6.44 kB 🟢 -2.13 kB 🟢 -1.92 kB
assets/ServerConfigPanel-CtCQgNlx.js (new) 6.44 kB 🔴 +6.44 kB 🔴 +2.13 kB 🔴 +1.9 kB
assets/UserPanel-CPmqiBLU.js (removed) 6.16 kB 🟢 -6.16 kB 🟢 -1.99 kB 🟢 -1.75 kB
assets/UserPanel-D3U1rzZQ.js (new) 6.16 kB 🔴 +6.16 kB 🔴 +1.99 kB 🔴 +1.75 kB
assets/cloudRemoteConfig-BcWT1yqy.js (new) 1.44 kB 🔴 +1.44 kB 🔴 +705 B 🔴 +609 B
assets/cloudRemoteConfig-CCKMAMba.js (removed) 1.44 kB 🟢 -1.44 kB 🟢 -702 B 🟢 -604 B
assets/refreshRemoteConfig-CC2hyk2y.js (new) 1.14 kB 🔴 +1.14 kB 🔴 +521 B 🔴 +482 B
assets/refreshRemoteConfig-CMu-na30.js (removed) 1.14 kB 🟢 -1.14 kB 🟢 -520 B 🟢 -469 B
assets/config-CGn5JFmU.js 996 B 996 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-B5oF6TeI.js 29.9 kB 29.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BVYOg4dh.js 24.5 kB 24.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CBEvSL1z.js 38.5 kB 38.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CGx1t8IZ.js 27.8 kB 27.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CNcb_4nC.js 30.5 kB 30.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Cx1dZM6H.js 23.9 kB 23.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Dw-QS6Nb.js 27.9 kB 27.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DXxgnCSn.js 32.4 kB 32.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-GRFn4guL.js 34.2 kB 34.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-mgwKIVQ2.js 28.8 kB 28.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-s83B801I.js 28.7 kB 28.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 10 added / 10 removed

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

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/auth-BLRkPQNe.js (new) 3.4 kB 🔴 +3.4 kB 🔴 +1.18 kB 🔴 +983 B
assets/auth-C_5oGc8X.js (removed) 3.4 kB 🟢 -3.4 kB 🟢 -1.18 kB 🟢 -991 B
assets/SignUpForm-C_CtlLHB.js (removed) 3.01 kB 🟢 -3.01 kB 🟢 -1.23 kB 🟢 -1.09 kB
assets/SignUpForm-DPd5PgVw.js (new) 3.01 kB 🔴 +3.01 kB 🔴 +1.23 kB 🔴 +1.09 kB
assets/UpdatePasswordContent-6oJpUlGT.js (removed) 2.37 kB 🟢 -2.37 kB 🟢 -1.07 kB 🟢 -944 B
assets/UpdatePasswordContent-CrWjhZkW.js (new) 2.37 kB 🔴 +2.37 kB 🔴 +1.07 kB 🔴 +943 B
assets/firebaseAuthStore-DlDgFmzh.js (new) 788 B 🔴 +788 B 🔴 +389 B 🔴 +347 B
assets/firebaseAuthStore-mY8cWxus.js (removed) 788 B 🟢 -788 B 🟢 -385 B 🟢 -349 B
assets/auth-B_HcX6vM.js (new) 357 B 🔴 +357 B 🔴 +222 B 🔴 +212 B
assets/auth-B5xEE6Hb.js (removed) 357 B 🟢 -357 B 🟢 -226 B 🟢 -208 B
assets/PasswordFields-DLbVLg8O.js 4.51 kB 4.51 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WorkspaceProfilePic-D6ioir1T.js 1.57 kB 1.57 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 5 added / 5 removed

Editors & Dialogs — 736 B (baseline 736 B) • ⚪ 0 B

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useSubscriptionDialog-BS5jWtyL.js (removed) 736 B 🟢 -736 B 🟢 -377 B 🟢 -329 B
assets/useSubscriptionDialog-C8hxZ8hh.js (new) 736 B 🔴 +736 B 🔴 +379 B 🔴 +330 B

Status: 1 added / 1 removed

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

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useTerminalTabs-BWqRH5C7.js (new) 9.84 kB 🔴 +9.84 kB 🔴 +3.4 kB 🔴 +3 kB
assets/useTerminalTabs-DcS5yhT7.js (removed) 9.84 kB 🟢 -9.84 kB 🟢 -3.4 kB 🟢 -2.98 kB
assets/ComfyQueueButton-BgEZlHwO.js (removed) 8.02 kB 🟢 -8.02 kB 🟢 -2.49 kB 🟢 -2.23 kB
assets/ComfyQueueButton-CJ2PWPne.js (new) 8.02 kB 🔴 +8.02 kB 🔴 +2.49 kB 🔴 +2.23 kB
assets/SubscribeButton-B-llH7Ip.js (new) 2.34 kB 🔴 +2.34 kB 🔴 +1.01 kB 🔴 +887 B
assets/SubscribeButton-CY2Vz8FB.js (removed) 2.34 kB 🟢 -2.34 kB 🟢 -1.01 kB 🟢 -890 B
assets/cloudFeedbackTopbarButton-BddURh_S.js (removed) 1.59 kB 🟢 -1.59 kB 🟢 -850 B 🟢 -759 B
assets/cloudFeedbackTopbarButton-BTYC9-Uu.js (new) 1.59 kB 🔴 +1.59 kB 🔴 +852 B 🔴 +755 B
assets/ComfyQueueButton-Cng5BVzO.js (removed) 793 B 🟢 -793 B 🟢 -390 B 🟢 -348 B
assets/ComfyQueueButton-DAyuVFiI.js (new) 793 B 🔴 +793 B 🔴 +393 B 🔴 +348 B
assets/Button-BmV_oMkV.js 3.07 kB 3.07 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudBadge-Dwm2ik5F.js 1.16 kB 1.16 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/FormSearchInput-_-8jCXXp.js 3.73 kB 3.73 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ScrubableNumberInput-DuXiQcmx.js 5.94 kB 5.94 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/TopbarBadge-CcfLKchp.js 7.44 kB 7.44 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserAvatar-CnQQLXB-.js 1.17 kB 1.17 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetButton-UG3bz6HI.js 1.84 kB 1.84 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 5 added / 5 removed

Data & Services — 2.58 MB (baseline 2.57 MB) • 🔴 +2.5 kB

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/dialogService-xpyjtxZI.js (new) 1.76 MB 🔴 +1.76 MB 🔴 +396 kB 🔴 +298 kB
assets/dialogService-BetuB46P.js (removed) 1.76 MB 🟢 -1.76 MB 🟢 -395 kB 🟢 -297 kB
assets/api-D6LrFIZ2.js (removed) 688 kB 🟢 -688 kB 🟢 -155 kB 🟢 -123 kB
assets/api-DOt11sZw.js (new) 688 kB 🔴 +688 kB 🔴 +155 kB 🔴 +123 kB
assets/load3dService-DyKK6YUg.js (removed) 91 kB 🟢 -91 kB 🟢 -19.1 kB 🟢 -16.4 kB
assets/load3dService-nPMN62jD.js (new) 91 kB 🔴 +91 kB 🔴 +19.1 kB 🔴 +16.4 kB
assets/extensionStore-CeANS_H3.js (removed) 12.1 kB 🟢 -12.1 kB 🟢 -4.21 kB 🟢 -3.7 kB
assets/extensionStore-CgUTo6O8.js (new) 12.1 kB 🔴 +12.1 kB 🔴 +4.21 kB 🔴 +3.7 kB
assets/releaseStore-BT-7n1fR.js (new) 7.96 kB 🔴 +7.96 kB 🔴 +2.22 kB 🔴 +1.95 kB
assets/releaseStore-Db3vXWWO.js (removed) 7.96 kB 🟢 -7.96 kB 🟢 -2.22 kB 🟢 -1.96 kB
assets/keybindingService-BxnaM9eK.js (new) 6.52 kB 🔴 +6.52 kB 🔴 +1.7 kB 🔴 +1.47 kB
assets/keybindingService-CVWNu6bE.js (removed) 6.52 kB 🟢 -6.52 kB 🟢 -1.71 kB 🟢 -1.48 kB
assets/bootstrapStore-CQkURx2O.js (new) 2.08 kB 🔴 +2.08 kB 🔴 +874 B 🔴 +787 B
assets/bootstrapStore-V4SYaAfX.js (removed) 2.08 kB 🟢 -2.08 kB 🟢 -873 B 🟢 -786 B
assets/userStore-DhM_HTrr.js (new) 1.85 kB 🔴 +1.85 kB 🔴 +719 B 🔴 +632 B
assets/userStore-DxJ9ps2F.js (removed) 1.85 kB 🟢 -1.85 kB 🟢 -721 B 🟢 -666 B
assets/audioService-CoKdUtqV.js (removed) 1.73 kB 🟢 -1.73 kB 🟢 -849 B 🟢 -726 B
assets/audioService-r4OT_goy.js (new) 1.73 kB 🔴 +1.73 kB 🔴 +847 B 🔴 +727 B
assets/releaseStore-BVbrUJwD.js (new) 760 B 🔴 +760 B 🔴 +381 B 🔴 +340 B
assets/releaseStore-Cl1-NQxo.js (removed) 760 B 🟢 -760 B 🟢 -380 B 🟢 -336 B
assets/settingStore-CeIIxTpT.js (new) 744 B 🔴 +744 B 🔴 +386 B 🔴 +342 B
assets/settingStore-DCOnRJJo.js (removed) 744 B 🟢 -744 B 🟢 -384 B 🟢 -340 B
assets/workflowDraftStore-CQv2mV3U.js (new) 736 B 🔴 +736 B 🔴 +374 B 🔴 +335 B
assets/workflowDraftStore-sJTt_xoY.js (removed) 736 B 🟢 -736 B 🟢 -377 B 🟢 -334 B
assets/dialogService-B44tve2g.js (new) 725 B 🔴 +725 B 🔴 +366 B 🔴 +328 B
assets/dialogService-OQYD_joW.js (removed) 725 B 🟢 -725 B 🟢 -365 B 🟢 -327 B
assets/serverConfigStore-EPk4OtIK.js 2.32 kB 2.32 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 13 added / 13 removed

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

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useLoad3d-DucN1evY.js (new) 14.6 kB 🔴 +14.6 kB 🔴 +3.63 kB 🔴 +3.21 kB
assets/useLoad3d-MXlfYC_p.js (removed) 14.6 kB 🟢 -14.6 kB 🟢 -3.63 kB 🟢 -3.21 kB
assets/useLoad3dViewer-BmdS3IeR.js (removed) 14.1 kB 🟢 -14.1 kB 🟢 -3.15 kB 🟢 -2.79 kB
assets/useLoad3dViewer-nVsB9WFK.js (new) 14.1 kB 🔴 +14.1 kB 🔴 +3.15 kB 🔴 +2.79 kB
assets/useFeatureFlags-BeWOseSz.js (removed) 4.14 kB 🟢 -4.14 kB 🟢 -1.24 kB 🟢 -1.06 kB
assets/useFeatureFlags-BXYLZaGQ.js (new) 4.14 kB 🔴 +4.14 kB 🔴 +1.24 kB 🔴 +1.06 kB
assets/useWorkspaceUI-HqT8L4gQ.js (new) 3 kB 🔴 +3 kB 🔴 +823 B 🔴 +703 B
assets/useWorkspaceUI-ISB_6hWV.js (removed) 3 kB 🟢 -3 kB 🟢 -821 B 🟢 -703 B
assets/subscriptionCheckoutUtil-Bkf0QnNX.js (new) 2.53 kB 🔴 +2.53 kB 🔴 +1.06 kB 🔴 +924 B
assets/subscriptionCheckoutUtil-DXYruhJu.js (removed) 2.53 kB 🟢 -2.53 kB 🟢 -1.06 kB 🟢 -923 B
assets/useErrorHandling-DFEtzxOL.js (new) 1.5 kB 🔴 +1.5 kB 🔴 +629 B 🔴 +569 B
assets/useErrorHandling-OE3Yl--9.js (removed) 1.5 kB 🟢 -1.5 kB 🟢 -630 B 🟢 -534 B
assets/useWorkspaceSwitch-B8Niw1IC.js (removed) 1.25 kB 🟢 -1.25 kB 🟢 -544 B 🟢 -484 B
assets/useWorkspaceSwitch-DKlc512E.js (new) 1.25 kB 🔴 +1.25 kB 🔴 +544 B 🔴 +481 B
assets/useLoad3d-B2iswatI.js (new) 859 B 🔴 +859 B 🔴 +423 B 🔴 +380 B
assets/useLoad3d-BzrNt7j7.js (removed) 859 B 🟢 -859 B 🟢 -423 B 🟢 -379 B
assets/audioUtils-0izxghmT.js (new) 858 B 🔴 +858 B 🔴 +499 B 🔴 +419 B
assets/audioUtils-FlhARZLk.js (removed) 858 B 🟢 -858 B 🟢 -500 B 🟢 -402 B
assets/useLoad3dViewer-Bx9x15JM.js (removed) 838 B 🟢 -838 B 🟢 -407 B 🟢 -370 B
assets/useLoad3dViewer-CqFpk0ag.js (new) 838 B 🔴 +838 B 🔴 +408 B 🔴 +372 B
assets/useCurrentUser-DwFUzT9_.js (removed) 722 B 🟢 -722 B 🟢 -368 B 🟢 -327 B
assets/useCurrentUser-poqd_aM0.js (new) 722 B 🔴 +722 B 🔴 +370 B 🔴 +328 B
assets/_plugin-vue_export-helper-ralzwvFM.js 315 B 315 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/colorUtil-Do7KfQZ0.js 7 kB 7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/envUtil-Clzmwvt4.js 466 B 466 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/markdownRendererUtil-Cddas8Zl.js 1.56 kB 1.56 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SkeletonUtils-BputJAFn.js 133 B 133 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useExternalLink-CC_Lvunc.js 1.66 kB 1.66 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 11 added / 11 removed

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

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-axios-Cp6hch1I.js 70.7 kB 70.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-chart-BxkFiWzp.js 399 kB 399 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-firebase-BvMr43CG.js 836 kB 836 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-i18n-DNX73mqE.js 133 kB 133 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-markdown-D5S6AC80.js 103 kB 103 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-other-CusKVpQl.js 1.52 MB 1.52 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-primevue-BnCPTL0g.js 1.73 MB 1.73 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-reka-ui-DwsW_6GN.js 390 kB 390 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-sentry-SQwstEKc.js 182 kB 182 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-three-LBLOE6BD.js 1.8 MB 1.8 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-tiptap-BnYkbQDM.js 634 kB 634 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vue-core-DtiQ1dr9.js 311 kB 311 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vueuse-D2jVNnmE.js 113 kB 113 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-xterm-MKpa1ZAW.js 374 kB 374 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-yjs-CP_4YO8u.js 143 kB 143 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-zod-DcCUUPIi.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Other — 7.89 MB (baseline 7.89 MB) • ⚪ 0 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/core-BuZqwUFa.js (removed) 73.4 kB 🟢 -73.4 kB 🟢 -18.9 kB 🟢 -16.2 kB
assets/core-CSNnrRfq.js (new) 73.4 kB 🔴 +73.4 kB 🔴 +18.9 kB 🔴 +16.2 kB
assets/groupNode-B7_pbkIp.js (removed) 71.8 kB 🟢 -71.8 kB 🟢 -17.7 kB 🟢 -15.5 kB
assets/groupNode-D-MzCIxt.js (new) 71.8 kB 🔴 +71.8 kB 🔴 +17.7 kB 🔴 +15.5 kB
assets/WidgetSelect-BZwTfd4u.js (removed) 58.1 kB 🟢 -58.1 kB 🟢 -12.4 kB 🟢 -10.7 kB
assets/WidgetSelect-CX1uODK3.js (new) 58.1 kB 🔴 +58.1 kB 🔴 +12.4 kB 🔴 +10.7 kB
assets/SubscriptionRequiredDialogContentWorkspace-aIPW1aUu.js (removed) 46.3 kB 🟢 -46.3 kB 🟢 -8.65 kB 🟢 -7.49 kB
assets/SubscriptionRequiredDialogContentWorkspace-BKPwTOQU.js (new) 46.3 kB 🔴 +46.3 kB 🔴 +8.65 kB 🔴 +7.52 kB
assets/WidgetPainter-Ba4u47xE.js (new) 32.5 kB 🔴 +32.5 kB 🔴 +7.96 kB 🔴 +7.07 kB
assets/WidgetPainter-D8SX1JeP.js (removed) 32.5 kB 🟢 -32.5 kB 🟢 -7.96 kB 🟢 -7.06 kB
assets/Load3DControls-DHZtHEKS.js (new) 30.9 kB 🔴 +30.9 kB 🔴 +5.34 kB 🔴 +4.65 kB
assets/Load3DControls-JisgWd63.js (removed) 30.9 kB 🟢 -30.9 kB 🟢 -5.34 kB 🟢 -4.65 kB
assets/WorkspacePanelContent-BXyTlgip.js (removed) 29.3 kB 🟢 -29.3 kB 🟢 -6.14 kB 🟢 -5.42 kB
assets/WorkspacePanelContent-DE6BP2fI.js (new) 29.3 kB 🔴 +29.3 kB 🔴 +6.15 kB 🔴 +5.38 kB
assets/SubscriptionRequiredDialogContent-DLZ6TIzF.js (removed) 25.7 kB 🟢 -25.7 kB 🟢 -6.57 kB 🟢 -5.76 kB
assets/SubscriptionRequiredDialogContent-YVf5__Cw.js (new) 25.7 kB 🔴 +25.7 kB 🔴 +6.57 kB 🔴 +5.78 kB
assets/Load3dViewerContent-Cd535Mas.js (new) 23 kB 🔴 +23 kB 🔴 +5.18 kB 🔴 +4.5 kB
assets/Load3dViewerContent-D93J6VtF.js (removed) 23 kB 🟢 -23 kB 🟢 -5.18 kB 🟢 -4.5 kB
assets/WidgetImageCrop-BGpHlVE1.js (new) 22.1 kB 🔴 +22.1 kB 🔴 +5.51 kB 🔴 +4.85 kB
assets/WidgetImageCrop-D8V2_aSF.js (removed) 22.1 kB 🟢 -22.1 kB 🟢 -5.51 kB 🟢 -4.87 kB
assets/SubscriptionPanelContentWorkspace-CXC24ytu.js (removed) 22 kB 🟢 -22 kB 🟢 -5.1 kB 🟢 -4.51 kB
assets/SubscriptionPanelContentWorkspace-DG1GTP-4.js (new) 22 kB 🔴 +22 kB 🔴 +5.11 kB 🔴 +4.51 kB
assets/CurrentUserPopoverWorkspace-BD9lC7R6.js (removed) 20.4 kB 🟢 -20.4 kB 🟢 -4.93 kB 🟢 -4.41 kB
assets/CurrentUserPopoverWorkspace-DG-GR6hl.js (new) 20.4 kB 🔴 +20.4 kB 🔴 +4.94 kB 🔴 +4.41 kB
assets/SignInContent-CACxEobZ.js (new) 18.9 kB 🔴 +18.9 kB 🔴 +4.76 kB 🔴 +4.17 kB
assets/SignInContent-CNU6nzhK.js (removed) 18.9 kB 🟢 -18.9 kB 🟢 -4.76 kB 🟢 -4.16 kB
assets/WidgetInputNumber-ByDXJFqn.js (new) 18.7 kB 🔴 +18.7 kB 🔴 +4.75 kB 🔴 +4.22 kB
assets/WidgetInputNumber-ZyTAh7Xg.js (removed) 18.7 kB 🟢 -18.7 kB 🟢 -4.75 kB 🟢 -4.22 kB
assets/WidgetRecordAudio-CGYqT0Qz.js (removed) 17.3 kB 🟢 -17.3 kB 🟢 -4.94 kB 🟢 -4.42 kB
assets/WidgetRecordAudio-uKO8EeyE.js (new) 17.3 kB 🔴 +17.3 kB 🔴 +4.94 kB 🔴 +4.42 kB
assets/Load3D-B235zdJW.js (removed) 16.2 kB 🟢 -16.2 kB 🟢 -4.03 kB 🟢 -3.53 kB
assets/Load3D-DmFrlEbZ.js (new) 16.2 kB 🔴 +16.2 kB 🔴 +4.03 kB 🔴 +3.52 kB
assets/load3d-mzh8zhAW.js (new) 14.7 kB 🔴 +14.7 kB 🔴 +4.19 kB 🔴 +3.63 kB
assets/load3d-O0639wql.js (removed) 14.7 kB 🟢 -14.7 kB 🟢 -4.19 kB 🟢 -3.63 kB
assets/AudioPreviewPlayer-Cz4CSsqg.js (new) 10.9 kB 🔴 +10.9 kB 🔴 +3.19 kB 🔴 +2.86 kB
assets/AudioPreviewPlayer-GqQ9lkMX.js (removed) 10.9 kB 🟢 -10.9 kB 🟢 -3.19 kB 🟢 -2.87 kB
assets/changeTracker-BHbrmdWi.js (new) 9.38 kB 🔴 +9.38 kB 🔴 +2.89 kB 🔴 +2.55 kB
assets/changeTracker-BNgonzkQ.js (removed) 9.38 kB 🟢 -9.38 kB 🟢 -2.89 kB 🟢 -2.54 kB
assets/nodeTemplates-Bc9a3kUI.js (new) 9.29 kB 🔴 +9.29 kB 🔴 +3.26 kB 🔴 +2.86 kB
assets/nodeTemplates-Bq6OIRur.js (removed) 9.29 kB 🟢 -9.29 kB 🟢 -3.25 kB 🟢 -2.86 kB
assets/InviteMemberDialogContent-BWa2YxVs.js (removed) 7.38 kB 🟢 -7.38 kB 🟢 -2.29 kB 🟢 -2 kB
assets/InviteMemberDialogContent-C2p_Kz-J.js (new) 7.38 kB 🔴 +7.38 kB 🔴 +2.29 kB 🔴 +2 kB
assets/Load3DConfiguration-B-Wka_S1.js (new) 6.27 kB 🔴 +6.27 kB 🔴 +1.92 kB 🔴 +1.68 kB
assets/Load3DConfiguration-CWq4ntMc.js (removed) 6.27 kB 🟢 -6.27 kB 🟢 -1.92 kB 🟢 -1.68 kB
assets/CreateWorkspaceDialogContent-BvIPw_WC.js (new) 5.53 kB 🔴 +5.53 kB 🔴 +1.99 kB 🔴 +1.74 kB
assets/CreateWorkspaceDialogContent-CxFKuV9L.js (removed) 5.53 kB 🟢 -5.53 kB 🟢 -1.99 kB 🟢 -1.73 kB
assets/onboardingCloudRoutes-BKt1qN3I.js (removed) 5.41 kB 🟢 -5.41 kB 🟢 -1.84 kB 🟢 -1.6 kB
assets/onboardingCloudRoutes-CYgSBvZ0.js (new) 5.41 kB 🔴 +5.41 kB 🔴 +1.84 kB 🔴 +1.62 kB
assets/FreeTierDialogContent-Cen7hAag.js (removed) 5.39 kB 🟢 -5.39 kB 🟢 -1.89 kB 🟢 -1.67 kB
assets/FreeTierDialogContent-DpidcQVT.js (new) 5.39 kB 🔴 +5.39 kB 🔴 +1.89 kB 🔴 +1.68 kB
assets/EditWorkspaceDialogContent-C3U3AMBp.js (new) 5.33 kB 🔴 +5.33 kB 🔴 +1.94 kB 🔴 +1.7 kB
assets/EditWorkspaceDialogContent-CqXhFV-U.js (removed) 5.33 kB 🟢 -5.33 kB 🟢 -1.95 kB 🟢 -1.7 kB
assets/ValueControlPopover-2g8jN52E.js (new) 4.92 kB 🔴 +4.92 kB 🔴 +1.76 kB 🔴 +1.57 kB
assets/ValueControlPopover-Cb3_AEnc.js (removed) 4.92 kB 🟢 -4.92 kB 🟢 -1.76 kB 🟢 -1.57 kB
assets/Preview3d-_4U2rRb2.js (removed) 4.81 kB 🟢 -4.81 kB 🟢 -1.56 kB 🟢 -1.36 kB
assets/Preview3d-Bkb9gItD.js (new) 4.81 kB 🔴 +4.81 kB 🔴 +1.56 kB 🔴 +1.37 kB
assets/CancelSubscriptionDialogContent-CJ8jxFf8.js (new) 4.79 kB 🔴 +4.79 kB 🔴 +1.78 kB 🔴 +1.56 kB
assets/CancelSubscriptionDialogContent-CXMf8v-M.js (removed) 4.79 kB 🟢 -4.79 kB 🟢 -1.78 kB 🟢 -1.56 kB
assets/DeleteWorkspaceDialogContent-CPx5k5p7.js (new) 4.23 kB 🔴 +4.23 kB 🔴 +1.63 kB 🔴 +1.42 kB
assets/DeleteWorkspaceDialogContent-DUwvMgwN.js (removed) 4.23 kB 🟢 -4.23 kB 🟢 -1.63 kB 🟢 -1.41 kB
assets/WidgetWithControl-CFrzGfmr.js (removed) 4.1 kB 🟢 -4.1 kB 🟢 -1.77 kB 🟢 -1.62 kB
assets/WidgetWithControl-D5xow-XB.js (new) 4.1 kB 🔴 +4.1 kB 🔴 +1.78 kB 🔴 +1.6 kB
assets/LeaveWorkspaceDialogContent-DJn6eqBi.js (removed) 4.06 kB 🟢 -4.06 kB 🟢 -1.58 kB 🟢 -1.37 kB
assets/LeaveWorkspaceDialogContent-HuNdYWyO.js (new) 4.06 kB 🔴 +4.06 kB 🔴 +1.58 kB 🔴 +1.37 kB
assets/RemoveMemberDialogContent-COWGqR2n.js (new) 4.04 kB 🔴 +4.04 kB 🔴 +1.52 kB 🔴 +1.33 kB
assets/RemoveMemberDialogContent-OjCrF6pN.js (removed) 4.04 kB 🟢 -4.04 kB 🟢 -1.52 kB 🟢 -1.33 kB
assets/RevokeInviteDialogContent-BJX4b3GE.js (removed) 3.95 kB 🟢 -3.95 kB 🟢 -1.54 kB 🟢 -1.35 kB
assets/RevokeInviteDialogContent-DZgO44oK.js (new) 3.95 kB 🔴 +3.95 kB 🔴 +1.54 kB 🔴 +1.35 kB
assets/InviteMemberUpsellDialogContent-MX8fFubx.js (removed) 3.82 kB 🟢 -3.82 kB 🟢 -1.4 kB 🟢 -1.23 kB
assets/InviteMemberUpsellDialogContent-q3W4Hskg.js (new) 3.82 kB 🔴 +3.82 kB 🔴 +1.4 kB 🔴 +1.23 kB
assets/tierBenefits-CJZYIzZO.js (new) 3.66 kB 🔴 +3.66 kB 🔴 +1.3 kB 🔴 +1.17 kB
assets/tierBenefits-yvGodWYs.js (removed) 3.66 kB 🟢 -3.66 kB 🟢 -1.3 kB 🟢 -1.16 kB
assets/saveMesh-Clyy84Ne.js (removed) 3.38 kB 🟢 -3.38 kB 🟢 -1.45 kB 🟢 -1.3 kB
assets/saveMesh-DOGlxmDN.js (new) 3.38 kB 🔴 +3.38 kB 🔴 +1.45 kB 🔴 +1.3 kB
assets/cloudSessionCookie-2s9fw1ST.js (new) 3.1 kB 🔴 +3.1 kB 🔴 +1.09 kB 🔴 +956 B
assets/cloudSessionCookie-Bd7PpGVE.js (removed) 3.1 kB 🟢 -3.1 kB 🟢 -1.08 kB 🟢 -943 B
assets/GlobalToast-B1xWGOKw.js (new) 2.91 kB 🔴 +2.91 kB 🔴 +1.21 kB 🔴 +1.03 kB
assets/GlobalToast-BOc6EVLl.js (removed) 2.91 kB 🟢 -2.91 kB 🟢 -1.21 kB 🟢 -1.03 kB
assets/SubscribeToRun-f9zVINtz.js (removed) 2.06 kB 🟢 -2.06 kB 🟢 -949 B 🟢 -820 B
assets/SubscribeToRun-sWURq2fU.js (new) 2.06 kB 🔴 +2.06 kB 🔴 +949 B 🔴 +829 B
assets/CloudRunButtonWrapper-DLKhU4WZ.js (new) 1.68 kB 🔴 +1.68 kB 🔴 +786 B 🔴 +710 B
assets/CloudRunButtonWrapper-FzErXywU.js (removed) 1.68 kB 🟢 -1.68 kB 🟢 -785 B 🟢 -714 B
assets/previousFullPath-BI13MnIt.js (new) 1.39 kB 🔴 +1.39 kB 🔴 +650 B 🔴 +556 B
assets/previousFullPath-DEu5YrFO.js (removed) 1.39 kB 🟢 -1.39 kB 🟢 -649 B 🟢 -557 B
assets/cloudBadges-CqvXaDdC.js (new) 1.36 kB 🔴 +1.36 kB 🔴 +702 B 🔴 +611 B
assets/cloudBadges-JZ8oB__5.js (removed) 1.36 kB 🟢 -1.36 kB 🟢 -698 B 🟢 -610 B
assets/cloudSubscription-B0Rxj348.js (removed) 1.33 kB 🟢 -1.33 kB 🟢 -653 B 🟢 -567 B
assets/cloudSubscription-CSPKWuD6.js (new) 1.33 kB 🔴 +1.33 kB 🔴 +655 B 🔴 +567 B
assets/Load3D-CwL7KuiV.js (removed) 1.07 kB 🟢 -1.07 kB 🟢 -497 B 🟢 -440 B
assets/Load3D-DoWDLQVl.js (new) 1.07 kB 🔴 +1.07 kB 🔴 +497 B 🔴 +445 B
assets/nightlyBadges-BMF-Dlnu.js (removed) 1 kB 🟢 -1 kB 🟢 -528 B 🟢 -471 B
assets/nightlyBadges-CQlMSjJT.js (new) 1 kB 🔴 +1 kB 🔴 +529 B 🔴 +473 B
assets/Load3dViewerContent-B6AtEYn1.js (new) 993 B 🔴 +993 B 🔴 +467 B 🔴 +420 B
assets/Load3dViewerContent-DCqYbg0I.js (removed) 993 B 🟢 -993 B 🟢 -466 B 🟢 -417 B
assets/SubscriptionPanelContentWorkspace-B6Om1LUh.js (removed) 920 B 🟢 -920 B 🟢 -436 B 🟢 -374 B
assets/SubscriptionPanelContentWorkspace-CdkfxmZq.js (new) 920 B 🔴 +920 B 🔴 +439 B 🔴 +375 B
assets/graphHasMissingNodes-B7c1FEDH.js (new) 761 B 🔴 +761 B 🔴 +374 B 🔴 +329 B
assets/graphHasMissingNodes-D8nfY7Sr.js (removed) 761 B 🟢 -761 B 🟢 -376 B 🟢 -316 B
assets/changeTracker-CEnZT5w4.js (new) 757 B 🔴 +757 B 🔴 +384 B 🔴 +338 B
assets/changeTracker-CkYF-rdu.js (removed) 757 B 🟢 -757 B 🟢 -381 B 🟢 -337 B
assets/WidgetLegacy-B3bao-NC.js (new) 745 B 🔴 +745 B 🔴 +383 B 🔴 +339 B
assets/WidgetLegacy-DwHUAJJW.js (removed) 745 B 🟢 -745 B 🟢 -379 B 🟢 -334 B
assets/WidgetInputNumber-DaOc4RKc.js (new) 469 B 🔴 +469 B 🔴 +262 B 🔴 +226 B
assets/WidgetInputNumber-F7Y3zMps.js (removed) 469 B 🟢 -469 B 🟢 -265 B 🟢 -229 B
assets/AnimationControls-BJfA48qn.js 4.61 kB 4.61 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ApiNodesSignInContent-Cf5pzr5w.js 2.69 kB 2.69 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/auto-BTnZwrs2.js 1.7 kB 1.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/BaseViewTemplate-DQKI7wOs.js 1.78 kB 1.78 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/comfy-logo-single-D9MrYETV.js 198 B 198 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ComfyOrgHeader-CuEodz4y.js 910 B 910 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-B-AdR9IA.js 17.5 kB 17.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CbkxT8K8.js 16.1 kB 16.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CJGmjcIS.js 15.9 kB 15.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CMaLgTTb.js 16.7 kB 16.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Cw07MMbJ.js 18.8 kB 18.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-D7EtdE6o.js 16.9 kB 16.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DknEFpK3.js 15.2 kB 15.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Ds6WuXnw.js 16.1 kB 16.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Dvq-F-mb.js 17.5 kB 17.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-pUOay9Eo.js 15.1 kB 15.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-u2AZ8xU4.js 16.1 kB 16.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/constants-htt0vt7m.js 579 B 579 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/i18n-BB6-58wO.js 534 kB 534 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/i18n-BhY0GvgO.js 199 B 199 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-B4gaX-yc.js 148 kB 148 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BDkWXD94.js 131 kB 131 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BMRaSx8g.js 132 kB 132 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BQewqC5f.js 152 kB 152 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CAdoKrN8.js 154 kB 154 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CDYHbD1q.js 179 kB 179 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DEgKa3D5.js 172 kB 172 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-EWELmaLr.js 157 kB 157 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Mk6d58ld.js 208 kB 208 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-o4jORuCB.js 149 kB 149 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-r2f5phvM.js 186 kB 186 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Media3DTop-Dqa2c7nZ.js 1.82 kB 1.82 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaAudioTop-DLiWNcHw.js 1.43 kB 1.43 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaImageTop-BLQErkwF.js 1.75 kB 1.75 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaOtherTop-NQGNpa4H.js 1.02 kB 1.02 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaTextTop-0crUoXWV.js 1.01 kB 1.01 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaVideoTop-CbM1Hg4R.js 2.77 kB 2.77 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-B_3vRHdX.js 404 kB 404 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-B8IeQQ22.js 491 kB 491 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BBd1UY-y.js 451 kB 451 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BCgLCz6M.js 399 kB 399 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BhY0cXr1.js 400 kB 400 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CcuK7vTw.js 391 kB 391 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CGMHpJUK.js 396 kB 396 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CnkZri8R.js 450 kB 450 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-E76-moki.js 367 kB 367 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-HxND2i1t.js 416 kB 416 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-HYzcH6bZ.js 364 kB 364 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/OBJLoader2WorkerModule-DTMpvldF.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Popover-i64uGJuk.js 3.65 kB 3.65 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/rolldown-runtime-DLICfi3-.js 1.97 kB 1.97 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SelectValue-C30NXhYp.js 8.94 kB 8.94 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/signInSchema-BnFkOiXP.js 1.53 kB 1.53 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Slider-DOON_1XA.js 3.52 kB 3.52 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/src-YFnxAfbN.js 251 B 251 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscriptionBenefits-DVSfLULk.js 2.01 kB 2.01 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/telemetry-zZf2dHJ2.js 226 B 226 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/types-DT3N7am7.js 204 B 204 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/VideoPlayOverlay-DNwi9WvU.js 1.35 kB 1.35 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widget-NeEr3XWN.js 586 B 586 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-CD1QCk7B.js 3.19 kB 3.19 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-CwZP69HN.js 283 B 283 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetChart-BtoXUSiF.js 2.21 kB 2.21 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetColorPicker-DCBI_-rd.js 2.9 kB 2.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetCurve-CIcV8pqy.js 9.36 kB 9.36 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetGalleria-DZSYhGzO.js 3.61 kB 3.61 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetImageCompare-1to19HN6.js 7 kB 7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetInputText-DEze40qY.js 1.86 kB 1.86 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetLayoutField-aaFXOFZ9.js 1.98 kB 1.98 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetMarkdown-Cqdttdn1.js 2.93 kB 2.93 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetPropFilter-DN03zIgB.js 1.1 kB 1.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetTextarea-DXeEXWjl.js 3.96 kB 3.96 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetToggleSwitch-BDo6bJhB.js 6.8 kB 6.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetTypes-Br_tbhcL.js 393 B 393 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 52 added / 52 removed

@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: 2

🤖 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/scripts/metadata/ogg.ts`:
- Around line 139-148: Normalize the Vorbis comment key before comparing by
trimming and lowercasing the variable `key` (the one set from text.substring at
the start of the metadata parsing block) so comparisons against 'prompt' and
'workflow' are case-insensitive; update the matching logic in the same block
that assigns `result.prompt` / `result.workflow` (and any other key checks) to
use the normalized key, and optionally trim `value` as well before parsing to
avoid whitespace issues.
- Around line 41-82: The loop appends segments across pages after inOpusTags
becomes true without validating Ogg logical-stream continuity, which can stitch
unrelated/corrupt pages into the OpusTags packet; fix by capturing the page
bitstream serial (bytes at the Ogg header serial number field) and the page
sequence number and header-type flags when you first detect 'OpusTags' (use the
same offsets surrounding OGG_HEADER_SIZE/OGG_PAGE_SEGMENTS_OFFSET to read
header-type and serial/sequence), then only accept segments from subsequent
pages if the serial matches, the page sequence is the expected next sequence (or
a continuation is indicated via the header-type continuation flag), and the
header-type continuation flag semantics are honored; if any of those checks
fail, stop processing/abort collecting further segments to avoid stitching
unrelated pages into segments (apply checks where you currently set inOpusTags
and before pushing into segments).

ℹ️ Review info

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 447295e and 1748944.

📒 Files selected for processing (2)
  • src/scripts/metadata/ogg.test.ts
  • src/scripts/metadata/ogg.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/scripts/metadata/ogg.test.ts

Comment thread src/scripts/metadata/ogg.ts
Comment thread src/scripts/metadata/ogg.ts Outdated
@christian-byrne christian-byrne self-assigned this Mar 12, 2026
Comment thread src/scripts/metadata/ogg.ts Outdated
Comment thread src/scripts/metadata/ogg.ts
Comment thread src/scripts/metadata/ogg.test.ts
Comment thread src/scripts/metadata/ogg.ts Outdated
Comment thread src/scripts/metadata/ogg.ts Outdated
@xeinherjer-dev

Copy link
Copy Markdown
Author

Summary of changes to address feedback:

  1. Memory Optimization: Limited file reading to 2MB (previously reading the entire file) to align with other metadata parsers.
  2. RFC Compliance: Added .toLowerCase() to Vorbis Comment keys to ensure case-insensitive matching per RFC 7845.
  3. Guard Clause: Added a segmentLength >= 8 check before decoding to avoid unnecessary processing on tiny segments.
  4. Log Level Adjustment: Downgraded the missing [OpusTags] log from console.error to console.warn for consistency with other parsers.
  5. Test Robustness: Updated the test helper to include an OpusHead identification header (Page 0), ensuring the parser correctly handles real-world Ogg/Opus structures.
    Verified with 14/14 tests passing and 100% coverage on ogg.ts.

@xeinherjer-dev xeinherjer-dev removed their assignment Mar 13, 2026

@christian-byrne christian-byrne left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

code looks good - clean rewrite with proper Ogg page traversal, thorough bounds checking, and comprehensive test coverage. all review feedback addressed.

@christian-byrne christian-byrne left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Rescinding approval - the parser rewrite itself is solid and already wired via parser.ts, but the PR is missing E2E coverage that the other media format PRs include (e.g., PR #4420 for AVIF):

  1. Add a workflow.ogg test asset to browser_tests/assets/workflowInMedia/ (a real Ogg/Opus file with embedded ComfyUI prompt+workflow metadata using core nodes only)
  2. Add 'workflow.ogg' to the fileNames array in browser_tests/tests/loadWorkflowInMedia.spec.ts

This ensures the full drag-and-drop → metadata extraction → workflow load path is covered end-to-end, not just the parser in isolation.

@christian-byrne christian-byrne left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Some extra guidance on creating the test asset:

Generating workflow.ogg:
The easiest way is to use ComfyUI itself — run any workflow that uses a SaveAudio node (which outputs Opus/Ogg). The backend embeds prompt and workflow as Vorbis Comments in the OpusTags packet automatically via extra_pnginfo.

Important: use core nodes only. The workflow.avif test asset is currently commented out in the test file because it uses non-core nodes, which triggers a missing nodes dialog and breaks the screenshot comparison. To avoid this, build a simple workflow using only built-in nodes (e.g., EmptyLatentImageKSampler → something that produces audio, or just any minimal core-only workflow).

Files to change:

  1. Add the generated .ogg file to browser_tests/assets/workflowInMedia/workflow.ogg
  2. Add 'workflow.ogg' to the fileNames array in browser_tests/tests/loadWorkflowInMedia.spec.ts (line ~27, after 'workflow.svg')

Verifying locally:

pnpm test:browser:local -- --grep 'workflow.ogg'

See PR #4420 for the full pattern (that PR added AVIF support with the same set of changes).

@xeinherjer-dev

Copy link
Copy Markdown
Author

I've confirmed that the E2E test for workflow.ogg passes locally without any issues, and I've pushed the updates.

I also included a fix for the MIME type mapping in DragDropHelper.ts to ensure .ogg files are correctly identified as audio/ogg during the tests.

image

The previous implementation used naive regex matching on binary
data converted to strings. This approach failed entirely when
a large prompt caused the `OpusTags` packet to span multiple
Ogg pages.

This commit replaces the fragile string search with a robust
binary parser that strictly follows the Ogg logical bitstream
and Vorbis Comments specifications. It correctly handles Ogg
lacing and reassembles segmented packets, ensuring that large
JSON metadata is successfully extracted.

Also adds unit tests (ogg.test.ts) to verify the correct parsing
of both standard and multi-page Ogg files.
@xeinherjer-dev

Copy link
Copy Markdown
Author

@christian-byrne
This PR now conflicts with main due to #11307. As shown in the screenshot, the target issue remains unresolved.
image

Please let me know if this fix is still needed. If so, I will update the branch and resolve the conflicts.

@christian-byrne christian-byrne self-assigned this May 3, 2026
Comment thread src/scripts/metadata/ogg.ts
Comment thread src/scripts/metadata/ogg.ts Outdated
Comment thread src/scripts/metadata/ogg.ts Outdated
# Conflicts:
#	src/scripts/metadata/ogg.test.ts
#	src/scripts/metadata/ogg.ts
Applies optimizations and robustness improvements to the Ogg/Opus
metadata parser based on PR feedback:

- Use direct byte comparisons for magic strings ('OggS', 'OpusTags')
  to avoid per-page TextDecoder allocations.
- Add explicit bounds checking during segment processing to prevent
  infinite loops on corrupted files.
- Emit a console.warn when the OpusTags packet is truncated at the
  2MB read cap instead of failing silently.
- Consolidate duplicated constants and clean up comments.
coderabbitai[bot]
coderabbitai Bot previously approved these changes May 4, 2026
@xeinherjer-dev

Copy link
Copy Markdown
Author

@christian-byrne
I have addressed the review comments.
I also merged the latest main to resolve the conflicts with #11307. Since I incorporated some test cases from it, I added a try...catch block to the main code to handle them properly.

xeinherjer-dev and others added 2 commits May 12, 2026 01:09
Resolved conflicts in ogg.ts by integrating the NaN/Infinity
parsing logic from Comfy-Org#12217 into the new robust Ogg parser.
@github-actions

github-actions Bot commented Jun 21, 2026

Copy link
Copy Markdown

🎭 Playwright: ⏳ Running...

🎨 Storybook: 🚧 Building...

@github-actions

github-actions Bot commented Jul 12, 2026

Copy link
Copy Markdown

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

@xeinherjer-dev

Copy link
Copy Markdown
Author

I have read and agree to the Contributor License Agreement

comfy-legal added a commit to Comfy-Org/comfy-cla that referenced this pull request Jul 12, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug] Failed to load workflows from long Opus/Ogg files (SyntaxError due to OggS page breaks)

3 participants