How to Write a README That People Actually Read
A README is the front door of your project. It is the first thing visitors see on GitHub, and for most open-source projects, it is the only documentation most users will ever read. A great README converts a casual browser into a user. A bad README sends them looking for alternatives.
The median time a developer spends evaluating a GitHub repository before deciding whether to use it is under 30 seconds. In that window, they scan the README for three things: what does this do, how do I install it, and is this actively maintained. If they cannot find those answers in half a minute, they leave.
The Anatomy of a Great README
Every effective README follows a predictable structure. Users expect certain sections in a certain order because that pattern has been established by thousands of successful projects. Deviating from this structure forces readers to hunt for information, which is the opposite of what documentation should do.
Here are the essential sections, in order:
1. Project Title and Description
Start with the project name as an H1 heading, followed by a one-sentence description that explains what the project does. Not how it works, not what technology it uses, but what problem it solves for the user.
The weak version describes the implementation. The strong version describes the value to the user. Lead with benefits, not technology.
2. Badges
Badges communicate project health at a glance: build status, test coverage, npm version, license, download count. Place them immediately after the description. Use shields.io for consistent styling.
Do not overdo badges. Five to seven is the sweet spot. A wall of 20 badges looks cluttered and communicates nothing except that the maintainer likes badges.
3. Quick Start / Installation
This is the most important section. A reader who makes it here is interested. Give them a copy-pasteable command to get started.
npm install your-package
Then show the minimum viable usage. Not a comprehensive API tour, just the simplest possible example that produces a visible result. Three to five lines of code, maximum.
4. Usage Examples
After the quick start, show two or three progressively more complex examples. Each example should demonstrate a single concept: basic usage, configuration options, advanced patterns. Include the expected output or a screenshot for visual projects.
5. API Reference
For libraries, document every public function, component, or endpoint. Include the function signature, parameter types, return type, and a brief description. For large APIs, link to a dedicated documentation site rather than putting everything in the README.
6. Configuration
If your project has configuration options, list them in a table with the option name, type, default value, and description. Tables are scannable. Paragraphs of configuration text are not.
7. Contributing
Explain how to set up the development environment, run tests, and submit a pull request. If your project has a separate CONTRIBUTING.md file, link to it here. The key information to include: how to fork and clone, how to install dev dependencies, how to run the test suite, and what your PR review process looks like.
8. License
State the license clearly. "MIT" or "Apache 2.0" is sufficient. Link to the LICENSE file in the repository.
Writing Tips for Non-Native Speakers
README writing is a specific style of technical English that follows conventions you will not learn in school or from general writing courses. Here are the patterns that matter most:
- Use the imperative mood for instructions: "Install the package" not "You should install the package" or "The package can be installed." Imperative mood is shorter, clearer, and standard in technical documentation.
- Prefer "you" over "we": "You can configure the timeout" is clearer than "We can configure the timeout." The reader is the one doing the action.
- Keep sentences short: Aim for 15-20 words per sentence. Technical writing is not the place for complex subordinate clauses.
- Use consistent terminology: If you call it a "config file" in one place, do not call it a "settings file" in another. Pick one term and stick with it throughout.
- Avoid idioms: "Out of the box," "under the hood," and "at the end of the day" are confusing for non-native readers. Use literal language.
- Active voice over passive: "The function returns a promise" is clearer than "A promise is returned by the function."
Common README Mistakes
- No installation instructions. If a user has to read your package.json to figure out how to install your project, you have already lost them.
- Examples that do not work. Test your README examples. Copy them into a fresh project and verify they run. Stale examples are worse than no examples because they waste the user's time and erode trust.
- Wall of text with no headings. README files are scanned, not read linearly. Use headings, code blocks, and lists to create visual structure.
- Outdated screenshots. If your UI has changed since the screenshots were taken, remove them or update them. Outdated screenshots suggest an abandoned project.
- No mention of requirements or prerequisites. State the minimum Node.js version, required system dependencies, and any environment variables upfront. A user who installs your package only to discover it requires Python 3.9 and Redis will be frustrated.
- Explaining "why" before "how." Users want to know how to use your project before they care about your architectural decisions. Lead with practical information. Put the philosophy section after the usage guide.
README Template
Copy this template and fill in your project-specific details. Every section is included, but you can remove sections that do not apply to your project.
Copy-Paste Template
# Project Name
One-sentence description of what this project does and who it is for.
  
## Quick Start
```bash
npm install your-package
```
```javascript
import { Component } from 'your-package';
const result = Component.doSomething();
console.log(result);
```
## Installation
### Prerequisites
- Node.js >= 18
- npm >= 9
### Steps
```bash
git clone https://github.com/you/project.git
cd project
npm install
```
## Usage
### Basic Example
```javascript
// Your simplest use case here
```
### Configuration
| Option | Type | Default | Description |
|-----------|---------|---------|------------------------|
| timeout | number | 3000 | Request timeout in ms |
| retries | number | 3 | Number of retry attempts |
## API Reference
### `functionName(param1, param2)`
- **param1** (string): Description
- **param2** (number, optional): Description. Default: `10`
- **Returns:** Promise<Result>
## Contributing
1. Fork the repository
2. Create your branch: `git checkout -b feat/my-feature`
3. Commit your changes: `git commit -m 'feat: add my feature'`
4. Push: `git push origin feat/my-feature`
5. Open a Pull Request
## License
MIT - see [LICENSE](LICENSE) for details.
Automated README Quality Checks
Just as you lint your code, you can lint your documentation. The bln-writing-assistant GitHub Action reviews README files and markdown documentation on every PR. It checks for grammar issues, missing sections, broken links, and clarity problems. It is particularly useful for teams where multiple contributors edit documentation, because it enforces a consistent standard automatically.
You can also use the BeLikeNative Chrome Extension to get real-time writing suggestions while editing README files directly in the GitHub web editor. It catches grammar issues, suggests clearer phrasing, and flags common non-native speaker patterns as you type.
Write Better Documentation Automatically
Lint your README and documentation files for grammar, clarity, and completeness on every PR.
Writing Assistant Action Chrome Extension