Sanity-compatible · self-installing · yours

A CMS you own outright, deployed with one button

New Orange CMS is a content platform that runs entirely inside your own Vercel project and your own Supabase database. It speaks the Sanity API, so @sanity/client, next-sanity and a full Sanity Studio connect to it unmodified — and this site is one of its deployments, seeded and served by the thing it describes.

Read the documentationOpen this deployment’s Studio

A wide diagonal gradient from orange to slate.

Built on

Ordinary infrastructure, arranged carefully

Nothing here is bespoke where something standard would do. Every piece below is something you can read, replace or take with you.

What it supports

Status is a closed vocabulary in the schema, so a partial implementation cannot be quietly presented as finished. The compatibility page has the same claims per surface, including what is out of scope.

FeatureStatusNotes
@sanity/client and next-sanity, unmodifiedsupportedQueries, mutations, actions, listeners, uploads and the calls the Studio makes on boot, against any well-formed pinned API version.
GROQ: projections, joins, functions, slices, nested queriessupportedEvaluated by groq-js over a candidate set the planner narrows. Narrowing decides speed, never the answer.
Perspectives: published, drafts, previewDrafts, rawsupportedIncluding the draft-over-published overlay’s _id and _originalId rules.
Drafts, publishing and document actionssupportedcreate, edit, publish, discard, delete and unpublish, each applied as one Postgres transaction.
Mutations, patches and optimistic concurrencysupportedThe whole patch set including diffMatchPatch, with ifRevisionID compared against the stored revision.
Reference integrity and unique published slugssupportedEnforced by the platform on write and on publish, not only by Studio validation.
History: revisions, events and the transaction logsupportedDeletions included, which a history derived from current documents cannot report.
Real-time listensupportedA genuine server-sent-event stream over Supabase Realtime, with keepalives and a polling fallback.
Assets: uploads, content-addressed ids, browser-direct uploadsupportedBytes in Blob, metadata in Postgres, URLs derived from the request origin at read time.
Identity: sessions, four roles, row-level securitysupportedNew accounts arrive with a role that grants nothing at all until an administrator elevates them.
Image transform parameterspartialw, h, fit, q, fm, auto=format and dpr are served. Hotspot rectangles, blur, sharpen, rect, palette and LQIP are not.
Full-text searchpartialtext::match pushes down to a Postgres tsquery. The result set matches; the ranking is Postgres’ rather than Sanity’s.
Presence, comments and taskspartialStored, served and surfaced in the Studio; not yet at parity with the hosted product.
Sanity’s hosted services — Content Lake, scheduling, releases, CanvasunsupportedOut of scope by design: this platform replaces the backend rather than proxying one.

Every row above is a document in this deployment, and every feature has a page of its own under /features.

Read the documentation

Ten sections, forty-two pages — all of it content in this deployment’s own database, written in the Studio and rendered by the same pipeline as everything else on this site.

Deploy one, then take it apart

One button provisions the database and the storage, and the first build migrates the schema, creates an administrator and seeds a working dataset. The repository is public, and so is the reasoning behind it.

Deploy in one clickBrowse the featuresTry a query