DevRel Content
This skill helps you create technical content that developers actually read: blog posts, tutorials, documentation, and thought leadership pieces that build trust and drive adoption.
Before You Start
Load your audience context first. Read .agents/developer-audience-context.md to understand:
- Who you're writing for (role, seniority, tech stack)
- Their pain points (what problems resonate)
- Verbatim language (how they describe things)
- Voice & tone (how formal/technical to be)
If the context file doesn't exist, run the developer-audience-context skill first.
The DevRel Content Framework
Phase 1: Research & Validation
Before writing anything, validate the topic is worth writing about.
| Research Type |
What to Do |
| Search intent |
Google your topic. What already ranks? What's missing? |
| Community signals |
Search Reddit, HN, Stack Overflow. Are developers asking about this? |
| Competitor gaps |
What have competitors written? What haven't they covered? |
| Internal data |
Support tickets, Discord questions, GitHub issues about this topic |
| Keyword research |
Use Ahrefs/SEMrush for search volume on technical terms |
Red flags — Don't write if:
- You're the only one who cares about this topic
- 10 identical articles already exist
- The topic is too broad ("Introduction to JavaScript")
- The topic is too narrow (no search volume, no community interest)
Phase 2: Content Type Selection
Choose the right format for your goal:
| Content Type |
Best For |
Structure |
| Tutorial |
Teaching a specific skill |
Step-by-step, code-heavy |
| Guide |
Covering a topic comprehensively |
Sections, reference material |
| Comparison |
Helping with decisions |
Table-based, pros/cons |
| Announcement |
Launching features/products |
News lead, what/why/how |
| Thought leadership |
Building authority |
Opinion, predictions, takes |
| Case study |
Social proof |
Problem → Solution → Results |
| Troubleshooting |
Solving specific errors |
Error → Cause → Fix |
Phase 3: Outline Structure
Use this outline template:
# [Title that promises specific value]
## Hook (2-3 sentences)
- State the problem or opportunity
- Establish credibility ("We migrated 10,000 repos...")
- Promise what the reader will learn
## Context (optional)
- Brief background if needed
- Link to prerequisites
## The Meat
### Section 1: [First major concept]
- Explanation
- Code example
- Common pitfall
### Section 2: [Second major concept]
- Explanation
- Code example
- Real-world application
### Section 3: [Third major concept]
- Explanation
- Code example
- Advanced tip
## Putting It Together
- Complete example
- Working code
## What's Next
- Links to deeper content
- Call to action (try the product, join Discord, etc.)
Writing Code Examples
Code is the content. Get it right.
The Copy-Paste Test
Every code example must:
| Requirement |
Why It Matters |
| Run without modification |
Developers will copy-paste. If it fails, you lose trust. |
| Include imports |
Don't assume they know which libraries to import. |
| Show output |
What should they see when it works? |
| Handle errors |
Real code has error handling. Show it. |
| Use real values |
No foo, bar, example.com unless necessary. |
Code Example Structure
First, install the dependencies:
\`\`\`bash
npm install your-library axios
\`\`\`
Now create a file called `fetch-data.js`:
\`\`\`javascript
// fetch-data.js
import { Client } from 'your-library';
import axios from 'axios';
const client = new Client({
apiKey: process.env.YOUR_API_KEY // Use environment variables
});
async function fetchUserData(userId) {
try {
const user = await client.users.get(userId);
console.log(`Fetched user: ${user.name}`);
return user;
} catch (error) {
console.error(`Failed to fetch user: ${error.message}`);
throw error;
}
}
// Example usage
fetchUserData('user_123')
.then(user => console.log(user))
.catch(err => process.exit(1));
\`\`\`
Run it:
\`\`\`bash
YOUR_API_KEY=sk_test_xxx node fetch-data.js
\`\`\`
Expected output:
\`\`\`
Fetched user: Jane Developer
{ id: 'user_123', name: 'Jane Developer', email: 'jane@example.dev' }
\`\`\`
Language-Specific Conventions
| Language |
Code Block |
Package Install |
Env Vars |
| JavaScript/Node |
javascript or js |
npm install |
process.env.VAR |
| TypeScript |
typescript or ts |
npm install |
process.env.VAR |
| Python |
python or py |
pip install |
os.environ['VAR'] |
| Go |
go |
go get |
os.Getenv("VAR") |
| Rust |
rust |
cargo add |
std::env::var("VAR") |
| Shell |
bash or shell |
N/A |
$VAR |
Technical Accuracy Checklist
Run through before publishing:
| Check |
How to Verify |
| Code runs |
Copy-paste every snippet and run it |
| Versions match |
Are you using the current library version? |
| Links work |
Click every link |
| Commands work |
Run every CLI command |
| Screenshots current |
Do UI screenshots match the current product? |
| No deprecated APIs |
Check if any APIs used are deprecated |
| Security review |
No hardcoded secrets, SQL injection, etc. |
| Peer review |
Have an engineer read it for accuracy |
SEO for Developer Content
Developers use Google differently than consumers.
Developer Search Patterns
| Pattern |
Example Searches |
| Error messages |
"TypeError: Cannot read property 'map' of undefined" |
| How to |
"how to deploy next.js to vercel" |
| Comparison |
"prisma vs typeorm 2024" |
| Best practices |
"typescript project structure best practices" |
| Alternatives |
"alternatives to firebase" |
| With |
"react with typescript tutorial" |
Technical SEO Checklist
| Element |
Best Practice |
| Title |
Include primary keyword, framework names, year if relevant |
| Meta description |
150 chars, include keyword, promise specific outcome |
| H1 |
Match or closely match title |
| H2s |
Include secondary keywords, make scannable |
| Code blocks |
Use proper syntax highlighting (helps featured snippets) |
| Internal links |
Link to related docs, tutorials, API reference |
| External links |
Link to official docs of tools mentioned |
| URL slug |
Lowercase, hyphens, include keyword |
Example Optimized Title
| Bad |
Good |
| "Using Our API" |
"How to Authenticate with the YourProduct API (Node.js)" |
| "Database Guide" |
"PostgreSQL Connection Pooling: Complete Guide with pgBouncer" |
| "Getting Started" |
"Getting Started with YourProduct: Your First API Call in 5 Minutes" |
Content Quality Signals
What separates great devrel content from mediocre:
Do This
- Show, don't tell — Code over prose
- Address the "why" — Not just how to do it, but when and why
- Acknowledge tradeoffs — Nothing is perfect; developers respect honesty
- Link to sources — Official docs, RFCs, related articles
- Include dates — "Updated March 2024" or version numbers
- Progressive disclosure — Start simple, add complexity
- Real examples — Production scenarios, not just hello world
Don't Do This
- Wall of text — Break up with code, headers, bullets
- Marketing speak — "Best-in-class," "seamless," "revolutionary"
- Assuming knowledge — Define acronyms, link to prerequisites
- Outdated content — Nothing worse than a 2019 tutorial with deprecated APIs
- Buried lede — Put the answer first, explanation second
- No code — Developers came for code, not prose
Content Templates
Blog Post Template
# [Specific, keyword-rich title]
[2-3 sentence hook: problem + promise]
## The Problem
[1 paragraph explaining the pain point]
## The Solution
[Brief explanation of your approach]
### Step 1: [Action]
[Explanation]
\`\`\`language
// Code
\`\`\`
### Step 2: [Action]
[Explanation]
\`\`\`language
// Code
\`\`\`
### Step 3: [Action]
[Explanation]
\`\`\`language
// Code
\`\`\`
## Complete Example
\`\`\`language
// Full working code
\`\`\`
## Troubleshooting
### [Common Error 1]
[Solution]
### [Common Error 2]
[Solution]
## What's Next
- [Link to deeper dive]
- [Link to related tutorial]
- [CTA: Try it yourself]
Comparison Post Template
# [Tool A] vs [Tool B]: [Specific Use Case] ([Year])
[1 paragraph: Who this comparison is for and what you'll learn]
## Quick Comparison
| Feature | Tool A | Tool B |
|---------|--------|--------|
| [Feature 1] | | |
| [Feature 2] | | |
| [Feature 3] | | |
## When to Choose [Tool A]
- [Scenario 1]
- [Scenario 2]
- [Scenario 3]
## When to Choose [Tool B]
- [Scenario 1]
- [Scenario 2]
- [Scenario 3]
## Deep Dive: [Specific Aspect]
### Tool A Approach
[Explanation + code]
### Tool B Approach
[Explanation + code]
## Our Recommendation
[Specific guidance based on use case]
Measuring Content Success
Metrics to Track
| Metric |
What It Tells You |
| Page views |
Reach (but vanity without context) |
| Time on page |
Engagement (are they reading?) |
| Scroll depth |
Did they read to the end? |
| Bounce rate |
Did they find what they needed? |
| Search rankings |
SEO performance |
| Backlinks |
Authority and reference value |
| Social shares |
Resonance (especially HN, Twitter, Reddit) |
| Conversion events |
Sign-ups, installs, docs clicks |
Content → Conversion Path
Track the journey:
- Search/social → Blog post
- Blog post → Docs / quickstart
- Docs → Sign up / install
- Sign up → Activation (first success)
Tools
| Tool |
Use Case |
| Octolens |
Monitor where your content gets shared (HN, Reddit, Twitter). Track competitor content performance. Find content ideas from developer conversations. |
| Grammarly / Hemingway |
Readability and grammar checking |
| Carbon / Ray.so |
Beautiful code screenshots |
| Excalidraw |
Technical diagrams |
| Loom |
Quick video walkthroughs |
| Ahrefs / SEMrush |
Keyword research and SEO tracking |
| Google Search Console |
Track search performance |
Related Skills
developer-audience-context — Foundation for knowing your readers
technical-tutorials — Deep dive into step-by-step content
developer-newsletter — Distributing content via email
developer-seo — Technical SEO optimization
hacker-news-strategy — Sharing content on HN effectively
1---2name: devrel-content-23description: When the user wants to create technical content for developers including blog posts, tutorials, and documentation. Trigger phrases include "write a blog post," "technical article," "developer content," "tutorial," "devrel content," "dev blog," "technical writing," or "content for developers."4---56# DevRel Content78This skill helps you create technical content that developers actually read: blog posts, tutorials, documentation, and thought leadership pieces that build trust and drive adoption.910---1112## Before You Start1314**Load your audience context first.** Read `.agents/developer-audience-context.md` to understand:1516- Who you're writing for (role, seniority, tech stack)17- Their pain points (what problems resonate)18- Verbatim language (how they describe things)19- Voice & tone (how formal/technical to be)2021If the context file doesn't exist, run the `developer-audience-context` skill first.2223---2425## The DevRel Content Framework2627### Phase 1: Research & Validation2829Before writing anything, validate the topic is worth writing about.3031| Research Type | What to Do |32|--------------|------------|33| **Search intent** | Google your topic. What already ranks? What's missing? |34| **Community signals** | Search Reddit, HN, Stack Overflow. Are developers asking about this? |35| **Competitor gaps** | What have competitors written? What haven't they covered? |36| **Internal data** | Support tickets, Discord questions, GitHub issues about this topic |37| **Keyword research** | Use Ahrefs/SEMrush for search volume on technical terms |3839**Red flags** — Don't write if:40- You're the only one who cares about this topic41- 10 identical articles already exist42- The topic is too broad ("Introduction to JavaScript")43- The topic is too narrow (no search volume, no community interest)4445### Phase 2: Content Type Selection4647Choose the right format for your goal:4849| Content Type | Best For | Structure |50|-------------|----------|-----------|51| **Tutorial** | Teaching a specific skill | Step-by-step, code-heavy |52| **Guide** | Covering a topic comprehensively | Sections, reference material |53| **Comparison** | Helping with decisions | Table-based, pros/cons |54| **Announcement** | Launching features/products | News lead, what/why/how |55| **Thought leadership** | Building authority | Opinion, predictions, takes |56| **Case study** | Social proof | Problem → Solution → Results |57| **Troubleshooting** | Solving specific errors | Error → Cause → Fix |5859### Phase 3: Outline Structure6061Use this outline template:6263```markdown64# [Title that promises specific value]6566## Hook (2-3 sentences)67- State the problem or opportunity68- Establish credibility ("We migrated 10,000 repos...")69- Promise what the reader will learn7071## Context (optional)72- Brief background if needed73- Link to prerequisites7475## The Meat76### Section 1: [First major concept]77- Explanation78- Code example79- Common pitfall8081### Section 2: [Second major concept]82- Explanation83- Code example84- Real-world application8586### Section 3: [Third major concept]87- Explanation88- Code example89- Advanced tip9091## Putting It Together92- Complete example93- Working code9495## What's Next96- Links to deeper content97- Call to action (try the product, join Discord, etc.)98```99100---101102## Writing Code Examples103104Code is the content. Get it right.105106### The Copy-Paste Test107108Every code example must:109110| Requirement | Why It Matters |111|------------|----------------|112| **Run without modification** | Developers will copy-paste. If it fails, you lose trust. |113| **Include imports** | Don't assume they know which libraries to import. |114| **Show output** | What should they see when it works? |115| **Handle errors** | Real code has error handling. Show it. |116| **Use real values** | No `foo`, `bar`, `example.com` unless necessary. |117118### Code Example Structure119120```markdown121First, install the dependencies:122123\`\`\`bash124npm install your-library axios125\`\`\`126127Now create a file called `fetch-data.js`:128129\`\`\`javascript130// fetch-data.js131import { Client } from 'your-library';132import axios from 'axios';133134const client = new Client({135 apiKey: process.env.YOUR_API_KEY // Use environment variables136});137138async function fetchUserData(userId) {139 try {140 const user = await client.users.get(userId);141 console.log(`Fetched user: ${user.name}`);142 return user;143 } catch (error) {144 console.error(`Failed to fetch user: ${error.message}`);145 throw error;146 }147}148149// Example usage150fetchUserData('user_123')151 .then(user => console.log(user))152 .catch(err => process.exit(1));153\`\`\`154155Run it:156157\`\`\`bash158YOUR_API_KEY=sk_test_xxx node fetch-data.js159\`\`\`160161Expected output:162163\`\`\`164Fetched user: Jane Developer165{ id: 'user_123', name: 'Jane Developer', email: 'jane@example.dev' }166\`\`\`167```168169### Language-Specific Conventions170171| Language | Code Block | Package Install | Env Vars |172|----------|-----------|-----------------|----------|173| JavaScript/Node | `javascript` or `js` | `npm install` | `process.env.VAR` |174| TypeScript | `typescript` or `ts` | `npm install` | `process.env.VAR` |175| Python | `python` or `py` | `pip install` | `os.environ['VAR']` |176| Go | `go` | `go get` | `os.Getenv("VAR")` |177| Rust | `rust` | `cargo add` | `std::env::var("VAR")` |178| Shell | `bash` or `shell` | N/A | `$VAR` |179180---181182## Technical Accuracy Checklist183184Run through before publishing:185186| Check | How to Verify |187|-------|---------------|188| **Code runs** | Copy-paste every snippet and run it |189| **Versions match** | Are you using the current library version? |190| **Links work** | Click every link |191| **Commands work** | Run every CLI command |192| **Screenshots current** | Do UI screenshots match the current product? |193| **No deprecated APIs** | Check if any APIs used are deprecated |194| **Security review** | No hardcoded secrets, SQL injection, etc. |195| **Peer review** | Have an engineer read it for accuracy |196197---198199## SEO for Developer Content200201Developers use Google differently than consumers.202203### Developer Search Patterns204205| Pattern | Example Searches |206|---------|-----------------|207| **Error messages** | "TypeError: Cannot read property 'map' of undefined" |208| **How to** | "how to deploy next.js to vercel" |209| **Comparison** | "prisma vs typeorm 2024" |210| **Best practices** | "typescript project structure best practices" |211| **Alternatives** | "alternatives to firebase" |212| **With** | "react with typescript tutorial" |213214### Technical SEO Checklist215216| Element | Best Practice |217|---------|--------------|218| **Title** | Include primary keyword, framework names, year if relevant |219| **Meta description** | 150 chars, include keyword, promise specific outcome |220| **H1** | Match or closely match title |221| **H2s** | Include secondary keywords, make scannable |222| **Code blocks** | Use proper syntax highlighting (helps featured snippets) |223| **Internal links** | Link to related docs, tutorials, API reference |224| **External links** | Link to official docs of tools mentioned |225| **URL slug** | Lowercase, hyphens, include keyword |226227### Example Optimized Title228229| Bad | Good |230|-----|------|231| "Using Our API" | "How to Authenticate with the YourProduct API (Node.js)" |232| "Database Guide" | "PostgreSQL Connection Pooling: Complete Guide with pgBouncer" |233| "Getting Started" | "Getting Started with YourProduct: Your First API Call in 5 Minutes" |234235---236237## Content Quality Signals238239What separates great devrel content from mediocre:240241### Do This242243- **Show, don't tell** — Code over prose244- **Address the "why"** — Not just how to do it, but when and why245- **Acknowledge tradeoffs** — Nothing is perfect; developers respect honesty246- **Link to sources** — Official docs, RFCs, related articles247- **Include dates** — "Updated March 2024" or version numbers248- **Progressive disclosure** — Start simple, add complexity249- **Real examples** — Production scenarios, not just hello world250251### Don't Do This252253- **Wall of text** — Break up with code, headers, bullets254- **Marketing speak** — "Best-in-class," "seamless," "revolutionary"255- **Assuming knowledge** — Define acronyms, link to prerequisites256- **Outdated content** — Nothing worse than a 2019 tutorial with deprecated APIs257- **Buried lede** — Put the answer first, explanation second258- **No code** — Developers came for code, not prose259260---261262## Content Templates263264### Blog Post Template265266```markdown267# [Specific, keyword-rich title]268269[2-3 sentence hook: problem + promise]270271## The Problem272273[1 paragraph explaining the pain point]274275## The Solution276277[Brief explanation of your approach]278279### Step 1: [Action]280281[Explanation]282283\`\`\`language284// Code285\`\`\`286287### Step 2: [Action]288289[Explanation]290291\`\`\`language292// Code293\`\`\`294295### Step 3: [Action]296297[Explanation]298299\`\`\`language300// Code301\`\`\`302303## Complete Example304305\`\`\`language306// Full working code307\`\`\`308309## Troubleshooting310311### [Common Error 1]312[Solution]313314### [Common Error 2]315[Solution]316317## What's Next318319- [Link to deeper dive]320- [Link to related tutorial]321- [CTA: Try it yourself]322```323324### Comparison Post Template325326```markdown327# [Tool A] vs [Tool B]: [Specific Use Case] ([Year])328329[1 paragraph: Who this comparison is for and what you'll learn]330331## Quick Comparison332333| Feature | Tool A | Tool B |334|---------|--------|--------|335| [Feature 1] | | |336| [Feature 2] | | |337| [Feature 3] | | |338339## When to Choose [Tool A]340341- [Scenario 1]342- [Scenario 2]343- [Scenario 3]344345## When to Choose [Tool B]346347- [Scenario 1]348- [Scenario 2]349- [Scenario 3]350351## Deep Dive: [Specific Aspect]352353### Tool A Approach354[Explanation + code]355356### Tool B Approach357[Explanation + code]358359## Our Recommendation360361[Specific guidance based on use case]362```363364---365366## Measuring Content Success367368### Metrics to Track369370| Metric | What It Tells You |371|--------|------------------|372| **Page views** | Reach (but vanity without context) |373| **Time on page** | Engagement (are they reading?) |374| **Scroll depth** | Did they read to the end? |375| **Bounce rate** | Did they find what they needed? |376| **Search rankings** | SEO performance |377| **Backlinks** | Authority and reference value |378| **Social shares** | Resonance (especially HN, Twitter, Reddit) |379| **Conversion events** | Sign-ups, installs, docs clicks |380381### Content → Conversion Path382383Track the journey:3841. Search/social → Blog post3852. Blog post → Docs / quickstart3863. Docs → Sign up / install3874. Sign up → Activation (first success)388389---390391## Tools392393| Tool | Use Case |394|------|----------|395| **[Octolens](https://octolens.com)** | Monitor where your content gets shared (HN, Reddit, Twitter). Track competitor content performance. Find content ideas from developer conversations. |396| **Grammarly / Hemingway** | Readability and grammar checking |397| **Carbon / Ray.so** | Beautiful code screenshots |398| **Excalidraw** | Technical diagrams |399| **Loom** | Quick video walkthroughs |400| **Ahrefs / SEMrush** | Keyword research and SEO tracking |401| **Google Search Console** | Track search performance |402403---404405## Related Skills406407- `developer-audience-context` — Foundation for knowing your readers408- `technical-tutorials` — Deep dive into step-by-step content409- `developer-newsletter` — Distributing content via email410- `developer-seo` — Technical SEO optimization411- `hacker-news-strategy` — Sharing content on HN effectively