<feed xmlns='http://www.w3.org/2005/Atom'>
<title>mobius/docs/r2-file-store.md, branch main</title>
<subtitle>Friendship Quest remix of mobius, a hotline server in go #cli</subtitle>
<id>https://git.r.bdr.sh/mobius/atom/docs/r2-file-store.md?h=main</id>
<link rel='self' href='https://git.r.bdr.sh/mobius/atom/docs/r2-file-store.md?h=main'/>
<link rel='alternate' type='text/html' href='https://git.r.bdr.sh/mobius/'/>
<updated>2026-07-08T22:01:05Z</updated>
<entry>
<title>Add Cloudflare R2 file library storage backend</title>
<updated>2026-07-08T22:01:05Z</updated>
<author>
<name>Jeff Halter</name>
<email>868228+jhalter@users.noreply.github.com</email>
</author>
<published>2026-07-08T22:01:05Z</published>
<link rel='alternate' type='text/html' href='https://git.r.bdr.sh/mobius/commit/?id=4bd4c14daff4cb8807a91305239cae1e8544f276'/>
<id>urn:sha1:4bd4c14daff4cb8807a91305239cae1e8544f276</id>
<content type='text'>
Implement R2FileStore, a FileStore backed by Cloudflare R2 via its
S3-compatible API, selectable with --file-store r2 and configured through
R2_* environment variables.

The store follows the MemFileStore model: a flat keyspace where directories
are derived from key prefixes, with zero-byte marker objects so empty folders
persist, and errors.ErrUnsupported for symlink/alias operations. Because R2
has no append, in-progress .incomplete uploads are routed to a local staging
directory (real O_APPEND and size-based resume) and promoted to a finished R2
object on the terminal upload-commit Rename; all other paths live in R2.

A narrow s3API seam plus an s3Uploader interface make the backend unit-testable
against an in-memory fake without a network. Adds a user setup guide at
docs/r2-file-store.md.
</content>
</entry>
</feed>
