Add root readme (#229)

diff --git a/README.md b/README.md
new file mode 100644
index 0000000..cfd663f
--- /dev/null
+++ b/README.md
@@ -0,0 +1,31 @@
+[![Build Status](https://github.com/dart-lang/shelf/workflows/Dart%20CI/badge.svg)](https://github.com/dart-lang/shelf/actions?query=workflow%3A"Dart+CI"+branch%3Amaster)
+
+## shelf [![Pub Package](https://img.shields.io/pub/v/shelf.svg)](https://pub.dev/packages/shelf)
+
+- Package: <https://pub.dev/packages/shelf>
+- [Source code](pkgs/shelf)
+
+## shelf_packages_handler [![Pub Package](https://img.shields.io/pub/v/shelf_packages_handler.svg)](https://pub.dev/packages/shelf_packages_handler)
+
+- Package: <https://pub.dev/packages/shelf_packages_handler>
+- [Source code](pkgs/shelf_packages_handler)
+
+## shelf_proxy [![Pub Package](https://img.shields.io/pub/v/shelf_proxy.svg)](https://pub.dev/packages/shelf_proxy)
+
+- Package: <https://pub.dev/packages/shelf_proxy>
+- [Source code](pkgs/shelf_proxy)
+
+## shelf_static [![Pub Package](https://img.shields.io/pub/v/shelf_static.svg)](https://pub.dev/packages/shelf_static)
+
+- Package: <https://pub.dev/packages/shelf_static>
+- [Source code](pkgs/shelf_static)
+
+## shelf_test_handler [![Pub Package](https://img.shields.io/pub/v/shelf_test_handler.svg)](https://pub.dev/packages/shelf_test_handler)
+
+- Package: <https://pub.dev/packages/shelf_test_handler>
+- [Source code](pkgs/shelf_test_handler)
+
+## shelf_web_socket [![Pub Package](https://img.shields.io/pub/v/shelf_web_socket.svg)](https://pub.dev/packages/shelf_web_socket)
+
+- Package: <https://pub.dev/packages/shelf_web_socket>
+- [Source code](pkgs/shelf_web_socket)
diff --git a/tool/readme.dart b/tool/readme.dart
new file mode 100644
index 0000000..92b8179
--- /dev/null
+++ b/tool/readme.dart
@@ -0,0 +1,22 @@
+import 'dart:io';
+
+const _pkgsDir = 'pkgs';
+
+void main() {
+  final dirs = Directory(_pkgsDir).listSync().whereType<Directory>();
+
+  final pkgs = dirs.map((e) => e.uri.pathSegments[1]).toList()..sort();
+
+  for (var pkg in pkgs) {
+    _printPkg(pkg);
+  }
+}
+
+void _printPkg(String pkgName) {
+  print('''
+## $pkgName [![Pub Package](https://img.shields.io/pub/v/$pkgName.svg)](https://pub.dev/packages/$pkgName)
+
+- Package: <https://pub.dev/packages/$pkgName>
+- [Source code]($_pkgsDir/$pkgName)
+''');
+}