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.