Skip to content

Init spatial#1064

Merged
alexvpickering merged 71 commits into
masterfrom
init-spatial
Jul 8, 2026
Merged

Init spatial#1064
alexvpickering merged 71 commits into
masterfrom
init-spatial

Conversation

@alexvpickering

@alexvpickering alexvpickering commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

Description

adds support for Visium HD

Details

URL to issue

N/A

Link to staging deployment URL (or set N/A)

N/A

Links to any PRs or resources related to this PR

Integration test branch

master

Merge checklist

Your changes will be ready for merging after all of the steps below have been completed.

Code updates

Have best practices and ongoing refactors being observed in this PR

  • Migrated any selector / reducer used to the new format.
  • All new dependency licenses have been checked for compatibility.

Manual/unit testing

  • Tested changes using InfraMock locally or no tests required for change, e.g. Kubernetes chart updates.
  • Validated that current unit tests for code work as expected and are sufficient for code coverage or no unit tests required for change, e.g. documentation update.
  • Unit tests written or no unit tests required for change, e.g. documentation update.

Integration testing

You must check the box below to run integration tests on the latest commit on your PR branch.
Integration tests have to pass before the PR can be merged. Without checking the box, your PR
will not pass the required status checks for merging.

  • Started end-to-end tests on the latest commit.

Documentation updates

  • Relevant Github READMEs updated or no GitHub README updates required.
  • Relevant Wiki pages created/updated or no Wiki updates required.

Optional

  • Staging environment is unstaged before merging.
  • Photo of a cute animal attached to this PR.

Signed-off-by: Alex Pickering <alexvpickering@gmail.com>
Signed-off-by: Alex Pickering <alexvpickering@gmail.com>
Signed-off-by: Alex Pickering <alexvpickering@gmail.com>
Signed-off-by: Alex Pickering <alexvpickering@gmail.com>
Signed-off-by: Alex Pickering <alexvpickering@gmail.com>
Signed-off-by: Alex Pickering <alexvpickering@gmail.com>
Signed-off-by: Alex Pickering <alexvpickering@gmail.com>
Signed-off-by: Alex Pickering <alexvpickering@gmail.com>
Signed-off-by: Alex Pickering <alexvpickering@gmail.com>
Signed-off-by: Alex Pickering <alexvpickering@gmail.com>
Signed-off-by: Alex Pickering <alexvpickering@gmail.com>
Signed-off-by: Alex Pickering <alexvpickering@gmail.com>
Signed-off-by: Alex Pickering <alexvpickering@gmail.com>
Signed-off-by: Alex Pickering <alexvpickering@gmail.com>
Three spatial outlier filters (metric + outlier slide views and z-score histogram), shown only for spatial datasets; signed change column.

Signed-off-by: Alex Pickering <alexvpickering@gmail.com>
Canvas-handoff segmentation overlay + cached full-res tiles fed to Vega
(no PNG round-trip), pure-Vega zoom/pan persisted to plot config, and
spatial styling controls (segmentation opacity/outline, image toggle).

Signed-off-by: Alex Pickering <alexvpickering@gmail.com>
visium_hd runs fewer gem2s steps; use a matching step list (and clamp to 100%) so the bar isn't stuck below complete.

Signed-off-by: Alex Pickering <alexvpickering@gmail.com>
Hide doublet-score option for visium_hd, don't save embedding plots
before they're computed, clone elbow data to avoid frozen-state writes,
and keep preview tiles fixed-size; independent metric/outlier configs.

Signed-off-by: Alex Pickering <alexvpickering@gmail.com>
Signed-off-by: Alex Pickering <alexvpickering@gmail.com>
Signed-off-by: Alex Pickering <alexvpickering@gmail.com>
Signed-off-by: Alex Pickering <alexvpickering@gmail.com>
Signed-off-by: Alex Pickering <alexvpickering@gmail.com>
Signed-off-by: Alex Pickering <alexvpickering@gmail.com>
Signed-off-by: Alex Pickering <alexvpickering@gmail.com>
Signed-off-by: Alex Pickering <alexvpickering@gmail.com>
@alexvpickering alexvpickering added the safe to run Sensitive jobs are safe to be run label Jun 15, 2026
@dbmi-svc-checkmarx

dbmi-svc-checkmarx commented Jun 15, 2026

Copy link
Copy Markdown

