README.md とは、リポジトリを開いた人が最初に読む「このソフトウェアは何で、どう動かすか」をまとめた説明書です。 GitHub ではリポジトリのトップページに自動で表示されるため、ここを読んだだけで「自分に関係があるか」「数分で動かせるか」が判断できる状態を目指して書きます。

この記事では、読み手(利用者・開発者・運用担当・採用担当)ごとに書くべき項目を一覧表にし、用途別のテンプレート4種(ライブラリ、社内業務アプリ、CLI ツール、個人ポートフォリオ)を記入例つきで掲載します。4種とも markdownlint-cli2 v0.23.3 でチェックし、指摘ゼロを確認した状態のものです。さらに、GitHub での表示仕様(README の探索順、目次の自動生成、アラート記法など)、構文チェックとリンク切れチェックの実行結果、書き漏れを防ぐチェックリストまでまとめています。Markdown の記法そのものは別記事「Markdownの書き方一覧」で扱っているので、ここでは README に何をどう書くかに絞ります。

README に書く項目の早見表

まず全員に必要な「必須」の4項目を書き、用途に応じて「推奨」を足すのが基本です。読み手の列は、その項目を特に必要とする人を示しています。

項目 重要度 主な読み手 書く内容 ライブラリ 社内アプリ CLI ポートフォリオ
名前と一行説明 必須 全員 何をするものかを1〜2文で ○ ○ ○ ○
インストール/セットアップ 必須 利用者・開発者 コピペで動くコマンド ○ ○ ○ ○
使い方(最小の例) 必須 利用者 実行例と期待される出力 ○ ○ ○ ○
ライセンス 必須(公開時) 利用者 MIT など。LICENSE ファイルへリンク ○ △ ○ ○
動作環境・前提 推奨 利用者・開発者 言語・ランタイムのバージョン、必要なツール ○ ○ ○ △
環境変数・設定 推奨 開発者・運用担当 変数名・必須か・例・説明の表 △ ○ ○ △
API/オプション一覧 推奨 利用者 引数・型・既定値の表、--help の出力 ○ - ○ -
構成図・ディレクトリ構成 推奨 開発者 Mermaid 図や主要ディレクトリの表 △ ○ △ △
よく使うコマンド 推奨 開発者 テスト・Lint・マイグレーションなど △ ○ ○ △
デプロイ手順 推奨 運用担当 手順そのものか、手順書へのリンク - ○ - △
問い合わせ先 推奨 全員 Issue、チャットのチャンネル、担当チーム △ ○ △ -
デモ・スクリーンショット 任意 利用者・採用担当 画像、GIF、デモ URL △ △ ○ ○
バッジ 任意 利用者 バージョン、CI の状態、ライセンス ○ - ○ △
作った理由・工夫した点 任意 採用担当 課題、技術選定の理由、工夫 - - - ○
変更履歴 任意 利用者 CHANGELOG.md へのリンク ○ △ ○ -
コントリビュート方法 任意 開発者 CONTRIBUTING.md へのリンク ○ △ ○ -
トラブルシューティング 任意 利用者・開発者 よく出るエラー文と対処 △ ○ △ -

○=ほぼ必ず書く、△=あると親切、-=通常は不要

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「README.mdの書き方|コピペで使える用途別テンプレート4種」

README を書く順番と考え方

README は「上から読んで、途中でやめても損しない」順に並べます。 多くの読み手は冒頭の数行で「自分に関係があるか」を判断し、関係があればセットアップに進みます。そのため、次の順番が読みやすくなります。

  1. 何か(名前と一行説明、バッジ、デモ画像)
  2. 動かせるか(動作環境、インストール、最小の使い方)
  3. 詳しく使う(API、オプション、設定、環境変数)
  4. 関わる(開発の始め方、コントリビュート、問い合わせ先、ライセンス)

長くなる情報は README に全部書かず、docs/ や CONTRIBUTING.md に分けてリンクするとトップページが読みやすく保てます。目安として、README には「最初の1回動かすまで」に必要なことを書き、それ以外はリンク先に任せると判断がぶれません。

一行説明の書き方

