Sanity CMS: The Content Editor Developers Love

Review of Sanity — a headless CMS with real-time collaboration, GROQ queries, and a customizable admin panel. For teams that value DX and content control.

Sanity is a headless CMS from Norway, founded in 2015. The main differentiator from competitors: content is structured data, not HTML blocks. Developers describe the schema in code, editors populate it in a real-time collaborative admin panel, and content queries are executed with GROQ — Sanity’s own query language.

Website: sanity.io

Architecture

Sanity separates content and presentation at a fundamental level. Content lives in the Sanity Content Lake — a cloud-based store accessible via API. The admin panel (Sanity Studio) is a React application you can customize to your heart’s content and host anywhere.

The content schema is described in JavaScript/TypeScript files. You define fields, their types, validations, relations — and Studio automatically picks up the schema. Schema changes deploy alongside the Studio code — a Git-based workflow with no GUI configurators.

GROQ — The Query Language

GROQ (Graph-Relational Object Queries) is like GraphQL but purpose-built for document work. It lets you query nested structures, filter, aggregate, and transform data in a single request. Example:

*[_type == "post" && publishedAt < now()] | order(publishedAt desc) {
  title,
  "slug": slug.current,
  "author": author->name,
  "related": *[_type == "post" && references(^._id)]{title}
}[0...10]

Powerful, but takes getting used to. Developers familiar with GraphQL pick it up in a day or two.

Real-Time Collaboration

Multiple editors can work on the same document simultaneously. Changes appear instantly — like Google Docs. Conflicts are resolved at the field level. For newsrooms and content teams where 2–3 people collaborate on an article, this is a killer feature.

Pricing

  • Free: unlimited content, 2 users, 100 GB assets
  • Growth: $15/mo per user — custom roles, scheduled publishing
  • Enterprise: custom — SSO, audit logs, dedicated support

The free tier is incredibly generous. For a team of up to 5 people — $75/mo. Compare with Contentful ($489/mo for 5 users) — the difference is an order of magnitude.

What’s Good

Developer Experience is the main draw. Schema in code, deployment via Git, admin panel customization on React. Embed your own components directly into the editor panel: previews, custom widgets, integrations. Sanity Studio can be styled to match the client’s brand.

GROQ — once mastered, it’s a superpower. Filtering by related documents, conditional fields, aggregations — all in one query without the N+1 problem.

Content is available through GraphQL and GROQ simultaneously. Fast API, CDN caching, webhooks for rebuilds.

What Holds It Back

The learning curve is steeper than Strapi or Storyblok. GROQ needs to be learned, Studio needs to be assembled — it’s not plug-and-play. For a simple blog with a standard structure, the overhead is too much.

Vendor lock-in: content in Content Lake is not just JSON. You can export to Markdown, but Sanity’s structure (references, blocks, portable text) gets lost. Moving back would be painful.

Per-user pricing ($15/mo) adds up fast for large teams. Twenty editors — $300/mo.

Verdict

Sanity is a CMS for teams where developers participate in content design. If you have a complex data structure, need real-time collaboration, and want to customize the admin panel for the client — Sanity is the best choice on the market. For simple blogs and landing pages — go with Strapi, it’s simpler.