Logo
Checkmarx One – Scan Summary & Details40f8f5a3-b2a5-4ddb-a151-07c0910aa9ae


New Issues (17) Checkmarx found the following issues in this Pull Request
# Severity Issue Source File / Package Checkmarx Insight
1 HIGH CVE-2026-12143 Npm-form-data-3.0.4
detailsDescription: form-data is a library for creating readable multipart/form-data streams. In versions through 2.5.5, 3.x through 3.0.4 and 4.x through 4.0.5, the `...
Attack Vector: NETWORK
Attack Complexity: LOW
Vulnerable Package
2 HIGH CVE-2026-12143 Npm-form-data-4.0.0
detailsDescription: form-data is a library for creating readable multipart/form-data streams. In versions through 2.5.5, 3.x through 3.0.4 and 4.x through 4.0.5, the `...
Attack Vector: NETWORK
Attack Complexity: LOW
Vulnerable Package
3 HIGH CVE-2026-12143 Npm-form-data-4.0.5
detailsDescription: form-data is a library for creating readable multipart/form-data streams. In versions through 2.5.5, 3.x through 3.0.4 and 4.x through 4.0.5, the `...
Attack Vector: NETWORK
Attack Complexity: LOW
Vulnerable Package
4 HIGH CVE-2026-44487 Npm-axios-1.13.6
detailsDescription: Axios's Node.js versions prior to `0.32.0` on the `0.x` line and versions prior to `1.16.0` on the `1.x`, HTTP adapter may forward a `Proxy-Authori...
Attack Vector: NETWORK
Attack Complexity: LOW
Vulnerable Package
5 HIGH CVE-2026-44490 Npm-axios-1.13.6
detailsDescription: Axios is a promise based HTTP client for the browser and Node.js. Prior to 0.32.0 and 1.0.0 prior to 1.16.0, axios exposes two read-side prototype-...
Attack Vector: NETWORK
Attack Complexity: LOW
Vulnerable Package
6 HIGH CVE-2026-44492 Npm-axios-1.13.6
detailsDescription: shouldBypassProxy, introduced in v1.15.0 to fix CVE-2025-62718, does not normalise IPv4-mapped IPv6 addresses. When NO_PROXY lists an IPv4 address ...
Attack Vector: NETWORK
Attack Complexity: LOW
Vulnerable Package
7 HIGH CVE-2026-48779 Npm-ws-7.4.6
detailsDescription: A high volume of exceptionally small fragments and data chunks can be sent by a peer, with modest network traffic, to force the remote peer into al...
Attack Vector: NETWORK
Attack Complexity: LOW
Vulnerable Package
8 HIGH CVE-2026-48779 Npm-ws-8.14.2
detailsDescription: A high volume of exceptionally small fragments and data chunks can be sent by a peer, with modest network traffic, to force the remote peer into al...
Attack Vector: NETWORK
Attack Complexity: LOW
Vulnerable Package
9 HIGH CVE-2026-48779 Npm-ws-7.5.9
detailsDescription: A high volume of exceptionally small fragments and data chunks can be sent by a peer, with modest network traffic, to force the remote peer into al...
Attack Vector: NETWORK
Attack Complexity: LOW
Vulnerable Package
10 HIGH CVE-2026-49982 Npm-tmp-0.0.33
detailsDescription: tmp is a temporary file and directory creator for node.js. In version through 0.2.6, the "_assertPath" guard added to tmp rejects only string value...
Attack Vector: NETWORK
Attack Complexity: LOW
Vulnerable Package
11 MEDIUM CVE-2026-53550 Npm-js-yaml-3.14.1
detailsDescription: js-yaml is a JavaScript YAML parser and dumper. Prior to 4.2.0, a crafted YAML document can trigger algorithmic CPU exhaustion in js-yaml merge-key...
Attack Vector: NETWORK
Attack Complexity: LOW
Vulnerable Package
12 MEDIUM Missing_HSTS_Header src/utils/http/fetchAPI.js: 30
detailsThe web-application does not define an HSTS header, leaving it vulnerable to attack.
Attack Vector
13 MEDIUM Use_Of_Hardcoded_Password src/pages/settings/profile/index.jsx: 53
detailsThe application uses the hard-coded password "NotAuthorizedException" for authentication purposes, either using it to verify users' identities, or...
Attack Vector
14 MEDIUM Use_Of_Hardcoded_Password src/pages/settings/profile/index.jsx: 53
detailsThe application uses the hard-coded password "InvalidParameterException" for authentication purposes, either using it to verify users' identities,...
Attack Vector
15 MEDIUM Use_Of_Hardcoded_Password src/pages/_app.jsx: 40
detailsThe application uses the hard-coded password "asfdsa" for authentication purposes, either using it to verify users' identities, or to access anoth...
Attack Vector
16 MEDIUM Use_Of_Hardcoded_Password src/pages/settings/profile/index.jsx: 53
detailsThe application uses the hard-coded password "InvalidPasswordException" for authentication purposes, either using it to verify users' identities, ...
Attack Vector
17 MEDIUM Use_Of_Hardcoded_Password src/pages/_app.jsx: 31
detailsThe application uses the hard-coded password "asfdsa" for authentication purposes, either using it to verify users' identities, or to access anoth...
Attack Vector

