The public website for Computational Biology at Berkeley, built with Vite, React, TypeScript, shadcn/ui, and Tailwind CSS.
npm ci
npm test
npm run devRun npm run build for the same credential-free production build used by GitHub Pages. The build validates officer data before compiling the site.
Fall 2026 deliberately separates approved roster decisions from submitted public profile content:
src/data/officersFa26Roster.jsonowns cohort membership, roles, order, stable IDs, and fallback portraits.src/data/officerProfilesFa26.jsonis a reviewed, public-only snapshot of in-window officer form responses.scripts/lib/officer-profile-cohorts.jsowns operational file paths and the explicit intake window; upstream database identifiers stay in protected environment secrets and out of the client bundle.src/data/compileOfficerDirectory.jsmatches responses to the roster, keeps the newest nonblank public fields, normalizes links, and ignores unmatched people.public/officers/fa26/stores stable headshot assets.public/officers/archive/stores immutable Fall 2025 and Spring 2026 snapshots so historical tabs work in a clean checkout.
Notion is private intake, not a publishing system. Maintainers use the controlled
officers:notion:dry-run, officers:notion:check, and
officers:notion:write commands described in scripts/README.md to prepare a
sanitized working-tree change. The write command does not commit, push,
deploy, or write anything back to Notion. A human must review the Git diff and
the staging site before promotion.
Each profile record in the public snapshot is limited to provenance ID, submission time, full and preferred names, headshot path, bio, personal website, LinkedIn, GitHub, and ORCID. Never copy email, phone number, birthday, scheduling data, another private form field, or an upstream database identifier into the snapshot. Run:
npm test
npm run validate:officersThe validator reports unmatched responses, invalid public links, missing assets, and officers still waiting for a current profile response. See scripts/README.md for the update workflow and .agents/skills/pre-production-checklist/SKILL.md before a production promotion.
src/data/siteIdentity.jsonandsrc/data/sitePages.jsonare the shared registries for the public identity, indexable routes, page titles, and descriptions.src/data/siteIdentity.jsonalso stores the public Google Search Console verification token that the build emits as a metadata tag.npm run buildcreates rendered HTML at each route directory, then generates and validatesdist/sitemap.xmlanddist/robots.txt.src/components/RouteMetadata.tsxkeeps metadata synchronized during client-side navigation.- Production builds are indexable by default. Staging sets
VITE_NOINDEX=trueand a stagingVITE_SITE_ORIGIN, which marks every pagenoindex, nofollowand suppresses the sitemap. Its robots file allows fetching so crawlers can observe the page-level directive. public/404.htmlis alwaysnoindex; internal/conceptsreview routes are intentionally absent from the sitemap and static route output.
- Pushes to
devdeploy the staging GitHub Pages site from theHilo-Hilostaging repository. - Pushes to
maindeploy production fromCompbioAtBerkeley/compbioatberkeley.github.io.
Neither build reads Notion or Google Sheets credentials. Form intake is reviewed and versioned before publication, so the same commit produces the same site in local, staging, and production environments. The separate weekly/manual drift workflow may read Notion with a read-only integration, but it cannot modify repository contents or publish candidate data.