VolView 4.5
VolView 4.5.0
Contributors: @zachmullen, @1isten and @PaulHax.
Backend processing jobs
A new Jobs module connects VolView to a processing backend, submits tasks, and loads completed results back into the viewer.
- Job workflow: Discover tasks, build forms from their specifications, submit jobs, monitor active work, and browse paginated history. Job details include logs, submitted parameters, cancellation, and deletion. (#904 by @PaulHax)
- Inputs from the current session: Images, DICOM series, and labelmaps can be passed to jobs. Supported form inputs include integers, floats, strings, booleans, enumerations, source references, and bounds.
- Results in the viewer: Completed outputs can be added as base images, layers, or segment groups. Files with missing or unknown result intents remain available as downloads.
- Vector annotations: Rulers, rectangles, and polygons can be sent to jobs and added back to the viewer from job results. (#916 by @PaulHax)
- Automatic inputs: Values supplied automatically by the backend are shown as read-only key-value rows.
- Multiple segment groups per input: A task input marked
multiplein its specification binds every segment group on the active dataset, staged one file per group, while a singular input still binds the selected group. Required inputs fail closed when there are no segment groups. Backend contract 0.2.0 adds the optionalmultipleflag, so existing backends are unaffected. (#920 by @PaulHax) - Backend contract: The new
backend-contractpackage defines the interface between VolView and a processing service. Zod schemas are the source of truth, with generated JSON Schema and OpenAPI files, fixtures, and drift checks. The contract ships in the VolView npm package so a backend can validate against the client version it serves. - Reference backend: girder_volview implements the server side of the contract with Slicer CLI Web images. See the job processing design and custom Slicer CLI guide for setup details.
Ultrasound and multi-frame DICOM
- Cine playback: Multi-frame DICOM images open in a dedicated cine viewer with playback controls overlay. (#878 by @PaulHax)
- Physical ultrasound spacing:
SequenceOfUltrasoundRegions(PhysicalDeltaXandPhysicalDeltaY) supplies spacing for US images, so rulers report millimeters instead of pixels. Multi-region images produce a warning, and malformed region values are handled safely. (#863 by @PaulHax) - Sample data: An ultrasound cine dataset was added to the sample data list. (#918 by @PaulHax)
- Segment groups Not supported on cine images, yet. Vector tools (polygon, rectangle, ruler) work just fine.
Paint and segmentation
- Fill Holes: A new segmentation process fills interior holes on the current slice or across the whole volume, for either the selected segment or all segments. Existing segments are not overwritten. (#898 by @PaulHax)
- Segment labels in NRRD: Exported segment groups include their labels in NRRD metadata that 3D Slicer can read. (#858 by @PaulHax)
- Slicer
.seg.nrrdimports: Slicer-style labelmaps retain their embedded segment names, colors, and label values when loaded. (#904 by @PaulHax) - Readable export names: Segment group archives use the group name as the filename and are stored under
segmentations/. (#860 by @PaulHax) - Misoriented labelmaps: Painting, polygon rasterization, slice rendering, and scalar probing now work when a segment group's direction matrix differs from its parent image. (#827 by @PaulHax)
- Segment updates: Fixed
updateSegmentso updates are correctly proxied to the segments object. (#839 by @1isten)
State files
- Sparse manifests: Standalone
*.volview.jsonstate files can reference data by URI instead of embedding it in a zip, including remote segment groups. (#828 and #827 by @PaulHax) - Safer saves and restores: The data-source graph is validated before an archive is written. Duplicate, dangling, cyclic, and missing sources are rejected. Invalid optional state is left out instead of producing an unrestorable session, and one bad segment group no longer blocks the rest of a session from loading.
- Unified restoration: State files now use the main import pipeline, report load errors instead of failing silently, support multiple volumes, and restore the primary image selection.
Data loading
- Automatic layering: Non-DICOM images with a shared filename prefix are layered automatically. (#819 by @PaulHax)
- Content-Disposition filenames: RFC 6266 headers can supply filenames for URLs without extensions, allowing API download endpoints to load correctly. Explicit filenames still take priority. (#825 by @PaulHax)
- ZIP detection: Archives are recognized by their magic bytes regardless of extension or generic Content-Type. VolView no longer reports failed to load LICENSE files during extraction.
- URL parameter validation: Comma-separated and bracket notation are supported, and commas inside URL query strings are no longer treated as separators.
- Configuration files via
urls(breaking): TheconfigURL parameter was removed. Configuration JSON is recognized by its contents, so pass it inurlsalongside the data and it is applied before the data is displayed. (#919 by @PaulHax) - Local compressed NIfTI files:
.nii.gzfiles selected from the local file system now load correctly. (#824 by @PaulHax) - DICOM series splitting: Distinct series with the same orientation remain separate. (#874 by @PaulHax)
- DICOM spacing: Single-slice images now use the same
PixelSpacingaxis order as ITK. Cine images fall back toPixelSpacingwhen ultrasound region spacing is unavailable. (#886 by @PaulHax) - S3 buckets: Object keys are percent-encoded in download URLs, and bucket listings use a plain fetch to avoid CORS preflight failures. (#871 and #872 by @PaulHax)
Large images and error reporting
- Copyable bug reports: Errors include a structured, anonymous report with build information, browser details, a stack trace, and dataset metadata. The report can be copied from the notification center. (#855 by @PaulHax, closes #854)
- Large labelmaps: Fixed a
RangeErrorwhen the WASM heap grew beyond 2 GB while importing a session, and reduced memory use when saving labelmaps over about 180 million voxels. Save errors are now shown in the UI. (#856 by @PaulHax - Readable pipeline errors: itk-wasm pipeline failures now show useful messages instead of raw objects.
Tools and UI
- Reference lines: Cross slice reference lines are now a standalone feature with their own setting, so they can stay on without the crosshairs tool being active. (#921 by @PaulHax)
- Fill tooltips: Hovering inside a rectangle or polygon shows its label and metadata, including while another tool is being placed. (#827 by @PaulHax)
- Annotation fill picking: Segment groups no longer cover rectangle and polygon fills during picking. (#828 by @PaulHax)
- Nested polygons: Fixed event handling when placing a polygon inside another polygon. (#833 by @PaulHax)
- Uninterrupted placement: Tool selection and fill picking are disabled while an annotation is being placed.
- Probe tool: The probe appears when segment groups are present and correctly samples images with different orientations. (#832 by @PaulHax)
- Labels list: Each label has its own row.
- Selection tool: Clicking a non-annotation widget no longer leaves a stale annotation selection. (#898 by @PaulHax)
- Slice views: Auto-fit remains enabled across programmatic camera changes. (#895 by @PaulHax)
- Sidebar cleanup: Paint process controls, annotation sidebar alignment, and panel sizing were cleaned up. (#898 by @PaulHax)
Build, packaging, and dependencies
- Smaller npm installs: Runtime packages moved to
devDependencies, so consumers of thevolviewnpm package no longer install the full build tree. (#823 by @zachmullen) - patch-package: Patches are applied at build time instead of install time. (#822 by @PaulHax)
- Dependency updates: Updated vtk.js to 36 and Zod to 4, along with
@vueuse/core, Pinia, Sentry, Socket.IO, Vite, itk-wasm, and Python server dependencies. (#826, #862, #895, #899, #914, and #915 by @PaulHax) - Python server: Fixed
setPrimarySelectionand removed an unreliable third-party API. (#835 by @PaulHax) - Commit and formatting checks: Conventional Commits are enforced by a commit-msg hook and CI. Prettier runs from the lint-staged pre-commit hook, and lint runs in CI. (#873 and #867 by @PaulHax)
- CI and end-to-end tests: Node setup was updated and npm is pinned for reproducible installs. The end-to-end matrix no longer fails fast, Chrome runs headless by default locally, dataset downloads are retried, SwiftShader is enabled for WebGL on Linux, and visual baselines are shared across platforms. Software-rendered browser runs were stabilized, and each checkout now derives its own server ports and scratch directory from its path, so two worktrees can run the suite at the same time while sharing the downloaded fixture cache. (#887, #885, #864, #917, and #922 by @PaulHax)