# Content Blog

> Generate a blog post from source materials (text, PDFs, images, transcripts). Use when user wants to create a blog post or article.

- Skill: `isaac-flath/content-blog` (Agent Skill, multi-file: 5 files)
- Install (CLI): `npx skillmds@latest add isaac-flath/content-blog`
- Raw SKILL.md: https://api.skillmd.com/api/skills/isaac-flath/content-blog/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: Isaac-Flath (https://skillmd.com/u/isaac-flath)
- Updated: 2026-09-22
- Page: https://skillmd.com/skills/isaac-flath/content-blog

---


# /content-blog

Generate a blog post using the gemini-3 skill for multimodal content.

## Usage

```
/content-blog
```

## Before Running

If `source/*.mp4` exists but `content/transcript.md` doesn't, run `/content-transcribe` first.

## Working Directory

Run from the monorepo root. The script finds the linked post in `posts/` automatically based on the project directory name.

## Source Materials

Accepts any combination from the project directory:
- `source/*.txt` or `source/*.md` (text files)
- `source/*.pdf` (PDFs)
- `source/*.png`, `source/*.jpg` (images)
- `content/transcript.md` (video transcript)
- `content/description.md` (video description/chapters)
- `screenshots/` (video screenshots, extracted on-demand)

## Run

```bash
# Generate blog post from project, writes to posts/
uv run .claude/skills/content-blog/scripts/generate_blog.py posts/<id>

# Specify a different Gemini model
uv run .claude/skills/content-blog/scripts/generate_blog.py posts/<id> --model gemini-2.5-pro
```

## How It Works

The script:
1. Gathers all source materials from the project directory
2. Builds a comprehensive prompt using Jinja2 templates
3. Calls the `/gemini-3` skill with the prompt and all multimodal files
4. Saves the generated blog post to `posts/<slug>/blog.md` with `draft: true`

## Screenshots

Screenshots must be extracted separately using `/content-screenshot` before or after blog generation.

1. Identify timestamps from the transcript/chapters that need visual illustration
2. Run `/content-screenshot` with those timestamps
3. Reference in the blog: `![Description](screenshots/screenshot-01m30s.png)`

## Output

Saves to `posts/<slug>/blog.md` (as a draft).

## Post-Generation Editing

After the blog is generated, run two Zinsser editing passes using gemini-3 to tighten the prose.

Read `writing-with-zinsser.md` from the wiki directory for the full style guide, then run two passes:

```bash
POST="posts/YYYY-MM-DD-slug/blog.md"
STYLE="writing-with-zinsser.md"  # from wiki --add-dir

# First pass
uv run .claude/skills/gemini-3/scripts/query.py \
  "Review this blog post and apply Zinsser's writing principles. Return only the improved post, no commentary." \
  --context "$STYLE" \
  --context "$POST" \
  --model gemini-2.5-pro > "${POST}.tmp"
mv "${POST}.tmp" "$POST"

# Second pass (catches clutter the first pass missed)
uv run .claude/skills/gemini-3/scripts/query.py \
  "Review this blog post and apply Zinsser's writing principles. Return only the improved post, no commentary." \
  --context "$STYLE" \
  --context "$POST" \
  --model gemini-2.5-pro > "${POST}.tmp"
mv "${POST}.tmp" "$POST"
```

> **agentkb users:** Search for richer results: `agentkb search -s wiki "Zinsser writing style principles"`

## Customizing Style

- `writing-with-zinsser.md` in the wiki directory — Full Zinsser guide
- `.claude/skills/content-blog/references/prompts/blog-generation.md` — Blog formatting instructions