一行説明は「誰が・何を・どうできるか」を入れると伝わります。

書き方 例
名前を言い換えただけ 「tiny-slugify はスラッグ化ライブラリです」
対象と効果が入っている 「日本語を含む文字列を、URL に使えるスラッグへ変換する軽量ライブラリです。依存パッケージはありません」

後者のように、対象(日本語を含む文字列)・結果(URL に使えるスラッグ)・特長(依存なし)の3点が入ると、検索から来た人も一読で判断できます。

コピペで使える用途別テンプレート4種

以下の4種は、記入例を入れた完成形です。example や名前の部分を自分の内容に置き換えれば、そのまま使えます。 すべて後述の markdownlint-cli2 の設定で「0 issues」を確認しています。

テンプレート 主な読み手 特徴的な項目
ライブラリ(npm パッケージ等) 利用者 バッジ、API 表、変更履歴
社内業務アプリ 新しく加わる開発者・運用担当 構成図、環境変数表、デプロイ、問い合わせ先
CLI ツール 利用者 --help の出力、設定ファイル、終了コード
個人ポートフォリオ 採用担当・レビュアー デモ URL、使用技術、工夫した点

テンプレート1:ライブラリ

利用者が「インストールして1分で試せる」ことを最優先にした構成です。API は表にすると、引数の型と既定値が一目でわかります。

# tiny-slugify

