Private by default
Browser recordings can contain sensitive UI state. Unsurf treats that as the default, not an edge case.
Default behavior
Section titled “Default behavior”New traces return a signed viewerUrl. Bare /r/<id> URLs 404 for current uploads.
bare trace URL → 404viewer URL + grant → 200Record privately
Section titled “Record privately”import { recordAttachedLocal } from "unsurf/skills/record";
const result = await recordAttachedLocal({ connect: 9222, task: "authenticated browser proof", run: async (browser) => { await browser.wait(2000); },});
console.log(result.viewerUrl);The viewer grant authorizes the trace page and related metadata for a limited window.
Long-lived shareable demos
Section titled “Long-lived shareable demos”unsurf record ./demo.ts --publicunsurf loop ./goal.json --north-star "done?" --publicpublic still means grant-gated; it simply gets a longer-lived share link.
Revoke access
Section titled “Revoke access”unsurf trace-revoke <id>Revocation bumps the grant generation and invalidates previous links.
Why this matters
Section titled “Why this matters”Unsurf is built around proof artifacts. Proof should be easy to share intentionally and hard to leak accidentally.