How to Write a README.md That Actually Helps People

7 min read Developer Guides

Table of Contents

A good README is the difference between a project that gets used and one that gets ignored. Most READMEs either say too little ("A cool project") or too much (walls of text nobody reads). Here's how to hit the sweet spot.

The Essential Sections (In Order)

  1. Project name and one-line description
  2. What it does (2-3 sentences or a screenshot)
  3. Quick start / Installation
  4. Basic usage example
  5. Configuration (if applicable)
  6. Contributing (if open source)
  7. License

Section 1: Project Name and Description

The first thing people see. Make it count:

# Project Name

One-sentence description of what this project does and who it's for.

![Screenshot or demo GIF](screenshot.png)

Bad example: "A JavaScript library"

Good example: "A lightweight JavaScript date picker that works without dependencies. 3KB gzipped."

Section 2: Installation

Get people running your project in under 60 seconds:

## Installation

```bash
npm install your-package
```

Or with yarn:
```bash
yarn add your-package
```

Rules for installation sections:

  • Copy-pasteable commands (not instructions like "install it with npm")
  • Include all prerequisites (Node version, system dependencies)
  • Show the simplest path first, mention alternatives second
  • Test your instructions on a clean machine

Section 3: Usage

Show the most common use case with working code:

## Usage

```javascript
import { DatePicker } from 'your-package';

const picker = new DatePicker('#my-input', {
  format: 'YYYY-MM-DD',
  minDate: new Date()
});
```

Include:

  • A minimal working example (the "hello world" of your project)
  • Expected output or result
  • Link to full API docs if they exist elsewhere

Section 4: Configuration / API

Use a table for options:

## Options

| Option    | Type     | Default  | Description              |
|-----------|----------|----------|--------------------------|
| format    | string   | 'YYYY-MM-DD' | Date format string  |
| minDate   | Date     | null     | Earliest selectable date |
| maxDate   | Date     | null     | Latest selectable date   |
| disabled  | boolean  | false    | Disable the picker       |

Section 5: Contributing

## Contributing

Contributions are welcome! Please:

1. Fork the repository
2. Create a feature branch (`git checkout -b feature/amazing-feature`)
3. Commit your changes (`git commit -m 'Add amazing feature'`)
4. Push to the branch (`git push origin feature/amazing-feature`)
5. Open a Pull Request

Section 6: License

## License

MIT License - see [LICENSE](LICENSE) for details.

Badges (Optional but Professional)

Add badges at the top for quick status information:

![npm version](https://img.shields.io/npm/v/your-package)
![build status](https://img.shields.io/github/actions/workflow/status/user/repo/ci.yml)
![license](https://img.shields.io/npm/l/your-package)

Common README Mistakes

  • No installation instructions — people won't guess how to install
  • Outdated examples — test your README examples regularly
  • Assuming knowledge — spell out prerequisites
  • Giant wall of text — use headers, lists, and code blocks
  • No quick start — people want results in under 2 minutes
  • Missing license — companies can't use your code without one

README Template

Copy this template for your next project:

# Project Name

Brief description of what it does.

## Installation

```bash
npm install project-name
```

## Quick Start

```javascript
// Minimal working example
```

## Documentation

[Full documentation](link-to-docs)

## Contributing

See [CONTRIBUTING.md](CONTRIBUTING.md)

## License

MIT

Pro Tips

  • Add a GIF or screenshot — visual proof that it works builds trust instantly
  • Link to a live demo if possible
  • Keep the README updated when APIs change
  • Write for someone who found your project via Google and has 30 seconds to decide if it's useful

Related Articles