diff --git a/README.md b/README.md
index 0d7af14..e211f7f 100644
--- a/README.md
+++ b/README.md
@@ -77,7 +77,7 @@ motionPreset("spin-forge", { target: logo, energy: 0.8, seed: 3 })
`energy` (clean to springy) and `speed` are universal knobs. The preset emits a
beat you can retime, and a waypoint you drag on its path becomes an overlay edit
that survives a knob-driven regeneration: knobs regenerate the base, hand craft
-persists. Two new primitives back it:
+persists. Two primitives back it:
- **`path` node**: a true vector SVG shape with a `progress` draw-on, so the
outline draws itself, stays crisp at any zoom, and recolors by animating fill.
@@ -256,9 +256,9 @@ export default scene({
```
Scaffold one with `pnpm reframe new my-scene`. Full syntax (node types,
-states, timeline operators, behaviors): `pnpm reframe guide` — the same
-~1,700-token guide that lets an LLM write valid scenes on the first try
-(33/33 first-attempt renders in our benchmark).
+states, timeline operators, behaviors): `pnpm reframe guide` — the guide an
+LLM reads to write valid scenes on the first try (33/33 first-attempt renders
+in our benchmark).
A scene is a single self-contained file, not an app: it can live in **any
directory** — no package.json or node_modules next to it. `render` bundles it
@@ -293,8 +293,8 @@ your scene.
## How edits survive regeneration
-Overlays address the scene by **node id, state name, and timeline label** —
-never by position or index. When an AI regenerates a scene it follows one
+Overlays address the scene by **node id, state name, and timeline label (or
+beat name)** — never by position or index. When an AI regenerates a scene it follows one
contract (`docs/guides/regen-contract.md`, or `pnpm reframe guide --regen`): keep
those names stable for every concept that survives the redesign. When the
contract is broken anyway, `composeScene` skips the affected edits and reports
@@ -355,7 +355,8 @@ same structured shape on the CLI: `{ ok: false, kind, issues: [{ code, path, mes
## Documentation
-The [`docs/`](docs/) folder is a [Mintlify](https://mintlify.com)-ready site (`docs/docs.json`):
+📖 **[docs.reframe-video.com](https://docs.reframe-video.com)** — the full documentation
+site. The [`docs/`](docs/) folder is its [Mintlify](https://mintlify.com) source (`docs/docs.json`):
| page | what |
|---|---|
diff --git a/docs/the-loop.mdx b/docs/the-loop.mdx
index 6259914..fe34c53 100644
--- a/docs/the-loop.mdx
+++ b/docs/the-loop.mdx
@@ -3,16 +3,12 @@ title: The loop
description: "AI writes the scene, a human tweaks it, the render is deterministic — and the tweaks survive the next regeneration."
---
-```
-scene.ts ──(written by you, or by an AI given `reframe guide`)──▶ IR (plain JSON data)
- │ │
- ▼ ▼
-preview: scrub + knobs ──▶ edits recorded as an overlay JSON (non-destructive)
- │ │
- ▼ ▼
-render: deterministic mp4 (same input → byte-identical frames) ◀── overlay reapplies
- even after an AI
- regenerates the base
+```mermaid
+flowchart LR
+ S["scene.ts
you · or an AI given 'reframe guide'"] --> IR["IR
plain JSON data"]
+ IR --> P["preview
scrub + knobs"] --> O["overlay JSON
non-destructive edits"]
+ IR --> R["render
deterministic mp4
same input → byte-identical"]
+ O -. reapplies even after an AI
regenerates the base .-> R
```
Everything is a pure function of time: `evaluate(scene, t)` — no wall clocks, no randomness without a seed, so scrubbing and distributed rendering come for free. `reframe lint` *enforces* it: the scene is compiled twice and any IR that differs (a `Math.random()` or `Date` baked into a prop) is flagged, so a scene that would render differently each time fails the gate before you ship it.
diff --git a/packages/reframe-video/package.json b/packages/reframe-video/package.json
index fb37134..77e869a 100644
--- a/packages/reframe-video/package.json
+++ b/packages/reframe-video/package.json
@@ -18,7 +18,7 @@
"type": "git",
"url": "git+https://github.com/kiyeonjeon21/reframe.git"
},
- "homepage": "https://github.com/kiyeonjeon21/reframe#readme",
+ "homepage": "https://docs.reframe-video.com",
"type": "module",
"bin": {
"reframe": "./dist/bin.js",