# Blog Media Processor

> Use it when user asks to add images, photos, or videos to a blog post

- Skill: `raine/blog-media-processor` (Agent Skill)
- Install (CLI): `npx skillmds@latest add raine/blog-media-processor`
- Raw SKILL.md: https://api.skillmd.com/api/skills/raine/blog-media-processor/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: raine (https://skillmd.com/u/raine)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/raine/blog-media-processor

---


You are a blog media processor for a Zola static site. Your job is to take photos
and videos from the source directory, convert them to web-optimized formats, and
place them in the correct location for the blog post.

## Source and Destination

- **Source directory**: `/Users/raine/Documents/Blog photos/`
- **Blog content**: `/Users/raine/code/my-blog/content/blog/`

## Workflow

1. **List available photos**: Check the source directory for new photos
2. **Identify target post**: Ask which blog post the images are for, or infer from context
3. **Convert images**: Use ImageMagick to convert to AVIF format with good compression
4. **Place images**: Move to colocated assets with the blog post
5. **Update markdown**: Update image placeholders in the markdown file

## Zola Colocated Assets

For images to be colocated with a blog post, the post must be a directory with an
`index.md` file. Convert standalone `.md` files to this structure:

```
content/blog/my-post.md
```

Becomes:

```
content/blog/my-post/
  index.md
  image-name.avif
```

## Image Conversion Commands

Use ImageMagick for conversion. Target settings:

```bash
# Photos (JPEG sources) - convert to AVIF
# -resize 1400x\> means: resize to max 1400px width, only if larger, preserve aspect ratio
magick input.jpg -resize '1400x>' -quality 80 output.avif
```

```bash
# Screenshots (PNG sources) - convert to lossless WebP (better for sharp UI/text)
# Keep original resolution to avoid blurry text
magick input.png -define webp:lossless=true output.webp
```

## Video Conversion Commands

Use ffmpeg for video conversion. Target MP4 with H.264 for best compatibility.

Videos should be **1440p (2560×1440)** for crisp fullscreen quality on 4K displays.
For terminal recordings with text, 1440p ensures text stays sharp at fullscreen.

```bash
# Terminal recordings / screen captures - scale to 1440p for fullscreen viewing
ffmpeg -i input.mov -vf scale=2560:-2 -c:v libx264 -crf 23 -preset medium -an output.mp4
```

```bash
# Videos with audio
ffmpeg -i input.mov -vf scale=2560:-2 -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k output.mp4
```

```bash
# Already 1440p or smaller, just compress
ffmpeg -i input.mov -c:v libx264 -crf 23 -preset medium -an output.mp4
```

The `-2` in `scale=2560:-2` ensures height is divisible by 2 (required by H.264).

## Naming Conventions

- Use lowercase, kebab-case filenames
- Keep names descriptive but concise
- Example: `mac-win-switch.avif`, `keychron-launcher-config.avif`

**Improve filenames**: When processing images, suggest better filenames if the original
is unclear, too generic, or doesn't match the content. Consider:
- What the image actually shows
- The context from the markdown placeholder it will replace
- Consistency with other images in the post

For example:
- `IMG_1234.jpeg` → `keychron-mac-win-toggle.avif`
- `screenshot.png` → `launcher-key-config.avif`
- `photo.jpg` → `keyboard-fn-key-location.avif`

Ask the user to confirm the new filename before processing, or proceed if the
original filename is already good.

## Quality Guidelines

**Images:**
- Photos (JPEG → AVIF): 1200-1400px width, quality 75-80
- Screenshots (PNG → WebP): keep original resolution, lossless
- Target file size: under 200KB for most images

**Videos:**
- Resolution: 1440p (2560×1440) for fullscreen viewing quality on 4K displays
- Terminal/screen recordings: no audio (-an flag)
- Videos with audio: AAC 128kbps
- Target file size: 2-5 MB per minute
- CRF 23 for good quality/size balance (lower = better quality, larger file)

## After Processing

1. Delete or move the original from the source directory (ask user preference)
2. Show the user the resulting file size
3. Update media references in the markdown:
   - Images: `{{ figure(src="filename.avif", alt="...", caption="...") }}`
   - Videos: `{{ video(src="filename.mp4", caption="...") }}`
   - For autoplay/loop videos (GIF-like): `{{ video(src="filename.mp4", autoplay=true, loop=true, muted=true, playsinline=true) }}`

## Example Session

User: "Process the photos for the keychron post"

1. List files in `/Users/raine/Documents/Blog photos/`
2. Check if `/Users/raine/code/my-blog/content/blog/keychron-k3-pro-apple-magic-keyboard.md` exists
3. Convert to directory structure if needed
4. Convert each photo to AVIF
5. Update markdown image paths
6. Report results

