CLAUDE.md
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
What this is
Gaurav Vipat’s personal academic portfolio site, built on the Academic Pages Jekyll template (a fork of Minimal Mistakes). It’s a static site deployed via GitHub Pages at gvipat.github.io. There is no application code to compile — content lives in Markdown/YAML collections, and Jekyll renders it into HTML via Liquid templates in _layouts/ and _includes/.
Common commands
Local development (native):
bundle install # install Ruby deps (delete Gemfile.lock and retry on errors)
bundle exec jekyll serve -l -H localhost # serve at localhost:4000, live-reloads on .md/.html changes
Changes to _config.yml require stopping and restarting the server — it is not hot-reloaded.
Local development (Docker / VS Code Dev Container):
chmod -R 777 .
docker compose up # site available at localhost:4000
Or reopen the repo in the VS Code Dev Container (.devcontainer/devcontainer.json); it builds from Dockerfile and runs jekyll serve with _config.yml,_config_docker.yml.
Production build (what CI runs, see .github/workflows/jekyll-build.yml):
bundle exec jekyll build --strict_front_matter
There is no linter or test suite in this repo — treat a successful strict-front-matter build as the correctness check.
JS asset build (only needed when editing assets/js/):
npm run build:js # uglifies jquery + assets/js/plugins/jquery.greedy-navigation.js + assets/js/_main.js + theme.js -> assets/js/main.min.js
npm run watch:js # rebuild on change
Content architecture
Content is organized as Jekyll collections, each a directory of Markdown files with YAML front matter, rendered through a matching layout:
_posts/— blog posts (archive-single.htmlviadefault.html)_publications/— papers, one file per publication (front matter drives the publications archive page)_talks/— talks/tutorials, rendered with_layouts/talk.htmland_includes/archive-single-talk.html; also feedstalkmap.html_teaching/,_portfolio/— same collection pattern_pages/— standalone pages (About, CV, Publications index, Talks index, 404, etc.), addressed bypermalinkin front matter, not by file path_drafts/— posts excluded from build until dated/published
The template’s sample entries have been removed from _posts/, _publications/, _talks/, _teaching/, and _portfolio/ — those collections are currently empty. When adding real content, follow the front-matter conventions documented on _pages/markdown.md (the site’s own /markdown/ guide page) rather than reintroducing the old placeholder files.
Site-wide behavior and content are controlled by _config.yml (author/social profile fields, theme, plugins, collections config) — most personalization (name, bio, social links, avatar) happens there, not in code.
_data/ holds structured YAML/JSON consumed by templates:
navigation.yml— top nav linksui-text.yml— locale stringsauthors.yml— author bios (for multi-author sites)cv.json— structured CV data consumed by_includes/cv-template.html(rendered on the/cv-json/page); generated from_pages/cv.md, not hand-edited (see below)comments/— flat-file comments (staticman-style), organized by post slug
Generating content from external sources
Several one-off scripts turn external/structured data into the Markdown files above. They are meant to be run manually, not as part of the build:
markdown_generator/— converts a TSV/BibTeX/ORCID export into_publications/*.mdand_talks/*.md..pyfiles (publications.py,pubsFromBib.py) are the low-dependency CLI versions (e.g.python3 publications.py publications.csv); the.ipynbcounterparts are the documented/interactive versions.scripts/update_cv_json.sh+scripts/cv_markdown_to_json.py— regenerates_data/cv.jsonfrom_pages/cv.md(source of truth is the Markdown CV, JSON is derived — do not hand-editcv.json).talkmap.ipynb/talkmap.py/talkmap/— geocodes talk locations from_talks/intotalkmap/org-locations.js, used by_pages/talkmap.html. Re-run automatically by.github/workflows/scrape_talks.ymlwhenever_talks/**ortalkmap.ipynbchanges (executes the notebook and pushes the regenerated output).
CI workflows (.github/workflows/)
jekyll-build.yml— runs afterbad-pr.ymlcompletes onmain; builds the site with--strict_front_matter(front-matter typos fail the build).bad-pr.yml— auto-closes/locks PRs that look like someone pushed personal-site changes to the upstream template repo (checks PR body for the template’s boilerplate warning text).close-tests.yml— auto-closes issues that look like connectivity/spam test issues.scrape_talks.yml— regenerates the talk map data (see above) and commits it back.
Note: bad-pr.yml and close-tests.yml are template-repo-maintenance workflows inherited from upstream academicpages/academicpages.github.io; they’re generally irrelevant once this is a personal fork but are left intact.
