Ship to Devs
2026-10-30

How to Write a Good README Developers Actually Use

Your README is the landing page most developers see first. Not your marketing site. The repo page.

A developer lands there with one question: "Is this worth ten minutes of my time?" A good README answers that in the first screen, then gets them to a working result before they lose interest. Everything else is secondary.

This guide covers what to put in a README, what order to put it in, what to cut, and a checklist to run before you make the repo public.

What a README is for

A README has three jobs, in this order:

  1. Qualify. Tell the reader what this is and who it is for, fast enough that the wrong reader leaves and the right one keeps going.
  2. Get them to first success. Install, run, see output. The smallest useful example.
  3. Route them. Point to full docs, support, contributing and license.

It is not your full documentation. Google's documentation style guide describes a README as a short summary of a directory's contents, with links out to fuller docs. That is the right mental model. When a section starts growing past a screen, move it to a docs site or wiki and link to it.

The order that works

Developers scan top to bottom and stop early. Put the things that decide "keep reading or leave" at the top.

Section Job Default length
Name + one-line description What it is, in plain words 1 line
Short pitch Who it is for, what problem it removes, how it differs 2–4 sentences
Quickstart Install, minimal example, expected output 10–20 lines of code
Usage Two or three common tasks Short examples
Requirements Runtimes, versions, OS, external services Bullet list
Configuration Env vars and options that matter Table
Docs and support Where to go next, where to ask Links
Status Stable, beta, unmaintained 1 line
Contributing How to set up, test, submit Short or link out
License Which one 1 line

Badges, screenshots and GIFs are optional. Use them when they show something words cannot, like a CLI's output or a UI. Skip them when they are decoration.

Step 1: Write the one-line description

This is the most important line in the file. Name the thing it does, not the category it wants to be in.

Bad:

A next-generation, developer-first platform for modern data workflows.

Good:

Sync Postgres tables to S3 as Parquet files on a schedule.

The good version tells a reader in five seconds whether they have this problem. The bad one tells them nothing.

Test: could someone repeat your one-liner to a teammate and have the teammate know what it does? If not, rewrite it.

Step 2: Write the short pitch

Two to four sentences under the one-liner. Cover:

Make a README recommends noting what sets your project apart from alternatives and linking any terms a reader might not know. Do both. Do not oversell. Developers read "fastest" and "easiest" as unverified claims.

Step 3: Make the quickstart the center of the file

This is where you win or lose the reader. The goal is time to first success: the shortest path from "I found this" to "I saw it work."

Rules for a quickstart that works:

pip install pgsync-parquet
export DATABASE_URL="postgres://user:pass@localhost:5432/app"
pgsync-parquet run --table orders --bucket s3://my-bucket/exports
Exported 12,480 rows from orders -> s3://my-bucket/exports/orders/2026-10-30.parquet

Then run it yourself from a fresh clone on a clean machine, following only the README. Most broken quickstarts were never followed from zero by their author.

Step 4: Add usage for the next two or three tasks

After first success, readers want to know whether the tool handles their real case. Pick the two or three tasks most people do next and give each a short heading and example.

Good usage headings

Task-shaped headings beat feature-shaped ones because readers search by what they are trying to do.

Step 5: Requirements and configuration

Be explicit. Make a README advises assuming the reader may be new and listing required language versions, operating systems and manual dependencies. Experts benefit too: an undocumented version mismatch costs anyone twenty minutes.

Use a table for configuration:

Variable Required Default What it does
DATABASE_URL Yes none Postgres connection string
EXPORT_FORMAT No parquet parquet or csv
LOG_LEVEL No info debug, info, warn

Step 6: Route them

Close with the links a reader needs next:

Common mistakes

README template

# project-name

One line: what it does, in plain words.

Two to four sentences: who it is for, what it removes, how it differs.

## Quickstart

Prerequisites: <runtime + version>, <service>.

    <install command>
    <minimal working example>

Expected output:

    <what success looks like>

## Usage

### <Common task 1>
### <Common task 2>

## Configuration

| Variable | Required | Default | What it does |

## Docs and support

- Docs: <link>
- Questions: <where you actually answer>

## Status

<Stable | Beta | Unmaintained>

## Contributing

<Setup, test, submit, or link to CONTRIBUTING.md>

## License

<License name>

Pre-ship checklist

Do this next

Open your README, cover everything below the first screen, and ask: would a stranger know what this is and how to try it? If not, fix the one-liner and the quickstart before anything else. Those two carry most of the weight.

If you want the rest of the launch handled the same way, from positioning and messaging to docs, launch assets and a day-by-day plan, The Developer Launch Kit includes a docs and quickstart chapter, fill-in templates and agent skills that draft from your repo. Get it here: https://shiptodevs.com/#pricing

Sources

From Ship to Devs

The Developer Launch Kit: the full method as templates, a worked example and agent skills.

See The Developer Launch Kit