Back to all posts
development
USE CASES
Company
Infrastructure
Workflows
Jul 17, 2025
July 17, 2025

UltiHash v1.6.0: native object versioning now available

Our latest version introduces full S3-compatible object versioning so you can track changes to an object over time and roll back.
Posted by
Tom Lüdersdorf
Founder & CEO
Key takeaways

We’ve just released v1.6.0, which introduces full S3-compatible object versioning, a critical feature for teams working with evolving datasets, model artifacts, and analytic outputs. Versioning allows you to track every change to an object over time and retrieve or roll back to any previous version on demand, all without altering your workflows.

Unlike traditional storage systems where versioning often results in costly storage bloat, UltiHash’s deduplication engine ensures redundant data across versions is only stored once. You get traceability without the cost of storage overheads.

Why Versioning?

In AI pipelines, versioning is foundational: models are re-trained, datasets change, features are adjusted, and pipelines evolve. Without robust object versioning, teams risk:

  • Overwriting training artifacts
  • Losing track of which data version led to which model performance
  • Failing audits or reproducibility checks
  • Wasting time rebuilding from scratch after bad updates

Versioning lets you retain every write operation as a uniquely identifiable version of the same object. That means you can always:

  • Restore a previous version if a new one breaks your workflow
  • Audit and reproduce experiments exactly
  • Track changes at the object level for any file in your data lake or ML pipeline

How Versioning Works in UltiHash

UltiHash’s versioning is modeled on S3 semantics and available via the standard S3-compatible API. By default, versioning is not enabled, and you need to explicitly turn it on through UltiHash S3-compatible API before it starts tracking versions.

Enabling Versioning

Versioning is bucket-scoped and must be explicitly enabled first. Once turned on, every update or overwrite to an object is saved as a new, immutable version rather than replacing the old one.

Each version is automatically assigned a unique versionId, which is returned after each write ( PUT ) operation: this lets you retrieve, compare, or roll back to any specific version whenever needed.

aws s3api put-bucket-versioning \
  --bucket your-bucket-name \
  --versioning-configuration Status=Enabled


Once versioning is enabled:

  • Every PUT or overwrite generates a new immutable version with its own versionId, so older versions are always preserved.
  • By default, GET requests return the latest version unless you explicitly request a specific versionId.
  • Overwriting an object doesn’t delete previous data anymore, every change is saved as a new version. If you need to permanently remove an object (including all its versions), you must explicitly delete each version using its versionId.

Example: Tracking a Model Artifact

aws s3api put-bucket-versioning \
  --bucket models \
  --versioning-configuration Status=Enabled


aws s3api put-object --bucket models --key resnet50.pt --body ./resnet50.pt
# returns versionId: "3a4b6..."

# Upload a new version
aws s3api put-object --bucket models --key resnet50.pt --body ./resnet50_v2.pt
# returns versionId: "5f1c2..."


In this example, we first upload an initial model file (resnet50.pt) to the models bucket. Later, we upload an updated file (resnet50_v2.pt) to the same object key, which is the unique name (or "path") used to reference that object in the bucket.

While the key stays the same, the actual object content changes, and with versioning enabled, each change automatically creates a new, immutable version. Each PUT command returns a unique versionId, allowing you to precisely track, retrieve, or roll back to any specific version at any time without overwriting earlier data. Each version is accessible for audit, rollback, or comparison.

When retrieving an object, if you don’t specify a versionId, you’ll always receive the latest version by default. To download a specific version instead, you should include the --version-id parameter:

aws s3api get-object --bucket models --key resnet50.pt --version-id 3a4b6... ./resnet50_v1.pt

The part ./resnet50_v1.pt is manually chosen by you as the local filename to save the downloaded file, UltiHash does not add this automatically.

Storage-Efficient by Default

What makes UltiHash unique is how versioning interacts with our built-in deduplication engine.

When multiple versions of the same object share overlapping binary content (e.g., large datasets with only partial changes, or models with identical weights in early layers), UltiHash detects duplicated parts and matches these redundancies of files. This dramatically reduces:

  • Incremental storage growth**:** Instead of duplicating whole objects through versioning, only the changes are saved. You can keep detailed version histories without drastically growing your storage footprint.

This makes UltiHash versioning not just a compliance or reproducibility feature, it’s also performance- and cost-aware by design.

Namespace Behavior

UltiHash treats each object as unique based on its full namespace that is, the combination of bucket name and object key.

bucket-1/data/file.csv
bucket-1/data-v2/file.csv


In this example, even if the content of both files is identical, they’re considered two separate objects with their own independent version histories because the namespaces are different.

Even if versioning is not enabled in this case, UltiHash’s deduplication engine will still detect and reduce storage for shared content, but versioning always operates per object key.

Common Use Cases

✅ ML Experiments

AI teams need to iterate on datasets and models to improve accuracy. Versioning keeps every dataset and model change traceable, so you can reproduce results, compare experiments, and roll back easily if new updates underperform.

✅ Data Pipelines

Frequent changes in ETL pipelines can introduce unexpected issues. With versioning, teams can track outputs and schema changes over time, pinpoint errors quickly, and restore stable states without rework.

✅ Analytics & Governance

When data or metrics definitions evolve, versioning helps maintain historical files and reports. This makes it easier to explain shifts, support audits, and ensure stakeholders understand what changed.

Try It Now

Versioning is available now in UltiHash v1.6.0, and part of the freemium plan. Get started by enabling versioning on a bucket, no changes to your client logic are required.

🔧 Setup guide

📥 Create account

For feedback, reach out to us directly at support@ultihash.io or drop your thoughts on ultihash.io/feedback.

