CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
What this is
Michael Wallbaum’s personal site, mwallba.io: plain Jekyll with no theme, built natively by GitHub Pages from main (there’s no Actions workflow, so a push deploys it). The repo is effizient-io/mwallba.io and it’s private. README.md holds the full background: DNS, the cutover, and the history of old URLs. Read it before changing URLs or hosting.
This is a verification page, not a marketing page. People arrive already knowing the name, from a search, an LLM answer, or a link somewhere else. Nothing on the page asks for anything: no contact form, no address, no availability line. Keep it that way. The prose uses plain hyphens ( - ), not em dashes.
Commands
bundle install
bundle exec jekyll serve # http://127.0.0.1:4000
bundle exec jekyll build # output in _site/
The github-pages gem pins the Jekyll 3.x and plugin versions that GitHub actually runs. Don’t add plugins outside the Pages whitelist, because they won’t run in production. There are no tests or linters.
How the pieces connect
- Identity is driven by config.
profilesandpersonin_config.ymlfeed three outputs at once: the Elsewhere list inindex.html, therel="me"links, and thesameAsarray in the Person JSON-LD (_includes/person-schema.html, included from_layouts/default.html). Onlyidentity: trueprofiles go intosameAs, because it means “this is the same person”. A URL of"#"is skipped. llms.txtis a hand-written plain-text copy of the homepage. It restates the Now/Before prose fromindex.html, so when the homepage bio changes, updatellms.txtto match.robots.txtallows every crawler on purpose.- Posts fall into two lists, split by
archived: true./archive/(archive.html) shows onlyarchived: trueposts. These are the 2020 pieces, republished because people still link to them. They carry anote:front-matter field that_layouts/post.htmlrenders as an aside about what has changed since./writing/(writing.html) shows every other post. The homepage footer link to Writing appears only once a non-archived post exists.- Never set
archived: trueon new writing.
- New post: add
_posts/YYYY-MM-DD-slug.mdwithlayout: post,title,excerpt(a single sentence, shown on the listings and in the feed) anddate. The URL, listing, sitemap and feed all follow from that. - CSS:
assets/style.cssis global.assets/post.cssloads only forlayout: postor for pages that setextra_css: true. - Social card:
index.htmlsetsimage:in its own front matter, because jekyll-seo-tag reads it there and not from site config. - Dates:
last_modified_atin front matter feeds the sitemaplastmodanddateModified. Onindex.htmlit also renders the footer’s “Updated” line, so bump it whenever the homepage changes.
URLs are load-bearing
Inbound links from earlier versions of the site still point here, so:
- Leave
permalink: /:title/alone unless you also addredirect_fromentries for the old form. - Old addresses are kept alive through
redirect_from(jekyll-redirect-from):/about/and/page2/redirect to the homepage./posts/and/blog/redirect to/archive/. A listing should go to a listing, because sending it to the homepage looks like a soft 404.- The dated
/YYYY/MM/DD/slug/forms redirect to the clean post URLs.
/feed.xml(jekyll-feed) and/sitemap.xmlmust keep those exact paths.CNAMEmust stay in the repo root.