The catalogue
Every feature, with a status you can hold us to
Each entry below is a document in this deployment. “Partial” means implemented and usable but not yet at parity; “planned” means it is not there. Nothing is marked shipped to make a page look fuller.
All features, by area
This section stores nothing but the word “all”. The list is a GROQ query over the feature documents, grouped by the area each one declares.
Authoring
The Content Studio
A full Sanity Studio v6, forked and rebranded, served from /admin of your own deployment. Real field validation, real Portable Text editing, real reference inputs.
shippedPage builder (page components)
Compose a page from the sections your design system actually has. Fourteen section types ship with the demo schema, and adding one is a schema change plus a component.
shippedPortable Text
Rich text as structured data: blocks, styles, lists, decorators, annotations, and embedded objects such as images, code blocks, tables and callouts.
shippedDrafts and publishing
A draft is a separate row, not a status flag. Publishing replaces the published document and deletes the draft in one transaction; discarding leaves the published version untouched.
shippedRevision history and timeline
Every transaction is recorded. Fetch a document as it was at a revision or at a timestamp, list one event per transaction, or stream the raw transaction log — deletions included.
shippedCustom desk structure
Singletons pinned to a fixed id, grouped lists, filtered panes and custom orderings — the real Sanity structure builder, not a fixed sidebar.
shippedInitial-value templates
Give "create new" a head start: a page pre-composed with the three sections most landing pages need, or an article pre-filed in the category it belongs to.
shippedMedia browser
Browse, search and reuse uploaded images and files from inside the Studio, with thumbnails served through the transform route rather than as full-size originals.
shippedContent API
A Sanity-compatible HTTP API
@sanity/client, next-sanity and the Studio connect unmodified. Same routes, same request shapes, same response envelopes, served from /api of your own deployment.
shippedMutations in one transaction
create, createIfNotExists, createOrReplace, patch (set, setIfMissing, unset, inc, dec, insert, diffMatchPatch) and delete — the whole set, applied atomically in Postgres.
shippedDocument actions
The transactional action form the Studio uses: document.create, edit, publish, discard, delete and unpublish, each expanding to a mutation set the store applies as one unit.
shippedOptimistic concurrency
ifRevisionID and ifPublishedRevisionId are compared against the stored revision, so two editors racing on one document get a conflict rather than a silent overwrite.
shippedReference and slug integrity
Strong references must resolve and published slugs must be unique — enforced by the platform on write and on publish, not only by Studio validation.
shippedQuerying
GROQ, in full
Queries are parsed with groq-js, narrowed to a candidate set by a SQL planner, then evaluated completely — so no query can silently fail because a compiler did not understand it.
shippedPerspectives
published, drafts (and its previewDrafts alias) and raw, with the draft-over-published overlay implemented the way Sanity specifies it — including the _originalId rules that are easy to get wrong.
shippedFull-text search
Each document carries a generated tsvector of its extracted plain text, Portable Text included, and text::match pushes down to a Postgres tsquery. Ranking is not yet Sanity-identical.
partialSync tags on every read
Every query response carries the sync tags its result depends on, which is what lets a frontend cache aggressively and purge exactly the entries a write invalidated.
shippedAssets
Assets on Vercel Blob
Bytes in Blob, metadata in Postgres, delivery through this deployment’s own routes — so asset URLs stay stable and independent of the storage behind them.
shippedContent-addressed uploads
An asset id is derived from a hash of its bytes, so uploading the same file twice stores it once and the second upload is a metadata write.
shippedImage transforms
w, h, fit, q, fm/auto=format and dpr are served through Vercel Image Optimization. Hotspot rectangles, blur, sharpen, flip, rect, palette extraction and LQIP are not supported — and are documented rather than silently mishandled.
partialBrowser-direct uploads
Files above the ~4.5 MB serverless request limit are uploaded straight from the browser to Blob with a short-lived token, then committed as metadata.
shippedIdentity & access
Authentication on Supabase Auth
Email and password sign-in against your own Supabase project, with the session carried in an HTTP-only cookie and the Studio using a custom auth provider rather than a hosted login.
shippedFour roles, one source of truth
administrator, editor, viewer and pending. The permission table is transcribed once in code; the API checks, the database policies and the Studio’s grants payload are all projections of it.
shippedRow-level security
Requests do not connect as the service role. Each transaction sets the acting identity, so Postgres policies apply — a bug in the API cannot become data loss.
shippedNew accounts arrive with no access
The default role grants nothing at all, so a user who arrives by a route the application never sees — the Supabase dashboard, the admin API — cannot read drafts until somebody elevates them.
shippedCollaboration
Real-time listen
A real server-sent-event stream backed by Supabase Realtime, with keepalives and reconnection inside the platform’s function time limit, and a polling fallback when a stream cannot be held.
shippedPresence
Who else has this document open, and where their cursor is. Backed by Supabase Realtime presence in place of the Studio’s hosted transport.
partialComments
Threads and replies attached to a document or to a specific field path, with mentions drawn from the user directory.
partialTasks
Assignable tasks with due dates and subscribers, targeted at documents, so editorial work has somewhere to live next to the content.
partialFrontend
A Next.js adapter
Route-handler factories, the Studio mount, cached GROQ reads, image and Portable Text primitives — the whole frontend surface, in the one package allowed to import Next.
shippedISR with exact invalidation
Reads are cached with the sync tags they depend on as cache tags, so publishing a document purges the pages that read it instead of the whole site.
shippedPortable Text rendering
Server-rendered with @portabletext/react, with your own schema types passed in as components — and an href allow-list, because Studio validation does not gate the API.
shippedDraft preview
A preview route puts the frontend into draft mode and switches the reads to the drafts perspective, so an editor sees unpublished work on the real site rather than in an approximation of it.
shippedOperations
One-click deployment
One button provisions a Vercel project, a Supabase database and a Blob store, then the first build migrates the schema, creates an administrator and seeds a working demo dataset.
shippedA self-installing build
Every build runs migrations under an advisory lock, ensures the administrator exists, seeds demo content only into an empty dataset, and asserts the sign-up posture — idempotently.
shippedOrdered, idempotent migrations
Plain SQL files applied in order under a Postgres advisory lock, so two builds racing on one database cannot interleave.
shippedDeployment diagnostics
A degraded deployment says so: the environment contract reports every missing variable at once, naming where each one comes from, instead of failing at the first one.
shippedCommand-line interface
init and login, for parity with the workflow a Sanity developer already has in their fingers.
partialSomething missing?
The repository is public and the backlog is in it. A feature that is not listed here is not hiding — it is not built.
