Backends
Backends
The capability matrix and a page per store.
Each backend implements one vfs.FileSystem interface and advertises exactly
what it can do via Caps. Operations a backend can't
perform correctly return ErrNotSupported — never a silent no-op.
| Backend | Address | Read | Write | Dirs | Notes |
|---|---|---|---|---|---|
| mem | mem://vol/path | ✅ | ✅ | real | in-memory reference impl; ephemeral per process |
| local | ./p, file://, local://alias/p | ✅ | ✅ | real | aliases are sandboxed to a base dir (symlink-contained) |
| s3 | <remote>://bucket/key | ✅ | ✅ | synth | AWS S3, R2, MinIO, GCS-interop; multipart + ranged GET |
| bunnystorage | <remote>://path | ✅ | ✅ | synth | Bunny Edge Storage over HTTP — live-verified |
| bunnystream | <remote>://coll/title | ~ | ✅ | real | Bunny Stream video API; lossy projection |
| http(s) | https://host/path | ✅ | — | — | read-only source; ranged ReadAt when supported |
| zip | zip://a.zip/inner | ✅ | — | synth | read-only view inside a local ZIP |
| tar | tar://a/inner | ✅ | — | synth | read-only; .tar, .tar.gz, .tgz |
"synth" = directories synthesized from key prefixes (object-store style).
gdrive and a webdav:// backend are planned.
Reading the matrix
- Read / Write — whether the backend supports reading and writing object
contents.
~means a lossy or best-effort projection (see bunnystream). - Dirs —
realdirectories exist as first-class entries;synthmeans directories are synthesized from common key prefixes, as object stores do.
Emulation makes object stores feel like filesystems
Object stores replace whole objects — they have no native random write, append,
or in-place truncate. Wrapping one with the
emulate.RMW decorator (emulate: true in config) adds
those via read-modify-write: stage the object locally, apply the writes,
re-upload on close. It's correct but non-atomic and O(filesize), so it's
opt-in and clearly labelled.