Use @Checkmarx to interact with Checkmarx PR Assistant.
Examples:
@Checkmarx how are you able to help me?
@Checkmarx rescan this PR

@github-actions

Copy link
Copy Markdown
Contributor

📦 Next.js Bundle Analysis for ui

This analysis was generated by the Next.js Bundle Analysis action. 🤖

⚠️ Global Bundle Size Increased

Page Size (compressed)
global 685.58 KB (🟡 +218 B)
Details

The global bundle is the javascript bundle that loads alongside every page. It is in its own category because its impact is much higher - an increase to its size means that every page on your website loads slower, and a decrease means every page loads faster.

Any third party scripts you have added directly to your app using the <script> tag are not accounted for in this analysis

If you want further insight into what is behind the changes, give @next/bundle-analyzer a try!

Fifteen Pages Changed Size

The following pages changed size from the code in this PR compared to its base branch:

Page Size (compressed) First Load
/data-management 202.58 KB (🟡 +499 B) 888.16 KB
/experiments/[experimentId]/data-exploration 1.48 MB (🟡 +17.65 KB) 2.15 MB
/experiments/[experimentId]/data-processing 513.71 KB (🟡 +23.29 KB) 1.17 MB
/experiments/[experimentId]/plots-and-tables/dot-plot 448.06 KB (🟡 +449 B) 1.11 MB
/experiments/[experimentId]/plots-and-tables/embedding-categorical 446.63 KB (🟡 +458 B) 1.11 MB
/experiments/[experimentId]/plots-and-tables/embedding-continuous 469.49 KB (🟡 +525 B) 1.13 MB
/experiments/[experimentId]/plots-and-tables/frequency 448.04 KB (🟡 +450 B) 1.11 MB
/experiments/[experimentId]/plots-and-tables/marker-heatmap 537.33 KB (🟡 +448 B) 1.19 MB
/experiments/[experimentId]/plots-and-tables/normalized-matrix 140.65 KB (🟡 +455 B) 826.23 KB
/experiments/[experimentId]/plots-and-tables/spatial-categorical 483.23 KB (🟢 -412.25 KB) 1.14 MB
/experiments/[experimentId]/plots-and-tables/spatial-feature 490.09 KB (🟢 -407.98 KB) 1.15 MB
/experiments/[experimentId]/plots-and-tables/trajectory-analysis 449.92 KB (🟡 +441 B) 1.11 MB
/experiments/[experimentId]/plots-and-tables/violin 470.72 KB (🟡 +475 B) 1.13 MB
/experiments/[experimentId]/plots-and-tables/volcano 452.51 KB (🟡 +433 B) 1.11 MB
/repository 106.85 KB (🟡 +473 B) 792.44 KB
Details

Only the gzipped size is provided here based on an expert tip.

First Load is the size of the global bundle plus the bundle for the individual page. If a user were to show up to your website and land on a given page, the first load size represents the amount of javascript that user would need to download. If next/link is used, subsequent page loads would only need to download that page's bundle (the number in the "Size" column), since the global bundle has already been downloaded.

Any third party scripts you have added directly to your app using the <script> tag are not accounted for in this analysis

Next to the size is how much the size has increased or decreased compared with the base branch of this PR. If this percentage has increased by 20% or more, there will be a red status indicator applied, indicating that special attention should be given to this.

