plugins/blog-generator/skills/blog-generator/SKILL.md
Transform technical notes into blog posts. Use when user says "blog-generator", "/blog-generator", "블로그 글 작성", "블로그로 변환", "write a blog post", "turn this into a blog", or provides technical content to convert into blog format.
npx skillsauth add jaykim88/claude-ai-engineering blog-generatorInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Transforms technical notes, memos, and documentation into well-structured blog posts with narrative flow, engaging introductions, and reader-friendly explanations.
English:
Korean:
Extract the content source from user message:
| Input Type | Detection | Action |
|---|---|---|
| File path | Contains .md, /path/to/, or ~ pattern | Read file using Read tool |
| URL | Contains https:// or http:// | Fetch using WebFetch tool |
| Direct text | Raw text content in message | Use text directly |
| IDE selection | Content in ide_selection tags | Use selected content |
Examples:
/blog-generator ~/notes/rag-explained.md → Read file/blog-generator https://example.com/article → Fetch URL/blog-generator "RAG는 질문에 답하기 전에..." → Direct textIf no content detected:
Ask user: "블로그로 변환할 내용을 제공해주세요. 파일 경로, URL, 또는 텍스트를 입력할 수 있습니다."
Ask the user 3 questions using a single AskUserQuestion call with all 3 questions:
AskUserQuestion(
questions=[
{
"question": "Who is the target audience for this blog post?",
"header": "Audience",
"options": [
{"label": "Beginner (Recommended)", "description": "입문자. 기본 개념부터 친절하게 설명"},
{"label": "Intermediate", "description": "실무자. 핵심 개념은 알지만 깊이 있는 설명 필요"},
{"label": "Advanced", "description": "시니어/전문가. 심화 내용과 트레이드오프 중심"}
],
"multiSelect": false
},
{
"question": "What tone and style should the blog post have?",
"header": "Tone",
"options": [
{"label": "Tutorial (Recommended)", "description": "단계별 학습 가이드. 따라하기 쉬운 구성"},
{"label": "Professional", "description": "기술 문서 스타일. 정확하고 간결한 톤"},
{"label": "Conversational", "description": "대화체. 친근하고 읽기 편한 스타일"}
],
"multiSelect": false
},
{
"question": "Which language should the blog post be written in?",
"header": "Language",
"options": [
{"label": "Korean (Recommended)", "description": "한국어로 작성. 기술 용어는 영문 병기"},
{"label": "English", "description": "Written entirely in English"},
{"label": "Mixed (Ko+En)", "description": "한영 혼용. 헤더는 영어, 본문은 한국어"}
],
"multiSelect": false
}
]
)
If config.yaml exists, show config defaults in the recommended labels. If user skips or selects defaults, use config values.
Read ~/.claude/skills/blog-generator/config.yaml:
output_dir: "~/Documents/blog/posts"
default_language: "ko"
default_audience: "intermediate"
default_tone: "tutorial"
auto_commit: false
auto_push: false
If config not found: Use these defaults and continue without asking. The output directory will be created automatically.
Apply interview answers: Override config defaults with user's interview selections.
Analyze the raw input to extract:
| Category | What to Extract | |---|---| | Core Topic | Main subject and its significance | | Key Concepts | Individual concepts/ideas that need explanation | | Logical Flow | Best order for progressive understanding | | Code Blocks | Code snippets to preserve verbatim | | Diagrams/Tables | Visual elements to keep or enhance | | Analogies | Existing analogies to expand; opportunities for new ones | | Complexity Level | How technical the content is |
Generate an outline (internal, not shown to user):
1. Hook/Introduction angle: [what relatable scenario to start with]
2. Section breakdown:
- Section A: [concept] → [explanation approach]
- Section B: [concept] → [explanation approach]
- ...
3. Code example placement: [where code fits in the narrative]
4. Conclusion angle: [how to wrap up with takeaways]
Write the blog post following this template structure. Adapt sections based on content — not every section is required for every post.
---
title: "[SEO-Friendly, Engaging Title]"
date: YYYY-MM-DD # Must run `date '+%Y-%m-%d'` to get exact date. Never estimate.
tags: [tag1, tag2, tag3]
read_time: "N min read"
audience: "beginner|intermediate|advanced"
---
# [Title - Same as frontmatter or slightly different for H1]
> **TL;DR**: [1-2 sentence summary of the entire post. What will the reader learn?]
## Introduction
[Hook: Start with a relatable scenario, question, or problem statement that the reader can connect with. NOT a dry "In this post, we'll cover..." opener.]
[Bridge: Connect the hook to the main topic. Why should the reader care?]
[Preview: Brief mention of what the post covers, without being a boring list.]
---
## [Main Section 1 - Core Concept]
[Explain the core concept with narrative flow. Use analogies to make abstract ideas concrete.]
[If there's a diagram or visual representation in the original, preserve or enhance it:]
[ASCII diagram or description for Mermaid conversion]
### [Subsection if needed]
[Deeper dive into a specific aspect]
---
## [Main Section 2 - How It Works / Implementation]
[Step-by-step explanation with context for WHY each step exists, not just WHAT it does.]
### Code Example
[Introduce the code with context — what problem it solves:]
```language
[Original code preserved verbatim]
[After code: explain key parts, highlight important lines, mention gotchas. Do NOT just repeat what the code says — add insight the reader wouldn't get from reading the code alone.]
[Real-world scenarios where this applies. Be specific, not generic.]
| Use Case | Description | Example | |---|---|---| | ... | ... | ... |
[Only include if the source material has warnings, limitations, or gotchas]
[3-5 bullet points summarizing the most important things the reader should remember]
[Optional: Author note or call-to-action]
**Writing Guidelines by Audience:**
| Audience | Explanation Depth | Jargon | Analogies | Code |
|---|---|---|---|---|
| **Beginner** | Explain everything from basics | Define all terms | Many, relatable | Full context, every line explained |
| **Intermediate** | Skip basics, focus on how/why | Use freely, explain niche terms | Selective | Key parts explained, assume basics |
| **Advanced** | Focus on tradeoffs, edge cases | Expert-level OK | Minimal, technical | Architecture-level, patterns |
**Writing Guidelines by Tone:**
| Tone | Opening | Transitions | Code Explanation | Closing |
|---|---|---|---|---|
| **Tutorial** | "Let's build..." | "Now that we've..., let's..." | Step-by-step walkthrough | "You've now learned..." |
| **Professional** | "[Topic] enables..." | Clear section headers | Concise annotation | "Key considerations..." |
| **Conversational** | "Ever wondered...?" | "So here's the thing..." | "This part is cool because..." | "That's the gist of it!" |
**Code Block Rules:**
- **NEVER modify** the original code. Preserve exactly as-is
- **ADD** explanatory comments only if the original lacks them
- **EXPAND** the explanation around the code (before/after paragraphs)
- **FORMAT** properly with language tag for syntax highlighting
---
### Step 6: Generate Filename
**Format**: `YYYY-MM-DD-{topic-slug}.md`
**Slug rules:**
- Lowercase, kebab-case
- Max 5-6 words
- Descriptive and SEO-friendly
- No language prefix (unlike ai-digest's "ai-" prefix)
**Examples:**
- `2026-02-19-understanding-rag-retrieval-augmented-generation.md`
- `2026-02-19-building-rest-api-with-fastapi.md`
- `2026-02-19-kubernetes-pod-networking-explained.md`
---
### Step 7: Save Document
**Save location**: `{output_dir}/{filename}`
**Create directory if needed:**
```bash
mkdir -p {output_dir}
Use Write tool to save the markdown file.
Default output: ~/Documents/blog/posts/YYYY-MM-DD-{slug}.md
Only if auto_commit: true in config:
cd "$output_dir"
git add "$filename"
git commit -m "Add blog post: $title
Co-Authored-By: Claude Opus 4.6 <[email protected]>"
If auto_push: true, also run:
git push
Show the user:
Blog post generated!
File: {full_path}
Title: {title}
Read time: {N} min
Audience: {audience}
Tone: {tone}
Language: {language}
Tags: {tag1}, {tag2}, {tag3}
Want me to adjust the tone, expand a section, or make any changes?
| Scenario | Response |
|---|---|
| No content provided | Ask user to provide file path, URL, or text |
| File not found | Error: File not found at {path}. Please check the path. |
| File is empty | Error: File is empty. Please provide content to convert. |
| URL fetch fails | Error: Cannot fetch URL. Please paste the content directly. |
| Content too short (< 100 chars) | Warning: Content is very short. The blog post may be brief. Proceed? |
| Write permission denied | Error: Cannot write to {path}. Check permissions or provide a different output path. |
| Config not found | Use defaults silently. Do not interrupt the flow. |
| Git not initialized | Warning: {output_dir} is not a git repo. Document saved but not committed. |
Located at ~/.claude/skills/blog-generator/config.yaml:
# Output directory for generated blog posts (absolute path)
output_dir: "~/Documents/blog/posts"
# Default language: ko (Korean), en (English), mixed (Korean+English)
default_language: "ko"
# Default audience: beginner, intermediate, advanced
default_audience: "intermediate"
# Default tone: tutorial, professional, conversational
default_tone: "tutorial"
# Auto-commit to git after saving
auto_commit: false
# Auto-push to remote (requires auto_commit: true)
auto_push: false
User: /blog-generator ~/notes/rag-explained.md
Claude: [Reads file, asks 3 interview questions]
[Generates blog post]
Blog post generated!
File: ~/Documents/blog/posts/2026-02-19-understanding-rag-retrieval-augmented-generation.md
Title: "RAG 완전 정복: LLM에게 오픈북 시험을 치르게 하는 방법"
Read time: 8 min
Audience: beginner
Tone: tutorial
Language: Korean
User: 블로그로 변환해줘
"Docker는 컨테이너 기반 가상화 기술이다.
VM과 달리 OS를 공유하므로 가볍다.
이미지 → 컨테이너 → 실행의 흐름..."
Claude: [Asks interview questions, generates blog post]
File: ~/Documents/blog/posts/2026-02-19-docker-container-basics-explained.md
User: /blog-generator https://blog.example.com/kubernetes-networking
Claude: [Fetches content, asks interview questions, generates blog post]
File: ~/Documents/blog/posts/2026-02-19-kubernetes-pod-networking-explained.md
development
Design webhooks correctly on both sides — sending (HMAC signing, retries with backoff, at-least-once) and receiving (verify signature on raw body, enqueue + 200 fast, dedupe on event id). Use when adding webhook delivery or consuming a provider's webhooks. Not for internal service-to-service events (use async-messaging) or general outbound-call retry policy (use resilience-patterns).
testing
Use transactions and isolation levels correctly — keep them short, no network calls inside, explicit isolation, retry on serialization conflicts, and choose optimistic vs pessimistic locking. Use when a write spans multiple tables, when concurrent updates corrupt data, or when designing money/inventory flows. Not for cross-service event delivery (use async-messaging Outbox) or schema-level constraints (use schema-design).
development
Backend testing pyramid — unit for pure logic, integration against a real DB (Testcontainers), and consumer-driven contract testing (Pact) for service boundaries. Use before a feature, after a bug fix, or when services break each other on deploy. Not for load testing (use performance-profiling) or security testing (use backend-security-audit).
data-ai
Design a relational schema — normalize to 3NF then denormalize with justification, choose the right Postgres index type per data shape, enforce constraints at the DB. Use when modeling a new domain, when queries are slow, or before a migration. Not for diagnosing slow queries (use query-optimization) or shipping the change without downtime (use migration-strategy).