Object storage services
Object storage services
The family runs a two-way split locked on 2026-06-20:
- GitHub Releases — versioned binaries.
Anything whose identity is
(repo, tag, asset-name): extension bundles, VS Code VSIX, CLI binaries. - Backblaze B2 — unversioned blobs. Backups, raw photo / video originals, asset archives.
Cloudflare R2 was rejected because its
adjacent paid features pull in a card-on-file requirement on the
same account, in violation of
rules/no-card-on-file.md. The
split decision is documented in
decisions/architecture/object-storage-split.md.
| Service | Status | Role | Used for |
|---|---|---|---|
| github-releases.md | active | storage-binary | Extension binaries, VSIX, CLI bins |
| backblaze-b2.md | active | storage-blob | Backups, raw originals, archives |
| restic.md | active | backup-tool | Encrypted, deduplicated weekly backups (target = B2) |
| cloudflare-r2.md | rejected | — | (adjacent card requirement) |
Why split rather than one bucket
Versioned binaries already have an excellent home (Releases) — git tags double as release identifiers, the URL is immutable, the CDN is free. Unversioned blobs don't fit that model — B2 fills the gap. Trying to put everything in one bucket either bloats Releases past the 2 GB/asset cap or loses the version-as-URL property B2 doesn't give you for free.