Use when user wants to review, edit, expand, or publish draft blog posts
View all blog posts, manage drafts, and quickly add content to existing posts from any repo.
/blog → Show dashboard of all posts/blog <query> → Find and work on a specific postThis skill requires BLOG_CONTENT_DIR to be set in your CLAUDE.md:
## Blog Configuration
BLOG_CONTENT_DIR=/path/to/your/blog/content/directory
Example: BLOG_CONTENT_DIR=/Users/you/portfolio/src/content/blog
If not configured: Ask the user where their blog markdown files are located before proceeding.
First, check if BLOG_CONTENT_DIR is set in the project's or user's CLAUDE.md.
If NOT set, ask the user:
Where are your blog posts located?
Please provide the absolute path to your blog content directory
(e.g., /Users/you/site/content/blog)
You can also add this to your CLAUDE.md to skip this prompt:
BLOG_CONTENT_DIR=/your/path/here
Store their answer and use it for the rest of the session.
Scan the blog directory for ALL markdown files (not just drafts):
cd {BLOG_CONTENT_DIR}
ls *.md 2>/dev/null
For each file, extract metadata from frontmatter:
title - Post titledate - Publication/creation datedraft - Boolean (true = draft, false/missing = published)tags - Array of tagsdescription - Brief summaryCheck if the user provided a search query with the command.
/blog) → Go to Step 3 (Dashboard)/blog tauri) → Go to Step 4 (Fuzzy Search)Show all posts grouped by status:
Blog Dashboard
==============
DRAFTS ({N})
1. {title} ({date}) [{tags}]
2. {title} ({date}) [{tags}]
PUBLISHED ({M})
3. {title} ({date})
4. {title} ({date})
Enter number to work on post, or 'q' to quit:
Sort each group by date descending (newest first).
If no posts found:
No blog posts found in {BLOG_CONTENT_DIR}.
Use /note from any project to create your first draft.
After user selects a post, go to Step 5 (Show Actions).
When the user provides a search query (e.g., /blog tauri):
Search these fields (case-insensitive):
Matching logic:
Results:
If single match:
Found: {title} ({draft status})
[Go directly to Step 5 - Show Actions]
If multiple matches:
Found {N} posts matching "{query}":
1. {title} ({draft/published})
2. {title} ({draft/published})
...
Which one? (enter number)
If no matches:
No posts found matching "{query}".
Try a different search term, or use /blog to see all posts.
After selecting a post, read its full content and show options.
For DRAFT posts:
Selected: {title}
Status: Draft
Date: {date}
Tags: {tags}
What would you like to do?
1. Add content - Append new learnings to this post
2. Expand - Flesh out existing content with more detail
3. Edit - Make specific changes
4. Publish - Set draft: false and commit
5. View - Show full content
6. Delete - Remove this draft
7. Back - Return to dashboard
For PUBLISHED posts:
Selected: {title}
Status: Published
Date: {date}
Tags: {tags}
What would you like to do?
1. Add content - Append new learnings to this post
2. Edit - Make specific changes
3. Unpublish - Set draft: true (hide from site)
4. View - Show full content
5. Back - Return to dashboard
This is the key action for quickly appending learnings from any repo.
What would you like to add to "{title}"?
(Paste or describe new content, code snippets, learnings, etc.)
Where should this content go?
1. End of post (default)
2. After a specific section (I'll show you the headings)
3. Let me decide based on content
Added to "{title}":
---
[new content preview]
---
Full post updated. Commit changes? (y/n)
cd {BLOG_CONTENT_DIR}
git add {filename}
git commit -m "update: {title}"
draft: true to draft: falsecd {BLOG_CONTENT_DIR}
git add {filename}
git commit -m "post: {title}"
git push
Output:
Published: {title}
Location: {BLOG_CONTENT_DIR}/{filename}
Committed and pushed to main.
draft: truecd {BLOG_CONTENT_DIR}
git add {filename}
git commit -m "unpublish: {title}"
Show the full post content in a readable format.
cd {BLOG_CONTENT_DIR}
rm {filename}
git add -A .
git commit -m "remove: {title}"
After each action, ask:
Would you like to work on another post? (y/n)
If yes, return to Step 3 (Dashboard).
/blog
Blog Dashboard
==============
DRAFTS (1)
1. Building Floating macOS UI with Tauri (2025-01-03) [tauri, macos]
PUBLISHED (2)
2. Hello World (2024-12-15)
3. The Million Dollar Bet (2024-12-10)
Enter number to work on post, or 'q' to quit: 1
Selected: Building Floating macOS UI with Tauri
Status: Draft
What would you like to do?
1. Add content
2. Expand
3. Edit
4. Publish
5. View
6. Delete
7. Back
> 4
Updating draft status...
Published: Building Floating macOS UI with Tauri
Committed and pushed to main.
# While working in a different project
/blog tauri
Found: Building Floating macOS UI with Tauri (draft)
What would you like to do?
1. Add content
2. Expand
3. Edit
4. Publish
5. View
6. Delete
7. Back
> 1
What would you like to add to "Building Floating macOS UI with Tauri"?
> Just discovered you can use `window.setAlwaysOnTop(true)` for floating windows.
> Also the `decorations: false` config removes the title bar completely.
Where should this content go?
1. End of post (default)
2. After a specific section
3. Let me decide
> 1
Added to "Building Floating macOS UI with Tauri":
---
## Additional Tips
Just discovered you can use `window.setAlwaysOnTop(true)` for floating windows.
Also the `decorations: false` config removes the title bar completely.
---
Commit changes? (y/n) y
Committed: update: Building Floating macOS UI with Tauri
Would you like to work on another post? n
Done!
/blog javascript
Found 2 posts matching "javascript":
1. ESM vs CommonJS Dynamic Imports (draft)
2. Modern JavaScript Patterns (published)
Which one? 1
Selected: ESM vs CommonJS Dynamic Imports
Status: Draft
[shows actions...]
Before publishing, ensure:
BLOG_CONTENT_DIR in your CLAUDE.md for convenience/blog <query> for quick access to specific posts from any repo