diff --git a/README.md b/README.md
index 24673b71..a9958898 100644
--- a/README.md
+++ b/README.md
@@ -13,22 +13,36 @@
[Pocket Lab](https://pocketlab.build) ·
[Pocket Museum](https://museum.pocketlab.build/)
-## Keeps JSX, Tailwind and reactive state. Removes every layer below them.
-
-PocketJS is a UI runtime with **no DOM, no CSS engine and no WebView**. An app
-is a QuickJS guest on a Rust core that performs flexbox layout and draws every
-pixel itself, in **one thread inside one process**. The frameworks, the class
-strings and the reactive state stay the ones you already use; everything under
-them is replaced.
+PocketJS is a portable application runtime that turns modern component code into
+native pixels across radically different hardware. Solid, Vue Vapor and Octane
+components compile to one native tree, and a QuickJS guest drives a Rust core
+that performs flexbox layout and draws every pixel **in one thread inside one
+process**. There is **no DOM, no CSS engine and no WebView**.
-## Write components as you already do
+## Contents
+
+- [Programming model](#programming-model)
+- [Rendering and execution](#rendering-and-execution)
+- [Performance](#performance)
+- [Native modules](#native-modules)
+- [Hardware support](#hardware-support)
+- [Applications](#applications)
+- [Getting started](#getting-started)
+- [Ahead-of-time compilation](#ahead-of-time-compilation)
+- [Repository layout](#repository-layout)
+- [Building and testing](#building-and-testing)
+- [Documentation](#documentation)
+
+## Programming model
+
+### Frameworks
Three frameworks compile to the same native tree and run on the same QuickJS
-guest, so the framework you pick changes your code and nothing below it.
+guest. The choice changes application code and nothing below it.
| Framework | State and lifecycle | Source forms |
| --- | --- | --- |
@@ -36,7 +50,7 @@ guest, so the framework you pick changes your code and nothing below it.
| **Vue Vapor** | `vue` | JSX and `