Share this post:
Check this out:
UltiHash v1.6.0: native object versioning now available
Our latest version introduces full S3-compatible object versioning so you can track changes to an object over time and roll back.
Posted by
Tom Lüdersdorf
Founder & CEO
Build faster AI infrastructure with less storage resources
Get 10TB Free

UltiHash v1.6.0: native object versioning now available

This is some text inside of a div block.
Our latest version introduces full S3-compatible object versioning so you can track changes to an object over time and roll back.

We’ve just released v1.6.0, which introduces full S3-compatible object versioning, a critical feature for teams working with evolving datasets, model artifacts, and analytic outputs. Versioning allows you to track every change to an object over time and retrieve or roll back to any previous version on demand, all without altering your workflows.

Unlike traditional storage systems where versioning often results in costly storage bloat, UltiHash’s deduplication engine ensures redundant data across versions is only stored once. You get traceability without the cost of storage overheads.

Why Versioning?

In AI pipelines, versioning is foundational: models are re-trained, datasets change, features are adjusted, and pipelines evolve. Without robust object versioning, teams risk:

  • Overwriting training artifacts
  • Losing track of which data version led to which model performance
  • Failing audits or reproducibility checks
  • Wasting time rebuilding from scratch after bad updates

Versioning lets you retain every write operation as a uniquely identifiable version of the same object. That means you can always:

  • Restore a previous version if a new one breaks your workflow
  • Audit and reproduce experiments exactly
  • Track changes at the object level for any file in your data lake or ML pipeline

How Versioning Works in UltiHash

UltiHash’s versioning is modeled on S3 semantics and available via the standard S3-compatible API. By default, versioning is not enabled, and you need to explicitly turn it on through UltiHash S3-compatible API before it starts tracking versions.

Enabling Versioning

Versioning is bucket-scoped and must be explicitly enabled first. Once turned on, every update or overwrite to an object is saved as a new, immutable version rather than replacing the old one.

Each version is automatically assigned a unique versionId, which is returned after each write ( PUT ) operation: this lets you retrieve, compare, or roll back to any specific version whenever needed.

aws s3api put-bucket-versioning \
  --bucket your-bucket-name \
  --versioning-configuration Status=Enabled


Once versioning is enabled:

  • Every PUT or overwrite generates a new immutable version with its own versionId, so older versions are always preserved.
  • By default, GET requests return the latest version unless you explicitly request a specific versionId.
  • Overwriting an object doesn’t delete previous data anymore, every change is saved as a new version. If you need to permanently remove an object (including all its versions), you must explicitly delete each version using its versionId.

Example: Tracking a Model Artifact

aws s3api put-bucket-versioning \
  --bucket models \
  --versioning-configuration Status=Enabled


aws s3api put-object --bucket models --key resnet50.pt --body ./resnet50.pt
# returns versionId: "3a4b6..."

# Upload a new version
aws s3api put-object --bucket models --key resnet50.pt --body ./resnet50_v2.pt
# returns versionId: "5f1c2..."


In this example, we first upload an initial model file (resnet50.pt) to the models bucket. Later, we upload an updated file (resnet50_v2.pt) to the same object key, which is the unique name (or "path") used to reference that object in the bucket.

While the key stays the same, the actual object content changes, and with versioning enabled, each change automatically creates a new, immutable version. Each PUT command returns a unique versionId, allowing you to precisely track, retrieve, or roll back to any specific version at any time without overwriting earlier data. Each version is accessible for audit, rollback, or comparison.

When retrieving an object, if you don’t specify a versionId, you’ll always receive the latest version by default. To download a specific version instead, you should include the --version-id parameter:

aws s3api get-object --bucket models --key resnet50.pt --version-id 3a4b6... ./resnet50_v1.pt

The part ./resnet50_v1.pt is manually chosen by you as the local filename to save the downloaded file, UltiHash does not add this automatically.

Storage-Efficient by Default

What makes UltiHash unique is how versioning interacts with our built-in deduplication engine.

When multiple versions of the same object share overlapping binary content (e.g., large datasets with only partial changes, or models with identical weights in early layers), UltiHash detects duplicated parts and matches these redundancies of files. This dramatically reduces:

  • Incremental storage growth**:** Instead of duplicating whole objects through versioning, only the changes are saved. You can keep detailed version histories without drastically growing your storage footprint.

This makes UltiHash versioning not just a compliance or reproducibility feature, it’s also performance- and cost-aware by design.

Namespace Behavior

UltiHash treats each object as unique based on its full namespace that is, the combination of bucket name and object key.

bucket-1/data/file.csv
bucket-1/data-v2/file.csv


In this example, even if the content of both files is identical, they’re considered two separate objects with their own independent version histories because the namespaces are different.

Even if versioning is not enabled in this case, UltiHash’s deduplication engine will still detect and reduce storage for shared content, but versioning always operates per object key.

Common Use Cases

✅ ML Experiments

AI teams need to iterate on datasets and models to improve accuracy. Versioning keeps every dataset and model change traceable, so you can reproduce results, compare experiments, and roll back easily if new updates underperform.

✅ Data Pipelines

Frequent changes in ETL pipelines can introduce unexpected issues. With versioning, teams can track outputs and schema changes over time, pinpoint errors quickly, and restore stable states without rework.

✅ Analytics & Governance

When data or metrics definitions evolve, versioning helps maintain historical files and reports. This makes it easier to explain shifts, support audits, and ensure stakeholders understand what changed.

Try It Now

Versioning is available now in UltiHash v1.6.0, and part of the freemium plan. Get started by enabling versioning on a bucket, no changes to your client logic are required.

🔧 Setup guide

📥 Create account

For feedback, reach out to us directly at support@ultihash.io or drop your thoughts on ultihash.io/feedback.