CLAUDE.md
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
What this is
A personal academic website (Xinnuo Xu) built on the academicpages Jekyll template, itself a fork of the Minimal Mistakes theme. It is served via GitHub Pages from https://xinnuoxu.github.io. There is no application code to compile — content lives in markdown collections and the layout/styling comes from the vendored theme.
Local development
bundle install # install Ruby deps (delete Gemfile.lock first if it errors)
bundle exec jekyll liveserve # build + serve at localhost:4000 with live reload (hawkins gem)
bundle exec jekyll serve # plain serve, no live reload
_config.dev.ymloverrides config for local runs (setsurl: localhost:4000, disables analytics). Jekyll’sliveserve/servedoes not pick it up automatically — pass it explicitly if needed:bundle exec jekyll serve --config _config.yml,_config.dev.yml._config.ymlis not hot-reloaded. Restart the server after editing it.- GitHub Pages builds the site automatically on push to
master; no manual deploy step.
Content model
Content is Jekyll collections, one directory per type, each file a markdown doc with YAML front matter. Output URLs and default layouts are wired in _config.yml under collections: and defaults:.
_publications/— papers. Front matter drives_pages/publications.md. See_publications/xu2019unsupervised.mdfor the expected fields (title,venue,citation,paper_link,doi,collection: publications)._talks/,_teaching/,_portfolio/— same pattern, other collections._posts/— blog posts, namedYYYY-MM-DD-title.md._pages/— standalone pages (about, cv, 404, archive views). The.htmlfiles here (e.g.publications.html,archiveviews) are list/index templates that loop over collections._drafts/— unpublished drafts.
Filenames in publications/talks conventionally encode the citation key / date (e.g. xu2019unsupervised.md, 2014-03-01-talk-3.md).
Navigation and config
_data/navigation.yml— the top menu. Most links are commented out; only Publications and CV are active. Uncomment entries here to expose a collection in the nav._config.yml— site-wide settings: author profile/sidebar (author:), social links, analytics, collection definitions, and per-collectiondefaults(layout, author_profile, share, comments). Editauthor:to change the sidebar bio/links._data/ui-text.yml,_data/authors.yml— theme UI strings and multi-author metadata.
Theme internals (rarely edited)
_layouts/— page templates (single.html,talk.html,archive.html, etc.). Front matterlayout:selects one._includes/— partials composing the layouts._sass/+assets/css/— styles. JS lives inassets/js/; rebuild the bundle withnpm run build:js(uglifies intoassets/js/main.min.js). Node is only needed for this.
Bulk-generating content from spreadsheets
markdown_generator/ converts TSV files into collection markdown. Run the python scripts (or the equivalent .ipynb notebooks) from inside that directory:
cd markdown_generator
python publications.py # reads publications.tsv -> writes ../_publications/*.md
python talks.py # reads talks.tsv -> writes ../_talks/*.md
pubsFromBib.py generates publication markdown from a BibTeX file instead of TSV.
Talk map
talkmap.py / talkmap.ipynb geocode talk locations and build an interactive map into talkmap/, surfaced by _pages/talkmap.html. The talk map nav link is gated by talkmap_link in _config.yml (currently false).
Notes
_site/,vendor/, and.bundleare git-ignored build/dependency output — do not edit or commit them.- If a security/dependency warning appears, the template’s guidance is to delete
Gemfile.lockand reinstall.
