README, который читают: структура, которая работает
Открываешь репозиторий чужой библиотеки. Хочешь понять: что это, зачем, как поставить, как убедиться, что подходит. Скроллишь README — и видишь полотно из бейджей, длинное «about the project», философию автора и обещание «getting started in 5 minutes», под которым ещё двадцать экранов настройки. К моменту, когда находишь команду установки, ты уже посмотрел документацию у двух конкурентов.
README — это первый и часто единственный документ, который читают про твой проект. Из всей документации он получает 80% трафика и формирует решение «брать или нет». Но писать его как маркетинговую страницу — провал, как технический справочник — провал, как инструкцию по установке — тоже провал. Разберу структуру, которая работает для библиотек, инструментов и сервисов, и что туда не нужно класть.
Что человек реально хочет узнать из README
Открывая README впервые, читатель ищет ответы на четыре вопроса в этом порядке:
- Что это и для кого. Решает ли мою задачу.
- Как быстро попробовать. Скопировать-вставить и увидеть результат.
- Где документация подробнее. Если зацепило, куда идти дальше.
- Активный ли проект. Когда последний релиз, кто отвечает на issues.
Всё остальное — детали, история разработки, сравнения с конкурентами, философия, контрибутинг — нужно процентам пяти читателей. Их можно и нужно убирать ниже или в отдельные документы.
Структура, которая работает
Минимально рабочий каркас README для библиотеки или инструмента:
- Заголовок и одна строчка-описание.
- Бейджи (ограниченно, см. ниже).
- Что это, в 2-3 предложениях.
- Установка.
- Минимальный пример использования.
- Ссылка на полную документацию.
- Поддержка/совместимость (версии языка, рантайма).
- Лицензия.
Всё. Если этого хватает — не добавляй больше. Длинный README не делает проект серьёзнее, он делает его утомительным.
Заголовок и описание: первое впечатление
Было:
# SuperParser
Welcome to SuperParser! This project was started in 2022
when we noticed that existing parsers had limitations...
Стало:
# SuperParser
Fast streaming JSON parser for Node.js with zero dependencies.
Handles files larger than memory.
Описание — одна строка, отвечает на «что это и зачем». Не «welcome», не «this project is», не история. Если у проекта есть конкуренты — упомяни ключевое отличие сразу: «zero dependencies», «handles files larger than memory», «built on top of X». Это то, что человек ищет глазами, листая список.
Бейджи: меньше — лучше
Бейджи бывают полезные и декоративные. Полезные:
- Версия в npm/pypi/crates — показывает, что проект релизится.
- Статус CI — показывает, что main собирается.
- Ссылка на документацию (если она не очевидна).
Декоративные, которые можно убрать без потерь: количество звёзд GitHub, количество форков, количество скачиваний, code coverage в процентах, рейтинг качества кода с непонятного сайта, бейдж «PRs welcome», бейдж «made with love». Это шум, через который читатель продирается к описанию.
Если бейджей больше пяти — стоп, ты делаешь визуальный спам. Оставь два-три самых важных.
Установка: одна команда
Установка должна быть в первом экране. Не в «Getting Started», не в «Installation Guide», а прямо в README. И — короткой:
npm install superparser
Если установка реально сложная (нужны системные зависимости, компилятор, отдельный конфиг) — короткой версии нет, но в README дай минимум для счастливого пути на Linux/macOS, а полный гайд вынеси в отдельный файл и сошлись.
Опасный антипаттерн — давать сразу пять способов установки (npm, yarn, pnpm, bun, docker, бинарник). Выбери один основной, остальные — в раскрывающемся блоке или ссылкой. Иначе читатель тратит время на выбор там, где выбор не нужен.
Минимальный пример: запускается без правок
После установки — пример. Первое правило: пример должен запускаться, если его скопировать целиком.
Было:
import { parse } from 'superparser'
const result = parse(myData)
console.log(result)
Что не так: myData непонятно где взять. Читатель копирует, видит ошибку, лезет искать — это потерянная минута и плохое впечатление.
Стало:
import { parse } from 'superparser'
const data = '{"users":[{"name":"Alice"},{"name":"Bob"}]}'
const result = parse(data, { path: 'users.*.name' })
console.log(result)
// => ['Alice', 'Bob']
Конкретный вход, конкретный вызов, ожидаемый вывод комментарием. Читатель копирует, запускает, получает результат, видит, что библиотека работает. Дальше — листает за подробностями.
Если у библиотеки несколько ключевых сценариев — покажи 2-3 примера, не больше. Пятнадцать примеров в README превращают его в reference, и тот, кто хотел «попробовать», уходит.
Ссылка на документацию
Когда у проекта есть полная документация на отдельном сайте — README обязан на неё сослаться явно, а не спрятать в подвал. Хорошее место — сразу после минимального примера:
## Documentation
Full docs at [superparser.dev](https://superparser.dev):
streaming API, transforms, performance tips.
Не «check our wiki», не «see /docs», а конкретная ссылка с подсказкой о содержимом. Читатель должен понять, идти ли по ссылке.
Совместимость и требования
То, чего часто не хватает: какие версии языка/рантайма поддерживаются. Это знание, которое экономит читателю установку и откат.
## Requirements
- Node.js 20+
- Works in browsers via ESM bundle
- TypeScript 5.0+ for type definitions
Один абзац, конкретные версии. Без него читатель ставит, получает SyntaxError на каком-то ??=, и идёт писать в issues.
Что в README не нужно класть
Содержимое, которое часто оказывается в README, но почти всегда лучше живёт где-то ещё:
- Полный API reference. Перегружает страницу. Сгенерируй его в отдельный сайт через TypeDoc/MkDocs/что-то ещё.
- История разработки и changelog. Положи в
CHANGELOG.md, дай ссылку. - Roadmap. Отдельный документ или GitHub Project. В README — две строки про статус (alpha/beta/stable), не больше.
- Контрибутинг гайд. Это
CONTRIBUTING.md. В README — одна строка «contributions welcome, see CONTRIBUTING.md». - Code of Conduct. Аналогично — отдельный файл.
- Сравнительные таблицы с конкурентами. Спорно, часто превращается в маркетинг. Если сравниваешь — на отдельной странице доков.
- Длинная секция «Why we built this». Один абзац мотивации в самом верху достаточно. Полная история — в блоге.
README для приложения, а не библиотеки
Если репозиторий — это приложение или сервис, а не библиотека для подключения, акценты другие:
- Что делает сервис.
- Скриншот или короткое демо (gif, статичная картинка).
- Как запустить локально (docker-compose up, make run).
- Как настроить (переменные окружения, конфиг).
- Как задеплоить или ссылка на инструкции по деплою.
- Архитектура в общих чертах (схема или 5 строк текста).
Скриншот в первом экране — это для приложений с UI важнее, чем для библиотек. Человек хочет увидеть, что получит, а не читать про функции.
Технические мелочи
- Все блоки кода — с указанием языка для подсветки.
```bash,```typescript, не голые```. - Якоря для крупных секций: GitHub автоматически делает их из заголовков, можно ссылаться внутри README.
- Не используй HTML-таблицы для оглавления, если оглавление не критично — на мобильных это плохо рендерится. Markdown-список из 4-6 пунктов лучше.
- Картинки кладите в репозиторий (
./docs/screenshot.png), а не на внешние хостинги. Внешний хостинг через год отвалится. - Для длинных секций (полная установка, пример конфига) используй
<details>— на GitHub оно нормально работает и сворачивается.
Чек-лист перед коммитом README
- В первом экране есть: что это, как поставить, минимальный пример.
- Описание проекта — одна строка, без «welcome» и истории.
- Бейджей не больше 5, все полезные (версия, CI, доки).
- Пример использования копируется и запускается без правок.
- Указаны минимальные версии рантайма/языка.
- Есть ссылка на полную документацию, если она существует отдельно.
- Лицензия указана.
- Длина README — два-три экрана прокрутки на десктопе. Если больше — режь.
Хороший README — это не тот, в который положили всё, а тот, из которого выкинули лишнее. Читатель приходит с конкретным вопросом, и за минуту получает ответ или решение идти дальше. Большинство «непонятных» библиотек на самом деле понятны — просто их README заставляет читать пять минут до места, где это становится ясно.