Static preview
Self-hosted doesn't mean unpreviewable.
A fully static build, uploaded to plain Apache or cPanel, still lets an editor see a draft before it's published. Sanity's own webhook infrastructure does the notifying; a small relay does the fetching. Nothing runs that you have to keep alive.
Stated plainly
A working link is the credential.
A static site's browser bundle can't hold a secret that isn't also public, so a per-link token minted there would buy nothing real — the read token stays on the server, the relay, only. This is disclosed, not hidden, and it's why the two layers below exist for teams who want more.
Not a login check — possession of the preview link is what grants access, by design.
Two optional layers
Add friction where you actually need it
Gates the draft content itself — the LOCKED screen in the screenshot above. Its own on-brand prompt, not a browser dialog, since those get blocked inside the Studio's embedded preview pane.
A one-time setup on the host locks the preview page shell too, for teams who want the whole thing behind a login.
WHAT AN EDITOR SEES, LIVE ON THE STATIC BUILD
- LOCKEDLOCKEDLOCKEDAccess code requiredContinue →
- EMPTYEMPTYEMPTYNo cached draftOpen Studio ↗
What it costs you
A handful of webhooks. Nothing to operate.
Deploying to Vercel or Netlify instead? Sanity's presentation visual editing feature is what you need
Stop customizing templates.
Start shipping brands.
Everything above just ran live on this page. Now picture it running yours.