Entity-relationship diagram
Document types
page
The core page builder document. Each page holds an orderedblocks[] 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.sponsor
Industry sponsors with tier-based classification. TheallowedEmails 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
Everypage 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_DATASETselects the Sanity dataset at build time.PUBLIC_SITE_IDfilters documents within the dataset — each document has an optionalsitefield used for this purpose.PUBLIC_SITE_THEMEapplies CSS custom property overrides via a[data-site-theme]attribute.- The Studio
siteFieldenables per-document site assignment; it is hidden on the production dataset (Capstone only). - Docker Compose can run all three variants simultaneously on separate ports.