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.

Publish to any shared hosting platform with Apache, PHP or cPanel

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

An access code, in-page

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.

Server-level password protection

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

nuxion.io/preview/page?id=8f2c1a…
PREVIEW
DraftsPublished
synced 1s ago
  • LOCKEDLOCKEDLOCKED
    Access code requiredContinue →
  • EMPTYEMPTYEMPTY
    No cached draftOpen Studio ↗

What it costs you

A handful of webhooks. Nothing to operate.

Static - Self-hosted - Shared hosting
You need
Any host that runs PHP - Most shared hosting/ Cloud panels do
Three webhooks, set up once
One shared secret
You don't
A Node process to keep running
A database or a cron job
Any SDK or client-side token

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.