| name | summit-cms |
| description | Edit Nextflow Summit website content in Sanity and publish it to the live site. Use whenever a task involves changing CMS content for the summit-website repo — talks/events, speakers, posters, sponsors, agenda, page copy, embedding YouTube recordings — or making such changes appear on summit.nextflow.io (which needs a Netlify rebuild). Covers the no-deployed-schema write workaround and the master-branch deploy gotcha. |
Editing summit-website CMS content and publishing it
Content lives in Sanity (project o2y1bt2g, dataset summit), not in this repo.
See CLAUDE.md for the full architecture. This skill is the procedure.
1. Understand the content before editing
get_schema returns "no schema deployed" — that's expected. Learn the shape by
querying live data instead: e.g. *[_type=="event" && location=="boston"]{...}.
- Talks/posters are
event docs (location = boston|barcelona|virtual). The
YouTube embed is a bare 11-char video ID in the youtube field. Schedule lives in
the bostonAgenda/bcnAgenda/virtualAgenda singletons, which reference
events via associatedEvents->.
- Use the Sanity MCP read tools freely (
query_documents, get_document).
2. Write — MCP write tools DON'T work here
patch_document_from_json / create_* fail with
Schema for schemaId '_.schemas.default' could not be found (schema not deployed).
Mutate with the JS client + the local Sanity CLI token instead. Write a script to
the repo root (so @sanity/client resolves) and run it:
import { createClient } from '@sanity/client'
const client = createClient({
projectId: 'o2y1bt2g', dataset: 'summit',
apiVersion: '2021-06-07', token: process.env.SANITY_TOKEN, useCdn: false,
})
await client.patch(id).set({ field: value }).commit({ visibility: 'sync' })
export SANITY_TOKEN=$(npx --no-install sanity debug --secrets 2>/dev/null \
| grep "Auth token" | sed -E "s/.*'([^']+)'.*/\1/")
node ./your-script.mjs
First check there are no drafts that would clash:
*[_type=="event" && _id in path("drafts.**")]. Confirm the write with a read-back.
Proper fix (not yet done): the schema isn't deployed because the Studio repo
seqeralabs/cms only runs sanity deploy, never sanity schema deploy. Running
sanity schema deploy --workspace summit there (with a CLI newer than the pinned
sanity@3.58) would unlock the MCP write tools — then call them with
workspaceName: "summit". Non-destructive, but drifts unless wired into that
repo's deploy pipeline. Until then, use the @sanity/client workaround.
3. Will it show on the live site? Maybe not without a rebuild
- Edits to
event, speaker, poster, sponsor, blog, keyDate are baked
in at build time (src/data/*.ts top-level await). They appear on the live
static pages (e.g. /2026/boston/agenda/<slug>/) only after a redeploy.
- Edits surfaced through SSR pages (agenda listing, overview, faq, settings,
menus — anything with
prerender = false) appear immediately, no deploy.
So a half-applied look (listing updated, detail page stale) means: data is fine,
you just haven't rebuilt.
4. Deploy to production = rebuild master
Production is the master branch on Netlify. The Studio "Deploy" button / the
build hook in the webhook_deploy doc point at 2026-mvp (wrong branch, and
its build errors), and the stored Netlify token is read-only (can't POST /builds). So force the hook onto master:
curl -sS -X POST -d '{}' "<buildHook>?trigger_branch=master&trigger_title=<msg>"
Poll until ready, then verify the rendered HTML (not just Sanity):
curl -s "https://summit.nextflow.io/<path>" | grep "<expected value>"
Static detail pages render content inside a React island, so the value appears
serialized in the page HTML once the rebuild lands.
5. Tell the user
Report: what changed in Sanity, whether a rebuild was needed, the deploy state, and
the live-page verification. Flag the 2026-mvp build-hook misconfiguration if it's
relevant — it's an ongoing footgun until someone repoints the hook to master.
Previewing unpublished drafts (no deploy)
To view draft content before publishing, hit
/preview?secret=<SANITY_PREVIEW_SECRET>&path=/some/page. It sets the
sanity-draft-mode cookie (src/middleware.ts) and rewrites to the path, so SSR
fetchers switch to getDraftClient() (previewDrafts perspective). Needs env
SANITY_READ_TOKEN (Viewer token) + SANITY_PREVIEW_SECRET (must match the Studio).
Only works on SSR pages — static detail pages can't preview drafts this way.