Introduction
zarrs is a Rust library for the Zarr V2 and Zarr V3 array storage formats.
If you don’t know what Zarr is, check out:
- the official Zarr website: zarr.dev, and
- the Zarr V3 specification.
zarrs was originally designed exclusively as a Rust library for Zarr V3.
However, it now supports a V3 compatible subset of Zarr V2, and has Python and C/C++ bindings.
The community has since built zarrs-backed bindings for other languages, such as MATLAB, R, and Julia.
This book details the Rust implementation.
🚀 zarrs is Fast 🚀
The repository includes benchmarks of
zarrs against other Zarr V3 implementations.
Check out the benchmarks below that measure the time to round trip a \(1024x2048x2048\) uint16 array encoded in various ways.
The zarr_benchmarks repository includes additional benchmarks.
Python Bindings: zarrs-python

zarrs-python exposes a high-performance zarrs-backed codec pipeline to the reference Python package. It is enabled as follows:
from zarr import config
import zarrs # noqa: F401
config.set({"codec_pipeline.path": "zarrs.ZarrsCodecPipeline"})
That’s it!
There is no need to learn a new API and it is supported by downstream libraries like dask.
However, zarrs-python has some limitations.
Consult the zarrs-python README or PyPi docs for more details.
Rust Crates
The Zarr specification is inherently unstable. It is under active development and new extensions are regularly being introduced.
The zarrs crate has been split into multiple crates to:
- allow external implementations of stores and extensions points to target a relatively stable API compatible with a range of
zarrsversions, - enable automatic backporting of metadata compatibility fixes and changes due to standardisation,
- stay up-to-date with unstable public dependencies (e.g.
opendal,object_store,icechunk, etc) without impacting the release cycle ofzarrs, and - improve compilation times.
Below is an overview of the crate structure. Crates highlighted in orange are community (third party) projects.
The core crate is:
For local filesystem stores (referred to as native Zarr), this is the only crate you need to depend on.
zarrs has quite a few supplementary crates:
Most Zarr extension points also have their own API crate:
Tip
The supplementary crates are transitive dependencies of
zarrs, and are re-exported by it. You do not need to add them as direct dependencies. The extension point API crates are re-exported aszarrs::array::{data_type,codec,chunk_grid,chunk_key_encoding}::api, and their key types are re-exported directly inzarrs::array. The storage transformer API is the exception: it lives inzarrsitself aszarrs::array::storage_transformer.
Note
The supplementary crates are separated from
zarrsto enable development of Zarr extensions and stores targeting a more stable API thanzarrsitself.
Additional crates need to be added as dependencies in order to use:
- remote stores (e.g. HTTP, S3, GCP, etc.),
zipstores, oricechunktransactional storage.
The Stores chapter details the various types of stores and their associated crates.
C/C++ Bindings: zarrs_ffi

A subset of zarrs exposed as a C/C++ API.
zarrs_ffi is a single header library: zarrs.h.
Consult the zarrs_ffi README and API docs for more information.
CLI Tools: zarrs_tools

Various tools for creating and manipulating Zarr v3 data with the zarrs rust crate.
This crate is detailed in the zarrs_tools chapter.
Zarr Metadata Conventions
ome_zarr_metadata

A Rust library for OME-Zarr (previously OME-NGFF) metadata.
OME-Zarr, formerly known as OME-NGFF (Open Microscopy Environment Next Generation File Format), is a specification designed to support modern scientific imaging needs. It is widely used in microscopy, bioimaging, and other scientific fields requiring high-dimensional data management, visualisation, and analysis.
Community (Third Party)
A growing ecosystem of projects builds on zarrs: bindings that expose it to other languages, and crates that extend it with additional stores, codecs, conventions, and format support.
Note
The projects in this section are developed and maintained by the community, independently of
zarrs. Zarr feature coverage, maturity, and support vary considerably, so consult each project’s own documentation. Please open an issue to add a project to this list.
Language Bindings
zarrista (Python)
A low-level Zarr API for Python built directly on zarrs, in the style of zarrita.
Unlike zarrs-python, which slots a zarrs-backed codec pipeline underneath zarr-python, zarrista exposes zarrs itself: it has its own API with synchronous and asynchronous variants, zero-copy numpy interoperability, and support for icechunk and object_store stores.
The Python API is not yet stable.
zarr-matlab (MATLAB)
A Zarr V2 and V3 implementation for MATLAB based on zarrs, which is called through a Rust MEX layer.
It supports reading and writing arrays and groups, chunking and sharding, a range of codecs, and filesystem and read-only HTTP stores.
pizzarr (R)
A Zarr implementation for R that ships in two builds of the same version.
The CRAN build is pure R with no compiled dependencies, whereas the r-universe build links zarrs through extendr as a backend, adding parallel decompression, additional codec support, and cloud stores.
Rzarrs (R)
R bindings to zarrs through the savvy crate, distributed via r-universe.
It is reader-first, supporting filesystem, HTTP/HTTPS, S3, and .zarr.zip stores.
Zarrs.jl (Julia)
Zarr V2 and V3 arrays for Julia backed by zarrs through a C FFI shim, including icechunk support.
Note
Zarrs.jlis experimental. Its README recommendsZarr.jlif a mature pure-Julia implementation is needed.
Extension Crates
These crates extend zarrs through its extension points and storage API.
zarrs_n5- Read-only N5 support, including the
gzip,bzip2,zstd, andbloscN5 compressors.
- Read-only N5 support, including the
zarrs_conventions- An implementation of the zarr-conventions specification, which standardises how conventions are declared in Zarr attributes.
- Companion crates implement individual conventions:
zarrs_conventions_licenseimplements the license convention, which communicates the licence(s) of the data in a group or array.
zarrs_conventions_thumbnailsimplements the thumbnails convention, which references images representing a node for use in galleries and previews.
zarrs_conventions_uomimplements the units of measure convention, which communicates the units of a numeric array.
ndic-zarr- Zarr V3 codecs for multidimensional scientific images:
nd_lift,htj2k, andnd_zfp.
- Zarr V3 codecs for multidimensional scientific images:
zarrs_sqlite- An SQLite-based Zarr store with
rusqliteandtursobackends, tracking a store specification proposal.
- An SQLite-based Zarr store with
zarrs_jpeg- An implementation of the proposed
jpegcodec backed bylibjpeg-turbo.
- An implementation of the proposed
Warning
Some of these crates are works in progress that have not been published to crates.io.