diff --git a/README.md b/README.md
new file mode 100644
index 0000000..8e11d1a
--- /dev/null
+++ b/README.md
@@ -0,0 +1,123 @@
+# context-panel
+
+Панель «Токены» для веб-интерфейса OpenCode 2: что сейчас лежит в контексте сессии, как он рос и сколько
+токенов ушло за сессию, за день и за всё время. Работает как плагин OpenCode и поднимается в его же процессе.
+
+
+
+## Что на вкладке
+
+В шапке сессии появляется кнопка с кружком и % заполнения контекста. Она открывает боковую панель на вкладке
+**«Токены»** рядом с Review и Context; вкладку можно выбрать и вручную. Кнопка и вкладка повторяют разметку
+OpenCode, поэтому стили у них родные. Если OpenCode перерисует интерфейс, `panel.js` вставит их заново.
+
+- **Состав контекста.** Сколько токенов было в последнем запросе к модели (как в самом OpenCode) из лимита
+ модели. Разбивка по категориям: сообщения, ответы, reasoning, вывод каждого тула (MCP отдельно,
+ `gitlab: …`, `jira: …`; для Code Mode — какие MCP вызывал скрипт), сводка compaction. Учитывается только
+ то, что сейчас в контексте, — его отдаёт сам OpenCode (`/api/session/{id}/context`). Категории считаются как
+ символы/4, так же оценивает сам OpenCode. «Остаток» — это разница между реальным числом токенов и суммой
+ оценок: системный промпт, AGENTS.md, схемы тулов и MCP, плюс погрешность.
+- **Рост контекста по шагам.** Токенов в каждом запросе к модели за всю сессию, линия лимита модели и отметки
+ compaction. Под графиком — список compaction: когда, авто или вручную, контекст до и после, размер сводки,
+ сколько заняло. Провал на графике без отметки compaction — это чистка вывода тулов (prune / DCP).
+- **Самые тяжёлые вызовы в контексте.** Топ-10 вызовов тулов в текущем контексте: тул, что вызывали (файл,
+ команда, описание), токены входа и вывода.
+- **Расход за сессию.** Input, cache read/write, output, reasoning, число шагов модели. Если были сабагенты,
+ рядом показан итог вместе с ними.
+- **Скорость модели в сессии.** Генерация (output + reasoning за время потока, ток/с), среднее ожидание первого
+ токена, prefill (input без кэша за это время, ток/с) и среднее время модели на шаг. Начало потока — первая
+ часть ответа, конец — `time.streamed` сообщения. Выполнение тулов не считается.
+- **Расход за сегодня / 7 дней / 30 дней / всё время**, по проекту или по всем проектам, плюс топ моделей
+ (со скоростью генерации и временем на шаг). Над таблицей — график с выбором периода: сегодня по часам, 7 и
+ 30 дней по дням, всё время по дням или по неделям, если история длиннее 90 дней. Столбики разбиты по типу
+ токенов (Cache / Input / Output) или по моделям (топ-4 + «другие»).
+
+Каждый раздел сворачивается кликом по заголовку; какие свёрнуты — запоминается в браузере (`localStorage`).
+Данные обновляются раз в 3 секунды, пока вкладка выбрана, % на кнопке — раз в 10 секунд.
+
+## Как устроено
+
+У веб-интерфейса OpenCode нет точек расширения: он зашит в бинарник, слоты для плагинов есть только в TUI, а
+своих HTTP-маршрутов серверный плагин добавить не может. Поэтому плагин `context-panel.v2.ts` поднимает внутри
+процесса OpenCode прокси (`server.mjs`) на отдельном порту. Прокси пропускает HTTP, SSE и WebSocket как есть, а
+в HTML-страницы вставляет `