diff --git a/README.md b/README.md
index 56dbee1..be011c8 100644
--- a/README.md
+++ b/README.md
@@ -1,53 +1,263 @@
-# TinyCompiler
+
+

-One tiny tensor language, two real chips: `C = relu(A @ B)` compiles to
-[tiny-gpu](https://github.com/deaneeth/tiny-gpu) assembly or to a
-[tiny-tpu](https://github.com/deaneeth/tiny-tpu) tile schedule, and runs on the real simulator / RTL.
+
TinyCompiler
-**Status: Phase 8 (launch).** The [Compiler Explorer](web/) runs the whole compiler in the browser. The frontend, optimizing pass pipeline and **both backends** work. One program,
-two chips, bit-exact against numpy on each:
+
+ A tiny tensor compiler that targets a real GPU simulator and a real systolic-array TPU,
+ and checks every result bit-exact against numpy.
+
-```bash
-tinyc examples/mm_relu.tiny --target tpu --run # tile passes on the real tiny-tpu RTL
-tinyc examples/mm_relu.tiny --target gpu --run # SIMT kernels on the tiny-gpu simulator
+
+
+
+
+
+
+
+
+
+
+
+
+TinyCompiler takes one small tensor program, such as `C = relu(A @ B)`, and compiles it to two
+very different chips. It produces **tiny-gpu** SIMT assembly that runs on a cycle-level GPU
+simulator, and a **tiny-tpu** tile schedule that runs on a real SystemVerilog systolic array
+(simulated through Verilator and WebAssembly). Each result is checked against a numpy oracle, so
+you can see the same program run on two architectures and get the same answer.
+
+It is built to be read. Every compiler stage has a printer, a verifier, and an interpreter, and
+you can watch the IR change one pass at a time. The whole thing also runs in your browser at the
+[Compiler Explorer](https://tiny-compiler.vercel.app/app).
+
+```text
+$ tinyc examples/mm_relu.tiny --target gpu --run -O2
+%1 =
+[[16161 15523 0 2949]
+ [ 0 8580 1770 15819]
+ [ 0 10549 1568 5105]
+ [ 0 9847 5002 0]]
+bit-exact vs numpy oracle: yes
+launches: 1 threads: 16 registers: 5 (R5-R7 untouched: yes)
+measured cycles: 3 (estimate 2..3)
+measured instructions: 885 (estimate 880..896)
+measured loads: 160 (estimate 160) stores: 16 (estimate 16)
+
+$ tinyc examples/mm_relu.tiny --target tpu --run
+%1 =
+[[16161 15523 0 2949]
+ [ 0 8580 1770 15819]
+ [ 0 10549 1568 5105]
+ [ 0 9847 5002 0]]
+bit-exact vs numpy oracle: yes
+chip passes: 2 measured RTL cycles: 30 (estimate 30)
```
-`-O2` tiles operands into tiny-gpu's shared memory and unrolls the loops (see
-[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) for the measured effect of every optimization).
-Both targets can be driven from pytest. See [docs/PLAN.md](docs/PLAN.md) for the roadmap,
-[docs/LANGUAGE.md](docs/LANGUAGE.md), [docs/IR.md](docs/IR.md) and [docs/PASSES.md](docs/PASSES.md) and [docs/TTPU_FORMAT.md](docs/TTPU_FORMAT.md) and [docs/TGPU_FORMAT.md](docs/TGPU_FORMAT.md).
+