diff --git a/README.md b/README.md
index 4978ba2..eea8ba2 100644
--- a/README.md
+++ b/README.md
@@ -7,186 +7,185 @@
[](https://github.com/tommy0103/obelisk/stargazers)
[](https://github.com/tommy0103/obelisk/releases)
-[](LICENSE)
+[](LICENSE)
-Every past session, subagent, and workflow -- queryable by your agent.
-
-**Humans should not browse session history. Agents should query it.**
+Every past Claude Code and Codex session -- queryable by your agent, browsable by you.
+## Two sides of the same index
+
+Obelisk has two sides that share one SQLite index:
+
+**Skill side** — an agent skill that lets coding agents search and query their own session history. The agent writes JS queries, runs them locally, answers in plain language.
+
+**App side** — an Electron desktop app for humans to browse sessions, manage memories, view usage stats, and see weekly recap cards.
+
+Both read from the same `~/.obelisk/obelisk.sqlite` database. The indexer reads Claude Code transcripts from `~/.claude/projects` and Codex transcripts from `~/.codex/sessions`.
+
+## Codex support
+
+Obelisk indexes Claude Code and Codex into the same SQLite schema instead of keeping separate databases. Rows carry a `source` value (`claude` or `codex`), and Codex IDs are prefixed with `codex:` so they cannot collide with Claude session IDs.
+
+Codex root threads become normal Obelisk sessions. Codex child threads are attached through the same `subagents` table when parent-thread metadata is available. Codex does not emit Claude-style workflow metadata, so workflow tables may be empty for Codex-only history.
+
+For live app refresh, Obelisk watches `~/.claude/projects` and `~/.codex/sessions`. It does not watch the whole `~/.codex` root. Codex's `session_index.jsonl` is used as lightweight title/update metadata during indexing, not as the message transcript source.
+
+## Skill: agent-first retrieval
+
- Ask in plain language. The agent writes the query, runs it, answers.
+