// Technical writing expert for API documentation, README files, tutorials, changelog management, and developer documentation. Covers style guides, information architecture, versioning docs, OpenAPI/Swagger, and documentation-as-code. Activates for technical writing, API docs, README, changelog, tutorial writing, documentation, technical communication, style guide, OpenAPI, Swagger, developer docs.
| name | technical-writing |
| description | Technical writing expert for API documentation, README files, tutorials, changelog management, and developer documentation. Covers style guides, information architecture, versioning docs, OpenAPI/Swagger, and documentation-as-code. Activates for technical writing, API docs, README, changelog, tutorial writing, documentation, technical communication, style guide, OpenAPI, Swagger, developer docs. |
Self-contained technical documentation expertise for ANY user project.
Expert in developer-focused documentation: READMEs, API references, tutorials, and changelogs.
Essential Structure:
# Project Name
One-sentence description.
## Features
- Key feature 1
- Key feature 2
## Installation
```bash
npm install project-name
import { ProjectName } from 'project-name';
const instance = new ProjectName();
[Basic example]
[Link or inline reference]
[Link to CONTRIBUTING.md]
MIT
**Best Practices**:
- Lead with value (what problem solved?)
- Code examples > long explanations
- Progressive disclosure (quick start โ advanced)
- Keep updated with code
### 2. API Documentation
**Function/Method Documentation**:
```typescript
/**
* Compress image with quality settings
*
* @param {string} input - Path to input image
* @param {CompressOptions} options - Compression options
* @param {number} options.quality - Quality 0-100 (default: 80)
* @param {string} options.format - Output format: jpeg|png|webp
*
* @returns {Promise<CompressResult>} Compression result with saved bytes
*
* @example
* const result = await compress('photo.jpg', { quality: 90 });
* console.log(`Saved ${result.savedBytes} bytes`);
*/
REST API Documentation:
### POST /api/users
Create a new user.
**Request**:
```json
{
"email": "user@example.com",
"name": "John Doe"
}
Response (201 Created):
{
"id": "uuid",
"email": "user@example.com",
"name": "John Doe",
"created": "2025-11-24T12:00:00Z"
}
Errors:
### 3. Tutorials
**Structure**:
```markdown
# Tutorial: Build X in 10 Minutes
**You'll learn**:
- How to set up X
- Core concepts
- Build a working example
**Prerequisites**:
- Node.js 18+
- Basic JavaScript knowledge
## Step 1: Setup
```bash
npm create vite@latest my-project
cd my-project
npm install
[Code with explanation]
[How to run and verify]
**Best Practices**:
- State prerequisites up front
- Break into small, testable steps
- Show expected output at each step
- Link to related docs
### 4. Changelogs
**Keep a Changelog Format** (keepachangelog.com):
```markdown
# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased]
### Added
- New feature X for Y use case
### Changed
- Improved performance of Z by 40%
### Fixed
- Critical bug in authentication (CVE-2024-1234)
## [1.2.0] - 2025-11-24
### Added
- Real-time notifications via WebSocket
- Export to PDF functionality
### Changed
- Updated dependencies (React 19)
### Deprecated
- `oldMethod()` - use `newMethod()` instead
### Removed
- Legacy API v1 endpoints
### Fixed
- Memory leak in image processing
- CORS issue with production domain
### Security
- Fixed SQL injection vulnerability (CVE-2025-5678)
## [1.1.0] - 2025-11-01
[Previous release notes]
Categories:
Active Voice (preferred):
Present Tense (preferred):
Second Person (for tutorials):
Be Specific:
Avoid Jargon (or explain it):
Short Sentences:
Show Complete Examples:
// โ
GOOD - Complete, runnable
import { connect } from 'database';
const db = await connect({
host: 'localhost',
port: 5432
});
const users = await db.query('SELECT * FROM users');
console.log(users);
// โ BAD - Incomplete
db.query('SELECT * FROM users');
Include Error Handling:
// โ
GOOD
try {
const result = await processImage('photo.jpg');
console.log('Success:', result);
} catch (error) {
console.error('Failed to process image:', error.message);
}
Organize by User Journey:
docs/
โโโ getting-started/
โ โโโ installation.md
โ โโโ quick-start.md
โ โโโ first-project.md
โโโ guides/
โ โโโ authentication.md
โ โโโ deployment.md
โ โโโ troubleshooting.md
โโโ api-reference/
โ โโโ client.md
โ โโโ server.md
โ โโโ types.md
โโโ examples/
โโโ basic-crud.md
โโโ real-time-updates.md
โโโ advanced-queries.md
Progressive Disclosure:
Clear Hierarchy:
Cross-Linking:
Table of Contents (for long pages):
## Table of Contents
- [Installation](#installation)
- [Configuration](#configuration)
- [Usage](#usage)
- [Basic Example](#basic-example)
- [Advanced Example](#advanced-example)
- [API Reference](#api-reference)
openapi: 3.0.0
info:
title: User API
version: 1.0.0
description: User management API
servers:
- url: https://api.example.com/v1
paths:
/users:
get:
summary: List all users
responses:
'200':
description: Successful response
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/User'
post:
summary: Create user
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateUser'
responses:
'201':
description: User created
content:
application/json:
schema:
$ref: '#/components/schemas/User'
components:
schemas:
User:
type: object
properties:
id:
type: string
format: uuid
email:
type: string
format: email
name:
type: string
CreateUser:
type: object
required:
- email
- name
properties:
email:
type: string
format: email
name:
type: string
Version docs alongside code:
docs/
โโโ v1.0/
โ โโโ api.md
โ โโโ guides.md
โโโ v2.0/
โ โโโ api.md
โ โโโ guides.md
โ โโโ migration.md
โโโ latest/ โ symlink to v2.0/
Migration Guides:
# Migrating from v1 to v2
## Breaking Changes
### Authentication
**v1**:
```javascript
const api = new API({ token: 'abc123' });
v2:
const api = new API({
auth: { bearer: 'abc123' }
});
token parameter renamed to auth.bearer
### Keep Docs Fresh
**Automation**:
- Generate API docs from code (JSDoc, TypeDoc, OpenAPI)
- Auto-update version numbers in docs
- CI/CD checks for broken links
**Review Checklist**:
- [ ] Code examples run without errors
- [ ] All links work (no 404s)
- [ ] Version numbers match package.json
- [ ] Screenshots show current UI
- [ ] Deprecation warnings added for old features
---
## Common Pitfalls
**โ Avoid**:
- Outdated examples (don't run)
- Missing prerequisites
- Incomplete code snippets
- Vague error messages ("something went wrong")
- Over-explaining obvious things
- Using future tense ("will do X")
**โ
Do**:
- Test all code examples
- State prerequisites up front
- Show complete, runnable code
- Specific error messages with fixes
- Respect reader's intelligence
- Use present tense
---
## Quick Reference Templates
### Function Documentation
```javascript
/**
* Brief description
*
* @param {Type} paramName - Description
* @returns {Type} Description
* @throws {ErrorType} When/why
* @example
* functionName(arg);
*/
### command [options]
Description of what command does.
**Options**:
- `-f, --flag`: Description (default: value)
- `-o, --option <value>`: Description
**Examples**:
```bash
command --flag --option=value
### Error Documentation
```markdown
### Error: ECONNREFUSED
**Cause**: Cannot connect to database
**Solutions**:
1. Check database is running: `docker ps`
2. Verify connection string in `.env`
3. Check firewall allows port 5432
This skill is self-contained and works in ANY user project.