
SeaweedFS
A distributed blob store with an S3 gateway and a file system layer, built to store and serve billions of small files.
- What it is
- Object storage,File storage
- Type
- Open source
- Made by
- Chris Lu and contributors; a paid Enterprise edition is sold at seaweedfs.com
- License
- Apache 2.0
- Facts checked
- 5 October 2026
What it is
SeaweedFS splits storage into three roles. Volume servers pack many files into large append-only volume files and keep a 16-byte index entry per file in memory, so reading any file, small or large, takes one disk seek. Master servers (one, or three in a Raft group) track volumes, not files: clients ask a master which server holds a volume, cache the answer and then talk to volume servers directly. Copies are made per volume with a three-digit setting for data centre, rack and server, so 001 means one extra copy on another server and 010 one on another rack. Volumes that have gone warm can later be converted to Reed-Solomon 10+4 erasure coding in the background.
On top sits the filer, which adds directories and file names and keeps that metadata in a database you choose: embedded LevelDB by default, or PostgreSQL, MySQL, Redis, Cassandra, TiKV and many others. The S3 gateway, WebDAV, SFTP, a FUSE mount and a Kubernetes CSI driver all go through the filer, so the same data is reachable as S3 objects and as files. The S3 gateway covers versioning, Object Lock, lifecycle rules, bucket policies, IAM users and STS, and S3 Tables with a built-in Iceberg REST catalog. Everything ships in one weed binary, and weed mini runs all the roles in one process for a single node.
Why teams pick it
- Fast with huge numbers of small files: one disk read per file and about 40 bytes of on-disk metadata each, where MinIO also writes a metadata file on every drive of the erasure set
- Broad S3 support: versioning, Object Lock, lifecycle, bucket policies, IAM groups, STS with OIDC or LDAP, and SSE-S3, SSE-KMS and SSE-C
- The same data as objects and as files, over S3, FUSE, WebDAV, SFTP, HDFS and a Kubernetes CSI driver
- Grows by adding volume servers with no data reshuffle, and the filer and S3 gateways are stateless, so you run as many as you need
- Apache 2.0, developed since 2011, with releases every week or two (4.48 in September 2026)
Watch out for
- No S3 bucket notification or bucket replication APIs and no S3 Select; cross-cluster replication and change events use SeaweedFS’s own replication and metadata feeds instead
- More moving parts than MinIO: masters, volume servers, filers, a metadata database and S3 gateways, each with its own flags and failure modes
- Missing replicas are not repaired automatically in normal operation: you run
volume.fix.replication, balancing and vacuum fromweed shellor the maintenance worker - Some data-safety features are Enterprise-only: self-healing storage, data recovery, point-in-time recovery and custom erasure coding ratios (open source is fixed at 10+4)
- Heavily dependent on its founder: Chris Lu has written about two thirds of all commits
Alternatives
What all object storage have in common →
Amazon S3AWSAWS’s object storage, and the de facto API most object stores copy.Apache OpenDALOpen sourceA Rust library, with bindings for Python, Java, Node.js, Go and more, that gives one API (read, write, stat, list, delete) over 50-plus storage backends: S3 and other object stores, local and HDFS file systems, Google Drive and Dropbox, and key-value stores.
Apache OzoneOpen sourceA Hadoop-born object store that serves the same buckets over S3 and as a Hadoop file system.
TigrisCommercialGlobally distributed S3-compatible object storage that moves data to where it’s read, with no egress fees.
Versity S3 GatewayOpen sourceA stateless S3 server that exposes an existing file system, or another object store, through the S3 API.How it fits with other technologies
Start an all-in-one node in Docker, use it with the aws CLI, then lay out a real cluster · bash
# master, volume server, filer and S3 (port 8333) in one process
docker run -d --name seaweed -p 8333:8333 -v weed-data:/data \
-e AWS_ACCESS_KEY_ID=admin -e AWS_SECRET_ACCESS_KEY=change-me \
-e S3_BUCKET=backups chrislusf/seaweedfs:4.48
export AWS_ACCESS_KEY_ID=admin AWS_SECRET_ACCESS_KEY=change-me
aws s3 cp --recursive ./exports/ s3://backups/2026-10-05/ --endpoint-url http://localhost:8333
aws s3 ls s3://backups/2026-10-05/ --endpoint-url http://localhost:8333
# a cluster: three masters, volume servers per rack, filer with the S3 gateway
weed master -mdir=/data/seaweedfs/master -peers=ip1:9333,ip2:9333,ip3:9333 -ip=ip1
weed volume -master=ip1:9333,ip2:9333,ip3:9333 -dataCenter=dc1 -rack=rack1 \
-dir=/data/seaweedfs/volume -max=0
weed filer -master=ip1:9333,ip2:9333,ip3:9333 -s3 -s3.port=8333S3 API: SeaweedFS vs MinIO#
Taken from SeaweedFS’s own comparison page. It says it was generated by scanning the source code with AI and is kept as a to-do list, so test the calls you rely on.
| Feature | SeaweedFS | MinIO |
|---|---|---|
| Versioning | Yes | Yes |
| Object Lock (retention, legal hold) | Yes | Yes |
| Lifecycle rules | Yes | Yes |
| Bucket policies | Yes | Yes |
| ACLs | Yes | Accepted but not enforced |
| Bucket notifications | No | Yes |
| Bucket replication | No | Yes |
| S3 Select | No | Yes |
| S3 Tables (Iceberg) | Yes | No |
| User and group admin | AWS IAM API | MinIO’s own admin API |
Moving from MinIO#
Copy data over the S3 API: rclone has a SeaweedFS provider setting, so rclone sync minio:bucket seaweed:bucket works, or use mc mirror if you still have the MinIO client. Run the sync again just before cutover, then switch endpoints. Users and policies have to be recreated; SeaweedFS manages them through AWS-style IAM calls rather than mc admin.
Plan around the gaps. Apps that react to MinIO bucket notifications need to subscribe to the filer’s metadata change events or webhooks instead, and MinIO bucket replication becomes SeaweedFS’s cluster-to-cluster replication. Unlike MinIO, SeaweedFS replicates new data first and erasure-codes it later, so size disks for the replication setting you choose.
See it in a real stack
No architecture uses SeaweedFS yet. Drop it into the playground and wire it up yourself.Open playground →Where it came from2010–2025
In 2010 Facebook described Haystack, the system it built to store billions of photos. Ordinary file systems spent extra disk reads per photo on directory and inode metadata, so Haystack packed many photos into large files and kept a small index in memory, making each photo one disk read. In November 2011 Chris Lu started Weed-FS on Google Code, an open-source blob store in Go built on the same idea.
The project moved to GitHub, and in April 2015, after a user asked what it was actually called, Lu suggested “SeaweedFS”, keeping weed as the binary’s name. Over the following decade he added the filer with pluggable metadata stores, the S3 gateway, FUSE mounts, erasure coding for warm data inspired by Facebook’s later f4 paper, and cloud tiering.
Lu still writes most of the code, about two thirds of all commits, and funds the work through sponsors and a paid Enterprise edition. Versions 1.0, 3.0 and 4.0 came in 2018, 2022 and 2025, and the project now presents itself as one system for S3 objects, files and Iceberg tables.
Why it’s built this way
- Pack small files into big volume files
- Haystack showed that per-file metadata, not the data, was the bottleneck for photo serving. Appending files to large volumes with a tiny in-memory index turns every read into one disk seek.
- The master tracks volumes, not files
- A cluster with billions of files has only thousands of volumes, so one master, or a Raft group of three, stays small and stays out of the read path.
- Replicate hot data, erasure-code warm data
- Writing whole copies is fast. Sealing older volumes and converting them to 10+4 erasure coding later saves disk without making every write pay the encoding cost.
- Keep directory metadata in an existing database
- Instead of writing its own metadata server, the filer stores names and directories in databases operators already run, from LevelDB to PostgreSQL, Redis and Cassandra.
Timeline
- 2010
Facebook presents the Haystack photo store at OSDI
- 2011
Chris Lu starts Weed-FS on Google Code (November)
- 2015
Project renamed SeaweedFS (April)
- 2018
Version 1.0 released (November)
- 2022
Version 3.0 released (April)
- 2025
Version 4.0 released (November)
- USENIX OSDI ’10: Finding a Needle in Haystack: Facebook’s Photo Storage
- seaweedfs/seaweedfs: commit sharing weed-fs on Google Code (November 2011)
- seaweedfs/seaweedfs issue #94: What is the name of this project?
- seaweedfs/seaweedfs pull request #118: rename links to seaweedfs
- f4: Facebook’s Warm BLOB Storage System (OSDI ’14)
- seaweedfs/seaweedfs contributors
- SeaweedFS release 1.00
- SeaweedFS release 3.00
- SeaweedFS release 4.00
Sources12 · facts checked 5 October 2026
- SeaweedFS Enterprise
- seaweedfs/seaweedfs on GitHub (README)
- SeaweedFS release 4.48
- SeaweedFS wiki: Supported APIs vs MinIO
- SeaweedFS wiki: Replication
- SeaweedFS wiki: Erasure coding for warm storage
- SeaweedFS wiki: Filer stores
- SeaweedFS wiki: Quick start with weed mini
- SeaweedFS wiki: Production setup
- seaweedfs/seaweedfs contributors
- rclone docs: Amazon S3 and compatible providers
- rclone docs: rclone sync