CLAUDE.md
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Overview
This is Işıl Özgü’s personal academic website (isil.io), built on the Academic Pages Jekyll template (a fork of Minimal Mistakes). It is a static site hosted on GitHub Pages from the isil66/isil66.github.io repository. There is no application code to compile — content is authored as Markdown/YAML and Jekyll renders it into static HTML.
Commands
Local development (native Ruby)
bundle install # install Ruby/Jekyll dependencies (delete Gemfile.lock and retry on errors)
bundle exec jekyll serve -l -H localhost # serve at localhost:4000 with live reload
If gem install permission errors occur, install gems locally first: bundle config set --local path 'vendor/bundle'.
Local development (Docker)
chmod -R 777 .
docker compose up # serves at localhost:4000
A VS Code Dev Container (.devcontainer/devcontainer.json) wraps the same Docker setup and auto-forwards port 4000.
JS asset build
npm run build:js # uglifies jquery/fitvids/smooth-scroll + assets/js/_main.js into assets/js/main.min.js
npm run watch:js # rebuild on change to assets/js/**/*.js
CV regeneration
_data/cv.json is generated from _pages/cv.md, not hand-edited:
scripts/update_cv_json.sh # wraps scripts/cv_markdown_to_json.py
Run this after editing _pages/cv.md if the JSON-rendered CV page (cv-json) is ever enabled in _data/navigation.yml.
Talks/publications from TSV
markdown_generator/ contains notebooks (talks.ipynb, publications.ipynb, pubsFromBib.ipynb) and equivalent plain scripts (talks.py, publications.py, pubsFromBib.py) that turn talks.tsv / publications.tsv (or a .bib file) into individual Markdown files under _talks/ / _publications/. Use these instead of hand-writing many entries at once.
There is no test suite or linter in this repo; “verification” means building the site (jekyll serve/jekyll build) and checking pages render.
Architecture
Content lives in collections, not code. Each Jekyll collection is a directory of Markdown files with YAML front matter, configured in _config.yml under collections:/defaults::
_publications/— permalink/publications/:path/, layoutsingle_talks/— permalink/talks/:path/, layouttalk_teaching/— permalink/teaching/:path/_portfolio/— permalink/portfolio/:path/_posts/— standard Jekyll blog posts (date-prefixed filenames)
Filenames follow YYYY-MM-DD-slug.md and the date drives both sorting and the generated permalink.
Pages vs. collections vs. layouts vs. includes:
_pages/— standalone pages (About, CV, archive/index pages likepublications.html,talks.html,portfolio.html,teaching.html,year-archive.html). These are the pages that list items from the collections above, using Liquid loops (site.publications,site.talks, etc.)._layouts/— top-level HTML templates (default.html,single.html,talk.html,archive.html,splash.html,cv-layout.html). Every content file’s front matterlayout:selects one of these._includes/— reusable partials pulled into layouts (masthead, sidebar/author-profile, footer, head/SEO, comments, social-share, feature_row, etc.). When changing site chrome (header, sidebar, footer), edit here rather than in layouts._sass/— SCSS partials (_custom.scssfor site-specific overrides,theme/andvendor/for the Minimal Mistakes base). Compiled via Jekyll’s built-in Sass support (sass_dir: _sass,style: compressed).
Site-wide config is centralized in _config.yml: author/social metadata, publication categories, navigation is not here (see _data/navigation.yml) but everything else (theme, plugins, collection permalinks, defaults: front matter per content type) is. Changing _config.yml requires restarting jekyll serve — it isn’t watched.
_data/ holds structured YAML/JSON consumed by templates: navigation.yml (header links — order here controls header order), authors.yml, ui-text.yml (UI string localization), cv.json (generated, see above).
Automation: .github/workflows/scrape_talks.yml runs on pushes touching _talks/** or talkmap.ipynb — it executes talkmap.ipynb via jupyter nbconvert to geocode talk locations and auto-commits the result (talkmap_out.ipynb, talkmap/org-locations.js), which feeds the talk map at _pages/talkmap.html. GitHub Pages itself builds and deploys the Jekyll site automatically on push to the default branch — there is no separate deploy workflow in this repo.
Site identity: CNAME pins the custom domain isil.io; _config.yml’s url/repository must stay consistent with it.
Adding content
- New publication/talk/teaching/portfolio entry → add a Markdown file to the matching
_publications/,_talks/,_teaching/,_portfolio/directory withYYYY-MM-DD-slug.mdnaming and front matter matching sibling files (or generate viamarkdown_generator/). - New nav item → edit
_data/navigation.yml. - Uploaded files (PDFs, etc.) go in
files/, referenced as/files/.... - Images go in
images/.
