See AI content operations in action at Braze. Join the live session April 14th

Custom editorial interfaces

App SDK

Build custom tools for your team with built-in authentication and one-command deploy. All using react hooks.

A fanned stack of digital screens, with the front one displaying a "Campaign control room" interface in blue tones.

App SDK 101

Watch editors work faster with custom content workflows

Build tools your team will actually use

A software development interface displaying a terminal, content structure settings, and an AI chat assistant prompting "Create an app that".
  • AI-ready tooling

    When you combine App SDK with Content Agent, you can create smarter workflows for your content team. Ready to use on day one.

  • Authentication included

    Apps inherit Sanity's auth. Roles, permissions, and access control work out of the box. No separate user management.

  • Real-time by default

    Every edit syncs instantly through the Live Content API. Your team sees the same data, always current. No polling. No refresh buttons.

  • Custom fit to you

    Use your component library, your design system, your brand. App SDK handles the data and sync so you own the pixels.

The building blocks

A split view showing TypeScript/React code next to a web interface for managing store hours, locations, and images.

App SDK is React. If you know hooks, you know this.

The hooks

Three hooks handle most of what you need:

  • useDocuments to fetch filtered collections
  • useDocument to read a single document that stays current
  • useEditDocument for optimistic writes that sync to Content Lake

Code example

import {useDocuments, useDocument, useEditDocument} from '@sanity/sdk-react'

function StoreHoursGrid() {
  const {data: stores} = useDocuments({documentType: 'store'})
  
  return stores.map(store => (
    <StoreRow key={store.documentId} handle={store} />
  ))
}

function StoreRow({handle}) {
  const {data: hours} = useDocument({...handle, path: 'hours'})
  const editHours = useEditDocument({...handle, path: 'hours'})
  
  return <input value={hours} onChange={e => editHours(e.target.value)} />
}

Developer experience

  • Typegen turns your schema into types automatically
  • Vite dev environment for fast iteration and hot reload
  • Deploy with a single sanity deploy command

Built for the job

  • A translation overview page listing documents, locales, and translation statuses (Live, Draft, Missing).
  • A map showing an orange trail. A pop-up displays "R10 Open to submissions," 22.08.26, 160km, and 795m elevation, with an "Edit" button. A cursor points to the trail.
  • A user feedback management interface showing a list of feedback items and detailed information for a selected pending item.
  • A dark mode application window with "Create your first app" typed in a message field, showing options for "Agent" and "Opus 4.6".

Some workflows need their own interface. Build focused content apps for exactly one job.

  • Translations dashboard

    Filter untranslated content, batch-select for translation, and track locale status from a single view.

  • Marketplace feeds

    Assign products to marketplaces, track publish status, and keep feeds updated without spreadsheets.

Describe it, build it

An AI chat window instructing to "Create an app that tracks tasks, per release," shown next to a task tracker application with a list and timeline view.

App SDK is typed React hooks on top of your content model. AI tools already know how to write React. Give them your schema, and they know how to write your app.

Example prompt

"Build me an app that shows all our store locations in a grid, with their hours editable inline. Group by region and highlight any stores with missing hours."

What makes it work

  • Your schema provides the types (stores, hours, regions)
  • The SDK provides predictable patterns (useDocuments, useDocument, useEditDocument)
  • You provide the requirements; AI connects the dots

The result: Working code that matches your content model, not generic boilerplate you have to rewire.

Where workflows begin

Custom apps isn't just where content lives — it's where work gets done. Trigger translations, approve publishes, route products to marketplaces, all without leaving the editor.

The infrastructure advantage

Real-time feedback lets editors see automation status update instantly. No polling. No "check back later."

Inherited permissions mean the same roles control both content access and action triggers. No separate auth system.

Content as state means your documents are the workflow state. A translation's status lives in the document. An approval flag is a field. No shadow database to sync.