Repository navigation
Releases: napari/napari
Release list
v0.10.0a0
napari 0.10.0
Sun, Oct 25, 2026
We're happy to announce the release of napari 0.10.0!
napari is a fast, interactive, multi-dimensional image viewer for Python.
It's designed for browsing, annotating, and analyzing large multi-dimensional
images. It's built on top of Qt (for the GUI), vispy (for performant GPU-based
rendering), and the scientific Python stack (numpy, scipy).
For more information, examples, and documentation, please visit our website,
https://napari.org.
napari follows EffVer (Intended Effort Versioning); this is a Macro release containing awesome new features, but may require dedication of some significant time when upgrading projects to use this version.
Highlights
- Add grid overlay (#7827)
New Features
- Add grid overlay (#7827)
Improvements
- Use global font size for overlays (#8667)
- Add single-plane projection for 3D points layers (#9229)
- UI: apply tabular numerals to embedded status bars (#9407)
- Clean up status for grid/multiple selection (#9431)
- Fix fuzzy finding and command highlighting in palette (#9503)
- Implement canvas_to_world on the napari side (#9517)
- Add option to declare deprecated property using descriptor (#9527)
- Add
RenamedWarningEmitterandDependentEmitter(#9529) - Keep reader and writer commands out of the command palette (#9582)
- Add warning icon if experimental setting (especially async) is enabled (#9590)
- Add
locked_data_levelas an argument forLabels(#9603) - Improve point projections to cover old out_of_slice use case (#9607)
- Make the layer name overlay bold (#9616)
- Fix reporting of Qt version in
napari --info(#9648)
Bug Fixes
- fix(shapes): pick shapes on a fractional slice key (#9394)
- Fix remove() mid-draw when removing shapes shifts the drawn shape's index (#9441)
- Fix fuzzy finding and command highlighting in palette (#9503)
- fix(qt): let a dock widget's minimum size shrink again when its content does (#9532)
- Fix Convert to Labels for shapes in 3D view and with rolled axes (#9580)
- Fix color of labels in colorpicker (#9599)
- Measure text at render size for even overlay padding (#9617)
- Fix font clipping in dock widget titles (#9619)
- Limit the lasso_vertex_distance preference spin box to 1-50 (#9626)
Documentation
- Add info in tooltips for projection mode (#9497)
- Clarify in
LayerListdocstring when thechangedevent is emitted (#9504) - Typing Guide: Tips and Resources (docs#1135)
- Deprecation policy using time-based windows for removal (docs#1138)
- Add missed PRs to 0.9.2 release notes. (docs#1151)
- docs: suggest refined github (docs#1155)
- Redirect old workshop pages to napari.org/workshops (docs#1156)
- Move Kyle Harrington to Emeritus Steering Council (docs#1160)
- Fix failing docs build due to
profilingclash (docs#1161)
Other Pull Requests
- Separate tiling from nontiling overlays (#9083)
- fix(typing): add typing and fix mypy error in
qt_tracks_controls.py(#9176) - fix (typing): add typing and fix mypy error in
qt_symbol_combobox.py(#9182) - MAINT: Remove deprecated ScaleBar.unit (#9218)
- feat: initial working version slide out dockwidget (#9317)
- chore: remove ChunkLoader dead test code (#9381)
- Fix labeler action (#9458)
- Remove deprecated
napari.utils.indexingmodule (#9505) - TYP: add type hints in
style_encoding.py(#9544) - TYP: add type hints in
color_manager.py(#9547) - TYP: add type hints in
qt_depiction_control.py(#9551) - TYP: add type hints in
qt_contour_spinbox.py(#9552) - TYP: add type hints in
qt_viewer_status_bar.py(#9554) - Change Qt backend used in type testing from PyQt6 to PySide6 (#9570)
- Update
coverage,fsspec,hypothesis,imageio,napari-resources,pandas,platformdirs,pytest-rerunfailures,tifffile,virtualenv,wrapt,xarray(#9594) - TYP: annotate
color_kwargsas dict[str, Any] in color_manager.py (#9618) - Update
hypothesis,platformdirs,virtualenv(#9625) - TYP: add type hints in
qt_welcome.py(#9642) - TYP: add type hints in
base.py(#9644) - TYP: add type hints in
qt_viewer_buttons.py(#9649) - TYP: add type hints in
qt_logger.py(#9655) - Removed obsolete cells3d monkeypatch in test_examples.py (#9658)
- typing: Enable checking presence of type annotation in functions (#9662)
- Remove Qt5 from --pre tests (#9687)
- Update
hypothesis,imageio,numpy,platformdirs,pydantic,pyside6,toolz,virtualenv(#9692) - Add Lundy Bernard to CITATION.cff (#9695)
- ci(dependabot): bump the github-actions group across 1 directory with 2 updates (docs#1125)
- Rumdl: Add baseline config and format docs/ (docs#1140)
- Move pre-fetch data step to begin of prep_docs.py (docs#1148)
- Add missed directories to circelci cache (docs#1149)
- Post rendered docs link as a sticky PR comment (docs#1159)
12 authors added to this release (alphabetical)
(+) denotes first-time contributors 🥳
- Aditi Juneja - @Schefflera-Arboricola +
- Aman kumar - @ghostiee-11 +
- Aniket - @Aniketsy
- Carlos Mario Rodriguez Reza - @carlosmariorr
- Grzegorz Bokota (docs) - @Czaki
- Jacopo Abramo (docs) - @jacopoabramo
- lettyz3 - @lettyz3 +
- Lorenzo Gaifas - @brisvag
- Lundy Bernard (docs) - @lundybernard +
- Matthias Schabel - @matthiasschabel
- Mridul Seth - @MridulS
- Tim Monko (docs) - @TimMonko
10 reviewers added to this release (alphabetical)
(+) denotes first-time contributors 🥳
- Aman kumar - @ghostiee-11 +
- Aniket - @Aniketsy
- Carol Willing - @willingc
- Grzegorz Bokota (docs) - @Czaki
- Jacopo Abramo ([docs](https://gi...
v0.9.2
napari 0.9.2
Tue, Sep 29, 2026
We're happy to announce the release of napari 0.9.2!
napari is a fast, interactive, multi-dimensional image viewer for Python.
It's designed for browsing, annotating, and analyzing large multi-dimensional
images. It's built on top of Qt (for the GUI), vispy (for performant GPU-based
rendering), and the scientific Python stack (numpy, scipy).
For more information, examples, and documentation, please visit our website,
https://napari.org.
napari follows EffVer (Intended Effort Versioning); this is a Meso release containing awesome new features, but some effort may be needed when updating previous projects to use this version.
Highlights
Vispy update
In #9499 we improved and updated Vispy (napari's rendering engine), which brings us a few fixes and new features. Some important ones:
- perspective rendering of points and text is no longer broken (Shift+right-click-drag to change FOV in 3D!)
- RGB data can now be viewed in 3D. This might still have some kinks to smooth out, so if you see issues, make sure to report them on the issue tracker.
Type checking changes and guide
In #9395 we have switched our type checking from mypy to pyrefly because its much faster (>20x!), easier to understand, and well supported. Read our new typing guide for more information on typing the napari code base. Contributors have found typing contributions as a great introduction to contributing to napari and it is work that we welcome. To read more about Aniket's experience, check out the new island dispatch blog post: From Any to Certainty.
New release policy with regular cadence
The napari team has been working hard to improve our release process, and based on our experience and feedback from the community, we have formally adopted a release policy (napari/docs#1126). Expect regular monthly releases and clearer communication about review and timing for contributions; read the full policy.
New Features
- Add multiscale level extraction as a
LayerListaction (#9495)
Improvements
- Feat: allow passing list of layers to Viewer.reset_view and .fit_to_view (#6120)
- Add setting for global multisampling/antialiasing (#8570)
- Reorder font-family declaration in console QSS (#9325)
- Performance: Avoid redundant unit conversion when aggregating layer extents (#9411)
- Add
RenamedEmittersubclass ofWarningEmitterto simplify renaming (#9482) - Bump vispy: rgb volumes, fixed perspective and overlay bleed (#9499)
Performance
- Reorder font-family declaration in console QSS (#9325)
- Performance: Avoid redundant unit conversion when aggregating layer extents (#9411)
Bug Fixes
- Allow
fourier_transform_playground.pyto work via drag'n'drop (#8175) - Fix view direction and refactor camera logic into vispy module (#9389)
- fix(vectors): emit edge_color_mode when the color setter changes the mode (#9396)
- Fix _unique_element crash and incorrect result for list-valued features (#9409)
- Fix changing theme with dynamic controls (#9460)
- Fix keeping properties and equality operators from parent class (#9479)
- Fix surface lighting in async mode (#9493)
- Bump vispy: rgb volumes, fixed perspective and overlay bleed (#9499)
- Fix calculation of number of viewboxes (#9509)
- Fix qt command palette row indexing (#9512)
- Frozen overlay dicts (#9525)
- fix(qt): let QtViewer attach to a ViewerModel that already holds several layers (#9533)
Build Tools
- Bump vispy: rgb volumes, fixed perspective and overlay bleed (#9499)
Documentation
- New release policy with regular cadence and responsibilities (docs#1126)
- Update 0.9.1 release notes to add missed author (docs#1130)
- Typing guide: Using Pyrefly and understanding the config (docs#1134)
- Add initial release notes for 0.9.2 (docs#1137)
- enforce LF line endings (docs#1139)
- Update release notes for 0.9.2 (docs#1146)
- Update the version switcher for 0.9.2 (docs#1150)
Other Pull Requests
- [pre-commit.ci] pre-commit autoupdate (docs#1131)
- [pre-commit.ci] pre-commit autoupdate (docs#1133)
- CI: skip docs build for CI-only changes (#8859)
- fix(typing): add typing and fix mypy error in
qt_layer_model.py(#9168) - fix(typing): add typing and fix mypy error in
qt_layer_controls_container.py(#9173) - fix(typing): add typing and fix mypy error in
qt_vectors_controls.py(#9178) - chore: cleanup unused functions (#9387)
- Remove stale viewer context (#9406)
- Update
coverage,dask,hypothesis,ipython,platformdirs,pydantic,virtualenv,wrapt(#9471) - Use new resource package to source logos (#9477)
- Fix --pre testing workflows to run only specific subset of environments (#9480)
- Update
coverage,hypothesis,ipython,lxml,matplotlib,numpy,pint,platformdirs,psygnal,pytest-rerunfailures,tifffile,tqdm,virtualenv,wrapt(#9492) - [pre-commit.ci] pre-commit autoupdate (#9496)
- [pre-commit.ci] pre-commit autoupdate (#9510)
- Disable graphviz on macos-intel, generate dependency pdf conditionally (#9514)
- TYP: add type hints in
action_manager.py(#9538) - TYP: add type hints in
mouse_bindings.py(#9540) - TYP: add type hints in
qt_text_visibility.py(#9541) - TYP: add type hints in
stubgen.py(#9542) - TYP: add type hints in
string_encoding.py(#9545) - TYP: add type hints in
color_encoding.py(#9548) - [pre-commit.ci] pre-commit autoupdate (#9553)
- Rename
RenamedEmittertoRenamedWarningEmitter(#9567)
10 authors added to this release (alphabetical)
(+) denotes first-time contributors 🥳
- Aditya Nikam - @adityaanikam +
- Aniket - @Aniketsy
- Carlos Mario Rodriguez Reza - @carlosmariorr
- Grzegorz Bokota (docs) - @Czaki
- Jacopo Abramo - @jacopoabramo
- Juan Nunez-Iglesias - @jni
- Lorenzo Gaifas - @brisvag
- Matthias Schabel - @matthiasschabel
- Peter Sobolewski - @psobolewskiPhD
- Tim Monko (docs) - @TimMonko
14 reviewers added to this release (alphabetical)
(+) denotes first-time contributors 🥳
- Aditya Nikam - @adityaanikam +
- Aniket - @Aniketsy
- Ashley Anderson - @aganders3
- Carlos Mario Rodriguez Reza - @carlosmariorr
- Carol Willing - @willingc
- [Draga Donci...
v0.9.2rc1
napari 0.9.2
Sun, Sep 27, 2026
We're happy to announce the release of napari 0.9.2!
napari is a fast, interactive, multi-dimensional image viewer for Python.
It's designed for browsing, annotating, and analyzing large multi-dimensional
images. It's built on top of Qt (for the GUI), vispy (for performant GPU-based
rendering), and the scientific Python stack (numpy, scipy).
For more information, examples, and documentation, please visit our website,
https://napari.org.
napari follows EffVer (Intended Effort Versioning); this is a Meso release containing awesome new features, but some effort may be needed when updating previous projects to use this version.
Highlights
Vispy update
In #9499 we improved and updated Vispy (napari's rendering engine), which brings us a few fixes and new features. Some important ones:
- perspective rendering of points and text is no longer broken (Shift+right-click-drag to change FOV in 3D!)
- RGB data can now be viewed in 3D. This might still have some kinks to smooth out, so if you see issues, make sure to report them on the issue tracker.
Change of type-checker
In #9395 we decided to change from mypy to pyrefly.
pyrefly is faster and support more typing features than mypy.
add blogpost link here
More strict release cadence
Based on our experience and feedback from the community, we decided to make our release cadence more strict. We decided to go to monthly cadence with exception for December. The formalization is added in napari/docs#1126. The actual policy is here.
New Features
- Add multiscale level extraction as a
LayerListaction (#9495)
Improvements
- Add setting for global multisampling/antialiasing (#8570)
- Reorder font-family declaration in console QSS (#9325)
- Performance: Avoid redundant unit conversion when aggregating layer extents (#9411)
- Add
RenamedEmittersubclass ofWarningEmitterto simplify renaming (#9482) - Bump vispy: rgb volumes, fixed perspective and overlay bleed (#9499)
- Add nD projection modes to points layer (replaces
out_of_slice_display) (#9534)
Performance
- Reorder font-family declaration in console QSS (#9325)
- Performance: Avoid redundant unit conversion when aggregating layer extents (#9411)
Bug Fixes
- Allow
fourier_transform_playground.pyto work via drag'n'drop (#8175) - Fix view direction and refactor camera logic into vispy module (#9389)
- fix(vectors): emit edge_color_mode when the color setter changes the mode (#9396)
- Fix _unique_element crash and incorrect result for list-valued features (#9409)
- Keep dock widgets resizable when their widget asks for vertical space (#9462)
- Fix keeping properties and equality operators from parent class (#9479)
- Bump vispy: rgb volumes, fixed perspective and overlay bleed (#9499)
- Fix calculation of number of viewboxes (#9509)
- Fix qt command palette row indexing (#9512)
- Frozen overlay dicts (#9525)
- Add nD projection modes to points layer (replaces
out_of_slice_display) (#9534)
Build Tools
- Bump vispy: rgb volumes, fixed perspective and overlay bleed (#9499)
Documentation
- New release policy with regular cadence and responsibilities (docs#1126)
- Update 0.9.1 release notes to add missed author (docs#1130)
- Add initial release notes for 0.9.2 (docs#1137)
Other Pull Requests
- CI: skip docs build for CI-only changes (#8859)
- fix(typing): add typing and fix mypy error in
qt_layer_model.py(#9168) - chore: cleanup unused functions (#9387)
- Remove stale viewer context (#9406)
- Update
coverage,dask,hypothesis,ipython,platformdirs,pydantic,virtualenv,wrapt(#9471) - Fix --pre testing workflows to run only specific subset of environments (#9480)
- Update
coverage,hypothesis,ipython,lxml,matplotlib,numpy,pint,platformdirs,psygnal,pytest-rerunfailures,tifffile,tqdm,virtualenv,wrapt(#9492) - [pre-commit.ci] pre-commit autoupdate (#9496)
- [pre-commit.ci] pre-commit autoupdate (#9510)
- Disable graphviz on macos-intel, generate dependency pdf conditionally (#9514)
- TYP: add type hints in
mouse_bindings.py(#9540)
8 authors added to this release (alphabetical)
(+) denotes first-time contributors 🥳
- Aditya Nikam - @adityaanikam +
- Aniket - @Aniketsy
- Grzegorz Bokota (docs) - @Czaki
- Jacopo Abramo - @jacopoabramo
- Lorenzo Gaifas - @brisvag
- Matthias Schabel - @matthiasschabel
- Peter Sobolewski - @psobolewskiPhD
- Tim Monko - @TimMonko
14 reviewers added to this release (alphabetical)
(+) denotes first-time contributors 🥳
- Aditya Nikam - @adityaanikam +
- Aniket - @Aniketsy
- Ashley Anderson - @aganders3
- Carlos Mario Rodriguez Reza - @carlosmariorr
- Carol Willing - @willingc
- Draga Doncila Pop - @DragaDoncila
- Grzegorz Bokota (docs) - @Czaki
- Jacopo Abramo - @jacopoabramo
- Juan Nunez-Iglesias - @jni
- Lorenzo Gaifas - @brisvag
- Matt Einhorn - @matham +
- Matthias Schabel - @matthiasschabel
- Peter Sobolewski - @psobolewskiPhD
- Tim Monko - @TimMonko
v0.9.2a1
napari 0.9.2
Sun, Sep 27, 2026
We're happy to announce the release of napari 0.9.2!
napari is a fast, interactive, multi-dimensional image viewer for Python.
It's designed for browsing, annotating, and analyzing large multi-dimensional
images. It's built on top of Qt (for the GUI), vispy (for performant GPU-based
rendering), and the scientific Python stack (numpy, scipy).
For more information, examples, and documentation, please visit our website,
https://napari.org.
napari follows EffVer (Intended Effort Versioning); this is a Meso release containing awesome new features, but some effort may be needed when updating previous projects to use this version.
Highlights
Vispy update
In #9499 we improved and updated Vispy (napari's rendering engine), which brings us a few fixes and new features. Some important ones:
- perspective rendering of points and text is no longer broken (Shift+right-click-drag to change FOV in 3D!)
- RGB data can now be viewed in 3D. This might still have some kinks to smooth out, so if you see issues, make sure to report them on the issue tracker.
Change of type-checker
In #9395 we decided to change from mypy to pyrefly.
pyrefly is faster and support more typing features than mypy.
add blogpost link here
More strict release cadence
Based on our experience and feedback from the community, we decided to make our release cadence more strict. We decided to go to monthly cadence with exception for December. The formalization is added in napari/docs#1126. The actual policy is here.
New Features
- Add multiscale level extraction as a
LayerListaction (#9495)
Improvements
- Add setting for global multisampling/antialiasing (#8570)
- Reorder font-family declaration in console QSS (#9325)
- Performance: Avoid redundant unit conversion when aggregating layer extents (#9411)
- Add
RenamedEmittersubclass ofWarningEmitterto simplify renaming (#9482) - Bump vispy: rgb volumes, fixed perspective and overlay bleed (#9499)
- Add nD projection modes to points layer (replaces
out_of_slice_display) (#9534)
Performance
- Reorder font-family declaration in console QSS (#9325)
- Performance: Avoid redundant unit conversion when aggregating layer extents (#9411)
Bug Fixes
- Allow
fourier_transform_playground.pyto work via drag'n'drop (#8175) - Fix view direction and refactor camera logic into vispy module (#9389)
- fix(vectors): emit edge_color_mode when the color setter changes the mode (#9396)
- Fix _unique_element crash and incorrect result for list-valued features (#9409)
- Keep dock widgets resizable when their widget asks for vertical space (#9462)
- Fix keeping properties and equality operators from parent class (#9479)
- Bump vispy: rgb volumes, fixed perspective and overlay bleed (#9499)
- Fix calculation of number of viewboxes (#9509)
- Fix qt command palette row indexing (#9512)
- Frozen overlay dicts (#9525)
- Add nD projection modes to points layer (replaces
out_of_slice_display) (#9534)
Build Tools
- Bump vispy: rgb volumes, fixed perspective and overlay bleed (#9499)
Documentation
- New release policy with regular cadence and responsibilities (docs#1126)
- Update 0.9.1 release notes to add missed author (docs#1130)
- Add initial release notes for 0.9.2 (docs#1137)
Other Pull Requests
- CI: skip docs build for CI-only changes (#8859)
- fix(typing): add typing and fix mypy error in
qt_layer_model.py(#9168) - chore: cleanup unused functions (#9387)
- Remove stale viewer context (#9406)
- Update
coverage,dask,hypothesis,ipython,platformdirs,pydantic,virtualenv,wrapt(#9471) - Fix --pre testing workflows to run only specific subset of environments (#9480)
- Update
coverage,hypothesis,ipython,lxml,matplotlib,numpy,pint,platformdirs,psygnal,pytest-rerunfailures,tifffile,tqdm,virtualenv,wrapt(#9492) - [pre-commit.ci] pre-commit autoupdate (#9496)
- [pre-commit.ci] pre-commit autoupdate (#9510)
- Disable graphviz on macos-intel, generate dependency pdf conditionally (#9514)
- TYP: add type hints in
mouse_bindings.py(#9540)
8 authors added to this release (alphabetical)
(+) denotes first-time contributors 🥳
- Aditya Nikam - @adityaanikam +
- Aniket - @Aniketsy
- Grzegorz Bokota (docs) - @Czaki
- Jacopo Abramo - @jacopoabramo
- Lorenzo Gaifas - @brisvag
- Matthias Schabel - @matthiasschabel
- Peter Sobolewski - @psobolewskiPhD
- Tim Monko - @TimMonko
14 reviewers added to this release (alphabetical)
(+) denotes first-time contributors 🥳
- Aditya Nikam - @adityaanikam +
- Aniket - @Aniketsy
- Ashley Anderson - @aganders3
- Carlos Mario Rodriguez Reza - @carlosmariorr
- Carol Willing - @willingc
- Draga Doncila Pop - @DragaDoncila
- Grzegorz Bokota (docs) - @Czaki
- Jacopo Abramo - @jacopoabramo
- Juan Nunez-Iglesias - @jni
- Lorenzo Gaifas - @brisvag
- Matt Einhorn - @matham +
- Matthias Schabel - @matthiasschabel
- Peter Sobolewski - @psobolewskiPhD
- Tim Monko - @TimMonko
v0.9.1
napari 0.9.1
Fri, Sep 04, 2026
We're happy to announce the bugfix release of napari 0.9.1!
napari is a fast, interactive, multi-dimensional image viewer for Python.
It's designed for browsing, annotating, and analyzing large multi-dimensional
images. It's built on top of Qt (for the GUI), vispy (for performant GPU-based
rendering), and the scientific Python stack (numpy, scipy).
This is a bug fix release, primarily fixing a regression in how dock widgets are resized.
For more information, examples, and documentation, please visit our website,
https://napari.org.
napari follows EffVer (Intended Effort Versioning); this is a Micro release containing bug fixes, so we encourage upgrading.
Improvements
- Allow single widget in layer controls (#9448)
Bug Fixes
- [bug fix] Keep playback in sync when dimension ranges change (#9440)
- Fix out-of-sync extent in async mode (#9459)
- Revert widget size policy change (#9484)
- Revert the str cast of shortcut in
bind_shortcutfrom #9076 (#9488)
Documentation
- Prefetch data that are problematic and causing docs build failure (docs#1103)
- Fix incorrect image link formatting in 0.9 release notes (docs#1123)
- Add 0.9.1 release notes (docs#1128)
- Update version switch to set 0.9.1 to default release (docs#1129)
- Update README image using the imshow.py example (#9467)
Other Pull Requests
- [pre-commit.ci] pre-commit autoupdate (#9445)
5 authors added to this release (alphabetical)
(+) denotes first-time contributors 🥳
- Grzegorz Bokota - @Czaki
- Juan Nunez-Iglesias - @jni
- Lorenzo Gaifas - @brisvag
- Matthias Schabel - @matthiasschabel
- Suyash Naik - @Suyash-Naik +
10 reviewers added to this release (alphabetical)
(+) denotes first-time contributors 🥳
v0.9.1rc1
napari 0.9.1
Fri, Sep 04, 2026
We're happy to announce the bugfix release of napari 0.9.1!
napari is a fast, interactive, multi-dimensional image viewer for Python.
It's designed for browsing, annotating, and analyzing large multi-dimensional
images. It's built on top of Qt (for the GUI), vispy (for performant GPU-based
rendering), and the scientific Python stack (numpy, scipy).
This is a bug fix release, primarily fixing a regression in how dock widgets are resized.
For more information, examples, and documentation, please visit our website,
https://napari.org.
napari follows EffVer (Intended Effort Versioning); this is a Micro release containing bug fixes, so we encourage upgrading.
Improvements
- Allow single widget in layer controls (#9448)
Bug Fixes
- [bug fix] Keep playback in sync when dimension ranges change (#9440)
- Fix out-of-sync extent in async mode (#9459)
- Revert widget size policy change (#9484)
- Revert the str cast of shortcut in
bind_shortcutfrom #9076 (#9488)
Documentation
- Prefetch data that are problematic and causing docs build failure (docs#1103)
- Fix incorrect image link formatting in 0.9 release notes (docs#1123)
- Add 0.9.1 release notes (docs#1128)
- Update version switch to set 0.9.1 to default release (docs#1129)
- Update README image using the imshow.py example (#9467)
Other Pull Requests
- [pre-commit.ci] pre-commit autoupdate (#9445)
5 authors added to this release (alphabetical)
(+) denotes first-time contributors 🥳
- Grzegorz Bokota - @Czaki
- Juan Nunez-Iglesias - @jni
- Lorenzo Gaifas - @brisvag
- Matthias Schabel - @matthiasschabel
- Suyash Naik - @Suyash-Naik +
10 reviewers added to this release (alphabetical)
(+) denotes first-time contributors 🥳
v0.9.1a1
napari 0.9.1
Fri, Sep 04, 2026
We're happy to announce the bugfix release of napari 0.9.1!
napari is a fast, interactive, multi-dimensional image viewer for Python.
It's designed for browsing, annotating, and analyzing large multi-dimensional
images. It's built on top of Qt (for the GUI), vispy (for performant GPU-based
rendering), and the scientific Python stack (numpy, scipy).
This is a bug fix release, primarily fixing a regression in how dock widgets are resized.
For more information, examples, and documentation, please visit our website,
https://napari.org.
napari follows EffVer (Intended Effort Versioning); this is a Micro release containing bug fixes, so we encourage upgrading.
Improvements
- Allow single widget in layer controls (#9448)
Bug Fixes
- [bug fix] Keep playback in sync when dimension ranges change (#9440)
- Fix out-of-sync extent in async mode (#9459)
- Revert widget size policy change (#9484)
- Revert the str cast of shortcut in
bind_shortcutfrom #9076 (#9488)
Documentation
- Prefetch data that are problematic and causing docs build failure (docs#1103)
- Fix incorrect image link formatting in 0.9 release notes (docs#1123)
- Add 0.9.1 release notes (docs#1128)
- Update version switch to set 0.9.1 to default release (docs#1129)
- Update README image using the imshow.py example (#9467)
Other Pull Requests
- [pre-commit.ci] pre-commit autoupdate (#9445)
5 authors added to this release (alphabetical)
(+) denotes first-time contributors 🥳
- Grzegorz Bokota - @Czaki
- Juan Nunez-Iglesias - @jni
- Lorenzo Gaifas - @brisvag
- Matthias Schabel - @matthiasschabel
- Suyash Naik - @Suyash-Naik +
10 reviewers added to this release (alphabetical)
(+) denotes first-time contributors 🥳
v0.9.0
napari 0.9.0
Tue, Aug 25, 2026
We're happy to announce the release of napari 0.9.0!
napari is a fast, interactive, multi-dimensional image viewer for Python.
It's designed for browsing, annotating, and analyzing large multi-dimensional
images. It's built on top of Qt (for the GUI), vispy (for performant GPU-based
rendering), and the scientific Python stack (numpy, scipy).
For more information, examples, and documentation, please visit our website,
https://napari.org.
napari follows EffVer (Intended Effort Versioning); this is a Macro release containing awesome new features, but may require dedication of some significant time when upgrading projects to use this version.
Highlights
Auto-labelling of viewer axes
napari 0.5.0 laid the ground work for more accurate metadata handling by
allowing users and plugins to set the axis_labels on layers. napari 0.9.0
finally capitalises on that work by automatically labelling viewer axes based
on the axis labels of layers present in the viewer.
(#9282)
Now, opening a dataset with labelled axes will result in correctly labelled
axes in the viewer:
Additionally, when you create a new layer from an existing one using the
buttons in the GUI, the new layer now inherits the axis labels of the layer(s)
it was derived from. (#9293)
There is still work to be done here. For example, if layers have labels that
are inconsistent with each other, napari will simply ignore layers with fewer
dimensions, or layers added later. But, for most use cases, layer and viewer
metadata will now be much more informative!
Xarray metadata is now inherited
In the same vein, if you work with Xarray — common in climate,
geoscience, and many places where data ships with labelled coordinates — napari
now reads metadata straight from your DataArrays. When you add an xarray
object to the viewer, napari will use its dimension names as axis labels, infer
scale and translate from the coordinate values, and pick up units from
CF-convention units attributes on coordinates (#9316).
This closed an 8-year old, double-digit, nearly-as-old-as-napari-itself issue!
(#14)
Status bar coordinates as floats
Continuing on the theme of improved metadata, when scale and/or unit metadata
is set on the layer, the status bar coordinates now have increased precision,
where before they were limited to just integers. This means you can have more
accurate physical estimates of your data coordinates when exploring data.
(#9287)
Layer controls for multiple selected layers
Until now, layer controls only appeared when a single layer was selected. Now,
napari dynamically builds the layer controls from your selection, so
when you select several layers at once you can see and use the controls that
are shared between them. Pan-zoom is always available, while the layer-specific
buttons still appear only when a single layer is selected.
(#9318)
<figure>
<video width="100%" controls autoplay loop muted playsinline>
<source src="../_static/images/joint-controls.webm" type="video/webm" />
<source src="../_static/images/joint-controls.mp4" type="video/mp4" />
<img src="../_static/images/joint-controls.png"
title="Your browser does not support the video tag"
alt="Video showing the editing of multiple selected layers at once."
>
</video>
</figure>
There's also an experimental setting, Generate GUI layer controls dynamically
instead of using premade panels, that makes napari use the new dynamic
controls even for single layers.
Take a guided tour of the viewer
New to napari, or just want a quick refresher on where everything lives? There's
now a guided tour, available from Help → Take a tour. The tour highlights
the main areas of the viewer — the canvas, the layer list, layer controls, the
viewer buttons, the dimension sliders, and the status bar — so you can get your
bearings in seconds. If the viewer is empty, napari opens the built-in Balls
(3D) sample data so the walkthrough has something to show (#9290).
![Screenshot of the napari viewer guided tour][../_static/images/guided-tour.png)
Contributable plugin preferences
Plugins can now ship their own preferences (#9308)!
By declaring configurations in
their napari.yaml manifest, plugins get their own settings — stored
separately from napari's own settings, automatically added to and editable from
the napari Preferences dialog, and accessible programmatically from Python:
from napari.settings import get_plugin_settings
settings = get_plugin_settings("my-plugin")
settings.reader.lazy = TrueRead more in the Configurations Guide
to learn more about how to add this new contribution to your own plugins.
Adjust grid rendering with hidden layers
Grid mode with hidden layers is much improved: empty
grid spaces are never shown and stride operates on the full layer list, so
layer grouping doesn't change when you show or hide layers (#9244).
Fuzzy find in command palette
Have you used our command palette yet? It's a great way to
quickly access and even discover napari functionality. Now, thanks to
#8661, it's easier to find
functions when you don't know the exact name, or you mistyped something. You'll
need to have rapidfuzz installed to
make use of it. It's automatically installed with napari[all] or
napari[optional]. And if the search feels a bit off, you can set just how
fuzzy you want it to be in Preferences > Experimental > Fuzzy Search Threshold.
2D slicing of surfaces
Ever since we added surfaces, they have been invisible in 2D slices. Now,
thanks to all the work done on thick slicing, surface
slices appear in 2D view (#8783).
This enhancement is accompanied by support for async slicing, which should
improve viewer responsiveness when slicing large, time varying surfaces, for
example.
<figure>
<video width="100%" controls autoplay loop muted playsinline>
<source src="../_static/images/slicing_surface.webm" type="video/webm" />
<source src="../_static/images/slicing_surface.mp4" type="video/mp4" />
<img src="../_static/images/slicing_surface.png"
title="Your browser does not support the video tag"
alt="Video showing a slicing of surface layers, with showing how to change thickness of slize and controlling slice mmode."
>
</video>
</figure>
... And you can try this out yourself with common .obj surface files thanks to
a new built-in reader plugin!
(#9228)
You should now be able to drag and drop .obj files into napari and see them
instantly.
Public API for auto contrast limits
For a very long time, it's been possible to set automatic contrast limits
updating on a layer only through the graphical user interface. This means an
extra click for many workflows and poorer reproducibility. Thanks to
#9271, you can now set the
auto_contrast attribute on Image layers:
image_layer = viewer.add_image(..., auto_contrast=True)
# or
image_layer.auto_contrast = TrueThe life-changing magic of tidying up the Viewer model
The napari Viewer model, for historical reasons, is a grab-bag of many
attributes, which makes usage, discoverability, and code modularity and
composability a major issue. We've taken some big steps towards cleaning up
one of our most important namespaces by creating Canvas
(#8633) and Scene
(#9323) models, which cleans up
(#9363) and clarifies
(napari/docs#1083) many parts of
the API.
The old API is in extremely widespread use, so although it is silently
deprecated, it will continue to work for the foreseeable future. In the
meantime, the new API should be much friendlier to work with by carefully
grouping related concepts and APIs. Some examples:
viewer.axesandviewer.floating_axesbecomeviewer.scene.overlays.axes
andviewer.canvas.overlays.axes.- From that API, you may also guess that the scale bar is on
viewer.canvas.overlays.scale_bar. - You can even get a list of the current overlays (both visible and invisible)
withlist(viewer.canvas.overlays)andlist(viewer.scene.overlays). (But
do note that overlays with a_prefix are private and may change!) viewer.camerais nowviewer.scene.camera.- Grid mode is now accessed at
viewer.canvas.grid(e.g.
viewer.canvas.grid.enabled = True).
This has also enabled a new public API: you can now query the canvas size (in
pixels) without accessing private napari APIs! Check viewer.canvas.size!
The TL;DR:
# Canvas Model
viewer.scale_bar -> viewer.canvas.overlays.scale_bar
viewer.text_overlay -> viewer.canvas.overlays.text
viewer.floating_axes -> viewer.canvas.overlays.axes
viewer.grid -> viewer.canvas.grid
NOW EXPOSED -> viewer.canvas.overlays.curre...v0.9.0rc3
napari 0.9.0
Thu, Aug 20, 2026
We're happy to announce the release of napari 0.9.0!
napari is a fast, interactive, multi-dimensional image viewer for Python.
It's designed for browsing, annotating, and analyzing large multi-dimensional
images. It's built on top of Qt (for the GUI), vispy (for performant GPU-based
rendering), and the scientific Python stack (numpy, scipy).
For more information, examples, and documentation, please visit our website,
https://napari.org.
napari follows EffVer (Intended Effort Versioning); this is a Macro release containing awesome new features, but may require dedication of some significant time when upgrading projects to use this version.
Highlights
Auto-labelling of viewer axes
napari 0.5.0 laid the ground work for more accurate metadata handling by
allowing users and plugins to set the axis_labels on layers. napari 0.9.0
finally capitalises on that work by automatically labelling viewer axes based
on the axis labels of layers present in the viewer.
(#9282)
Now, opening a dataset with labelled axes will result in correctly labelled
axes in the viewer:
Additionally, when you create a new layer from an existing one using the
buttons in the GUI, the new layer now inherits the axis labels of the layer(s)
it was derived from. (#9293)
There is still work to be done here. For example, if layers have labels that
are inconsistent with each other, napari will simply ignore layers with fewer
dimensions, or layers added later. But, for most use cases, layer and viewer
metadata will now be much more informative!
Layer controls for multiple selected layers
Until now, layer controls only appeared when a single layer was selected. Now,
napari dynamically builds the layer controls from your selection, so
when you select several layers at once you can see and use the controls that
are shared between them. Pan-zoom is always available, while the layer-specific
buttons still appear only when a single layer is selected.
(#9318)
There's also an experimental setting, Generate GUI layer controls dynamically
instead of using premade panels, that makes napari use the new dynamic
controls even for single layers.
Xarray metadata is now inherited
If you work with Xarray — common in climate,
geoscience, and many places where data ships with labelled coordinates — napari
now reads metadata straight from your DataArrays. When you add an xarray
object to the viewer, napari will use its dimension names as axis labels, infer
scale and translate from the coordinate values, and pick up units from
CF-convention units attributes on coordinates (#9316).
This closed an 8-year old issue: #14!
Status bar coordinates as floats
Continuing on the theme of improved metadata, when scale and/or unit metadata
is set on the layer, the status bar coordinates now have increased precision,
where before they were limited to just integers. This means you can have more
accurate physical estimates of your data coordinates when exploring data.
(#9287)
Take a guided tour of the viewer
New to napari, or just want a quick refresher on where everything lives? There's
now a guided tour, available from Help → Take a tour. The tour highlights
the main areas of the viewer — the canvas, the layer list, layer controls, the
viewer buttons, the dimension sliders, and the status bar — so you can get your
bearings in seconds. If the viewer is empty, napari opens the built-in Balls
(3D) sample data so the walkthrough has something to show (#9290).
Contributable plugin preferences
Plugins can now ship their own preferences (#9308)!
By declaring configurations in
their napari.yaml manifest, plugins get their own settings — stored
separately from napari's own settings, automatically added to and editable from
the napari Preferences dialog, and accessible programmatically from Python:
from napari.settings import get_plugin_settings
settings = get_plugin_settings("my-plugin")
settings.reader.lazy = TrueRead more in the Configurations Guide
to learn more about how to add this new contribution to your own plugins.
Adjust grid rendering with hidden layers
Speaking of grid mode: grid mode with hidden layers is much improved: empty
grid spaces are never shown and stride operates on the full layer list, so
layer grouping doesn't change when you show or hide layers (#9244).
Fuzzy find in command palette
Have you used our command palette yet? It's a great way to
quickly access and even discover napari functionality. Now, thanks to
#8661, it's easier to find
functions when you don't know the exact name, or you mistyped something. You'll
need to have rapidfuzz installed to
make use of it. It's automatically installed with napari[all] or
napari[optional]. And if the search feels a bit off, you can set just how
fuzzy you want it to be in Preferences > Experimental > Fuzzy Search Threshold.
[screenshot or movie to be provided by Lorenzo]
2D slicing of surfaces
Ever since we added surfaces, they have been invisible in 2D slices. Now,
thanks to all the work done on thick slicing, surface
slices appear in 2D view (#8783).
This enhancement is accompanied by support for async slicing, which should
improve viewer responsiveness when slicing large, time varying surfaces, for
example.
[movie of ND-cows and slicing]
... And you can try this out yourself with common .obj surface files thanks to
a new built-in reader plugin!
(#9228)
You should now be able to drag and drop .obj files into napari and see them
instantly.
Public API for auto contrast limit
For a very long time, it's been possible to set automatic contrast limits
updating on a layer only through the graphical user interface. This means an
extra click for many workflows and poorer reproducibility. Thanks to
#9271, you can now set the
auto_contrast attribute on Image layers:
image_layer = viewer.add_image(..., auto_contrast=True)
# or
image_layer.auto_contrast = TrueThe life-changing magic of tidying up the Viewer model
The napari Viewer model, for historical reasons, is a grab-bag of many
attributes, which makes usage, discoverability, and code modularity and
composability a major issue. We've taken some big steps towards cleaning up
one of our most important namespaces by creating Canvas
(#8633) and Scene
(#9323) models, which cleans up
(#9363) and clarifies
(napari/docs#1083) many parts of
the API.
The old API is in extremely widespread use, so although it is silently
deprecated, it will continue to work for the foreseeable future. In the
meantime, the new API should be much friendlier to work with by carefully
grouping related concepts and APIs. Some examples:
viewer.axesandviewer.floating_axesbecomeviewer.scene.overlays.axes
andviewer.canvas.overlays.axes.- From that API, you may also guess that the scale bar is on
viewer.canvas.overlays.scale_bar. - You can even get a list of the current overlays (both visible and invisible)
withlist(viewer.canvas.overlays)andlist(viewer.scene.overlays). (But
do note that overlays with a_prefix are private and may change!) viewer.camerais nowviewer.scene.camera.- Grid mode is now accessed at
viewer.canvas.grid(e.g.
viewer.canvas.grid.enabled = True).
This has also enabled a new public API: you can now query the canvas size (in
pixels) without accessing private napari APIs! Check viewer.canvas.size!
The TL;DR:
# Canvas Model
viewer.scale_bar -> viewer.canvas.overlays.scale_bar
viewer.text_overlay -> viewer.canvas.overlays.text
viewer.floating_axes -> viewer.canvas.overlays.axes
viewer.grid -> viewer.canvas.grid
NOW EXPOSED -> viewer.canvas.overlays.current_slice
NEW -> viewer.canvas.overlay_tiling
NEW -> viewer.canvas.background_color & viewer.canvas.background_color_override
NEW -> viewer.canvas.size
# Scene Model
viewer.camera -> viewer.scene.camera
viewer.axes -> viewer.scene.overlays.axesRemoval of translation code
Several years ago, we started working on implementing localization machinery
into napari. Unfortunately, this work has been sitting unfinished and unused,
while making maintaining napari harder. Given the extra maintenance burden
without benefit, we made the difficult decision to remove it from our codebase
(#8935), with the hope that in
the future we might restart this effort with a better plan.
We do aim to revisit when napari's foundations are more solid, but for now,
napari.utils.translations is deprecated. If you have this code in your
codebase:
from napari.utils import translations as trans
please remove it. (For now, `t...
v0.9.0rc2
napari 0.9.0
Thu, Aug 20, 2026
We're happy to announce the release of napari 0.9.0!
napari is a fast, interactive, multi-dimensional image viewer for Python.
It's designed for browsing, annotating, and analyzing large multi-dimensional
images. It's built on top of Qt (for the GUI), vispy (for performant GPU-based
rendering), and the scientific Python stack (numpy, scipy).
For more information, examples, and documentation, please visit our website,
https://napari.org.
napari follows EffVer (Intended Effort Versioning); this is a Macro release containing awesome new features, but may require dedication of some significant time when upgrading projects to use this version.
Highlights
Auto-labelling of viewer axes
napari 0.5.0 laid the ground work for more accurate metadata handling by
allowing users and plugins to set the axis_labels on layers. napari 0.9.0
finally capitalises on that work by automatically labelling viewer axes based
on the axis labels of layers present in the viewer.
(#9282)
Now, opening a dataset with labelled axes will result in correctly labelled
axes in the viewer:
Additionally, when you create a new layer from an existing one using the
buttons in the GUI, the new layer now inherits the axis labels of the layer(s)
it was derived from. (#9293)
There is still work to be done here. For example, if layers have labels that
are inconsistent with each other, napari will simply ignore layers with fewer
dimensions, or layers added later. But, for most use cases, layer and viewer
metadata will now be much more informative!
Layer controls for multiple selected layers
Until now, layer controls only appeared when a single layer was selected. Now,
napari dynamically builds the layer controls from your selection, so
when you select several layers at once you can see and use the controls that
are shared between them. Pan-zoom is always available, while the layer-specific
buttons still appear only when a single layer is selected.
(#9318)
There's also an experimental setting, Generate GUI layer controls dynamically
instead of using premade panels, that makes napari use the new dynamic
controls even for single layers.
Xarray metadata is now inherited
If you work with Xarray — common in climate,
geoscience, and many places where data ships with labelled coordinates — napari
now reads metadata straight from your DataArrays. When you add an xarray
object to the viewer, napari will use its dimension names as axis labels, infer
scale and translate from the coordinate values, and pick up units from
CF-convention units attributes on coordinates (#9316).
This closed an 8-year old issue: #14!
Status bar coordinates as floats
Continuing on the theme of improved metadata, when scale and/or unit metadata
is set on the layer, the status bar coordinates now have increased precision,
where before they were limited to just integers. This means you can have more
accurate physical estimates of your data coordinates when exploring data.
(#9287)
Take a guided tour of the viewer
New to napari, or just want a quick refresher on where everything lives? There's
now a guided tour, available from Help → Take a tour. The tour highlights
the main areas of the viewer — the canvas, the layer list, layer controls, the
viewer buttons, the dimension sliders, and the status bar — so you can get your
bearings in seconds. If the viewer is empty, napari opens the built-in Balls
(3D) sample data so the walkthrough has something to show (#9290).
Contributable plugin preferences
Plugins can now ship their own preferences (#9308)!
By declaring configurations in
their napari.yaml manifest, plugins get their own settings — stored
separately from napari's own settings, automatically added to and editable from
the napari Preferences dialog, and accessible programmatically from Python:
from napari.settings import get_plugin_settings
settings = get_plugin_settings("my-plugin")
settings.reader.lazy = TrueRead more in the Configurations Guide
to learn more about how to add this new contribution to your own plugins.
Adjust grid rendering with hidden layers
Speaking of grid mode: grid mode with hidden layers is much improved: empty
grid spaces are never shown and stride operates on the full layer list, so
layer grouping doesn't change when you show or hide layers (#9244).
Fuzzy find in command palette
Have you used our command palette yet? It's a great way to
quickly access and even discover napari functionality. Now, thanks to
#8661, it's easier to find
functions when you don't know the exact name, or you mistyped something. You'll
need to have rapidfuzz installed to
make use of it. It's automatically installed with napari[all] or
napari[optional]. And if the search feels a bit off, you can set just how
fuzzy you want it to be in Preferences > Experimental > Fuzzy Search Threshold.
[screenshot or movie to be provided by Lorenzo]
2D slicing of surfaces
Ever since we added surfaces, they have been invisible in 2D slices. Now,
thanks to all the work done on thick slicing, surface
slices appear in 2D view (#8783).
This enhancement is accompanied by support for async slicing, which should
improve viewer responsiveness when slicing large, time varying surfaces, for
example.
[movie of ND-cows and slicing]
... And you can try this out yourself with common .obj surface files thanks to
a new built-in reader plugin!
(#9228)
You should now be able to drag and drop .obj files into napari and see them
instantly.
Public API for auto contrast limit
For a very long time, it's been possible to set automatic contrast limits
updating on a layer only through the graphical user interface. This means an
extra click for many workflows and poorer reproducibility. Thanks to
#9271, you can now set the
auto_contrast attribute on Image layers:
image_layer = viewer.add_image(..., auto_contrast=True)
# or
image_layer.auto_contrast = TrueThe life-changing magic of tidying up the Viewer model
The napari Viewer model, for historical reasons, is a grab-bag of many
attributes, which makes usage, discoverability, and code modularity and
composability a major issue. We've taken some big steps towards cleaning up
one of our most important namespaces by creating Canvas
(#8633) and Scene
(#9323) models, which cleans up
(#9363) and clarifies
(napari/docs#1083) many parts of
the API.
The old API is in extremely widespread use, so although it is silently
deprecated, it will continue to work for the foreseeable future. In the
meantime, the new API should be much friendlier to work with by carefully
grouping related concepts and APIs. Some examples:
viewer.axesandviewer.floating_axesbecomeviewer.scene.overlays.axes
andviewer.canvas.overlays.axes.- From that API, you may also guess that the scale bar is on
viewer.canvas.overlays.scale_bar. - You can even get a list of the current overlays (both visible and invisible)
withlist(viewer.canvas.overlays)andlist(viewer.scene.overlays). (But
do note that overlays with a_prefix are private and may change!) viewer.camerais nowviewer.scene.camera.- Grid mode is now accessed at
viewer.canvas.grid(e.g.
viewer.canvas.grid.enabled = True).
This has also enabled a new public API: you can now query the canvas size (in
pixels) without accessing private napari APIs! Check viewer.canvas.size!
The TL;DR:
# Canvas Model
viewer.scale_bar -> viewer.canvas.overlays.scale_bar
viewer.text_overlay -> viewer.canvas.overlays.text
viewer.floating_axes -> viewer.canvas.overlays.axes
viewer.grid -> viewer.canvas.grid
NOW EXPOSED -> viewer.canvas.overlays.current_slice
NEW -> viewer.canvas.overlay_tiling
NEW -> viewer.canvas.background_color & viewer.canvas.background_color_override
NEW -> viewer.canvas.size
# Scene Model
viewer.camera -> viewer.scene.camera
viewer.axes -> viewer.scene.overlays.axesRemoval of translation code
Several years ago, we started working on implementing localization machinery
into napari. Unfortunately, this work has been sitting unfinished and unused,
while making maintaining napari harder. Given the extra maintenance burden
without benefit, we made the difficult decision to remove it from our codebase
(#8935), with the hope that in
the future we might restart this effort with a better plan.
We do aim to revisit when napari's foun...


