Use when writing documentation, guides, API references, or technical content for developers - enforces clarity, conciseness, and authenticity while avoiding AI writing patterns that signal inauthenticity
Rewrites technical content to be clear, concise, and authentic while avoiding AI writing patterns.
npx claudepluginhub ed3dai/ed3d-pluginsThis skill inherits all available tools. When active, it can use any tool Claude has access to.
Core principle: Technical writing must be clear, concise, and authentic. Clarity and technical depth are not opposites - you can have both. Avoid AI writing patterns that make content feel robotic or inauthentic.  Why this matters: Developers value their time. Clear documentation builds trust. AI-like writing patterns (identified through research) make content feel generic and untrustworthy. Technical depth without clarity frustrates users. Clarity without depth leaves them stuck.
Use this skill when:
Trigger symptoms:
Developers should understand on first read. No re-reading required.
Techniques:
Every word serves a purpose. Remove noise and filler.
Techniques:
Same terminology, structure, and voice throughout.
Techniques:
Research shows specific phrases and structures that readers identify as AI-generated. Avoid these to maintain authenticity.
| AI Phrase | Why It's Bad | Use Instead |
|---|---|---|
| "delve into" | Overly formal, 269x spike post-ChatGPT | "explore," "examine," "look at" |
| "leverage" | Corporate jargon | "use," "take advantage of" |
| "robust" / "seamless" | Vague marketing adjectives | Be specific about what you mean |
| "at its core" | Condescending simplification | "fundamentally" (use rarely) or delete |
| "cutting-edge" / "revolutionary" | Empty hype | Describe actual features |
| "streamline" / "optimize" | Vague promises | "speed up," "reduce," "improve" |
| "foster" / "cultivate" | Bland corporate speak | Use direct action verbs |
| "unlock the potential" | Cliched metaphor | State specific outcome |
| "in today's fast-paced world" | Generic filler | Delete entirely |
| "needless to say" | If needless, don't say it | Delete |
Never start with:
Fix: Start with substance. Delete the preamble.
| Hedged | Confident |
|---|---|
| "I think we should..." | "We should..." |
| "It would be great if..." | "Please do X" |
| "Should be able to..." | "Can complete..." |
| "Basically..." | Delete it |
| "Generally speaking..." | Be specific or remove |
| "One might argue..." | "This indicates..." |
Why hedging fails: Makes you sound uncertain even when you're correct. State facts directly.
AI defaults to formal Victorian-era connectors. Use simpler alternatives or break paragraphs.
| Overused AI | Better |
|---|---|
| Moreover / Furthermore | Plus, also, and |
| However / Nevertheless | But, though, still |
| Additionally | And, plus |
| Consequently / As a result | So, then |
| That being said | But (or delete) |
| Indeed / Interestingly | Often delete entirely |
| In conclusion | End cleanly without announcing it |
ALWAYS explain why when:
Design decisions with tradeoffs
Non-obvious patterns
Breaking from conventions
When "how" alone suffices:
Don't:
Do:
Good Example Pattern:
# Good: Complete, realistic, explains why
try:
response = await fetch_user(user_id)
# Check status before assuming success - API returns 200 for "not found"
if response.status != 200:
raise APIError(f"Failed to fetch user: {response.status}")
return response.json()
except NetworkError as e:
# Network failures are retryable - log and re-raise for retry logic
logger.warning(f"Network error fetching user {user_id}: {e}")
raise
Bad Example Pattern:
# Bad: Perfect world, no context, brittle
response = await fetch_user(user_id)
return response.json()
Layer complexity. Simple first, then depth.
Pattern:
Good:
## Authentication
All API requests require an API key in the Authorization header:
```bash
curl -H "Authorization: Bearer YOUR_API_KEY" https://api.example.com/users
For production systems, rotate API keys every 90 days...
**Bad:**
```markdown
## Authentication
Authentication can be performed using several methods including API keys, OAuth 2.0, or JWT tokens. The choice depends on your security requirements, user experience goals, and architectural constraints. Let's explore each option...
(Too much upfront. Start simple.)
Bad:
"Simply connect your ETLOrchestrator to the HydraNode endpoint. Once a connection is established, instantiate a DataStream by passing your KinesisConfiguration."
Why it fails: Jargon firehose with no definitions, no links, no onramp for beginners.
Fix: Define terms, link to prerequisites, provide Getting Started guide.
Bad:
const myFile = document.getElementById('file-input').files[0];
const response = await uploadFile('/api/upload', myFile);
console.log('File uploaded successfully!');
Why it fails: No error handling, ignores edge cases (no file selected, network failure, file too large).
Fix: Wrap in try-catch, check response status, handle undefined files.
Bad:
getUser(userId): "Gets a user by their ID."class DataProcessor: "A class for processing data."processData(data): "Processes the data."Why it fails: Tautological. Says nothing beyond the function name.
Fix: Describe behavior, parameters, return values, exceptions. "Fetches user record from database, returns null if user doesn't exist. Throws AuthError if API key lacks read permissions."
"Row Level Security (RLS) is a PostgreSQL feature that allows you to control which rows a user can access in a table. When you enable RLS on a table, all SELECT, INSERT, UPDATE, and DELETE operations are subject to a security policy. A policy is a SQL expression that returns a boolean value. If the expression returns true, the operation is allowed to proceed. If it returns false or null, the operation is denied."
Why it works: Defines RLS, explains scope (CRUD operations), defines mechanism (policy = SQL boolean expression). Dense with information, perfectly clear.
"Stripe uses conventional HTTP response codes to indicate the success or failure of an API request. In general: Codes in the 2xx range indicate success. Codes in the 4xx range indicate an error that failed given the information provided. Codes in the 5xx range indicate an error with Stripe's servers."
Why it works: Establishes predictable contract for fundamental API behavior. Technical, precise, immediately useful.
"You can run create-astro anywhere on your machine, so you don't have to create an empty directory for your project first. If you don't have an empty directory yet, the wizard will help you create one."
Why it works: Anticipates common beginner question ("Do I need to make a folder first?") and answers it proactively.
"The biggest maintainability concern when using a utility-first approach is managing commonly repeated utility combinations. The traditional approach is to extract repeated utilities into a component class. We believe that @apply should be used sparingly. The best way to manage repeated utility combinations is to create reusable components with a templating language."
Why it works: Identifies problem, presents common solution, explains why that solution is suboptimal, guides toward better approach. Teaches philosophy, not just features.
AI defaults to:
Human writing:
AI writes: Every paragraph is 3-4 sentences. Every sentence is 15-20 words. Everything feels perfectly balanced and rhythmic in an uncanny way.
Human writes: Short sentences create emphasis. Longer sentences provide context, explanation, or explore nuance that requires more breathing room. Mix them. Create rhythm naturally.
AI avoids:
Human includes:
AI never:
Human does:
AI writes vaguely:
Human writes specifically:
Always use periods at the end of code comments.
// Good: Validates user input before processing.
// Bad: validates user input before processing
Use sentence case in all headings. Never title case.
Good: ## Error handling patterns
Bad: ## Error Handling Patterns
Good: ### When to use async
Bad: ### When To Use Async
Format error messages as lowercase sentence fragments. They compose naturally when chained.
Good: failed to parse configuration: invalid JSON at line 42
Bad: Failed to Parse Configuration: Invalid JSON at Line 42
The lowercase format works because errors often chain: "operation failed: " + innerError.message reads correctly.
Before publishing, check for these issues:
| Mistake | Reality | Fix |
|---|---|---|
| "Just being thorough with explanations" | You're explaining obvious things. | Delete explanations of what developers already know. |
| "Keeping it professional with formal language" | Formal = robotic. | Use contractions, conversational tone, natural language. |
| "Covering all the edge cases upfront" | Overwhelms reader. | Basic case first, advanced section for edge cases. |
| "Using precise technical terminology" | Jargon without definitions loses readers. | Define terms on first use, link to glossary. |
| "Being careful with hedging language" | Hedging makes you sound uncertain. | State facts directly. Remove qualifiers. |
| "Perfect code examples look cleaner" | Perfect world examples are brittle in practice. | Include error handling, show realistic usage. |
| "More examples = more helpful" | Too many examples = noise. | One excellent, complete example beats five shallow ones. |
Technical writing in three rules:
Avoid AI markers: No "delve," "leverage," "robust." No throat-clearing. No hedging. No formal transitions.
One excellent example beats five mediocre ones. Include error handling. Show realistic usage.
Technical depth + clarity are not opposites. You can have both. Supabase, Stripe, and Cloudflare prove this daily.
Read aloud test: If it sounds robotic or overly formal, rewrite it.
You MUST use this before any creative work - creating features, building components, adding functionality, or modifying behavior. Explores user intent, requirements and design before implementation.