Skip to content
Back to skills

Blog From Chat

ASecurity

Turn a chat log, conversation or discussion summary into a publishable blog post, in one or more languages. Use for "blog from this chat" or "write up our conversation".

  • 4 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added September 29, 2026
ai-agentspythongogit

Works with

  • terminal
  • mcp

Security analysis

A100/100

Scanned September 29, 2026

npx -y skills add furkankoykiran/.claude --skill blog-from-chat --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Blog From Chat?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Blog From Chat
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/furkankoykiran-blog-from-chat/badge)](https://www.skillsdirectory.com/skills/furkankoykiran-blog-from-chat)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: blog-from-chat
description: Turn a chat log, conversation or discussion summary into a publishable blog post, in one or more languages. Use for "blog from this chat" or "write up our conversation".
---

# Blog from Chat Summary (Generic)

This skill generates a blog post from a chat summary. It supports Turkish, English, or both languages.

**Generic Design**: Works for any user with GitHub auth. Reads configuration from memory.

## Input

Chat summary provided as `$ARGUMENTS`.

## Configuration (Read from Config & Memory)

Before starting, read `~/.claude/config.json` for:
- `BLOG_DIR` - Blog directory path (from `paths.blog_dir`)
- `USERNAME` - GitHub username (from `user.username`)
- `DEFAULT_LANGUAGE` - Default language setting (from `blog.default_language`)

Fallback detection:
- If config doesn't exist: Use `mcp__github__get_me()["login"]` and ask user for blog_dir

## Workflow

### Step 1: Ask Language Preference (FIRST)

Use AskUserQuestion to ask:
```
Blog gönderisi hangi dilde olsun?

1. Türkçe
2. İngilizce
3. Hem Türkçe hem İngilizce (iki ayrı post)
```

**Default**: Option 1 (Turkish) if not specified.

### Step 2: Learn Writing Style

Read the last 2-3 blog posts from `$BLOG_DIR/_posts/` to understand:
- Tone and voice (friendly, professional, first-person)
- Structure (Problem → Solution → Implementation → Results)
- Formatting patterns
- Image placement (~1 image per 50 lines)

### Step 3: Generate Frontmatter

Based on the chat summary, create appropriate frontmatter:

```yaml
---
title: "Generated Title"
description: "Brief 1-2 sentence description"
date: YYYY-MM-DD HH:MM:SS +0300
categories: [Category1, Category2]
tags: [tag1, tag2, tag3, tag4]
image:
  path: /assets/img/YYYY-MM-DD-slug/banner.png
  alt: "Banner image description"
---
```

### Step 4: Estimate Line Count

Calculate and show estimate:
```python
# Estimate based on chat summary length
estimated_lines = len(chat_summary.split()) / 3  # Rough estimate

print(f"Tahmini blog uzunluğu: ~{estimated_lines} satır")
print("Onaylıyor musunuz? Veya tercih ettiğiniz aralığı belirtin (örn: 200-250 satır)")
```

Wait for user confirmation or preferred range.

### Step 5: Write Blog Content

Generate blog content in the selected language following the learned style.

**Adjust length** based on user's preferred range if specified.

### Step 6: Find and Download Images

Use your configured image-search MCP (e.g. a Google / Bing image-search MCP server):
1. Search for banner image (main topic related)
2. Search for inline images (~1 per 50 lines of content)
3. Download all images to `$BLOG_DIR/assets/img/YYYY-MM-DD-slug/`
4. Use format: `banner.png`, `image1.png`, `image2.png`, etc.

Skip this step if no image-search MCP is configured.

### Step 7: Show Draft

Display the complete draft in the terminal using fenced code blocks.

### Step 8: Wait for User Approval

Ask user: "Taslak onaylanıyor mu? Blog dosyası oluşturulsun mu?"

### Step 9: Write Blog File (On Approval)

If approved:
1. Create the file at `$BLOG_DIR/_posts/YYYY-MM-DD-slug.md`
2. If bilingual: Create two files (`-tr.md` and `-en.md`)

### Step 10: Create DEV.to Draft (Optional)

Skip this step entirely if no DEV.to publishing MCP is configured. Otherwise, use it to create the article draft:
- Set `published: false`
- Use appropriate tags (max 4)
- Include frontmatter as description

### Step 11: Ask for DEV.to Publish Approval

Ask user: "DEV.to'da publish edilsin mi?"

### Step 12: Publish to DEV.to (On Approval)

Update the draft to `published: true` via the same MCP used in Step 10.

## Critical Requirements

- **Generic Design**: No hardcoded usernames or paths
- **Read config from config.json**: User settings in `~/.claude/config.json`
- **Auto-detect username**: Use `config["user"]["username"]` or fallback to `mcp__github__get_me()["login"]`
- **Language selection is FIRST question** - always ask before generating content
- **Read previous blog posts** to match writing style
- **Show draft first** - never auto-write files
- **Separate approvals** for file write and DEV.to publish
- **Default to Turkish** unless user specifies otherwise
- **Download images** to correct directory structure if an image-search MCP is configured

## Image Guidelines

- Banner: 1200x630px PNG
- Inline images: Every ~50 lines
- Save to: `$BLOG_DIR/assets/img/YYYY-MM-DD-slug/`
- Always include alt text

## Memory Reference

**Config Path**: `~/.claude/config.json`
This file contains user settings (username, blog directory, language).

## Variables Used

```python
# Read from config or auto-detect
from lib.config import get_config
config = get_config()
USERNAME = config["user"]["username"] or mcp__github__get_me()["login"]
BLOG_DIR = config["paths"]["blog_dir"]

# Derived paths
POSTS_DIR = f"{BLOG_DIR}/_posts/"
IMAGES_DIR = f"{BLOG_DIR}/assets/img/"
```

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.