Storage backends
Local disk in dev, S3-compatible in prod.
The Storage trait abstracts the filesystem: LocalStorage, InMemoryStorage (tests), and S3Storage (hand-rolled SigV4 — AWS S3 / Cloudflare R2 / Backblaze B2 / MinIO, no aws-sdk dependency). Swap the backend without touching call sites.
let key = storage.put("avatars/42.png", bytes, "image/png").await?;
let url = storage.public_url(&key);