# ruviz v0.4.0

Released: 2026-04-05

## Highlights

- Empty plots now render successfully across the Rust core, Python notebook PNG display, and the Python widget/browser path.
- Tick-aware shared layout now respects explicit margin configuration again, including `Fixed`, `Auto`, `Proportional`, and the `center_plot` option.
- Render-time tick layout now follows configured major tick settings consistently across `render()`, save/export, and interactive rendering.
- Heatmap raster export no longer uses the `0.3.5` output-surface fast path, restoring color/parity with the normal per-cell heatmap renderer for narrow downsampled features.
- Python widget rebuilds are more reproducible through hardened wasm-bindgen bootstrap lookup and install locking.

## Version Alignment

This release keeps the published workspace packages aligned on one version:

- `ruviz` `0.4.0`
- `ruviz-web` `0.4.0`
- `ruviz-gpui` `0.4.0`
- npm `ruviz` `0.4.0`
- PyPI `ruviz` `0.4.0`

## Plotting Notes

- A plot with zero series is now a valid render target. Static export, notebook display, widget rendering, and browser-backed sessions all fall back to a normal empty chart instead of returning `NoDataSeries`.
- Margin configuration is once again honored by the shared layout path, including `tight_layout_pad(...)` and fixed/proportional margin flows.
- Configured major tick counts now drive render-side layout decisions consistently, reducing mismatches between screen renders and export results.
- Heatmap PNG output now matches the normal rectangle renderer again after removing the incorrect heatmap surface-raster shortcut and adding regression coverage for narrow vertical features.
- Image-backed raster paths that use `draw_datashader_image` now apply the intended plot-area transform when blitting, fixing placement/scaling parity for those optimized paths.

## Packaging And Docs

- Refreshed release-facing package docs for the Rust crates, Python package, and npm package.
- Unified transient build output under `generated/` and documented the committed media layout under `docs/assets/`, `python/docs/assets/`, and `tests/fixtures/golden/`.
- Added a single `make release-docs` workflow for regenerating README media, rustdoc assets, gallery pages, Python docs assets, and built docs output.

## Quality And Validation

This release was validated with the standard CI lanes plus targeted local verification:

- Rustfmt
- Clippy
- `cargo test --all-features`
- `cargo doc -p ruviz --all-features --no-deps`
- `cargo doc -p ruviz-web --no-deps`
- `cargo doc -p ruviz-gpui --no-deps`
- Python widget rebuild verification
- Python docs/gallery regeneration
- Web package and docs build

## References

- Changelog: [`CHANGELOG.md`](../../CHANGELOG.md)
- Previous release notes: [`v0.3.6`](./v0.3.6.md)
- Empty plot rendering PR: [#48](https://github.com/Ameyanagi/ruviz/pull/48)
- Tick-aware layout fix PR: [#45](https://github.com/Ameyanagi/ruviz/pull/45)
- Heatmap raster parity fix PR: [#51](https://github.com/Ameyanagi/ruviz/pull/51)
- Python widget reproducibility PR: [#46](https://github.com/Ameyanagi/ruviz/pull/46)
