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. 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. 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.

project

Capstone projects linked to a sponsor with technology tags and team roster.

testimonial

Quotes from industry partners and students, optionally linked to a project.

event

Calendar events with categories and optional end dates.

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.

Object types

Shared objects are reused across multiple document and block types.

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:
  • 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.