# ZenML 0.96.2 - Product: ZenML (https://whatsnew.fyi/product/zenml) - Vendor: ZenML - Date: 2026-07-17 - Version: 0.96.2 - Original notes: https://github.com/zenml-io/zenml/releases/tag/0.96.2 - Permalink: https://whatsnew.fyi/product/zenml/releases/0.96.2 What's New is an index, not a publisher: every entry below links to the vendor's own release notes, which are the authoritative source. Entries are labelled where they are hand-curated sample data, pre-releases, or drawn from a secondary source such as a developer blog. Reuse: the summaries, labels and curation here are © What's New. Quote freely with attribution and a link back; wholesale republication of the corpus is not permitted — terms: https://whatsnew.fyi/terms. The vendors' own release notes remain their publishers'. --- - **added** — Dynamic pipelines now support start_after parameter when calling steps to control which concurrently launched steps should wait for others before starting - **added** — Configure whether JSON-serializable raw values passed to steps in dynamic pipelines should be treated as parameters instead of artifacts through environment variables and explicit APIs - **added** — Dynamic pipelines now support CONTINUE_ON_FAILURE execution mode to allow queued or asynchronous work to continue when an async step fails - **added** — First-class DigitalOcean integration with support for DigitalOcean Spaces artifact stores and DigitalOcean Container Registry stack components - **added** — Helm chart now exposes server logging options and OpenTelemetry settings in values for console or JSON logging, service names, OTEL endpoints, and trace/metric/log configuration - **added** — Delete artifact version data through the server API from the UI or thin clients without direct stack access - **added** — Projects now support arbitrary project_metadata on create, update, and hydrated response models - **changed** — start_after is now a reserved step keyword in dynamic pipelines - **changed** — fileio.copy() now streams cross-filesystem copies in bounded chunks instead of reading entire files into memory - **changed** — ZenML caches commonly reused project, store, stack, pipeline run, and completed step run responses in process to reduce server requests - **changed** — DAG endpoint now does less unnecessary parsing and object construction when serving large pipeline graphs - **changed** — FastAPI updated to 0.138.0, Starlette lower bound raised to 0.46.0, and OpenTelemetry packages updated for compatibility - **changed** — Removed unused fastapi_utils dependency and cleaned up deprecated FastAPI response and lifespan usage - **changed** — Dynamic pipelines now model implicit dependencies from newly launched steps to the last completed sync step - **fixed** — User tokens issued before a password change are now rejected - **fixed** — Tokens derived from API keys are tied to the key generation so rotated keys no longer leave stale sessions usable - **fixed** — Dashboard now correctly rotates API keys when a non-zero retention period is configured - **fixed** — ZenML now properly handles in-memory Docker credentials when a local Docker credential store already has entries for the same registry ###### Known issues Artifact version deletion via the API is broken in this release and will be fixed in `0.96.3`. Artifact versions can still be deleted using the python SDK: ```python from zenml.client import Client Client().delete_artifact_version(..., server_side=False) ``` ###### Dynamic pipelines - **Explicit start ordering for dynamic steps**: Dynamic pipelines now support `start_after=...` when calling steps, letting you control which concurrently launched steps should wait for others before starting. This makes it easier to model ordering constraints without turning concurrent parts of a dynamic pipeline into fully synchronous execution. Note that `start_after` is now a reserved step keyword, so steps that previously used a parameter with this name will need to be updated. [PR #4995](https://github.com/zenml-io/zenml/pull/4995) - **More flexible dynamic step inputs**: You can now configure whether JSON-serializable raw values passed to steps in dynamic pipelines should be treated as parameters instead of artifacts. The new environment-variable threshold defaults to `0` to preserve existing behavior, while explicit APIs such as `with_options(parameters=...)` and `ExternalArtifact(...)` remain available when you want to force either behavior. [PR #5079](https://github.com/zenml-io/zenml/pull/5079) - **Improved dynamic execution semantics**: Dynamic pipelines now support `CONTINUE_ON_FAILURE` execution mode, allowing already queued or asynchronous work to continue when an async step fails. ZenML also models implicit dependencies from newly launched steps to the last completed sync step, making mixed sync/async dynamic pipelines execute in a more predictable order. [PR #5052](https://github.com/zenml-io/zenml/pull/5052) ###### Integrations and deployment - **DigitalOcean integration**: ZenML now includes a first-class `digitalocean` integration with support for DigitalOcean Spaces artifact stores and DigitalOcean Container Registry stack components. Spaces support builds on the existing S3-compatible implementation while handling DigitalOcean regions and endpoint generation for you. [PR #5054](https://github.com/zenml-io/zenml/pull/5054) - **Helm chart logging and OpenTelemetry configuration**: The ZenML Helm chart now exposes server logging options and OpenTelemetry settings directly in values. You can configure console or JSON logging, service names, OTEL endpoints, and enable or disable traces, metrics, and logs without custom chart modifications. [PR #5048](https://github.com/zenml-io/zenml/pull/5048) ###### Data and metadata management - **Server-side artifact data deletion**: ZenML can now delete artifact version data through the server API, not only from a full client with direct stack access. This enables artifact metadata and backing data to be deleted from the UI or from thin clients that do not have the artifact store stack component locally available. [PR #5034](https://github.com/zenml-io/zenml/pull/5034) - **Project metadata**: Projects now support arbitrary `project_metadata` on create, update, and hydrated response models. Metadata is stored as portable JSON, preserved when omitted, replaced when explicitly supplied, and can be cleared by sending an empty object. [PR #5086](https://github.com/zenml-io/zenml/pull/5086) ###### Performance and scalability - **Lower-memory cross-filesystem copies**: `fileio.copy()` now streams cross-filesystem copies in bounded chunks instead of reading the entire file into memory. This significantly reduces peak memory usage for local-to-remote and remote-to-local artifact operations, including `PathMaterializer`, directory copies, integration materializers, and code archive upload/download flows. [PR #5031](https://github.com/zenml-io/zenml/pull/5031) - **Fewer server requests during runs**: ZenML now caches commonly reused project, store, stack, pipeline run, and completed step run _[Truncated at 4000 characters — full notes: https://github.com/zenml-io/zenml/releases/tag/0.96.2]_