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/, layout single
  • _talks/ — permalink /talks/:path/, layout talk
  • _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 like publications.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 matter layout: 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.scss for site-specific overrides, theme/ and vendor/ 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 with YYYY-MM-DD-slug.md naming and front matter matching sibling files (or generate via markdown_generator/).
  • New nav item → edit _data/navigation.yml.
  • Uploaded files (PDFs, etc.) go in files/, referenced as /files/....
  • Images go in images/.