From blog-writer
Interview-driven blog post creator that writes in your voice and strips AI tells
npx claudepluginhub zate/cc-plugins --plugin blog-writerThis skill is limited to using the following tools:
Create blog posts through a guided conversational workflow. Interviews you about your topic, captures your voice from how you answer, writes a draft matching your tone, removes AI patterns, and publishes as markdown or HTML.
Writes or edits structured blog posts (800-1200 words) with sections, referencing published posts and guidelines to avoid repetition and match voice.
Generates publication-ready blog posts from topics or sources: listicles, tutorials, how-to guides, narratives, thought leadership. Handles research, outlining, drafting, SEO, polishing.
Writes, edits, and optimizes technical blog posts including tutorials, deep dives, postmortems, benchmarks; transforms brain dumps into polished dev content.
Share bugs, ideas, or general feedback.
Create blog posts through a guided conversational workflow. Interviews you about your topic, captures your voice from how you answer, writes a draft matching your tone, removes AI patterns, and publishes as markdown or HTML.
If $ARGUMENTS is provided, use it as the initial topic. Otherwise, start by asking for a topic in Phase 1.
Goal: Understand the topic AND capture how the user naturally communicates.
CRITICAL: Pay close attention to HOW the user answers — not just WHAT they say. Their word choices, sentence length, formality, humor, directness, and vocabulary ARE the voice profile.
Ask questions one group at a time using AskUserQuestion, then follow up with open-ended questions to capture natural voice.
AskUserQuestion:
questions:
- question: "What's this blog post about? Give me the elevator pitch."
header: "Topic"
multiSelect: false
options:
- label: "Technical tutorial"
description: "How-to, walkthrough, or guide"
- label: "Opinion / hot take"
description: "Your perspective on something in your field"
- label: "Story / experience"
description: "Something that happened, lessons learned"
- label: "Announcement / update"
description: "Product launch, project update, news"
- question: "Who are you writing this for?"
header: "Audience"
multiSelect: false
options:
- label: "Developers / technical"
description: "People who write code"
- label: "Business / leadership"
description: "Decision makers, managers"
- label: "General / mixed"
description: "Broad audience, no assumed expertise"
- label: "Community / peers"
description: "People in your specific niche"
These are open-ended to capture natural writing voice. Ask via AskUserQuestion with options that encourage free-text responses.
AskUserQuestion:
questions:
- question: "In your own words, what's the ONE thing you want readers to walk away knowing?"
header: "Core point"
multiSelect: false
options:
- label: "Let me type it out"
description: "Free-form answer (recommended — helps capture your voice)"
- label: "I'm not sure yet"
description: "We'll figure it out as we go"
- question: "What's your take on this topic that most people get wrong or overlook?"
header: "Your angle"
multiSelect: false
options:
- label: "Let me explain"
description: "Share your perspective in your own words"
- label: "No strong contrarian take"
description: "Straightforward coverage"
AskUserQuestion:
questions:
- question: "How do you want this to feel when someone reads it?"
header: "Tone"
multiSelect: false
options:
- label: "Casual & conversational"
description: "Like talking to a colleague over coffee"
- label: "Direct & no-nonsense"
description: "Get to the point, respect the reader's time"
- label: "Thoughtful & nuanced"
description: "Explore complexity, acknowledge tradeoffs"
- label: "Energetic & opinionated"
description: "Strong voice, not afraid to take a stance"
- question: "How long should this be?"
header: "Length"
multiSelect: false
options:
- label: "Short (500-800 words)"
description: "Quick read, punchy"
- label: "Medium (800-1500 words)"
description: "Standard blog length"
- label: "Long (1500-2500 words)"
description: "Deep dive, comprehensive"
- label: "Whatever it takes"
description: "Let the content dictate length"
After the interview, silently build a voice profile from the user's answers. Analyze:
Store this as an internal note — do NOT show the voice profile to the user. Just use it.
Goal: Structure the post before writing.
Generate an outline based on interview answers. Include:
Present the outline to the user:
AskUserQuestion:
questions:
- question: "Here's the outline. How does it look?"
header: "Outline"
multiSelect: false
options:
- label: "Looks good, write it (Recommended)"
description: "Proceed to drafting"
- label: "Tweak it"
description: "I have some changes"
- label: "Start over"
description: "This isn't what I had in mind"
If "Tweak it": Ask what to change, update outline, re-present. If "Start over": Return to Phase 1 interview.
Goal: Write the full blog post matching the user's voice.
Follow the voice profile from Phase 1. Additionally:
These patterns make writing sound like AI generated it. Never use them:
Write the draft and save it to a working file at .claude/blog-draft.md.
Goal: Run the draft through a dedicated agent that strips remaining AI patterns and polishes the voice.
Invoke the de-ai-writer agent with:
.claude/blog-draft.mdThe agent returns a cleaned version. Save to .claude/blog-polished.md.
Goal: User reviews the final draft, provides feedback, and chooses output format.
Present the polished draft in full (read from .claude/blog-polished.md).
AskUserQuestion:
questions:
- question: "How's the draft? Be honest."
header: "Review"
multiSelect: false
options:
- label: "Love it, publish (Recommended)"
description: "Export to final format"
- label: "Close but needs changes"
description: "Tell me what to adjust"
- label: "Rewrite sections"
description: "Specific sections need rework"
- label: "Start the draft over"
description: "Keep the outline, rewrite from scratch"
If changes needed: make edits, re-run Phase 4 de-AI pass, re-present.
When approved:
AskUserQuestion:
questions:
- question: "What format do you want?"
header: "Format"
multiSelect: false
options:
- label: "Markdown (.md) (Recommended)"
description: "Clean markdown file"
- label: "HTML (.html)"
description: "Styled HTML with embedded CSS"
- label: "Both"
description: "Generate both formats"
- question: "Where should I save it?"
header: "Location"
multiSelect: false
options:
- label: "Current directory"
description: "Save right here"
- label: "blog/ subdirectory"
description: "Create blog/ folder if needed"
- label: "Let me specify"
description: "I'll type a custom path"
Write clean markdown with:
# headingWrite a self-contained HTML file with:
After publishing, remove working files:
rm -f .claude/blog-draft.md .claude/blog-polished.md
Display the final file path and word count.
.claude/ — no cleanup needed, they're gitignored/blog or mentions creating blog content