Skip to content

Consistent versioning strategy for GeoZarr conventions #102

Open

Description

@maxrjones

Summary

#101 Established that the first release of GeoZarr will be comprised of a set of initial Zarr conventions (e.g., multiscales, spatial:, proj:).

To ensure a coherent ecosystem and reduce implementation burden, we should align on a consistent versioning strategy across all conventions that comprise GeoZarr.

Background

Recent discussions across the zarr-conventions organization have explored versioning approaches for specifications:

Key Considerations

Integer vs. Semantic Versioning

For specifications (as opposed to software libraries), semantic versioning (major.minor.patch) may create unnecessary burden on implementers.

Consistency Across Conventions

If different conventions within GeoZarr use different versioning schemes (e.g., multiscales using v1.0.0 while others use v1 and others do not use versioning), this could:

  • Confuse implementers about version compatibility semantics
  • Create inconsistent patterns in zarr metadata
  • Complicate tooling that needs to parse and validate version strings

Implementer Burden

Large geospatial data catalogs are expensive to update. A versioning strategy should:

  • Signal meaningful changes that require action
  • Allow forward compatibility where possible (e.g., new optional fields)
  • Avoid requiring catalog-wide updates for non-breaking changes

Proposal

GeoZarr should establish a recommendation for consistent versioning across its constituent conventions:

  1. Adopt integer versioning (e.g., v1, v2) for all Zarr Conventions comprising GeoZarr, aligning with zarr-conventions-spec and zarr_format
  2. Start at version 1 to signal stability and production-readiness
  3. Increment versions only for breaking changes that require implementation updates
  4. Use GitHub releases for tracking non-breaking updates (documentation, clarifications, optional field additions) without incrementing the convention version
  5. Allow updating schemas for versions that do not include breaking changes - This would mean not using tagged release files as the published schema.

Breaking Changes (Require Version Increment)

  • Removing required properties
  • Changing property semantics incompatibly
  • Changing JSON Schema in ways that invalidate previously valid data
  • Removing conformance classes

Non-Breaking Changes (No Version Increment)

  • Adding new optional properties
  • Adding new conformance classes
  • Extending allowed values (e.g., new transform types)
  • Adding new conventions
  • Documentation clarifications and bug fixes

Alternatives

  1. SemVer (STAC-style): Full major.minor.patch versioning
  2. No versioning (GeoJSON-style): Breaking changes mean the data do not actually follow the conventions
  3. Major + minor only (CF-style): Use only major and minor version numbers in metadata

Convention UUID Stability

Deprecation Policy

  1. Features deprecated in version N
  2. Deprecation warning documented in version N
  3. Removal allowed in version N+1
  4. Minimum 12 months between deprecation and removal

Relationship to Convention Maturity

The Zarr Conventions Framework defines maturity levels that interact with versioning:

Maturity Stability Expectation
Proposal Breaking changes expected
Pilot Breaking changes not anticipated but possible
Candidate Breaking changes require new version
Stable All changes require new version and review process

Version stability commitments should align with maturity level.

Questions for Discussion

  1. Should GeoZarr mandate a versioning approach for its constituent conventions, or provide a recommendation?
  2. Should each convention have independent versions, or one unified version?
  3. How do we version the composition of conventions?
  4. What is the support timeline for older versions?

Dependencies

None

References

Activity

  1. changed the title [-]Consistent versioning approaches across Zarr Conventions comprising GeoZarr[/-] [+]Consistent versioning strategy for GeoZarr conventions[/+] on Feb 13, 2026
  2. jsignell commented on Apr 7, 2026

    @jsignell

    In case it's helpful in the discussions: When implementing STAC Extensions in tools it is really useful to be able to derive meaning from SemVer. In practice a lot of extensions start at 1.0.0, so there's not always a ton of meaning in that one, but the difference between v1.0.0 and v1.1.0 as opposed to v2.0.0 is meaningful. An implementation that was written or v1.0.0 would maybe not have special handling for a field on v1.1.0 but it wouldn't raise an error. The same promise would not apply if you pass a v2.0.0 object. So I guess with SemVer it's easier to communicate expectations about what version of a STAC extension is supported by a particular tool.

    Also recently in pystac, we switched to having a python package per STAC extension and the version of those packages matches the version of the STAC extension itself. This is super new, but we are excited about its potential to make the relationship between spec version and implementation version way more explicit.

  3. emmanuelmathot commented on May 19, 2026

    @emmanuelmathot
    Collaborator

    +1 to @jsignell's point. The graceful degradation behavior you describe ( an implementation written for v1.0.0 not erroring on v1.1.0 but correctly refusing v2.0.0 ) is exactly what you want from a geospatial metadata convention. That contract is only expressible with semver; integer versions can't make that promise.

    The spec-to-package version alignment you mention in pystac is also a compelling model worth considering for GeoZarr tooling down the line.

    cc @kylebarron

  4. maxrjones commented on May 22, 2026

    @maxrjones
    MemberAuthor

    I had Claude assess the changes associated with version bumps across 6 specs in https://zarr-conventions.github.io/zarr-conventions-guidance/posts/2026-survey.

    A couple things stood out to me:

    1. The STAC ecosystem does not use patch versions in practice and NGFF routinely uses patch versions for small additions, which would be minor bumps under strict semver. This suggests we would gain no value and possibly increase confusion by adopting versioning following x.y.z relative to just x.y.
    2. Semver is subjective in practice for standards. The STAC spec and extensions have released technically breaking changes in minor version releases. I think that STAC versioning is in practice closer to effver.

    I think that the Cargo / Rust-style pre-1.0 variant matches our needs best:

    • allows us to iterate quickly pre-v1.0 while having resolvable schemas/spec versions
    • after v1.0, readers and writers don't need to track minor-version differences because all minor bumps are additive

    I'll acknowledge the tradeoff that reaching a stable v1 under cargo-style would likely take longer because the bar for stability is higher than under EffVer (no breaking changed allowed in minor releases after v1). I think a high bar is a good thing.

    Independent of that opinion, we could immediately label the multiscales, proj, and spatial conventions as v0.1 and publish a release. That is orthogonal to voting on how to do versioning long-term at a SWG meeting.

  5. kylebarron commented on May 22, 2026

    @kylebarron

    I think starting conventions at v0.1 is a low-risk way to start publishing.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions