
No dashboard, no project list. The moment you want to share is the only interaction, and then you close the tab.
One hour to thirty days, decided at upload. Metadata carries KV's native TTL, so the link dies on its own — no job to run, and no orphans left for you.
One Cloudflare Worker: small sites in KV, larger ones in R2, files served close to whoever opens them. 25 MB per upload, one HTML file or a ZIP.
Every site's metadata lives in KV with a matching expirationTtl. The moment it expires the link is dead — nothing has to run to make that true.
Under 1.5 MB and 20 files, the content is stored inline in KV and expires itself through native TTL. No cleanup, and no orphans.
Past the threshold the files go to R2 while metadata stays in KV. A daily cron sweeps objects whose metadata has already expired.
The familiar /s/<id>/ URL now opens a trusted shell while uploaded HTML stays in an opaque-origin sandbox. The shell brokers only that drop's browser-local keys — never another drop's data or the app's own storage.
The public URL and existing drops do not move. What changed is the storage bridge: localStorage is seeded synchronously inside the sandbox, then persisted under a per-drop namespace, so it survives closing and reopening the same link without weakening isolation. A still-open legacy tab is imported once; /privacy explains why data from an already-closed old tab cannot be recovered.
Service-wide capacity is capped at 1 GB — sites expire on their own, so it drains itself. Deliberately well under the free tier.
The whole product is this one card: pick a file, pick how long it lives, take the link. No projects, no settings, no account.