Skip to content

Build1 publisher2 min readPublished

Garage's compatibility page marks versioning, Object Lock and encryption Missing

Garage and RustFS are both single Rust binaries that speak S3 on one node. The documented differences are AGPL-3.0 against Apache 2.0, and four rows that Garage's own compatibility page marks as Missing.

The Engineer · Build desk

Illustration accompanying Garage's compatibility page marks versioning, Object Lock and encryption Missing

What happened

  • Garage and RustFS are both Rust-written, single-binary, S3-compatible object stores that you can run on a single node.
  • The dev.to comparison calls the license and the S3 feature set the decisive split: Garage is AGPL-3.0, RustFS is Apache 2.0.
  • RustFS's README Feature and Status table, re-checked on 2026-09-21, marks versioning, Object Lock, lifecycle, replication, IAM/policies, server-side encryption and distributed mode as available.
  • Garage implements lifecycle only for AbortIncompleteMultipartUpload and Expiration, and nothing that depends on versioning or storage classes.
  • Garage's documented single-node start is one command, garage server --single-node --default-bucket, which configures a cluster with no replication and creates a default access key and bucket from environment variables.

Compiled by The EngineerSomething wrong?How this is made

Why it matters

  • exposure Patch Garage and serve it over a network and the disclosure obligation lands on your fork, so a hosted product built on a modified build owes its source to the people it serves.
  • constraint An app that expects version history, WORM retention or bucket-level encryption has to be changed before Garage can serve it. In that case the client's S3 dialect picks the store.
  • capability Because RustFS lists Object Lock and versioning as available, a backup target can hold retention inside the bucket without the backup tool cooperating.
  • constraint Neither store offers a filesystem view: anything that wants a POSIX path or a FUSE mount needs a gateway in front of RustFS.

Garage's own S3 compatibility page marks bucket versioning as Missing [11], and Object Lock is Missing at every lock endpoint, legal hold and retention both [12]. Server-side encryption, PutBucketEncryption and its relatives, is Missing as well, and the project's stated position is that you encrypt at the partition or on the client instead [13]. Bucket replication through the S3 API is Missing [14], and ACLs and bucket policies are Missing because Garage has a permission model of its own, per access key and per bucket [15]. None of those rows are bugs; they are the project documenting that the feature is not implemented [25].

Counted against the RustFS README's available list, Garage matches two rows outright, S3 core and distributed operation, marks four as Missing, implements lifecycle in part, and substitutes its own permission model for IAM-style policies [23].

The license condition is narrow and specific. The Garage project states it plainly: "if you patch Garage and then use it to provide any service over a network, you must share your code" [8]. AGPL v3 is network copyleft, stronger than ordinary GPL, and the obligation attaches when you modify Garage and expose it as a service [9]. RustFS's README describes the project as "released under the permissible Apache 2.0 license", with no copyleft, so you can modify it and embed it in a closed-source product or a commercial service without disclosing source [10]. The dev.to write-up's view is that for a homelab or an internal-only deployment that never serves third parties, AGPL is usually a non-event [22].

The single-node path also costs Garage its design center. The quick start writes a garage.toml with metadata_dir, data_dir, replication_factor = 1 and ports 3900 through 3903 [18]. Garage's docs, meanwhile, describe a store that "replicates data 3x over distant servers" and is "not as latency sensitive" because it avoids consensus algorithms like Paxos or Raft [4].

The comparison does not include benchmarks; the dev.to write-up says "We cite the docs, not benchmarks" [20]. A feature table transfers to your deployment only when its rows match the calls your client actually emits. The check is which verbs your SDK or backup agent sends, and the write-up recommends testing first if the client assumes versioning, WORM immutability, SSE or IAM policies [24]. Two RustFS rows are still preview, MinIO on-disk compatibility and S3 Tables (Iceberg REST) [6], and RustFS has no POSIX layer and no FUSE mount [7]. The write-up's own rule is Garage for a tiny geo-distributed store on secondhand hardware when AGPL is fine. RustFS when the app needs versioning, immutability, IAM and a MinIO-compatible dialect on the smallest operational surface [21].

What to watch

  • A Garage release that flips bucket versioning from Missing, since Object Lock and version-aware lifecycle sit behind it.
  • Any relicensing or commercial exception from Deuxfleurs, which is the one thing that would clear AGPL for a modified hosted build.
  • A published single-node benchmark running both binaries on identical hardware.
Loading claim ledger
Loading source directory links
Loading share composer
Loading topic controls
Loading related stories