Skip to main content
All CMS content lives in Sanity Content Lake. The schema is organized into three layers: documents (top-level content), objects (reusable field groups), and blocks (page builder sections).

Entity-relationship diagram

Document types

page

The core page builder document. Each page holds an ordered blocks[] array that the BlockRenderer dispatches at render time.
FieldTypeRequiredNotes
titlestringYesPage title
slugslugYesURL path (source: title)
sitestringConditionalrwc-us or rwc-intl; hidden on production dataset
templatestringNodefault, fullWidth, landing, sidebar, twoColumn
seoseo objectNoMeta title, description, OG image
blocksarrayNo23 block types supported
Certain blocks emit a Studio warning when used in constrained templates (sidebar, twoColumn) because their full-width layouts will not render correctly.

siteSettings (singleton)

One document per workspace. Controls global navigation, branding, footer, and social links.
FieldTypeRequiredNotes
siteNamestringYesSite display name
logoimage (with alt)YesPrimary logo
logoLightimage (with alt)NoLight-mode variant
ctaButtonbutton objectNoHeader call-to-action
navigationItemsarray of linkNoMain nav with dropdown children
footerContentobjectNoText and copyright string
socialLinksarrayNoPlatform + URL pairs
contactInfoobjectNoAddress, email, phone
footerLinksarray of linkNoFooter nav
resourceLinksarray of linkNoResource nav
programLinksarray of linkNoProgram nav
currentSemesterstringNoe.g., "Fall 2026"
Industry sponsors with tier-based classification. The allowedEmails array is the portal access whitelist — middleware checks it to escalate a user to the sponsor role.
FieldTypeRequiredNotes
namestringYesSponsor organization name
slugslugYesURL path
logoimage (with alt)YesSponsor logo
descriptiontextNoAbout the sponsor
websiteurlNoExternal website
contactEmailstringNoPrimary contact (email validated)
allowedEmailsarray of stringNoPortal whitelist
industrystringNoIndustry sector
tierstringNoplatinum, gold, silver, bronze
hiddenbooleanNoHides sponsor from all public listings
featuredbooleanNoPromotes to featured displays
seoseo objectNoSEO metadata

project

Capstone projects linked to a sponsor with technology tags and team roster.
FieldTypeRequiredNotes
titlestringYesProject title
slugslugYesURL path
sponsorreference → sponsorNoFunding sponsor
statusstringYesactive, completed, archived
featuredbooleanNoPromotes to featured displays
semesterstringNoAcademic semester label
contentportableTextNoRich text description
outcometextNoOutcome and impact summary
teamarray of objectsNoname + role per member
mentorobjectNoname, title, department
technologyTagsarray of stringNo70+ predefined technology options
seoseo objectNoSEO metadata

testimonial

Quotes from industry partners and students, optionally linked to a project.
FieldTypeRequiredNotes
namestringYesPerson’s name
quotetextYesTestimonial text
rolestringNoJob title or role
organizationstringNoCompany or school
typestringNoindustry or student
photoimage (with alt)NoPerson’s photo
projectreference → projectNoRelated project

event

Calendar events with categories and optional end dates.
FieldTypeRequiredNotes
titlestringYesEvent title
slugslugYesURL path
datedatetimeYesStart date/time
endDatedatetimeNoMust be after date (validated)
locationstringNoVenue
descriptiontextNoEvent description
isAllDaybooleanNoDefault: false
categorystringNoworkshop, lecture, social, competition, other
eventTypestringNoshowcase, networking, workshop
statusstringNoupcoming, past
seoseo objectNoSEO metadata

submission (read-only)

Contact form submissions stored by the Cloudflare Worker proxy. This document type is read-only in Studio — entries are created by the API, not by editors.
FieldTypeRequiredNotes
namestringYesSubmitter name
emailstringYesSubmitter email
organizationstringNoOrganization
messagetextYesMessage content
formreference → formNoSource form
submittedAtdatetimeYesSubmission timestamp

Object types

Shared objects are reused across multiple document and block types.
ObjectFieldsUsed in
seometaTitle (max 60), metaDescription (max 160), ogImagepage, sponsor, project, event
buttontext, url (validated), variant (default / secondary / outline / ghost)ctaBanner, heroBanner, sponsorSteps, sponsorshipTiers
linklabel, href (validated), external (boolean)siteSettings nav, footer
portableTexth2–h4, blockquote, strong/em/code/underline, internalLink, image with alt+caption, callout with toneproject.content, richText, faqItem.answer, textWithImage
faqItemquestion, answer (portableText)faqSection
featureItemicon, image, title, descriptionfeatureGrid
statItemvalue, label, descriptionstatsRow
stepItemtitle, description, bullet listsponsorSteps
teamMembername, role, image (with alt), links[]teamGrid
galleryImageimage (with alt), captionimageGallery
comparisonColumntitle, highlighted (boolean)comparisonTable
comparisonRowfeature, values[], isHeader (boolean)comparisonTable
timelineEntrydate, title, description, image (with alt)timeline
block-basebackgroundVariant, spacing, maxWidthAll blocks (via defineBlock)

How page documents relate to blocks

Every page document has a blocks[] array. Each element in the array is one of 23 block object types. At build time the PAGE_BY_SLUG_QUERY GROQ query expands the full block data. BlockRenderer.astro maps block._type to the matching component via block-registry.ts: All block components share the same flat-props interface — fields arrive as direct props, not nested under a block object.

Reference graph

Multi-site support

The platform serves three site variants from a single codebase using two environment variables:
VariantPUBLIC_SANITY_DATASETPUBLIC_SITE_IDThemeDev port
YWCC Capstoneproductioncapstonered4321
RWC USrwcrwc-usblue4322
RWC Internationalrwcrwc-intlgreen4323
  • PUBLIC_SANITY_DATASET selects the Sanity dataset at build time.
  • PUBLIC_SITE_ID filters documents within the dataset — each document has an optional site field used for this purpose.
  • PUBLIC_SITE_THEME applies CSS custom property overrides via a [data-site-theme] attribute.
  • The Studio siteField enables per-document site assignment; it is hidden on the production dataset (Capstone only).
  • Docker Compose can run all three variants simultaneously on separate ports.
When adding a new document type that should be site-filterable, include the site string field and use createSchemaTypesForWorkspace(targetDataset) in the schema factory to conditionally show or hide it based on the active dataset.

Build docs developers (and LLMs) love