Personal academic website for Krish Desai, a machine learning researcher at Lawrence Berkeley National Laboratory working on unfolding, inference, and practical statistics for particle physics. Built with Jekyll and hosted on GitHub Pages at desai.ml.
- Ruby (managed via
rbenvor system Ruby) - Bundler
- Node.js & npm
- uv (Python package manager, Python 3.13+)
bundle install # install Ruby gems
npm install # install Node.js tools
uv sync # install Python packagesbundle exec jekyll serve -lIThe site is available at http://127.0.0.1:4000.
# Production build
bundle exec jekyll build
# Minify JavaScript (_main.js → main.min.js)
npm run build.
├── _config.yml # Jekyll configuration (site metadata, collections, plugins)
├── _data/
│ ├── cv.json # Structured CV data (auto-generated by update_cv.py)
│ └── navigation.yml # Site navigation menu
├── _experience/ # Work experience entries
├── _includes/ # Reusable HTML partials
├── _layouts/ # Page layout templates
├── _pages/ # Static pages (about, publications, talks, teaching, cv, contact)
├── _publications/ # Publication entries
├── _sass/ # SCSS stylesheets
├── _talks/ # Talk and presentation entries
├── _teaching/ # Teaching history entries
├── assets/
│ └── js/
│ ├── _main.js # Source JavaScript (theme toggle, BibTeX modals)
│ └── main.min.js # Minified output (generated by npm run build)
├── files/ # PDFs and downloadable resources
├── talkmap/ # Generated interactive talk location maps
├── talkmap.py # Geocodes talk locations and generates Leaflet maps
└── update_cv.py # Reads collection frontmatter and writes _data/cv.json
Each collection lives in a _<name>/ directory. Files use date-prefixed slugs (YYYY-MM-DD-descriptive-slug.md) with YAML frontmatter.
---
layout: publication
title: "Paper Title"
collection: publications
category: manuscripts # manuscripts | conferences | preprints | theses
permalink: /publications/2024-01-01-slug
date: 2024-01-01
venue: "Journal or Conference Name"
paperurl: "https://..."
citation: "Author et al. (2024). ..."
authors: "<strong>Krish Desai</strong>, Co-Author"
# Optional link fields:
doi: "10.xxxx/..."
arxiv: "2401.xxxxx"
scix: "..."
inspirehep: "..."
researchgate: "..."
code: "https://github.com/..."
---Wrap your own name in <strong> tags to bold it in author lists.
---
layout: talk
title: "Talk Title"
collection: talks
type: "Talk" # Talk | Poster | Seminar
permalink: /talks/2024-01-01-slug
venue: "Conference Name"
date: 2024-01-01
location: "City, Country"
link: "https://..."
------
layout: experience
title: "Job Title"
collection: experience
type: "Internship"
permalink: /experience/2024-company
venue: "Organization Name"
date: 2024-06-01
end_date: 2024-08-31
location: "City, State"
logo: "/assets/images/logo.png"
logo_dark: "/assets/images/logo-dark.png"
------
layout: teaching
title: "Role Title"
collection: teaching
type: "Associate Instructor"
course: "COURSE 101"
venue: "University Name"
year: 2024
semester: "Fall"
location: "City, State"
materials: "https://..."
description: "Course description."
---Geocodes talk locations via the Nominatim API and generates interactive Leaflet maps in the talkmap/ directory.
uv run talkmap.pyReads YAML frontmatter from _publications/, _talks/, _experience/, and _teaching/ and writes structured data to _data/cv.json.
uv run update_cv.pyThree GitHub Actions workflows automate deployment and data updates:
| Workflow | Trigger | Action |
|---|---|---|
pages.yml |
Push to master |
Builds Jekyll site and deploys to GitHub Pages |
update_cv.yml |
Changes to collections or update_cv.py |
Runs update_cv.py and commits updated _data/cv.json |
scrape_talks.yml |
Changes to _talks/ or talkmap.py |
Runs talkmap.py and commits updated map files |
| Layer | Technology |
|---|---|
| Static site generator | Jekyll 4.4 |
| CSS preprocessor | Dart Sass via sass-embedded |
| JavaScript minification | Terser |
| Python dependency management | uv |
| Hosting | GitHub Pages |
| Maps | Leaflet via getorg |
| Geocoding | Nominatim via geopy |