npm scripts for build, lint, test, or typecheck. Do not invent npm run ... commands here.assets/css/main.css through jekyll-postcss-v2. Keep the empty front matter at the top of that file or Jekyll will stop treating it as a page to process.assets/js/main.js by jekyll-esbuild, configured in _config.yml under esbuild.files.jekyll-postcss-v2 in Gemfile/Gemfile.lock (S8A/jekyll-postcss-v2 on branch feature/change_hook_to_site_post_write). Do not replace it with the upstream gem unless the user asks.bundle install and npm install.bundle exec jekyll serve --drafts.docker compose up. The container already runs npm install && jekyll serve --drafts.JEKYLL_ENV=production NODE_ENV=production bundle exec jekyll build --verbose.master, using Ruby 3.3, Node 20, and apt packages listed in .apt._config.yml: _open_source, _websites, _desktop, _mathematics, _misc_projects, plus _posts for the blog.projects.html and the home page derive project listings from site.documents and _data/project_collections.yml; highlighted project cards come from collection documents with highlight: true.blog/index.html and _config.yml (paginate: 12, paginate_path: "/blog/:num/").layout: jupyter-notebook, which bypasses the default Tailwind layout and uses the committed assets/css/jupyter-*.css files instead._site/; it is generated and ignored._layouts/default.html; the Tailwind stylesheet and bundled JS are linked there., which depends on jekyll-thumbnail-img` to generate width variants. Preserve that pattern when changing image markup.