Update post

Cover storage now uses durable object storage

New stored covers can now live in Cloudflare R2 instead of depending on Vercel filesystem uploads or fragile remote hotlinks.

InfrastructureLive2026-05-18 20:30 UTC

Post links

Keep browsing

Move between the update feed, upcoming work, and the editor from the same reading surface.

What changed

A concise summary of the work delivered in this release.

  • Added Cloudflare R2 support for normalized cover uploads.
  • Added app-side R2 safety caps for total stored bytes, daily upload bytes, and daily upload count.
  • Added R2 media storage metadata so covers can be distinguished from local files, database-backed media, and remote URLs.
  • Updated catalog contribution logic to prefer durable stored covers over original hotlink URLs when a cover is stored in R2 or the database.

User value

How this release improves the experience, workflow, or control users get from LoreKeep.

  • New covers should stay visible in production instead of disappearing when Vercel local upload paths are unavailable.
  • Stored covers are compressed before upload, keeping media usage small for early testing.
  • If R2 is not configured or safety caps are reached, LoreKeep falls back instead of blocking entry saves.

Full notes

Additional context, implementation notes, or rollout details for this release.

LoreKeep cover storage now has a production-ready object-storage path. When R2 is configured, saved and recovered covers are normalized, compressed, uploaded to the media bucket, and served from the dedicated media domain. Local development still uses local uploads where possible, and database-backed cover bytes remain as a safety fallback so saves do not fail if object storage is unavailable.

Release status

Current state

A quick snapshot of how this update is categorized and published.

Category

Infrastructure

Status

Live

Published

2026-05-18 20:30 UTC