CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Project Overview
This is the Kittysplit blog (blog.kittysplit.com), a Jekyll 4.4 static site hosted on GitHub Pages. Deploying is done by pushing to the main branch.
Commands
- Install dependencies:
bundle - Run locally:
bundle exec jekyll serve --port 3000 - Run with drafts:
bundle exec jekyll serve --drafts --port 3000 - Generate title image:
npm run generate:title -- scripts/configs/<post-slug>.json
Architecture
_posts/— Published blog posts (Markdown with YAML front matter)_drafts/— Unpublished draft posts_layouts/—default.html(base),post.html,page.html_includes/— Reusable partials (analytics, social icons, twitter plug)style.css/highlighting-style.css— Site styles (Sass compiled by Jekyll)images/— Post images, organized by date subdirectories (e.g.,images/2026-02-11/)scripts/— Title image generator (Playwright + HTML template). Shared logo assets live inscripts/assets/, per-post configs inscripts/configs/.
Blog Post Conventions
- Posts use the naming format
YYYY-MM-DD-slug.md - Front matter requires
layout: postandtitle;imageis optional (used for social cards) - Use
<!-- read-more -->to mark excerpt boundaries (configured asexcerpt_separatorin_config.yml) - Permalinks follow the
/:title/pattern - Date format in prose is
dd.mm.YYYY(e.g. 11.03.2026) - Images are stored in
images/<date>/and referenced with kramdown attributes for sizing:{: width="320"} - Capitalisation: always capitalise Kittysplit and Kitty (the name for a shared expense group)
- Tone: easy going and friendly — like chatting with a friend, not a press release. No corporate speak, no buzzwords. Keep it casual and genuine.
- Structure: don’t over-structure with headers. Match the flow of existing posts.
Writing a New Post
When asked to create a new post, follow these steps in order:
- Research. Use WebSearch/WebFetch to gather context about the topic. Skim 2–3 posts from
_posts/dated 2024 or earlier to internalise voice and tone. If anything about the topic is unclear, ask before writing. - Write. Create
_posts/YYYY-MM-DD-<slug>.mdusing the conventions above. Front matter example:--- layout: post title: "Your Title Here" image: /images/YYYY-MM-DD/<name>-title.png --- - Humanise. Run
/humaniseron the finished draft to strip AI writing patterns. Mandatory — don’t skip. - Generate the title image (see the Title Images section below). Reference it in the front matter
image:and inline at the top of the body. - Verify. Run
bundle exec jekyll build --futureand fix any errors it reports.
Title Images
Every new post gets a title image generated by scripts/generate-title-image.mjs. Do not hand-pick or reuse an image from elsewhere.
- Drop the post’s screenshot (e.g. a phone shot) into
images/YYYY-MM-DD/. - Create
scripts/configs/YYYY-MM-DD-<slug>.jsonwith this shape:{ "output": "images/YYYY-MM-DD/<name>-title.png", "screenshot": "images/YYYY-MM-DD/<screenshot>.png", "scheme": "blue", "slots": { "eyebrow": "New · <short label>", "title": "First line of headline,", "accent": "second line.", "subtitle": "One or two natural sentences. Avoid em dashes.", "url": "https://www.kittysplit.com" } }schemeis optional — pick"blue"(indigo gradient, sky-blue accent) or"cyan"(teal gradient, orange accent). Defaults toblue. - Run
npm run generate:title -- scripts/configs/YYYY-MM-DD-<slug>.json. - Reference the generated image in the post’s front matter (
image:) and inline at the top of the body.
All paths in the config are resolved from the repo root. The template lives in scripts/title-template.html.
Plugins
jekyll-sitemap— Auto-generates sitemap.xmljekyll-seo-tag— SEO meta tags and social cards