Signed-off-by: Alex Pickering <alexvpickering@gmail.com>
Signed-off-by: Alex Pickering <alexvpickering@gmail.com>
Drop the aspect-fit that shrank the plot within the box; full plots use the styling-panel dimensions and mini previews fill their fixed tile.

Signed-off-by: Alex Pickering <alexvpickering@gmail.com>
SpatialViewerVitessce.jsx had no importers; drop it and the helpers only it used (offsetPolygons, filterPolygonsData, updateStatus, clearPleaseWait).

Signed-off-by: Alex Pickering <alexvpickering@gmail.com>
Pull out parseColor, the bitmask rendering subsystem (LUTs + makeBitmaskLayer factory replacing 3 near-identical layers), and a shared useFocusCellColors hook for the duplicated focus/expression colouring. No behaviour change.

Signed-off-by: Alex Pickering <alexvpickering@gmail.com>
Remove the coordinateTransformations scale/translation branch and its helpers; the pipeline only writes v0.3 pyramids (no transforms). Keeps axesMetadata, still used for the channel axis.

Signed-off-by: Alex Pickering <alexvpickering@gmail.com>
Register the xenium_transcripts and molecules_pyramid file types, accept and
validate transcripts.parquet as an optional input, and match the longest file
suffix first so cells/cell_boundaries aren't shadowed.

Signed-off-by: Alex Pickering <alexvpickering@gmail.com>
Read points from the quadfeather molecule pyramid (bbox/gene filtered) over a
range-reading ZipFileStore, plus its meta dictionary and colour lookup. Pulls in
apache-arrow to parse the tile feathers.

Signed-off-by: Alex Pickering <alexvpickering@gmail.com>
Add the SpatialMolecules plot type, its initial config, the showMolecules viewer
toggle, and gate the plot card behind a molecule-capable tech (Xenium).

Signed-off-by: Alex Pickering <alexvpickering@gmail.com>
Configurable point-size range/step, optional axis offset and image toggle, and a
keepValuesOnReset hook so a plot can preserve fields (sample/genes/colours) across
a styling reset.

Signed-off-by: Alex Pickering <alexvpickering@gmail.com>
Per-gene molecule scatter plot read from the pyramid: gene selection with palette
colours, segmentation-outline backdrop, and shared deck.gl axis/zoom chrome.

Signed-off-by: Alex Pickering <alexvpickering@gmail.com>
Add a Molecules layer toggle that, when a gene is plotted, draws its transcripts
as points over neutral cell outlines in place of the per-cell expression fill.
Adds a uniform-colour bitmask LUT and switches the feature scheme to purplered.

Signed-off-by: Alex Pickering <alexvpickering@gmail.com>
loadMoleculeNodes(store, { genes }) resolves codes to per-gene Feather entries via
meta.json and range-reads only those, replacing the manifest/depth/budget walk that
read whole tile levels then filtered by feature_code. SpatialViewer + SpatialMolecule
plot drop the now-unused bbox. Renames molecules_pyramid -> molecules_by_gene.

The per-gene tiles are float32 + ZSTD-compressed Arrow bodies, so bump apache-arrow to
^21.1.0 (decodes LZ4/ZSTD IPC) and register fzstd as the ZSTD decoder (arrow ships the
framework but no codecs). Also fixes a stale spatialMolecules registration test.

Signed-off-by: Alex Pickering <alexvpickering@gmail.com>
Each selected gene gets the first available Polychrome colour (resolveGeneColors):
existing/picker colours are reserved so auto-assignment never duplicates them, and a
removed gene's colour is freed so the next gene added reclaims it. Seeded colours are
persisted so appending a gene never recolours the others. Replaces the pipeline-baked
meta.color. Caps the plot at 15 genes.

removeGene nulls the gene's colour rather than deleting the key: the componentConfig
reducer deep-merges objects (only arrays are replaced), so a deleted key silently
survives and the stale colour would resurface as an override on re-add. null is
overwritten by the merge and treated as 'no colour' by the resolver.

