In late 2025 the company behind MinIO abandoned it — which broke local S3 emulation in a lot of demos, plus the build pipelines that used it to validate S3 compatibility. Robin Moffatt wanted the simplest replacement, so he defined the criteria before touching a single candidate and then wired each one into a working stack.

The test is a Docker Compose setup with DuckDB and an Iceberg REST Catalog, where a three-row insert has to land as Parquet and Avro in the bucket. The criteria:

  • Must ship a Docker image — demos are Compose files and nobody wants to brew their own
  • Must be S3-compatible, which is the entire point
  • Must be free, with a strong preference for OSI-approved open source
  • Should be simple to run single-node, with an active community or commercial backer
  • Bonus for developer experience

Explicitly out of scope: multi-node, distributed storage, production support costs, GUIs.

The verdicts are blunt. SeaweedFS and S3Proxy get a yes; RustFS is a maybe on account of being alpha with a recent serious security advisory; Garage is a no because its config is more than his use case needs; Apache Ozone gets “lol.” Several projects are perfectly good — just not aimed at simple single-node local S3.

Two things worth carrying out of the post beyond the tool list:

  • Governance. Only Ozone is foundation-owned. Every other option could change licence at the drop of a hat, exactly as MinIO did.
  • Bus factor. Some of these have long healthy histories from a single contributor. If they walked away, would anyone fork and keep going? Docker pull counts are a signal, but one busy CI pipeline using the image can distort the number.

This is the shape a decision record should take: bounded scope, stated criteria, a reproducible test, per-candidate verdicts, and an honest note on the caveats. The reason the post exists at all is the failure mode it is reacting to — an open source dependency whose vendor simply left, with no technical degradation involved.