CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
What this repo is
Personal Jekyll blog for Martin Vysny, published via GitHub Pages at https://mvysny.github.io/. Based on the Jekyll Now template. Posts focus on Vaadin, Kotlin, Java, Linux, and first-principles engineering topics.
GitHub Pages compatibility (important)
This site is built by GitHub Pages, not a custom CI. Every change must stay within the GitHub Pages supported set — see https://pages.github.com/versions/ for the authoritative list. In particular:
- Jekyll is pinned to 3.x (currently 3.10.0). Do not use Jekyll 4-only features.
- kramdown 2.4.x, rouge 3.30.x, Sass via jekyll-sass-converter 1.x.
- Plugins must be on the GitHub Pages allowlist. In practice this repo uses only
jekyll-sitemapandjekyll-feed. Adding an off-allowlist plugin would force a move to a GitHub Actions build pipeline. - Prefer built-in theme gems (
minima,jekyll-theme-*) over arbitrary themes if swapping themes.
Local development
GitHub Pages builds the site automatically on push to master. For local preview:
gem install github-pages # one-time, mirrors GitHub Pages plugins
jekyll serve # serves on http://127.0.0.1:4000/
Gemfile/Gemfile.lock are gitignored — install gems globally or generate a Gemfile locally.
Adding a post
Create a file in _posts/ named YYYY-M-D-slug-or-Title.md (the existing corpus mixes lower-case-dashed and Title-Case-Dashed; either works). Required front-matter:
---
layout: post
title: Post Title
---
The URL path is derived from title via permalink: /:title/ in _config.yml, not from the filename slug. When linking between posts, use the title-derived path (e.g., ../fedex-sucks/), not the filename.
Architecture
Standard Jekyll Now layout — nothing custom beyond a Google Analytics snippet injected in _layouts/default.html:
_config.yml— site name, description, footer social links, kramdown/rouge settings.url: "https://mvysny.github.io"andbaseurl: ""(user site, no project path, no custom domain)._layouts/—default.html(masthead + footer wrapper, loadsstyle.css, embeds GA tagG-F8ZSX2CWKG),post.html,page.html._includes/—meta.html,svg-icons.html(footer social icons driven byfooter-linksin_config.yml),analytics.html,disqus.html._sass/—_reset.scss,_variables.scss,_highlights.scss(rouge/pygments theme),_svg-icons.scss. Imported by top-levelstyle.scss.index.html— home page, lists all posts with excerpts in reverse chronological order.images/— post images and site assets.
Conventions observed in existing posts
- Markdown with GFM, fenced code blocks, rouge highlighting (
css_class: 'highlight'). - Cross-post links use the permalink slug (the title-derived one), commonly as a relative link from another post:
[text](../other-post-title/). - Images referenced from
/images/<subdir>/<file>.