[![npm version](https://img.shields.io/npm/v/tiny-slugify.svg)](https://www.npmjs.com/package/tiny-slugify)
[![CI](https://github.com/example/tiny-slugify/actions/workflows/ci.yml/badge.svg)](https://github.com/example/tiny-slugify/actions/workflows/ci.yml)
[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)

日本語を含む文字列を、URL に使えるスラッグへ変換する軽量ライブラリです。依存パッケージはありません。

## 特長

- 全角英数字・全角スペースを半角に正規化してから変換します
- 区切り文字や最大長をオプションで変えられます
- ESM と CommonJS の両方に対応しています

## 動作環境

| 項目 | バージョン |
| --- | --- |
| Node.js | 20 以上 |
| TypeScript(型定義を使う場合) | 5.0 以上 |

## インストール

```bash
npm install tiny-slugify
```

## 使い方

```js
import { slugify } from "tiny-slugify";

console.log(slugify("Hello World 2026"));
// => "hello-world-2026"

console.log(slugify("在庫 一覧", { separator: "_" }));
// => "在庫_一覧"
```

## API

### slugify(input, options?)

| 引数 | 型 | 既定値 | 説明 |
| --- | --- | --- | --- |
| `input` | `string` | (必須) | 変換する文字列 |
| `options.separator` | `string` | `"-"` | 単語の区切り文字 |
| `options.maxLength` | `number` | `80` | 最大文字数。超えた分は切り捨てます |

戻り値は `string` です。`input` が文字列でないときは `TypeError` を投げます。

## 変更履歴

[CHANGELOG.md](CHANGELOG.md) を参照してください。

## コントリビュート

不具合報告や改善提案は Issue でお知らせください。開発の始め方は [CONTRIBUTING.md](CONTRIBUTING.md) にまとめています。

## ライセンス

[MIT](LICENSE)

テンプレート2:社内業務アプリ

チームに新しく加わった人が、README だけでローカル起動までたどり着けることを目標にした構成です。環境変数の表と「起動できたかの確認方法」が特に役立ちます。

# 備品管理システム(bihin-kanri)

社内の備品(PC・モニター・貸出用機材)の貸出と返却を記録する Web アプリです。
総務チームが運用し、開発チームが保守しています。

> [!IMPORTANT]
> 本番環境の `.env` はリポジトリに含めていません。値は運用チームのパスワード管理ツールから取得してください。

## 目次

- [構成](#構成)
- [ローカルでの起動](#ローカルでの起動)
- [環境変数](#環境変数)
- [よく使うコマンド](#よく使うコマンド)
- [デプロイ](#デプロイ)
- [問い合わせ先](#問い合わせ先)

## 構成

```mermaid
flowchart LR
    U[社員のブラウザ] --> W[Web: Next.js]
    W --> A[API: Node.js]
    A --> D[(PostgreSQL 16)]
```

| ディレクトリ | 内容 |
| --- | --- |
| `apps/web` | 画面(Next.js) |
| `apps/api` | API サーバー |
| `db/migrations` | DB マイグレーション |
| `docs/` | 設計資料・運用手順 |

## ローカルでの起動

前提: Node.js 22、Docker Desktop(または互換ツール)

```bash
git clone git@github.com:example-org/bihin-kanri.git
cd bihin-kanri
cp .env.example .env
docker compose up -d db
npm ci
npm run db:migrate
npm run dev
```

ブラウザで <http://localhost:3000> を開き、ログイン画面が出れば成功です。
テスト用アカウントは `admin@example.com` / `password` です(ローカル専用)。

## 環境変数

| 変数名 | 必須 | 例 | 説明 |
| --- | --- | --- | --- |
| `DATABASE_URL` | 必須 | `postgres://app:app@localhost:5432/bihin` | 接続先 DB |
| `SESSION_SECRET` | 必須 | `openssl rand -hex 32` の出力 | セッション署名用の鍵 |
| `MAIL_FROM` | 任意 | `noreply@example.com` | 返却期限メールの送信元 |
| `LOG_LEVEL` | 任意 | `info` | `debug` / `info` / `warn` / `error` |

## よく使うコマンド

| コマンド | 用途 |
| --- | --- |
| `npm run dev` | 開発サーバー起動 |
| `npm test` | 単体テスト |
| `npm run lint` | Lint と Markdown チェック |
| `npm run db:migrate` | マイグレーション適用 |

## デプロイ

`main` ブランチへのマージで、ステージング環境へ自動デプロイされます。
本番への反映手順は [docs/deploy.md](docs/deploy.md) を参照してください。

<details>
<summary>トラブルシューティング</summary>

- `ECONNREFUSED 127.0.0.1:5432` が出る: `docker compose ps` で db コンテナが起動しているか確認します
- `npm ci` が失敗する: `node -v` が 22 系か確認します

</details>

## 問い合わせ先

- 機能の要望: 総務チーム(Slack `#bihin-request`)
- 不具合: このリポジトリの Issue

ポイントは次の3つです。

  • 起動手順の最後に「成功の目印」を書く(「ログイン画面が出れば成功です」)。手順の途中で止まったのか、最後まで進んだのかが本人にわかります。
  • 環境変数は「必須か」「例」を必ず書く。値そのもの(本番の鍵など)は書かず、取得場所を書きます。
  • 問い合わせ先は人名ではなくチャンネルやチーム名にすると、担当が変わっても更新が不要です。

テンプレート3:CLI ツール

--help の出力をそのまま載せると、オプションの説明がコードと一致しやすくなります。終了コードの表は、シェルスクリプトから呼ぶ人に役立ちます。

# logtail-lite

複数のログファイルを同時に追いかけ、キーワードで色分けして表示する CLI ツールです。

![デモ](docs/demo.gif)

## インストール

```bash
# npm
npm install -g logtail-lite

# インストールせずに試す
npx logtail-lite --help
```

## クイックスタート

```bash
logtail-lite app.log worker.log --highlight ERROR,WARN
```

## 使い方

```text
Usage: logtail-lite [options] <files...>

Options:
  -n, --lines <number>      最初に表示する末尾の行数 (default: 10)
  -H, --highlight <words>   カンマ区切りで色付けするキーワード
  -f, --filter <regex>      一致した行だけ表示
      --no-color            色を付けない
  -h, --help                ヘルプを表示
  -V, --version             バージョンを表示
```

## 設定ファイル

ホームディレクトリの `~/.logtailrc.json` に既定値を書けます。

```json
{
  "lines": 50,
  "highlight": ["ERROR", "WARN"]
}
```

## 終了コード

| コード | 意味 |
| --- | --- |
| `0` | 正常終了(Ctrl+C を含む) |
| `1` | 引数の誤り |
| `2` | ファイルが見つからない |

## 開発

```bash
git clone https://github.com/example/logtail-lite.git
cd logtail-lite
npm ci
npm test
npm link   # ローカルの logtail-lite コマンドとして使う
```

## ライセンス

[MIT](LICENSE)

テンプレート4:個人ポートフォリオ

読み手は「この人がどう考えて作ったか」を知りたい採用担当やレビュアーです。機能の羅列よりも、作った理由と工夫した点を具体的に書くと伝わります。

# 読書記録アプリ「よみログ」

読んだ本と感想を記録し、月ごとの読書量をグラフで振り返れる Web アプリです。
学習目的で、設計からデプロイまで一人で作りました。

**デモ**: <https://yomilog.example.com>(ゲストログインあり)

<picture>
  <source media="(prefers-color-scheme: dark)" srcset="docs/screenshot-dark.png">
  <img alt="よみログのトップ画面" src="docs/screenshot-light.png" width="720">
</picture>

## 作った理由

紙のメモでは「今月何冊読んだか」がすぐにわからなかったため、記録と集計を一つにまとめたいと考えました。

## 機能

- 本の登録(ISBN 入力で書名と著者を自動入力)
- 感想の記録(Markdown 対応)
- 月別の読書量グラフ
- タグでの絞り込み

## 使用技術

| 分類 | 技術 |
| --- | --- |
| フロントエンド | React 19 / TypeScript / Vite |
| バックエンド | Hono / Node.js 22 |
| DB | PostgreSQL 16 |
| インフラ | Docker / GitHub Actions |
| テスト | Vitest / Playwright |

## 工夫した点

1. **一覧画面の表示を速くした**: 一覧取得を 1 回のクエリにまとめ、件数が増えても応答時間が変わらないようにしました
2. **テストを CI で自動実行**: プルリクエストごとに単体テストと E2E テストが走ります
3. **アクセシビリティ**: キーボードだけで全操作ができることを確認しました

## 今後やりたいこと

- [ ] 読みたい本リスト
- [ ] 他のユーザーとの本の共有

## ローカルでの起動

```bash
git clone https://github.com/example/yomilog.git
cd yomilog
cp .env.example .env
docker compose up -d
```

<http://localhost:5173> を開きます。

## 作者

- GitHub: [@example](https://github.com/example)

<picture> 要素を使うと、閲覧者が GitHub をダークテーマで見ているときは screenshot-dark.png、ライトテーマでは screenshot-light.png が表示されます。工夫した点は「何を・どうして・結果どうなったか」の3点で書くと、技術的な判断が伝わりやすくなります。

GitHub での README の表示仕様

GitHub は README を特別扱いし、リポジトリのトップに表示します。 2026年10月時点の GitHub Docs で確認した主な仕様は次のとおりです。

仕様 内容 書き方・使い方
README の探索順 .github/ → リポジトリのルート → docs/ の順に探し、最初に見つかった README を表示 ルートに置くのが一般的。.github/README.md があるとそちらが優先される
サブディレクトリの README フォルダを開くと、そのフォルダの README が下に表示される apps/web/README.md などでパッケージごとに説明できる
目次の自動生成 見出しから目次が自動生成され、ファイル右上の「Outline」アイコンから開ける 手書きの目次がなくても移動できる。長い README では手書き目次もあると親切
見出しへのリンク 見出しが小文字化され、空白はハイフンに、記号は除かれてアンカーになる [環境変数](#環境変数) のように書く
相対リンク docs/deploy.md や ../LICENSE のような相対パスは、表示中のブランチに合わせて解決される 絶対 URL より相対リンクが推奨。クローンした環境でも動く
画像 ![代替テキスト](docs/demo.gif) で表示。相対パス可 代替テキストを必ず書く
ダーク・ライト切り替え <picture> と <source media="(prefers-color-scheme: dark)"> に対応 テンプレート4を参照
折りたたみ <details> と <summary> で開閉できるブロックを作れる <summary> の後と </details> の前に空行を入れると中の Markdown が整形される
Mermaid 図 コードブロックの言語に mermaid を指定すると図として表示 構成図やシーケンス図を画像なしで書ける
アラート > [!NOTE] > [!TIP] > [!IMPORTANT] > [!WARNING] > [!CAUTION] の5種類 公式は「1記事に1〜2個まで」を推奨
バッジ GitHub Actions のバッジは https://github.com/OWNER/REPO/actions/workflows/ファイル名/badge.svg 画像リンクとして [![CI](...badge.svg)](...) の形で置く
サイズ上限 500 KiB を超えた部分は切り詰められる 大きな表や長いログは別ファイルへ
プロフィール README ユーザー名と同じ名前の公開リポジトリの README がプロフィールに表示される 自己紹介ページとして使える

アラート記法は次のように書きます。

> [!NOTE]
> 読み飛ばしてもよいが、知っておくと便利な補足です。

> [!WARNING]
> 実行前に確認が必要な注意点を書きます。

アラートは目立つぶん、多用すると重要度が伝わりにくくなります。 本当に読み飛ばされると困る1〜2点に絞ると効果的です。

markdownlint-cli2 で構文をチェックする

markdownlint-cli2 は、Markdown の書き方の揺れや崩れを検出するコマンドラインツールです。 空行の不足、見出しレベルの飛び、コードブロックの言語指定漏れなどを機械的に見つけられます。以下は Node.js v22.22.2、markdownlint-cli2 v0.23.3(markdownlint v0.41.1)で実行した結果です。

インストール

npm init -y
npm install -D markdownlint-cli2
npx markdownlint-cli2 --version
markdownlint-cli2 v0.23.3 (markdownlint v0.41.1)

崩れた README をチェックした結果

次のような、空行が少なく見出しレベルも飛んでいる README を用意しました。

# task-api
タスクを管理するAPIです。
### セットアップ
```
npm install
npm run dev
```
* 手順は [こちら](docs/setup.md)
- 詳細は [設定](docs/config.md) を参照
- [使い方](#使い方)

詳しくは https://example.com を見てください。
## ライセンス
MIT
npx markdownlint-cli2 README.md

実行結果(設定ファイルなし、既定ルール):

Summary: 16 issues in 1 file
README.md:1 error MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "# task-api"]
README.md:3 error MD001/heading-increment Heading levels should only increment by one level at a time [Expected: h2; Actual: h3]
README.md:3 error MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Above] [Context: "### セットアップ"]
README.md:3 error MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "### セットアップ"]
README.md:4 error MD031/blanks-around-fences Fenced code blocks should be surrounded by blank lines [Context: "```"]
README.md:4 error MD040/fenced-code-language Fenced code blocks should have a language specified [Context: "```"]
README.md:7 error MD031/blanks-around-fences Fenced code blocks should be surrounded by blank lines [Context: "```"]
README.md:8 error MD032/blanks-around-lists Lists should be surrounded by blank lines [Context: "* 手順は [こちら](docs/setup.md)"]
README.md:8 error MD032/blanks-around-lists Lists should be surrounded by blank lines [Context: "* 手順は [こちら](docs/setup.md)"]
README.md:9:1 error MD004/ul-style Unordered list style [Expected: asterisk; Actual: dash]
README.md:9 error MD032/blanks-around-lists Lists should be surrounded by blank lines [Context: "- 詳細は [設定](docs/config.md) を参照"]
README.md:10:1 error MD004/ul-style Unordered list style [Expected: asterisk; Actual: dash]
README.md:10:3 error MD051/link-fragments Link fragments should be valid [Context: "[使い方](#使い方)"]
README.md:12:6 error MD034/no-bare-urls Bare URL used [Context: "https://example.com"]
README.md:13 error MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Above] [Context: "## ライセンス"]
README.md:13 error MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## ライセンス"]

指摘ごとの直し方

ルール 意味 直し方
MD001 見出しレベルが飛んでいる(h1 の次に h3) ### を ## にする
MD004 箇条書きの記号(- と *)が混在 どちらかに統一。設定で "style": "dash" も指定できる
MD022 見出しの前後に空行がない 見出しの上下に空行を入れる
MD031 コードブロックの前後に空行がない フェンスの上下に空行を入れる
MD032 箇条書きの前後に空行がない リストの上下に空行を入れる
MD034 URL がむき出し <https://example.com> か [説明](https://example.com) にする
MD040 コードブロックに言語名がない ```bash のように言語を書く(シンタックスハイライトも効く)
MD051 ページ内リンクの飛び先がない 存在する見出しにリンクするか、見出しを追加する

--fix を付けると、空行や記号の統一など機械的に直せるものは自動で修正されます。

npx markdownlint-cli2 --fix README.md
Attempted: 13 fixes in 1 file
Summary: 3 issues in 1 file
README.md:5 error MD001/heading-increment Heading levels should only increment by one level at a time [Expected: h2; Actual: h3]
README.md:7 error MD040/fenced-code-language Fenced code blocks should have a language specified [Context: "```"]
README.md:14:3 error MD051/link-fragments Link fragments should be valid [Context: "[使い方](#使い方)"]

16件中13件が自動修正され、残った3件(見出しレベル、言語名、リンク先)は意味を判断する必要があるため手で直します。

設定ファイル(日本語の README 向け)

プロジェクトのルートに .markdownlint-cli2.jsonc を置くと、ルールを調整できます。

{
  "config": {
    "default": true,
    // 日本語は1行が長くなりやすく、表の行も長いので行長チェックを外す
    "MD013": false,
    // 箇条書きの記号を - に統一
    "MD004": { "style": "dash" },
    // README でよく使う HTML 要素だけ許可
    "MD033": { "allowed_elements": ["details", "summary", "picture", "source", "img", "br"] }
  },
  "ignores": ["node_modules/**", "CHANGELOG.md"]
}

MD033 を調整しない場合、テンプレート2・4は次のように指摘されます(既定では HTML の直書きを指摘するルールのため)。

Summary: 5 issues in 2 files
app.md:74:1 error MD033/no-inline-html Inline HTML [Element: details]
app.md:75:1 error MD033/no-inline-html Inline HTML [Element: summary]
portfolio.md:8:1 error MD033/no-inline-html Inline HTML [Element: picture]
portfolio.md:9:3 error MD033/no-inline-html Inline HTML [Element: source]
portfolio.md:10:3 error MD033/no-inline-html Inline HTML [Element: img]

設定ファイルを置いた状態で、修正後の README とテンプレート4種をまとめてチェックした結果です。

npx markdownlint-cli2 "**/*.md" "#node_modules"
Linting: 7 files
Summary: 0 issues in 0 files

package.json の scripts に "lint:md": "markdownlint-cli2 \"**/*.md\" \"#node_modules\"" を登録しておくと、CI でも同じチェックを回せます。

リンク切れをチェックする

README の相対リンクやページ内リンクは、ファイルの移動や見出しの変更で切れやすい部分です。 ここでは npm の markdown-link-check v3.15.0 で確認しました。外部 URL は CI 環境によっては到達できないことがあるため、設定で外部 URL を除外し、リポジトリ内のリンクだけを確認しています。

{ "ignorePatterns": [ { "pattern": "^https?://" } ] }
npm install -D markdown-link-check
npx markdown-link-check -c mlc.json README.md

docs/config.md が存在せず、#使い方 という見出しもない状態での実行結果:

FILE: README.md
  [✓] docs/setup.md
  [✖] docs/config.md
  [✖] #%E4%BD%BF%E3%81%84%E6%96%B9
  [/] https://example.com

  4 links checked.

  ERROR: 2 dead links found!
  [✖] docs/config.md → Status: 400
  [✖] #%E4%BD%BF%E3%81%84%E6%96%B9 → Status: 404

docs/config.md を作り、## 使い方 の見出しを追加した後の結果:

FILE: README.md
  [✓] docs/setup.md
  [✓] docs/config.md
  [✓] #%E4%BD%BF%E3%81%84%E6%96%B9
  [/] https://example.com

  4 links checked.

[/] は設定で除外したリンクです。日本語の見出しへのリンクは URL エンコードされて表示されますが、正しく検出されています。 markdownlint の MD051 もページ内リンクを確認できるので、両方を CI に入れておくと安心です。

よくある不足のチェックリスト

README で一番多いつまずきは「書いてある手順どおりに実行しても動かない」ことです。 書き終えたら、次の表で確認します。

チェック項目 よくある状態 こうすると解決
セットアップ手順を新しい環境で試したか 自分の PC では動くが、他の人の環境では途中で止まる 新しいディレクトリにクローンし直して、README のコマンドだけで動くか試す
前提ツールのバージョンを書いたか Node.js や Python のバージョン違いでエラーになる 動作環境の表にバージョンを書く。.nvmrc や .python-version も置く
環境変数をすべて説明したか .env.example にあるのに README に説明がない、またはその逆 変数名・必須か・例・説明の表を作り、.env.example と一致させる
秘密情報を書いていないか 本番の鍵やパスワードを例として書いてしまう 値ではなく「取得場所」を書く。例はダミー値にする
成功の目印を書いたか 起動したのかどうか判断できない 「http://localhost:3000 でログイン画面が出れば成功」と書く
コマンドに $ を付けていないか コピペすると $: command not found になる プロンプト記号は付けず、出力は別のブロックに分ける
コードブロックに言語名があるか ハイライトされず読みにくい ```bash ```json などを付ける(MD040 で検出可)
相対リンクが切れていないか ファイル移動後にリンクが 404 になる markdown-link-check を CI で回す
画像に代替テキストがあるか 画像が読めない環境で内容が伝わらない ![デモ:ログを色分け表示している様子](docs/demo.gif) のように書く
依存の更新に追従しているか README の手順が以前のバージョンのまま 依存を上げるプルリクエストで README も一緒に直す。PR テンプレートに確認欄を置く
問い合わせ先があるか 困ったときにどこへ聞けばよいかわからない Issue やチャンネル名を書く

特に効果が大きいのは「新しい環境で README だけを見て動かしてみる」ことです。 Docker コンテナや別ユーザーで試すと、自分の PC にだけ入っているツールや設定に気づけます。

よくある質問

Q. README は英語と日本語のどちらで書けばよいですか? A. 読み手に合わせます。社内向けなら日本語、海外の利用者も想定する公開ライブラリなら英語が一般的です。両方用意する場合は README.md(英語)と README.ja.md(日本語)のように分け、冒頭に互いへのリンクを置くと迷いません。

Q. README.md と README(拡張子なし)の違いは何ですか? A. 拡張子が .md だと GitHub が Markdown として整形して表示します。拡張子なしやテキスト形式だと、そのままの文字として表示されます。見出しや表を使うなら README.md にします。

Q. README にどこまで詳しく書けばよいですか? A. 「初めての人が最初の1回動かすまで」を目安にします。API の全仕様や運用手順の詳細は docs/ に分け、README からリンクすると読みやすさを保てます。GitHub では 500 KiB を超える部分が切り詰められる点も覚えておくと安心です。

Q. 目次は手書きしたほうがよいですか? A. GitHub には見出しから目次を自動生成する機能(Outline)があるので、短い README なら不要です。長い README や、GitHub 以外(エディタやドキュメントサイト)でも読まれる場合は、テンプレート2のように手書きの目次があると便利です。

まとめ

  • README.md は「何か」「動かせるか」「詳しく使う」「関わる」の順に、上から読めば判断できる構成にする
  • 必須は名前と一行説明・セットアップ・使い方・ライセンスの4つ。用途に応じて環境変数や API 表を足す
  • 用途別テンプレート4種(ライブラリ、社内業務アプリ、CLI、ポートフォリオ)は置き換えるだけで使える
  • GitHub は .github/ → ルート → docs/ の順に README を探し、目次の自動生成、Mermaid、アラート記法に対応している
  • markdownlint-cli2 の --fix で機械的な崩れは自動修正でき、残りは意味を判断して手で直す
  • リンク切れは markdown-link-check で検出でき、CI に入れると最新に保ちやすい
  • 新しい環境で README だけを見て動かしてみるのが、書き漏れを見つける一番の近道

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「README.mdの書き方|コピペで使える用途別テンプレート4種」

株式会社RJCでは、読み手に伝わるドキュメントの書き方を仲間と学び合っています。こうした知識を共有しながら、日々技術を磨いています。

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?