From alemtuzlak-skills
Writes SEO-optimized blog posts from PRs, git diffs, marketing briefs, codebase paths, or freeform technical descriptions.
npx claudepluginhub alemtuzlak/skills --plugin alemtuzlak-skillsThis skill uses the workspace's default tool permissions.
Write high-quality blog posts from code changes, marketing briefs, or feature descriptions. Handles SEO, structure, tone matching, and visual content.
Writes, edits, and optimizes technical blog posts including tutorials, deep dives, postmortems, benchmarks; transforms brain dumps into polished dev content.
Generates technical blog posts on codebase features, analyzing git history, implementations, and challenges with code snippets. Applies anti-AI writing guides for natural tone.
Enforces Sentry's blog writing standards for technical posts, product announcements, and engineering deep-dives. Ensures precise, opinionated voice, banned phrases avoidance, and problem-first structure.
Share bugs, ideas, or general feedback.
Write high-quality blog posts from code changes, marketing briefs, or feature descriptions. Handles SEO, structure, tone matching, and visual content.
Resolve the argument (if provided) in this order:
.md containing "Executive Summary" or "Key Messages") → marketing brief#\d+ pattern → PR... or .. → git ref rangeIf no argument is provided, ask: "What should I write about? You can provide a marketing brief path, PR URL/number, git ref range (e.g. v1.0...v2.0), file/directory path, or just describe the topic."
If multiple interpretations match, confirm with the user.
digraph blog_post {
rankdir=TB;
"Resolve input" [shape=box];
"Phase 1: Discovery" [shape=box];
"Phase 2: Research" [shape=box];
"Phase 3: Configure" [shape=box];
"Phase 4: Outline" [shape=box];
"Outline approved?" [shape=diamond];
"Phase 5: Write" [shape=box];
"Phase 6: Output" [shape=box];
"Resolve input" -> "Phase 1: Discovery";
"Phase 1: Discovery" -> "Phase 2: Research";
"Phase 2: Research" -> "Phase 3: Configure";
"Phase 3: Configure" -> "Phase 4: Outline";
"Phase 4: Outline" -> "Outline approved?";
"Outline approved?" -> "Phase 4: Outline" [label="no, revise"];
"Outline approved?" -> "Phase 5: Write" [label="yes"];
"Phase 5: Write" -> "Phase 6: Output";
}
Do NOT skip phases. Ask questions at a natural pace. Don't overwhelm, but don't artificially slow things down either. If the user answers multiple questions at once, accept their bundled answers and skip ahead.
If the user says "just pick defaults", "you choose", or similar, pick reasonable defaults based on context, state what you chose, and ask for a single confirmation before proceeding.
Never make assumptions without confirming.
| Input type | What to read |
|---|---|
| Marketing brief | Read the brief - extract problem statement, value prop, audience, key messages, competitive positioning. Still do Step 2 if the brief lacks product context, then proceed to Step 3. |
| PR | Diff, PR description, review comments, commit messages (gh pr view, gh pr diff). For large PRs (20+ files), focus on user-facing changes. |
| Git refs | git diff and git log between the refs. For large ranges, prioritize commit messages and user-facing changes. |
| Codebase feature | Read the specified files/directories. |
| Freeform text | Parse the user's description. If it lacks specifics (no feature name, no value prop, no context), ask the user to provide more detail or point to a specific file/PR. Fall back to open-ended questions only if they can't. |
User-facing changes include: new features, UI changes, API changes, performance improvements, bug fixes, and documentation updates. Internal changes include: refactors, test additions, CI changes, and dependency bumps. When uncertain, list what you found and ask the user which are relevant.
Error handling:
gh not installed/authenticated → inform user, suggest gh auth login, offer alternative inputRead if they exist: README, docs/, package.json (or equivalent), marketing references.
Goal: understand what the product is, who it's for, what it does.
If nothing found, ask: "I couldn't find product context in the repo. Can you briefly describe the product and who it's for?"
"Here's what I understand:"
- Feature A - short description
- Feature B - short description
"Which of these should the blog post cover? Anything to add, remove, or correct?"
Ask as many questions as needed to fully understand the scope. Do NOT proceed until the user confirms.
Scan for: breaking changes, deprecations, security fixes, migration requirements.
If found, flag each and ask how to frame them before proceeding.
Before configuring the post, search for similar blog posts in the space:
If WebSearch is unavailable, skip this phase and rely on your own knowledge.
Present a brief summary to the user:
"I found some similar posts in the space. Here's what I noticed:"
- [Key findings about what works]
- [Content gaps / opportunities]
- [SEO keyword opportunities]
"I'll use these insights to shape the post."
Ask these questions:
Q1 - Audience: "Who is this blog post for?" (developers, end users, technical decision-makers, general audience, other)
Q2 - Tone: Read existing blog posts, README, and docs in the repo to detect the product's voice. Then confirm:
"Based on your existing content, the tone seems [e.g. conversational and developer-friendly]. Should I match that or go a different direction?"
If no existing content to analyze, ask directly what tone the user wants.
Q3 - Post type: Based on the input and audience, recommend a post type and confirm:
"Given the [input/audience], I'd recommend a [type] post because [reason]. Sound right?"
Q4 - CTA: Infer the most appropriate call to action from context:
"I'd suggest the CTA be: [inferred CTA]. Want to go with that or something different?"
Q5 - Involvement level: "How involved do you want to be in the writing process?"
Generate a structured outline:
## [Working title]
1. **Hook/Introduction** - [approach: question/statistic/bold statement/story]
- Key point to establish
- Transition to body
2. **Section Name** - [purpose]
- Key points
- Estimated word count
3. **Section Name** - [purpose]
- Key points
- Estimated word count
[...as many sections as needed]
N. **Conclusion** - [summary + CTA]
- Key takeaway to reinforce
- CTA: [specific action]
Estimated total: ~X words
If involvement level is A, generate the outline internally without showing it. For B and C, present it and wait for approval.
For each section:
If involvement level is C, present each section after self-review and get confirmation before proceeding. For A and B, run this process silently.
After the body is complete, generate 3-5 headline options using different formulas:
Recommend one and explain why it works best for this post's audience, SEO, and context. Also explain the trade-offs of the others.
For involvement levels B and C, present the options and get the user's selection before proceeding. For level A, use your recommendation.
Prioritize readability over SEO constraints. Write the best headline first. If it doesn't fit the 50-60 char SEO title limit, craft a separate shorter title tag for the frontmatter.
Generate as YAML frontmatter at the top of the post:
---
title: "[Selected headline]"
meta_description: "[140-160 chars, includes primary keyword, compelling value prop]"
primary_keyword: "[main target keyword]"
secondary_keywords: ["keyword1", "keyword2", "keyword3"]
long_tail_keywords: ["longer phrase 1", "longer phrase 2"]
slug: "[url-friendly-slug]"
---
Rules:
The intro has three components:
Keep the intro to 3-5 short paragraphs. No walls of text.
Generate directly when possible:
For images that need external creation:
<!-- TODO: Add image here -->
<!-- Suggestion: [description of what the image should show] -->
<!-- LLM prompt: "[ready-to-use prompt for an image generation model, e.g. 'A clean, minimal illustration showing a dashboard with dark mode toggle, flat design style, developer tool aesthetic, 16:9 ratio']" -->

Use visuals wherever they help comprehension - after explaining a complex concept, when comparing options, or when showing UI changes.
For developer audiences, include at least one code example showing the feature in action. Prefer minimal, runnable snippets (5-15 lines). Show before/after when demonstrating an improvement.
After all sections are written and the headline is selected, assemble the complete post (frontmatter + body).
For B and C, if the user requests revisions, make them and present again. Only proceed to output once the user approves.
Detect existing blog directory first. Check for:
content/blog/, src/pages/blog/, _posts/, blog/, posts/, articles/If found, use that directory. If not, default to blog/posts/.
Present to the user:
"I'll save this to
[detected-or-default-path]/<slug>.md. Want it somewhere else, or should I skip saving and just print it?"
Create the directory if it doesn't exist.
If file already exists: ask whether to overwrite or create a versioned copy.
gh not available → inform user, offer alternative inputblog/posts/, create it/social-copy for that)/marketing-brief for that)