|
| 1 | +# CLAUDE.md |
| 2 | + |
| 3 | +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. |
| 4 | + |
| 5 | +## About This Site |
| 6 | + |
| 7 | +Jekyll site for [example42.com](https://example42.com) — home of Example42's Puppet/DevOps consulting services and the **Abnormal DevOps Iterations (ADI)** podcast. Deployed via GitHub Pages. |
| 8 | + |
| 9 | +Media production assets (audio, video, transcripts, cover images) live in the sibling OneDrive workspace: `~/Library/CloudStorage/OneDrive-Personal/ADI/` |
| 10 | + |
| 11 | +## Local Development |
| 12 | + |
| 13 | +```bash |
| 14 | +# Via Docker (recommended — no local Ruby/Jekyll install needed) |
| 15 | +bash bin/docker_jekyll.sh |
| 16 | +# Serves at http://127.0.0.1:4001 with live reload |
| 17 | + |
| 18 | +# Or with local Ruby/Bundler |
| 19 | +bundle exec jekyll serve --config _config.yml,_config_dev.yml |
| 20 | +# Serves at http://127.0.0.1:4000 |
| 21 | +``` |
| 22 | + |
| 23 | +## Site Architecture |
| 24 | + |
| 25 | +| Path | Purpose | |
| 26 | +|------|---------| |
| 27 | +| `_episodes/` | ADI podcast episode pages (001.md, 002.md…) | |
| 28 | +| `_posts/` | Blog posts | |
| 29 | +| `_presentations/` | Tutorial/presentation pages | |
| 30 | +| `_layouts/` | Page layouts (Jekyll) | |
| 31 | +| `_includes/` | Reusable HTML partials | |
| 32 | +| `_config.yml` | Production config | |
| 33 | +| `_config_dev.yml` | Dev override — sets `url: http://127.0.0.1:4000` | |
| 34 | +| `AbnormalDevOpsIterations/img/` | Resized episode cover images | |
| 35 | + |
| 36 | +## Episode Pages (`_episodes/NNN.md`) |
| 37 | + |
| 38 | +Files are zero-padded: `001.md`, `022.md`. The layout `adi_humanintelligence` renders via `_layouts/adi_humanintelligence.html` → `_includes/adi_detail.html`. |
| 39 | + |
| 40 | +### Required Frontmatter |
| 41 | + |
| 42 | +```yaml |
| 43 | +--- |
| 44 | +number: '22' # string, matches the episode number |
| 45 | +layout: 'adi_humanintelligence' # always this value |
| 46 | +title: 'Episode title' |
| 47 | +date: 'YYYYMMDD' # e.g. 20250305 |
| 48 | +host: Alessandro Franceschi |
| 49 | +youtube: 'YouTubeVideoID' |
| 50 | +guest: # list (or bare string for single guest) |
| 51 | + - Guest Name |
| 52 | +tags: |
| 53 | + - Tag1 |
| 54 | + - Tag2 |
| 55 | +summary: "One-sentence summary, ~200 chars max, no names" |
| 56 | +quotes: |
| 57 | + - "Quote 1, ≤140 chars" |
| 58 | + - "Quote 2" |
| 59 | + - "Quote 3" |
| 60 | + - "Quote 4" |
| 61 | +--- |
| 62 | +Episode body text here. |
| 63 | +``` |
| 64 | + |
| 65 | +`guest` can be a bare string (`guest: Name`) or a YAML list. The template iterates over it with `{% for g in page.guest %}`. |
| 66 | + |
| 67 | +### Adding a New Episode |
| 68 | + |
| 69 | +1. Create `_episodes/NNN.md` with full frontmatter above |
| 70 | +2. Add cover image: run `bin/resize_pics.sh` to copy + resize from `ADI/Covers/ADI N.png` → `AbnormalDevOpsIterations/img/N.png` |
| 71 | +3. The episode URL will be `/AbnormalDevOpsIterations/NNN/` |
| 72 | + |
| 73 | +## Tooling Scripts |
| 74 | + |
| 75 | +| Script | What it does | |
| 76 | +|--------|-------------| |
| 77 | +| `bin/docker_jekyll.sh` | Serve site locally via Docker on port 4001 | |
| 78 | +| `bin/resize_pics.sh` | Resize ADI cover images and copy to site img dir | |
| 79 | +| `bin/get_quotes.py` | Generate `summary` + `quotes` frontmatter from a transcript file using OpenAI | |
| 80 | + |
| 81 | +### `get_quotes.py` usage |
| 82 | +```bash |
| 83 | +export OPENAI_API_KEY=... |
| 84 | +python3 bin/get_quotes.py /path/to/transcript.txt |
| 85 | +# Outputs YAML — paste into episode frontmatter |
| 86 | +``` |
0 commit comments