docs: add roadmap page outlining future plans - #4149
Conversation
Adds a Roadmap page to the documentation describing the goals for the
next major cycle of work ("v4"), the intended changes per theme, and
the three-stream release model (additive minors, deprecations, one
minimal removals-only major).
Assisted-by: ClaudeCode:claude-fable-5
|
cc @ilan-gold @maxrjones, opening this as a draft for visibility. lmk if there's anything more or less we should say here |
| Zarr-Python around the stack, so that each level is something you can depend | ||
| on, conform to, or replace, without buying every other level: | ||
|
|
||
| - **A focused package per level** — `zarr-metadata`, `zarr-store`, |
There was a problem hiding this comment.
Would maybe note the zarrs example here
There was a problem hiding this comment.
good point, will add something crediting zarrs with this layout
| complementary rather than competitive: Zarr-Python aims to be the best | ||
| pure-Python Zarr implementation *and* the best wrapper around the | ||
| compiled-language implementations, so that users who need native throughput can |
There was a problem hiding this comment.
I'm really conflicted on this, because I think baking fragmentation into the ecosystem is not great, but the flipside is that languages may have different features/advantages. It would be great to have a concrete reason (or list of reasons) as to why we would design around this level of extensibility
There was a problem hiding this comment.
good points, I'd say we want the backend to be an extension point for a few reasons:
- we always want a traditional python impl. IMO it's our job as the python implementation, and it keeps the ecosystem healthy to have multiple implementations
- we can't guarantee uniform, complete feature support across all implementations. As long as we allow people to hack on stuff in python, there will be things the python impl does that e.g. a rust impl doesn't support, and that's OK. For now, a compiled backend is effectively an external dep, and we simply can't promise what external deps will do in perpetuity.
- IMO a full backend is just an refined version of our current model, which requires extenders manage buffer prototypes, data type implementations, codec implementations, and store implementations. Consolidating all of this pluggability on a single surface should make extending Zarr Python easier even for other python backends (like a cupy backend, or a pysparse backend)
| Make Zarr-Python's IO surfaces device-agnostic rather than adding GPU support | ||
| as a bolted-on feature: stores and codecs grow APIs for writing into a | ||
| caller-provided buffer (`read_into`, `decode_into`), and the `Array` facade | ||
| returns array-like objects in the user's chosen Array API namespace. GPU | ||
| support falls out once the assumption of CPU destinations is removed, and CPU | ||
| paths get faster too, because pre-allocated output buffers eliminate per-chunk | ||
| allocation. |
There was a problem hiding this comment.
@TomAugspurger it'd be great to get your thoughts on this component in particular.
Co-authored-by: Max Jones <14077947+maxrjones@users.noreply.github.com>
Co-authored-by: Max Jones <14077947+maxrjones@users.noreply.github.com>
Co-authored-by: Max Jones <14077947+maxrjones@users.noreply.github.com>
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #4149 +/- ##
=======================================
Coverage 94.12% 94.12%
=======================================
Files 92 92
Lines 12826 12826
=======================================
Hits 12072 12072
Misses 754 754 🚀 New features to boost your workflow:
|
Co-authored-by: Max Jones <14077947+maxrjones@users.noreply.github.com>
The mkdocs-redirects plugin was generating a redirect stub for roadmap.md pointing at the old v3.0.8 docs, which clobbered the new roadmap page added in this PR. The developers/roadmap.html redirect is kept so old links to the historical v3 design roadmap still resolve. Assisted-by: ClaudeCode:claude-fable-5
| Move configuration from "global mutable state read implicitly" to "typed data | ||
| passed explicitly": a typed config object replacing the untyped global `donfig` | ||
| dict, array-scoped runtime config passed at open time, a registry redesign that | ||
| addresses implementations by stable identity and resolves plugin name-conflicts | ||
| deliberately, and named profiles replacing global mutators. |
There was a problem hiding this comment.
FWIW I would like to prototype using a context manager in Zarrista for scope-local configuration.
See developmentseed/zarrista#153. In particular the idea is to borrow from rasterio.Env, which injects settings only for that local scope.
with rasterio.Env(GDAL_CACHEMAX=128000000) as env:
# All drivers are registered, GDAL's raster block cache
# size is set to 128 MB.
# Commence processing...
...
# End of processing.
# At this point, configuration options are set to their
# previous (possible unset) values.There was a problem hiding this comment.
This kind of thing relies on two routines or objects being the same, modulo the configuration. So why not make this explicit? for functions its easy, we declare their configuration in a parameter. for objects we can do something similar, by initializing the object with a configuration, and copying the object with a different configuration as needed, e.g. new_object = StatefulObject.with_config(new_config). IMO this is cleaner because it means runtime internals don't need to know about environment variables. they just inspect local data -- function parameters or the attributes of self -- for configuration info.
There was a problem hiding this comment.
This kind of thing relies on two routines or objects being the same, modulo the configuration. So why not make this explicit?
We do currently make this explicit as a parameter into each function. The context manager would be an abstraction to automatically pass down the config into all zarrista calls within that scope.
I'm still not sure whether I like the idea though.
There was a problem hiding this comment.
don't need to know about environment variables.
Oh but to be clear, I didn't have in mind environment variables. Despite the name of rasterio.Env, I don't think it's setting global environment variables, because that wouldn't be scope-local.
I had in mind a context manager that would hold config as a Python object, and that local config could be queried. But I don't think Zarrista should touch shell environment variables at all
There was a problem hiding this comment.
that local config could be queried.
this is a pattern I don't really like. if an object like a function or class instance depends on some other data, then that should be formalized as part of the function signature or class structure. zarr-python today has a lot of places where code reaches for a free-floating config object, when IMO the simpler solution is to add parameters to functions / classes.
Co-authored-by: Kyle Barron <kylebarron2@gmail.com>
Co-authored-by: Kyle Barron <kylebarron2@gmail.com>
Co-authored-by: Kyle Barron <kylebarron2@gmail.com>
Co-authored-by: Kyle Barron <kylebarron2@gmail.com>
Co-authored-by: Kyle Barron <kylebarron2@gmail.com>
|
I gave the text a sweep, folks should have another look. |
|
@zarr-developers/python-core-devs please have a look! |
|
I'd like to get this merged soon, so I will self-merge today unless anyone raises objections to specific content here, in which case we can refine things and then merge soon. Otherwise I recommend we continue iterating on the roadmap in follow up PRs. |
maxrjones
left a comment
There was a problem hiding this comment.
I agree with everything in this roadmap. I also support merging this since there's been a long window for comments, and folks can still open PRs against the roadmap.
| The 3.x redesign was carried out under hard backwards-compatibility | ||
| constraints, and it inherited many structural patterns from the 2.x | ||
| implementation it replaced. The library has never had a release cycle whose | ||
| primary goal was the *shape* of the internals. The next body of work — which we | ||
| call **"v4"** — is that overdue investment. |
There was a problem hiding this comment.
| The 3.x redesign was carried out under hard backwards-compatibility | |
| constraints, and it inherited many structural patterns from the 2.x | |
| implementation it replaced. The library has never had a release cycle whose | |
| primary goal was the *shape* of the internals. The next body of work — which we | |
| call **"v4"** — is that overdue investment. | |
| The 3.x redesign was carried out under hard backwards-compatibility | |
| constraints, and it inherited many structural patterns from the 2.x | |
| implementation it replaced. These structural patterns have made it | |
| challenging to evolve the API for usability (e.g., many argument are | |
| counter-intuitive and lead to user error) and provide excellent performance | |
| across backends (e.g., local and hybrid systems suffer from | |
| Python overhead with our current design). The goal of **v4** is | |
| to provide a highly usable library that delivers first-class performance | |
| across all backends. We recognize that accomplishing these goals is | |
| only possible via improvements to Zarr Python's internals, and consider | |
| the investment in the Zarr Python internals to be a crucial part of | |
| the **v4*** effort. |
I'd like this section to be explicitly motivated for reasons beyond just cleaning up the shape of the internals.
There was a problem hiding this comment.
this suggestion was based off an earlier version of the PR; I didn't realize it'd still be included in my review. It probably isn't still necessary, but I'll leave it.
| need read-only array access; other tools need everything. We think of this as a | ||
| "Zarr stack", from most abstract to most concrete: | ||
|
|
||
| 1. **Conventions** — application and/or domain-specific schemas built on top of Zarr (OME-NGFF, |
There was a problem hiding this comment.
I prefer keeping it as just "conventions" since specification may confuse folks who think of the core zarr spec

Adds a Roadmap page to the documentation describing the goals for the
next major cycle of work ("v4"), the intended changes per theme, and
the three-stream release model (additive minors, deprecations, one
minimal removals-only major), with an option for a
legacymodule.Assisted-by: ClaudeCode:claude-fable-5
Author attestation