CLAUDE.md

CLAUDE.md

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

Overview

This is Jianhao Wu’s personal academic website (rushingfox.github.io), built on the academicpages Jekyll template (a fork of Minimal Mistakes). It is published via GitHub Pages from master.

Local development

GitHub Pages builds the site automatically on push, but for local preview:

bundle install                                        # install Ruby deps (delete Gemfile.lock first if it errors)
bundle exec jekyll serve --config _config.yml,_config.dev.yml   # serve at http://localhost:4000 with dev overrides
bundle exec jekyll liveserve                          # alternative; auto-rebuilds on change

_config.dev.yml only overrides a few keys (url, analytics off, expanded sass) — pass it in addition to _config.yml. Note that _config.yml is not auto-reloaded; restart jekyll serve after editing it.

The JS toolchain (package.json) is inherited from Minimal Mistakes and only needed when modifying assets/js/:

npm run build:js     # uglify vendor + plugin JS into assets/js/main.min.js
npm run watch:js     # rebuild on change

There is no test suite and no linter configured.

Content architecture

Content lives in Jekyll collections (configured in _config.yml under collections:), each with its own folder and permalink pattern /:collection/:path/:

  • _publications/ — papers (filename convention YYYY-MM-DD-title.md)
  • _talks/ — talks & posters; rendered with the custom talk layout
  • _teaching/ — teaching entries
  • _portfolio/ — portfolio items
  • _posts/ — blog posts (standard Jekyll posts, paginated 5/page)

Static pages (about, CV, publications index, etc.) live in _pages/ and are explicitly included via _config.yml’s include: list. Site-wide nav comes from _data/navigation.yml; UI strings from _data/ui-text.yml; author/sidebar info from _config.yml’s author: block (not _data/authors.yml, which is template scaffolding).

Defaults in _config.yml set layout: single + author_profile: true for most content, and layout: talk for talks. To change the sidebar, comment area, or author block site-wide, edit those defaults: rather than every front matter.

Theme internals (don’t edit unless restyling the whole site):

  • _layouts/ — page templates (single.html, talk.html, archives, …)
  • _includes/ — partial templates referenced by layouts
  • _sass/ + assets/css/ — styling (Sass compiled by Jekyll; output style is compressed in prod, expanded in dev)
  • assets/js/ — vendored jQuery + plugins, bundled into main.min.js

User-uploaded files (PDFs, slides, images) go in files/ and images/ and are served at the corresponding URL paths.

Generating publication / talk markdown

markdown_generator/ holds Jupyter notebooks and equivalent .py scripts that turn publications.tsv / talks.tsv (or a BibTeX file via pubsFromBib.py) into one markdown file per entry, ready to drop into _publications/ or _talks/. Use these instead of hand-writing entries when bulk-importing.

talkmap.ipynb / talkmap.py build the interactive map at /talkmap/ from the existing _talks/ files; rerun after adding talks if the map page is in use (talkmap_link: false in _config.yml currently hides the link).

Conventions worth knowing

  • New publications/talks must use the YYYY-MM-DD-slug.md filename pattern — Jekyll uses the date for sorting and the slug for the permalink.
  • Anything you don’t want shipped to the built site should be added to the exclude: list in _config.yml (already excludes node_modules, Gemfile, README, etc.).
  • The site uses the GitHub Pages-safe plugin whitelist (jekyll-paginate, jekyll-sitemap, jekyll-gist, jekyll-feed, jemoji); adding other plugins will work locally but break the GitHub Pages build.