technical-writing
Technical Writing Skill
Self-contained technical documentation expertise for ANY user project.
Expert in developer-focused documentation: READMEs, API references, tutorials, and changelogs.
Core Documentation Types
1. README Files
Essential Structure:
# Project Name
One-sentence description.
## Features
- Key feature 1
- Key feature 2
## Installation
```bash
npm install project-name
Quick Start
import { ProjectName } from 'project-name';
const instance = new ProjectName();
Usage
[Basic example]
API Reference
[Link or inline reference]
Contributing
[Link to CONTRIBUTING.md]
License
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:
- 400: Invalid email format
- 409: Email already exists
### 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
Step 2: Create Component
[Code with explanation]
Step 3: Test It
[How to run and verify]
Next Steps
- Advanced feature 1
- Advanced feature 2
- Link to API docs
**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:
- Added: New features
- Changed: Changes in existing functionality
- Deprecated: Soon-to-be removed features
- Removed: Now removed features
- Fixed: Bug fixes
- Security: Vulnerability fixes
Style Guide Essentials
Voice & Tone
Active Voice (preferred):
- ✅ "The function returns an array"
- ❌ "An array is returned by the function"
Present Tense (preferred):
- ✅ "The API validates input"
- ❌ "The API will validate input"
Second Person (for tutorials):
- ✅ "You can configure the timeout"
- ❌ "Users can configure the timeout"
Clarity Rules
Be Specific:
- ✅ "Set timeout to 5000ms"
- ❌ "Set a reasonable timeout"
Avoid Jargon (or explain it):
- ✅ "Idempotent (can be called multiple times safely)"
- ❌ "The endpoint is idempotent"
Short Sentences:
- ✅ "Install the package. Then import it."
- ❌ "After installing the package, you need to import it into your project."
Code Examples
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);
}
Documentation Structure
Information Architecture
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:
- Getting Started: Quickest path to value
- Guides: Task-oriented how-tos
- API Reference: Complete technical reference
- Examples: Real-world patterns
Navigation Best Practices
Clear Hierarchy:
- Use consistent heading levels (H1 → H2 → H3)
- Don't skip heading levels
- One H1 per page
Cross-Linking:
- Link to related docs
- Link to prerequisites
- Link to next steps
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 / Swagger
OpenAPI 3.0 Template
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
Documentation Maintenance
Versioning Strategy
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' }
});
What Changed
tokenparameter renamed toauth.bearer- Supports multiple auth methods now
Migration Steps
- Update API initialization
- Test authentication flow
- Update error handling (new error codes)
### 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);
*/
CLI Command Documentation
### 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.
More from anton-abyzov/specweave
spec-driven-brainstorming
Spec-driven brainstorming and product discovery expert. Helps teams ideate features, break down epics, conduct story mapping sessions, prioritize using MoSCoW/RICE/Kano, and validate ideas with lean startup methods. Activates for brainstorming, product discovery, story mapping, feature ideation, prioritization, MoSCoW, RICE, Kano model, lean startup, MVP definition, product backlog, feature breakdown.
43kafka-architecture
Apache Kafka architecture expert for cluster design, capacity planning, and high availability. Use when designing Kafka clusters, choosing partition strategies, or sizing brokers for production workloads.
34docusaurus
Docusaurus 3.x documentation framework - MDX authoring, theming, versioning, i18n. Use for documentation sites or spec-weave.com.
29frontend
Expert frontend developer for React, Vue, Angular, and modern JavaScript/TypeScript. Use when creating components, implementing hooks, handling state management, or building responsive web interfaces. Covers React 18+ features, custom hooks, form handling, and accessibility best practices.
29reflect
Self-improving AI memory system that persists learnings across sessions in CLAUDE.md. Use when capturing corrections, remembering user preferences, or extracting patterns from successful implementations. Enables continual learning without starting from zero each conversation.
27aws-cost-expert
AWS cost optimization - EC2 Reserved Instances, Savings Plans, Spot, Lambda optimization, Cost Explorer, Trusted Advisor.
25