From dev-blog-writer
This skill should be used when the user asks to "write a blog post", "draft a dev blog", "write about a feature", "draft a post", "build in public", "announce a feature", "write up", "newsletter", "viết blog", "viết bài", "đăng bài", "chia sẻ", "tản mạn", "write a Facebook post", "post to Threads", "social media post", "short post", "quick update", or wants to share their building journey, explain a technical decision, or announce something about their product. Also use when the user asks for "blog outlines", "post ideas", "improving a draft", or "publish this". Supports Substack, Medium, Hashnode, Dev.to, Ghost, Facebook, and Threads. Handles build-in-public updates, technical deep-dives, announcements, studio/process posts, social posts, and product teasers. Supports English, Vietnamese, or mixed language. Even if the user just says "I want to write something about X" or "mình muốn viết về X", this skill should be triggered.
How this skill is triggered — by the user, by Claude, or both
Slash command
/dev-blog-writer:dev-blog-writerThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Help makers, founders, and dev teams write posts that sound human, earn technical respect, and turn readers into users. Supports blog posts, social media posts, and everything in between — in English, Vietnamese, or mixed.
references/anti-ai-voice.mdreferences/feedback-engine.mdreferences/mcp-integration.mdreferences/platform-diagram-support.mdreferences/platforms/devto.mdreferences/platforms/facebook.mdreferences/platforms/ghost.mdreferences/platforms/hashnode.mdreferences/platforms/medium.mdreferences/platforms/reddit.mdreferences/platforms/substack.mdreferences/platforms/threads.mdreferences/platforms/viblo.mdreferences/post-templates.mdreferences/presets/example.jsonreferences/vietnamese-voice.mdreferences/visual-diagrams.mdscripts/setup.mdHelp makers, founders, and dev teams write posts that sound human, earn technical respect, and turn readers into users. Supports blog posts, social media posts, and everything in between — in English, Vietnamese, or mixed.
The skill's own directory is read-only when installed as a plugin. All user data files (config.json, voice-profile.json) must be stored in a writable data directory, not alongside SKILL.md.
How to resolve the data directory:
config.json by checking these paths in order:
<workspace>/.claude/dev-blog-writer/config.json (the primary writable location)<skill-directory>/config.json (legacy — if found here, migrate it to the writable location)<workspace>/.claude/dev-blog-writer/ and run first-time setup.In Cowork, <workspace> is typically the mounted user directory (the parent of .claude/). Use mkdir -p to create the data directory if it doesn't exist.
Throughout this skill, "data directory" always means <workspace>/.claude/dev-blog-writer/. All references to saving config.json or voice-profile.json mean saving to this writable location — never to the skill's own read-only directory.
On first use (no config.json exists in the data directory), run the setup flow:
<workspace>/.claude/dev-blog-writer/scripts/setup.md for the interactive setup questionsconfig.json in the data directoryIf config.json exists in the data directory, load it silently at the start. The user can re-run setup anytime by saying "reconfigure blog settings" or "change my blog setup".
Check references/presets/ for example configs the user can start from.
Read config.json from the data directory to understand who you're writing for. It contains:
Use this context to personalize every post. Never ask for info that's already in the config.
If voice-profile.json exists in the data directory, load it silently alongside config.json. It contains writing preferences the skill has learned from previous feedback — tone rules, vocabulary preferences, structural patterns, and platform-specific notes.
Apply all voice profile rules before writing any draft. They layer on top of the voice principles below and can override them — the user's actual voice always trumps generic guidelines. See references/feedback-engine.md for the full schema and how rules are applied.
If voice-profile.json doesn't exist, that's fine — it gets created automatically in the data directory on the first feedback interaction. Don't create it during setup.
When the user wants to write a post:
Determine the post size and platform (skip what you already know from config):
Clarify the basics (skip what you already know from config):
Load the right references (only what you need for this post):
references/post-templates.md for the matching post type and sizereferences/platforms/ matching the targetreferences/anti-ai-voice.md before writing any draftreferences/vietnamese-voice.mdreferences/visual-diagrams.md for diagram guidanceDraft the post following the loaded template, platform rules, language settings, and anti-AI-voice guidelines.
For long posts: Write the headline last. Draft 3-5 options after the body is done. For short posts, the hook IS the headline — write it first.
For long posts: Identify diagram opportunities. After drafting, review the post and proactively suggest 1-2 sections where a Mermaid diagram would improve comprehension. Read references/visual-diagrams.md for the content-type-to-diagram mapping and references/platform-diagram-support.md for the correct output format per platform. Only suggest — don't generate until the user agrees. For short/medium posts, skip this step unless the user explicitly asks for a diagram.
Check the opening. Read the first 3 sentences (or first 2 lines for short posts). Would you keep reading if this showed up in your feed? If not, rewrite them.
Deliver the post in the appropriate format for the platform (see Output formats below). If diagrams were generated, include them in the correct format for the target platform (Mermaid code block for Dev.to/Hashnode/Viblo, PNG for all others). See references/platform-diagram-support.md.
Collect feedback (adaptive). How you ask depends on the confidence level for this post's context (platform + size + post type). Read references/feedback-engine.md for the full logic — here's the short version:
learning (default for new contexts): Ask for detailed feedback. "How does this feel? Anything you'd change about the tone, word choices, structure, or opening? Or is this good to go?"calibrated (4+ consecutive approvals): Ask lightly. "Anything to tweak, or good to go?"confident (8+ consecutive approvals): Skip asking. Just deliver and add: "If anything feels off, just let me know."When feedback arrives, classify it and respond:
voice-profile.json, reset approval streak for this context, revise the draft, and re-deliver. If already at confident level, first ask: "Got it — should I treat this as your new default going forward, or just for this post?"Repeat the feedback-revise cycle until the user approves. Then proceed to publishing.
Offer to publish if MCP publishing is configured (see Publishing section below).
Offer cross-platform versions if the user publishes to multiple platforms. A blog post can become a Facebook teaser, a Threads thread, etc.
These are in addition to the voice principles above. Vietnamese writing has its own rhythm.
Read references/vietnamese-voice.md for the full guide before writing any Vietnamese content.
The single most important reference file is references/anti-ai-voice.md. It contains specific patterns that make writing sound machine-generated and how to avoid them — for both English and Vietnamese. Read it before writing any draft. This is what separates a useful post from one readers scroll past.
After drafting, offer to publish directly if MCP tools are available. Read references/mcp-integration.md for the full workflow.
Quick publishing flow:
search_mcp_registry) for publishing connectorsFacebook Groups note: Facebook deprecated group posting API in April 2024. For groups, generate copy-paste ready content in plain text format.
Cross-posting: When publishing to multiple platforms, publish to the primary (blog) first, then adapt and publish social versions with canonical URLs.
Load these on demand, not all at once:
| File | When to load |
|---|---|
references/anti-ai-voice.md | Before writing ANY draft |
references/feedback-engine.md | When processing feedback or updating voice profile |
references/vietnamese-voice.md | When writing in Vietnamese or mixed language |
references/post-templates.md | When you need structure for a specific post type/size |
references/visual-diagrams.md | When writing long posts (800+ words) — diagram type mapping, Mermaid guidelines, language rules |
references/platform-diagram-support.md | When generating diagrams — rendering matrix per platform |
references/platforms/substack.md | When writing for Substack |
references/platforms/medium.md | When writing for Medium |
references/platforms/hashnode.md | When writing for Hashnode |
references/platforms/devto.md | When writing for Dev.to |
references/platforms/ghost.md | When writing for Ghost |
references/platforms/viblo.md | When writing for Viblo |
references/platforms/reddit.md | When writing for Reddit |
references/platforms/facebook.md | When writing for Facebook (Pages or Groups) |
references/platforms/threads.md | When writing for Threads |
references/mcp-integration.md | When publishing or setting up publishing |
<data-dir>/config.json | At the start of every session |
<data-dir>/voice-profile.json | At the start of every session (if it exists) |
scripts/setup.md | Only during first-time setup or reconfiguration |
references/presets/*.json | Only during setup, as starting templates |
Deliver as a markdown file containing:
.png files and .mermaid source files alongside the markdown.Deliver as a markdown file containing:
Deliver as a markdown file (.md) optimized for Reddit's editor, containing:
## headers not #, no inline images)For posts with diagrams: include externally-hosted image links. Note if a link post to the blog would be better due to heavy visual content. See references/platforms/reddit.md for full formatting rules and strategy.
Deliver as a plain text file (.txt) containing:
For Threads threads, deliver numbered posts (1/N, 2/N, etc.).
When the user publishes to multiple platforms, offer to generate all versions:
Save each as a separate file with clear naming: post-title-substack.md, post-title-reddit.md, post-title-facebook.txt, post-title-threads.txt.
Provides behavioral guidelines to reduce common LLM coding mistakes, focusing on simplicity, surgical changes, assumption surfacing, and verifiable success criteria.
Searches, retrieves, and installs Agent Skills from prompts.chat registry using MCP tools like search_skills and get_skill. Activates for finding skills, browsing catalogs, or extending Claude.
npx claudepluginhub unknown-studio-dev/dev-blog-writer --plugin dev-blog-writer