How the site is built, structured, and how its interactive pieces work. Read this before making code changes; for content-only changes see CONTRIBUTING.md.
- Tech Stack
- Project Structure
- Routes
- Content and Data Sources
- Interactive Components (React Islands)
- Search
- Theming
- Homepage Carousel
- Accessibility
- Where to Edit What
| Concern | Technology |
|---|---|
| Site framework | Astro 5 (static output) |
| Interactivity | React 19 islands (client:* directives) |
| Styling | Tailwind CSS + SCSS theme variables |
| Content | Astro content collections (Markdown + Zod) |
| Publications | BibTeX (bibtex-parse-js) |
| Page search | Fuse.js (publications), Pagefind (site-wide) |
Astro renders all pages to static HTML at build time. React is used only for components that need client-side interactivity; everything else is server-rendered Astro.
src/
components/astro/ Static layout blocks (Navbar, Footer, MemberGrid, Breadcrumbs)
components/react/ Interactive UI (PublicationSearch, GlobalSearch, etc.)
content/ Astro content collections (members, news, research, ...)
content/config.ts Zod schemas for every collection (source of truth)
data/ Data files (publications.bib, software.json, sponsors.json)
layouts/ Page shell (Layout.astro)
pages/ Route files (see below)
plugins/ Markdown/rehype plugins
styles/ SCSS theme + global styles
utils/ Build-time helpers (e.g. bibtex.ts)
public/
images/ Site images (members, research, software, sponsors, gallery)
assets/ Downloadable assets (teaching, software)
docs/ Resume PDFs
publications/ Paper, slides, and poster files
Files in src/pages/ map directly to URLs.
Top-level pages:
index.astro— homepagepeople.astro— members listing (folder-driven)publications.astro— publications searchsoftware.astro— software/tools listing (its own page, not a publications tab)teaching.astro— teaching landingfaq.astro,contact.astro
Nested / dynamic routes:
members/[...slug].astro— individual member pagesnews/index.astro,news/awards.astro,news/grants.astro— news + filtered viewsresearch/index.astro,research/[...slug].astro— research areasresearch/resources/[...slug].astro— reading lists / resourcesgallery/— gallery pagesteaching/*.astro— individual course pages (mla,cse325,cse420,quantum-computation,older-courses)
- Collections (
src/content/):members,news,research,resources,faq,gallery. Each is validated by a Zod schema insrc/content/config.ts. - Data files (
src/data/):publications.bib,software.json,sponsors.json.
The field reference and how-to for each collection and data file lives with its content guide under content/.
Located in src/components/react/:
PublicationSearch.tsx— publication search and filter dropdownsGlobalSearch.tsx— site-wide modal search (Pagefind)HomepageCarousel.tsx— homepage image carouselGalleryGrid.tsx/ImageLightbox.tsx— gallery and lightboxSoftwareCard.tsx/PublicationCard.tsx— cardsThemeToggle.tsx— light/dark switch
Keep these focused on interactivity. Static markup belongs in Astro components.
The site has two independent search systems.
- UI logic:
src/components/react/PublicationSearch.tsx - Data source:
src/data/publications.bib - Behavior: client-side fuzzy search; filter dropdowns are derived from years and categories in BibTeX, member names from the members collection, and research tags from the research collection.
If filters appear empty or wrong:
- Confirm BibTeX entries include
year,category,author,research. - Run
npm run buildto validate the data flow. - Restart the dev server if the hydration cache is stale.
- UI logic:
src/components/react/GlobalSearch.tsx - Index: generated into
dist/pagefind/duringnpm run build. - Behavior: runtime dynamic import of
/pagefind/pagefind.js. Works reliably only after a build — usenpm run build && npm run previewto test it.
- Tailwind utilities plus SCSS theme variables (CSS custom properties).
- Theme files:
src/styles/_theme-light.scsssrc/styles/_theme-dark.scsssrc/styles/main.scss
When changing colors or contrast, verify the result in both light and dark modes.
- Reads JPG/JPEG files from
public/images/homepage/. - Randomly selects 3 images per page load, so new images can be added without crowding the homepage.
- HEIC source images can be converted with
scripts/convert-heic-to-jpg.sh(it also deletes the original HEIC files after a successful conversion).
When editing interactive UI:
- Keep controls keyboard-focusable (
button,a). - Keep
aria-labels on icon-only buttons. - Verify color contrast in both light and dark mode.
| Goal | Edit |
|---|---|
| Homepage copy/layout | src/pages/index.astro |
| People listing behavior | src/pages/people.astro |
| Publications search behavior | src/components/react/PublicationSearch.tsx |
| Software listing | src/data/software.json + src/pages/software.astro |
| Sponsors strip | src/data/sponsors.json |
| Navigation / footer | src/components/astro/Navbar.astro, Footer.astro |
| Content schema rules | src/content/config.ts |
| Colors / theme | src/styles/_theme-light.scss, _theme-dark.scss |