
Sanity as a headless CMS
One content, many heads
A classic CMS is one block: the editor, the database, and a built-in “head” that produces the web pages.
Headless doesn’t mean no head: it means removing the built-in one so you can choose your own. Website, app, screens, voice, feeds all read the same content over an API.
The condition: structured content with no layout baked in. Then a new channel is a new head, not a rewrite.
Every head below shows the latest published news item: “Sanity evaluation results presented at the CodeLand Plenary”.
Edit it in the Studio and publish: every head updates within seconds, without a reload. Open in the Studio
Content, not pages
Sanity doesn’t store HTML pages: it stores structured documents (title, excerpt, rich text as data, an image with a focal point, references). No colours, columns or templates inside the content.
That is why every frontend decides on its own how to show it, in any technology: React, plain HTML, Python, an app, a screen, a voice. Head 8 shows exactly the data they all receive.
Real, separate frontends
Four different technologies, no shared code, the same content in real time:
Next.js (React)
This website, with Visual Editing.
- Plain HTML and JavaScript
One file, no framework or SDK: GROQ over HTTP and live updates from Sanity’s Listen API.
Python
Demo/heads/voice_briefing.py: reads the news aloud.
Node.js
Demo/heads/terminal.mjs: the news in a terminal.
The heads
1. Website
Next.js, this site

2. Phone app
Preview: a native app would call the same query
CodeLand

Sanity evaluation results presented at the CodeLand Plenary
The full results of CodeLand’s Sanity evaluation, including the AEM concept map and the recommendation, are published after the Plenary.
3. Smartwatch
Preview: title only, because the content is structured
Press
Sanity evaluation results presented at the CodeLand Plenary
4. Office or airport screen
Preview; the real one is full screen and live
CodeLand · News
Sanity evaluation results presented at the CodeLand Plenary
5. Voice assistant
Plain text from pt::text(), read aloud
Speech synthesis is not available in this browser.
“Sanity evaluation results presented at the CodeLand Plenary. The full results of CodeLand’s Sanity evaluation, including the AEM concept map and the recommendation, are published after the Plenary.”
6. RSS feed
XML for feed readers and podcasts
<item> <title>Sanity evaluation results presented at the CodeLand Plenary</title> <pubDate>Thu, 01 Oct 2026 07:00:00 GMT</pubDate> </item>/feed.xml?lang=en
7. Any language
HTTP and GROQ, no SDK: Python, terminal, Ruby…
curl "https://8augwmcx.apicdn.sanity.io/v2025-02-19/data/query/production?query=*%5B_type%20%3D%3D%20%22article%22%20%26%26%20language%20%3D%3D%20%22en%22%5D%20%7C%20order(publishedAt%20desc)%5B0%5D%7Btitle%2C%20excerpt%7D"
In the repository: Demo/heads/voice_briefing.py (Python, reads the headlines aloud) and Demo/heads/terminal.mjs (Node).
8. The raw data (JSON)
What every head receives from the API
{
"_id": "5h6FyZinaruU6QbliPNVif",
"author": "Marco Bianchi",
"coverImage": {
"_type": "accessibleImage",
"alt": "GROQ in five minutes for AEM developers",
"asset": {
"_id": "image-c33647637e4be2368ef7a672885a86ed78902d93-1600x900-png",
"metadata": {
"dimensions": {
"_type": "sanity.imageDimensions",
"aspectRatio": 1.7777777777777777,
"height": 900,
"width": 1600
},
"lqip": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsSAAALEgHS3X78AAACEElEQVQokS3Ra2vUQBQG4PysYiYzZy6ZmUwm1ya7bZPuZtMmrVvdal2FtqJoixdECiKUUhBR8Iv+SJnV4TDMh/eZD+f1EPIDHHApVWwp5yhACPmEEKBAKACjQCmXUkZGaEUF5yI0WWGyggruuSiQUEfSGALg/goQAMB/CZQxobUyNq0n5d5+Ula2qLRNCIDDlDMZW6F1gAPf4YAAECCEAgZCuRBKx1kxrC/Orj83w9KWlVAu7GGCTZqWO3tpuS2VYpxxIbgQoQylVqGS2sQmSafz/vLm7tWX+4PjsSgtFxwh3+OhaObdyZOzo+VJt1i0+23TtpPptGmbRd/Pu27W9f0wPn99/en775fvP5wOSVMSxrCPfE9F0Wxx8Gh1+nC5HI/GcRyHcdyfz+dddzgMh8N4MIyPz559vP128/PPxcXqxSLYTR9g7PbqqdgWVV1WVZ5nWZ7lRZGXRZxYbaLIGJtlSV7Mj5Zvb39cfb0/X02ftluJ8pE7vhclmTIx44wQDACMM8YZMLbpiQmlVGz71frN3a/L66vzUY71lmBoozeYSxngACEfY+eJ64kSACbCUEdRkvar9frdzerJ8ekMJtZ3nTi+wUwIjDEmGBilnFHGKOeU81BHysTa2qzeqWeLvXZnt460BIyDYDNeul1rY4XSLhpbba22iXJ3assq2a7jvIwS966aWTaZKhMLpf/NXwGlzPv7TYDWAAAAAElFTkSuQmCC"
},
"url": "https://cdn.sanity.io/images/8augwmcx/production/c33647637e4be2368ef7a672885a86ed78902d93-1600x900.png"
}
},
"excerpt": "The full results of CodeLand’s Sanity evaluation, including the AEM concept map and the recommendation, are published after the Plenary.",
"kind": "pressRelease",
"plainText": "MILAN — Embargoed until 1 October 2026, 09:00 CEST.…",
"publishedAt": "2026-10-01T07:00:00Z",
"slug": "sanity-evaluation-results-presented-at-the-plenary",
"title": "Sanity evaluation results presented at the CodeLand Plenary"
}Sanity compared with other CMSs
| WordPress | AEM | Strapi | Sanity | |
|---|---|---|---|---|
| Head (rendering) | Built in (PHP themes) | Pages (HTL) + headless (Content Fragments, GraphQL) | None: you pick | None: you pick |
| Where content lives | Your database | Your repository (or AEM Cloud Service) | Your database (or Strapi Cloud) | Sanity’s Content Lake (cloud, EU) |
| Who runs the backend | You | You or Adobe | You | Sanity (zero ops) |
| Editor | wp-admin | Author (Sites) | Admin panel | Open-source Studio: customisable, hostable anywhere |
| A new channel | Plugin or REST API | Headless as an add-on | REST/GraphQL API | One GROQ query: nothing re-authored |
Contentful is headless SaaS like Sanity, but its editor can’t be self-hosted.