tapped = false, 1500); navigator.clipboard?.writeText(location.href.split('#')[0] + '#the-url-is-the-api')" >The URL is the API
Everything is in the path: size, pixel density up to 4x, JPEG quality, and media emulation for dark mode, contrast, print and reduced motion, so a page can be captured exactly as a reader with those settings would see it. Options it doesn't know are refused rather than ignored.
tapped = false, 1500); navigator.clipboard?.writeText(location.href.split('#')[0] + '#video-recorded-in-the-browser')" >Video, recorded in the browser
It records MP4, animated WebP and GIF too, from 240p to 4K, with a duration, frame rate and a choreographed scroll through the page. The encoders run inside the page being recorded, with their own color conversion, and the page's clock is replaced with one the Worker can freeze and step a frame at a time, so animations come out smooth however long each frame takes to render.
tapped = false, 1500); navigator.clipboard?.writeText(location.href.split('#')[0] + '#fast-and-cheap-to-run')" >Fast, and cheap to run
One browser session is kept warm in a Durable Object, and identical requests that arrive together share a single render
Renders are stored in R2 and served stale while they refresh, weekly, with ETags and a purge endpoint
Failures are remembered briefly, so a broken page can't run up a bill
Pages behind Cloudflare Access can be captured with a service token
Tests on Vitest, CI on GitHub Actions, and a one-click deploy button