CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

Project Overview

Personal academic website for Andrew M. Camp (andrewmcamp.com), built with Quarto and deployed on Netlify. Fully static — no databases, no build-time JS frameworks.

Commands

quarto preview          # Local dev server with hot reload
quarto render           # Build site to _site/
quarto publish          # Deploy to Netlify

Architecture

Site Framework

  • Quarto static site generator with .qmd (Quarto Markdown) content files
  • Dual theme: Flatly (light) / Darkly (dark) via _quarto.yml, with a dark-mode flash prevention script in the HTML header
  • Design tokens in _brand.yml — colors, typography (Source Serif 4 headings, Inter body, JetBrains Mono code)
  • Single SCSS file at _assets/theme/theme.scss (~1,166 lines) handles all custom styling; it compiles twice (once per theme) and uses $_is-dark: lightness($body-bg) < 50% to branch light/dark values at compile time

Pages

Page File Notes
Landing index.qmd Hero section + spotlight carousel (auto-rotates, inline JS)
About about.qmd Timeline layout, JSON-LD structured data
Research writing.qmd Publication listing with filter bar
Contact contact.qmd Card grid, email copy-to-clipboard
CV cv.qmd PDF download link, structured sections

Publication System

  • Each publication is a .qmd file in writings/ with YAML frontmatter: title, date, author, categories, tags, abstract, and optional resource links (pdf, link, slides, appendix, brief, code)
  • categories control type grouping: peer-reviewed, working-paper, reports, featured
  • tags are research topics used for filtering (e.g., teacher-labor-market, four-day-school-week)
  • Publications render through the EJS template _assets/html/pubs.ejs
  • Featured items use spotlight field pointing to a detail page in writings/spotlight/

Filter System (_assets/js/filters.js)

  • Vanilla JS, no dependencies
  • Three filter dimensions: Year (single-select), Type (multi-select), Topic (multi-select)
  • Filter states sync between desktop sidebar and mobile inline bar (breakpoint: 992px)

Key Conventions

  • CSS class prefixes: .landing-*, .spotlight-*, .filter-*, .pub-*, .cv-*, .card-nav
  • File naming: kebab-case for .qmd files matching the publication title
  • Author formatting: comma-separated in frontmatter; Andrew M. Camp is bolded in rendered output by the EJS template
  • Quarto version: pinned at 1.6.43 in netlify.toml
  • Extension: _extensions/schochastics/academicons provides academic social icons