diff --git a/README.md b/README.md
index 5052147b..007110ea 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-

+
@@ -8,13 +8,15 @@
Website · Download .dmg · All releases · Shortcuts
-You can run one Claude Code session in a terminal. GraphCode lets you run ten — connected, unattended, and
+You can run one coding-agent session in a terminal. GraphCode lets you run ten — connected, unattended, and
still yours to attach to and correct mid-run. Each node is a unit of work inside a real CLI coding-agent
-session; each edge is a hand-off, message, or spawn between them. They are live terminals, not headless jobs.
+session: **Claude Code, GitHub Copilot CLI, Codex, or OpenCode**, chosen per loop. Each edge is a hand-off,
+message, or spawn between them, and an edge never asks which agent is on either end — a Codex loop hands off
+to a Claude Code loop that messages a Copilot one. They are live terminals, not headless jobs.
**[Graph Engineering, simplified →](https://graphcode.app/)** — the mental model, then the machinery.
-
+
## How it works
@@ -32,14 +34,16 @@ Two design choices explain most of the rest:
- **GraphCode schedules nothing.** A time-based loop's recurrence lives *inside* its session, written into the
prompt with the agent's own `/loop` skill; the daemon only keeps the session alive. That is what makes a
running loop something you can attach to and correct, rather than a job that already finished somewhere.
+ Codex and OpenCode have no such skill, so a time-based loop on them needs the experimental **Daemon
+ heartbeat** switched on in Settings.
- **Sessions outlive everything.** Each loop's terminal is a [`zmx`](https://zmx.sh) session, so it survives
quitting the app and rebooting — the backend's session ID is persisted, so relaunching resumes the
conversation with `--resume` rather than starting a duplicate.
## Install
-Requires **macOS 15+ on Apple Silicon** (arm64), with **Claude Code on your `PATH`** — GraphCode launches it,
-it doesn't bundle it.
+Requires **macOS 15+ on Apple Silicon** (arm64), with at least one agent CLI on your `PATH` — `claude`,
+`copilot`, `codex`, or `opencode`. GraphCode launches whichever one a loop names; it bundles none of them.
```sh
brew install --cask scgopi/graphcode/graphcode
@@ -52,12 +56,16 @@ Releases are Developer ID signed and notarized.
1. **Add a project** — the sidebar's ⊕ menu: a local folder, a clone from a URL, or a remote repository
over SSH (key auth and zmx on the server; loops run there while this Mac steers them).
-2. **Create a loop** — ⊕ on the canvas. Write the prompt and hit Create; the type chooser explains what
- each kind hands off, and a goal's done check has a **Test** button that runs it as the daemon will.
+2. **Create a loop** — ⊕ on the canvas. Write the prompt, pick the agent it runs as (Claude Code unless you
+ change **Settings ▸ New loops use**), and hit Create; the type chooser explains what each kind hands off,
+ and a goal's done check has a **Test** button that runs it as the daemon will. From a shell,
+ `graphcode node create` takes the same choice as `--backend claudeCode | copilotCLI | codex | openCode`;
+ a loop that creates children without naming one hands them its own.
3. **Open it** — click the node for that loop's terminal workspace: tabs, splits, ⌘K to jump to any loop, ⌘⇧R to walk
the ones asking for you ([shortcuts](https://graphcode.app/shortcuts.html)). You attach to the live session.
4. **Connect loops** — drag between nodes. An edge is a hand-off by default (fires when the source
- resolves); it can also be a message or a spawn, with a condition and a cycle guard.
+ resolves); it can also be a message or a spawn, with a condition and a cycle guard. The agents on
+ either end can differ.
## Parts
diff --git a/docs/assets/graphcode-demo-hero.gif b/docs/assets/graphcode-demo-hero.gif
new file mode 100644
index 00000000..2df55a5a
Binary files /dev/null and b/docs/assets/graphcode-demo-hero.gif differ