Signed-off-by: Alex Pickering <alexvpickering@gmail.com>
The segmentation outline is a viv MultiscaleImageLayer (view-dependent tile
rendering). Added to the already-mounted uncontrolled deck once its loader resolved,
it didn't draw until the first viewport change. Key the deck remount on the loader
being ready so the layer is present in the initial render (and preserve the live
camera via initialViewState so the remount doesn't reset an in-progress zoom).

Signed-off-by: Alex Pickering <alexvpickering@gmail.com>
The deck view stays y-down so the segmentation image + molecules keep their native
orientation; only the axis LABELS change. Anchor the data extent's bottom-left corner
at (0,0): x measured rightward from the left edge, y UPWARD from the bottom edge.
Ticks are generated in this 0-based label space (then mapped back to world coords for
positioning), so 0 is always a tick and the bottom-left reads (0,0) at any zoom.
Positions are unchanged — nothing moves, the image is not expanded; PNG/SVG exports
inherit it via the chrome model.

Signed-off-by: Alex Pickering <alexvpickering@gmail.com>
Signed-off-by: Alex Pickering <alexvpickering@gmail.com>
Signed-off-by: Alex Pickering <alexvpickering@gmail.com>
Signed-off-by: Alex Pickering <alexvpickering@gmail.com>
Signed-off-by: Alex Pickering <alexvpickering@gmail.com>
Signed-off-by: Alex Pickering <alexvpickering@gmail.com>
@github-actions

Copy link
Copy Markdown
Contributor

📦 Next.js Bundle Analysis for ui

This analysis was generated by the Next.js Bundle Analysis action. 🤖

⚠️ Global Bundle Size Increased

Page Size (compressed)
global 686.49 KB (🟡 +1.12 KB)
Details

The global bundle is the javascript bundle that loads alongside every page. It is in its own category because its impact is much higher - an increase to its size means that every page on your website loads slower, and a decrease means every page loads faster.

Any third party scripts you have added directly to your app using the <script> tag are not accounted for in this analysis

If you want further insight into what is behind the changes, give @next/bundle-analyzer a try!

New Page Added

The following page was added to the bundle from the code in this PR:

Page Size (compressed) First Load
/experiments/[experimentId]/plots-and-tables/spatial-molecules 643.87 KB 1.3 MB

Seventeen Pages Changed Size

The following pages changed size from the code in this PR compared to its base branch:

Page Size (compressed) First Load
/data-management 202.47 KB (🟡 +384 B) 888.96 KB
/experiments/[experimentId]/data-exploration 1.51 MB (🟡 +42.5 KB) 2.18 MB
/experiments/[experimentId]/data-processing 515.09 KB (🟡 +24.67 KB) 1.17 MB
/experiments/[experimentId]/plots-and-tables 11.95 KB (🟡 +73 B) 698.44 KB
/experiments/[experimentId]/plots-and-tables/batch-differential-expression 64.47 KB (-1 B) 750.95 KB
/experiments/[experimentId]/plots-and-tables/dot-plot 448.19 KB (🟡 +583 B) 1.11 MB
/experiments/[experimentId]/plots-and-tables/embedding-categorical 446.77 KB (🟡 +610 B) 1.11 MB
/experiments/[experimentId]/plots-and-tables/embedding-continuous 469.65 KB (🟡 +684 B) 1.13 MB
/experiments/[experimentId]/plots-and-tables/frequency 448.17 KB (🟡 +583 B) 1.11 MB
/experiments/[experimentId]/plots-and-tables/marker-heatmap 537.45 KB (🟡 +570 B) 1.2 MB
/experiments/[experimentId]/plots-and-tables/normalized-matrix 140.77 KB (🟡 +578 B) 827.26 KB
/experiments/[experimentId]/plots-and-tables/spatial-categorical 485.58 KB (🟢 -409.89 KB) 1.14 MB
/experiments/[experimentId]/plots-and-tables/spatial-feature 491.44 KB (🟢 -406.63 KB) 1.15 MB
/experiments/[experimentId]/plots-and-tables/trajectory-analysis 450.05 KB (🟡 +577 B) 1.11 MB
/experiments/[experimentId]/plots-and-tables/violin 470.84 KB (🟡 +602 B) 1.13 MB
/experiments/[experimentId]/plots-and-tables/volcano 452.63 KB (🟡 +555 B) 1.11 MB
/repository 106.73 KB (🟡 +345 B) 793.22 KB
Details

Only the gzipped size is provided here based on an expert tip.

First Load is the size of the global bundle plus the bundle for the individual page. If a user were to show up to your website and land on a given page, the first load size represents the amount of javascript that user would need to download. If next/link is used, subsequent page loads would only need to download that page's bundle (the number in the "Size" column), since the global bundle has already been downloaded.

Any third party scripts you have added directly to your app using the <script> tag are not accounted for in this analysis

Next to the size is how much the size has increased or decreased compared with the base branch of this PR. If this percentage has increased by 20% or more, there will be a red status indicator applied, indicating that special attention should be given to this.

Drop the unused per-gene colour-lookup chain (buildMoleculeColorLookup,
colorForCode) the overlay never applied, and their tests.

Signed-off-by: Alex Pickering <alexvpickering@gmail.com>
Signed-off-by: Alex Pickering <alexvpickering@gmail.com>
Signed-off-by: Alex Pickering <alexvpickering@gmail.com>
Signed-off-by: Alex Pickering <alexvpickering@gmail.com>
Signed-off-by: Alex Pickering <alexvpickering@gmail.com>
@github-actions

Copy link
Copy Markdown
Contributor

📦 Next.js Bundle Analysis for ui

This analysis was generated by the Next.js Bundle Analysis action. 🤖

⚠️ Global Bundle Size Increased

Page Size (compressed)
global 686.49 KB (🟡 +1.12 KB)
Details

The global bundle is the javascript bundle that loads alongside every page. It is in its own category because its impact is much higher - an increase to its size means that every page on your website loads slower, and a decrease means every page loads faster.

Any third party scripts you have added directly to your app using the <script> tag are not accounted for in this analysis

If you want further insight into what is behind the changes, give @next/bundle-analyzer a try!

New Page Added

The following page was added to the bundle from the code in this PR:

Page Size (compressed) First Load
/experiments/[experimentId]/plots-and-tables/spatial-molecules 643.65 KB 1.3 MB

Seventeen Pages Changed Size

The following pages changed size from the code in this PR compared to its base branch:

Page Size (compressed) First Load
/data-management 202.47 KB (🟡 +384 B) 888.96 KB
/experiments/[experimentId]/data-exploration 1.51 MB (🟡 +42.08 KB) 2.18 MB
/experiments/[experimentId]/data-processing 515.09 KB (🟡 +24.67 KB) 1.17 MB
/experiments/[experimentId]/plots-and-tables 11.95 KB (🟡 +73 B) 698.44 KB
/experiments/[experimentId]/plots-and-tables/batch-differential-expression 64.47 KB (-1 B) 750.95 KB
/experiments/[experimentId]/plots-and-tables/dot-plot 448.19 KB (🟡 +583 B) 1.11 MB
/experiments/[experimentId]/plots-and-tables/embedding-categorical 446.77 KB (🟡 +610 B) 1.11 MB
/experiments/[experimentId]/plots-and-tables/embedding-continuous 469.65 KB (🟡 +684 B) 1.13 MB
/experiments/[experimentId]/plots-and-tables/frequency 448.17 KB (🟡 +583 B) 1.11 MB
/experiments/[experimentId]/plots-and-tables/marker-heatmap 537.45 KB (🟡 +570 B) 1.2 MB
/experiments/[experimentId]/plots-and-tables/normalized-matrix 140.77 KB (🟡 +578 B) 827.26 KB
/experiments/[experimentId]/plots-and-tables/spatial-categorical 485.58 KB (🟢 -409.89 KB) 1.14 MB
/experiments/[experimentId]/plots-and-tables/spatial-feature 491.44 KB (🟢 -406.63 KB) 1.15 MB
/experiments/[experimentId]/plots-and-tables/trajectory-analysis 450.05 KB (🟡 +577 B) 1.11 MB
/experiments/[experimentId]/plots-and-tables/violin 470.84 KB (🟡 +602 B) 1.13 MB
/experiments/[experimentId]/plots-and-tables/volcano 452.63 KB (🟡 +555 B) 1.11 MB
/repository 106.73 KB (🟡 +345 B) 793.22 KB
Details

Only the gzipped size is provided here based on an expert tip.

First Load is the size of the global bundle plus the bundle for the individual page. If a user were to show up to your website and land on a given page, the first load size represents the amount of javascript that user would need to download. If next/link is used, subsequent page loads would only need to download that page's bundle (the number in the "Size" column), since the global bundle has already been downloaded.

Any third party scripts you have added directly to your app using the <script> tag are not accounted for in this analysis

Next to the size is how much the size has increased or decreased compared with the base branch of this PR. If this percentage has increased by 20% or more, there will be a red status indicator applied, indicating that special attention should be given to this.

Reset preserves selectedGenes (keepValuesOnReset) and only flips
useMarkerGenes off, so the plot data is unchanged and the main effect
correctly skips refetching. Assert at most one getDotPlot call rather
than exactly one.

Signed-off-by: Alex Pickering <alexvpickering@gmail.com>
@github-actions

Copy link
Copy Markdown
Contributor

📦 Next.js Bundle Analysis for ui

This analysis was generated by the Next.js Bundle Analysis action. 🤖

⚠️ Global Bundle Size Increased

Page Size (compressed)
global 686.49 KB (🟡 +1.12 KB)
Details

The global bundle is the javascript bundle that loads alongside every page. It is in its own category because its impact is much higher - an increase to its size means that every page on your website loads slower, and a decrease means every page loads faster.

Any third party scripts you have added directly to your app using the <script> tag are not accounted for in this analysis

If you want further insight into what is behind the changes, give @next/bundle-analyzer a try!

New Page Added

The following page was added to the bundle from the code in this PR:

Page Size (compressed) First Load
/experiments/[experimentId]/plots-and-tables/spatial-molecules 643.65 KB 1.3 MB

Seventeen Pages Changed Size

The following pages changed size from the code in this PR compared to its base branch:

Page Size (compressed) First Load
/data-management 202.47 KB (🟡 +384 B) 888.96 KB
/experiments/[experimentId]/data-exploration 1.51 MB (🟡 +42.08 KB) 2.18 MB
/experiments/[experimentId]/data-processing 515.09 KB (🟡 +24.67 KB) 1.17 MB
/experiments/[experimentId]/plots-and-tables 11.95 KB (🟡 +73 B) 698.44 KB
/experiments/[experimentId]/plots-and-tables/batch-differential-expression 64.47 KB (-1 B) 750.95 KB
/experiments/[experimentId]/plots-and-tables/dot-plot 448.19 KB (🟡 +583 B) 1.11 MB
/experiments/[experimentId]/plots-and-tables/embedding-categorical 446.77 KB (🟡 +610 B) 1.11 MB
/experiments/[experimentId]/plots-and-tables/embedding-continuous 469.65 KB (🟡 +684 B) 1.13 MB
/experiments/[experimentId]/plots-and-tables/frequency 448.17 KB (🟡 +583 B) 1.11 MB
/experiments/[experimentId]/plots-and-tables/marker-heatmap 537.45 KB (🟡 +570 B) 1.2 MB
/experiments/[experimentId]/plots-and-tables/normalized-matrix 140.77 KB (🟡 +578 B) 827.26 KB
/experiments/[experimentId]/plots-and-tables/spatial-categorical 485.58 KB (🟢 -409.89 KB) 1.14 MB
/experiments/[experimentId]/plots-and-tables/spatial-feature 491.44 KB (🟢 -406.63 KB) 1.15 MB
/experiments/[experimentId]/plots-and-tables/trajectory-analysis 450.05 KB (🟡 +577 B) 1.11 MB
/experiments/[experimentId]/plots-and-tables/violin 470.84 KB (🟡 +602 B) 1.13 MB
/experiments/[experimentId]/plots-and-tables/volcano 452.63 KB (🟡 +555 B) 1.11 MB
/repository 106.73 KB (🟡 +345 B) 793.22 KB
Details

Only the gzipped size is provided here based on an expert tip.

First Load is the size of the global bundle plus the bundle for the individual page. If a user were to show up to your website and land on a given page, the first load size represents the amount of javascript that user would need to download. If next/link is used, subsequent page loads would only need to download that page's bundle (the number in the "Size" column), since the global bundle has already been downloaded.

Any third party scripts you have added directly to your app using the <script> tag are not accounted for in this analysis

Next to the size is how much the size has increased or decreased compared with the base branch of this PR. If this percentage has increased by 20% or more, there will be a red status indicator applied, indicating that special attention should be given to this.

@alexvpickering
alexvpickering merged commit efb2a96 into master Jul 8, 2026
14 checks passed
@alexvpickering
alexvpickering deleted the init-spatial branch July 8, 2026 18:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

safe to run Sensitive jobs are safe to be run

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants