Skip to main content
The siteSettings document is a singleton — there is exactly one per site. It controls global branding (logo, site name), header navigation, footer content, social links, and contact information.

Singleton pattern

The singleton is enforced in two ways:
  1. Document actionssanity.config.ts restricts allowed actions to publish, discardChanges, and restore. Editors cannot create or delete the document.
  2. New document optionssiteSettings is removed from the “New document” menu so a second instance cannot be created.
On the production dataset, the document ID is siteSettings. On the rwc dataset, each site has its own singleton: siteSettings-rwc-us and siteSettings-rwc-intl. getSiteSettingsId() in sanity.ts returns the correct ID for the current build.

Fields

Branding group

siteName
string
required
Full site name (e.g. YWCC Industry Capstone). Used in the <title> tag fallback and footer.
site
string
Multi-site discriminator. Hidden on the production dataset.
siteDescription
text
Default meta description for pages that do not have their own SEO description set.
Primary site logo. Used in the header. Supports hotspot. Must include alt text.
logoLight
image
Light-on-dark variant of the logo. Used in the footer. Must include alt text.
ctaButton
object
Primary call-to-action button shown in the header. Inline object with text and url from the shared buttonFields definition.
navigationItems
array of objects
Ordered list of header navigation links. Each item uses linkFields (label, href) and supports a children array for dropdown sub-items.
Sub-items (children) are stored in the schema but are not yet rendered in the header. Rendering dropdown navigation is planned for a future story.
Footer body content with two sub-fields:
  • text (text) — body copy shown in the footer
  • copyrightText (string) — copyright line in the footer bottom bar
Links shown in the footer bottom bar (e.g. Privacy Policy, Terms of Use). Each item uses linkFields.
Links shown in the footer Resources column. Each item uses linkFields.
Links shown in the footer Programs column. Each item uses linkFields.

Social & Contact group

Social media links. Each item has:
  • platform (string, required) — one of github, linkedin, twitter, instagram, youtube
  • url (url, required) — full URL to the profile
contactInfo
object
Contact information displayed in the footer. Sub-fields:
  • address (string)
  • email (string, validated as email with a warning)
  • phone (string)
currentSemester
string
Current academic semester label (e.g. Fall 2026). Displayed in various blocks and used as a default semester filter. Format: Season YYYY.

Fetching site settings

getSiteSettings() in sanity.ts fetches the singleton and caches the result for the entire build:
export async function getSiteSettings() {
  if (!visualEditingEnabled && _siteSettingsCache) return _siteSettingsCache
  const { result } = await loadQuery({
    query: SITE_SETTINGS_QUERY,
    params: { siteSettingsId: getSiteSettingsId() },
  })
  _siteSettingsCache = result
  return result
}
It is called from Layout.astro, Header.astro, and Footer.astro. Because of the module-level cache, only one API call is made per build regardless of how many pages include those components.

Build docs developers (and LLMs) love