История изменений

Все значимые релизы trip2g. Новые записи идут первыми. Для каждого изменения указано
Что / Зачем / Как использовать, чтобы оператор или администратор мог решить,
стоит ли обновляться и как начать пользоваться функцией.

Теги старее v0.2.0 доступны только в истории git.


v0.10.0 (2026-07-13)

Темы для дефолтного шаблона + живой редактор тем

  • Что. Две новые страницы про смену вида дефолтного шаблона. ru/user/themes объясняет: весь вид задают переменные Pico CSS --pico-* — переопределите их в блоке <style> через админку HTML Injection, и сайт перекрашивается целиком, без пересборки и форка. ru/user/theme-editor показывает живой редактор прямо на сайте: двигаете переменные, видите превью, а под админом жмёте Save — тема записывается в HTML injection вашего сайта. Редактор — это кастомный Jet-layout (layout: theme_editor), его можно поставить на любой сайт из trip2g/theme_editor_template.
  • Зачем. Раньше сменить вид означало читать стили и угадывать нужную переменную. Редактор превращает это в цикл «подвигал — сохранил» и заодно служит примером кастомного шаблона, работающего с admin API (тот же приём, что у канбан-доски).
  • Как. Список переменных и куда вставлять — в ru/user/themes. Попробовать редактор — ru/user/theme-editor; поставить к себе — curl layout из репозитория шаблона и заметка с layout: theme_editor.

Встраивание заметок с кастомным CSS-классом

  • Что. Новая страница ru/user/embedded-notes про ![[имя-заметки]] — содержимое целевой заметки рендерится прямо на странице, обёрнутое в <div class="embedded-note">. Добавьте embed_class: my-class во фронтматтер встраиваемой заметки — обёртка получит ещё и embedded-note__my-class, зацепку для стилей из админки. Любая заметка становится переиспользуемым оформленным блоком: колаут, промо-карточка, общий футер.
  • Зачем. У переиспользуемых блоков (баннер подписки, общий заголовок) не было описанного паттерна. Вместе со скрытыми _-заметками одно редактирование обновляет блок везде, где он встроен.
  • Как. См. ru/user/embedded-notes. Держите блок в _скрытой заметке, добавьте embed_class: для стилей и встраивайте через ![[_block]].

Доступ Telegram-группа ↔ подграф (в обе стороны)

  • Что. Новая страница ru/user/telegram-access про связку Telegram-группы с подграфом: доступ течёт в обе стороны — участники группы читают заметки подграфа на сайте, а читатели с доступом к подграфу получают приглашение в группу. Каждое направление — отдельный переключатель, и оба живые: вышли из группы — заметки закрылись; истёк доступ — фоновая задача убирает вас из группы. В основе — членство теперь отслеживает события Telegram chat_member, поэтому входы и выходы регистрируются сразу, а меню /content бота ведёт на нужные подграфы.
  • Зачем. Гейтинг контента по членству в платной группе был возможен, но плохо описан, а изменения членства не всегда учитывались. Теперь Telegram-группа — полноценный источник доступа, наравне с платным оффером или ручной выдачей.
  • Как. Добавьте бота админом группы, свяжите группу с подграфом в Админка → TG bots (по секции на каждое направление), пометьте заметки subgraph:, а участники открывают закрытые заметки через /content. Полный разбор — в ru/user/telegram-access.

Доступ к сайту по Git

  • Что. Новая страница ru/user/git: каждый сайт trip2g — это git-репозиторий. git clone https://ваш-сайт.com/_system/git, правьте markdown любым инструментом или агентом, коммит, push — сервер применяет ваши коммиты к живому сайту. Авторизация HTTP Basic (user + git-токен из Админка → Integrations → Git tokens), а области токена теперь разделяют pull и push — токен только на чтение клонирует, но не пишет.
  • Зачем. Массовым правкам, CI и кодинг-агентам нужен стандартный git, а не отдельный плагин. Ограниченные токены делают безопасной выдачу URL клонирования только на чтение.
  • Как. Создайте git-токен в админке, git clone URL _system/git и push в ветку master (единственная ветка, которую сервер принимает). Для ежедневного письма в Obsidian по-прежнему удобнее плагин синхронизации. См. ru/user/git.

Рецепты подграфов: приватность по умолчанию, всё бесплатно, скрытые _-заметки

  • Что. В ru/user/subgraphs добавлены три практических рецепта. Патч фронтматтера приватность по умолчанию назначает каждую непомеченную заметку в зарезервированный подграф, к которому ни у кого нет доступа — ничего не утечёт, пока вы явно не опубликуете. Симметричный патч всё бесплатно ставит free: true на весь vault для полностью публичного сайта. И уточнённый раздел описывает: любой файл или папка с именем на _ скрыты из списков, поиска и RSS (но остаются доступны по ссылке и встраиваемы).
  • Зачем. «Какие заметки кому видны» — самый частый вопрос про подграфы. Эти рецепты дают готовые точки старта для двух краёв спектра — приватность-в-первую-очередь и публичность-в-первую-очередь.
  • Как. В Админка → Notes & Content → Frontmatter Patches создайте правило с jsonnet из ru/user/subgraphs (приватность по умолчанию или всё бесплатно) и заведите зарезервированный подграф private без выдач.

v0.9.0 (2026-07-12)

Первый вход на свежем self-host сервере

  • Что. Первый вход администратора на новом сервере больше не требует почтового сервера. Рекомендованный путь: trip2g-server login-link печатает одноразовую ссылку для входа, действующую 5 минут — открываете её прямо из терминала (/_system/hat теперь принимает токен по GET, поэтому ссылка кликабельна в браузере). Хотите вход по коду из письма, но без почтового сервера? Поставьте LOG_SIGN_IN_CODES=true, и сервер пишет коды входа в лог (читаете из journalctl или docker logs). Два сопутствующих фикса: запрос кода без настроенного транспорта теперь возвращает понятную ошибку вместо молчаливого «письмо отправлено», а SMTP_STARTTLS=false работает — код уходит на локальный plaintext-relay (Postfix, MailHog) без навязанного STARTTLS.
  • Зачем. Первый вход на чистом сервере — без домена, без почты — был тупиком: запрос принимался, но код нигде не появлялся, а локальный relay падал на ненужном STARTTLS. Теперь одна команда даёт рабочую ссылку входа, с fallback через лог и честными ошибками.
  • Как. Запустите trip2g-server login-link на сервере (или через docker exec в контейнере) и откройте ссылку в течение 5 минут; повторный запуск даёт свежую ссылку. Fallback: LOG_SIGN_IN_CODES=true, запросите код на странице входа, скопируйте из лога. Уберите эти bootstrap-опции, когда настроите OAuth или реальный почтовый транспорт — см. ru/user/smtp.

Поиск: один движок для сайта и MCP

  • Что. Поиск на сайте (GraphQL) и MCP-инструмент search теперь используют один движок выдачи (текст + векторы + слияние рангов) вместо двух разошедшихся копий. Два изменения поведения для MCP-клиентов: анонимные (и федеративные) клиенты теперь ищут по опубликованным (live) заметкам, как анонимные посетители сайта — раньше поиск шёл по последним версиям, включая черновики публичных заметок; векторный поиск теперь пропускает устаревшие эмбеддинги после смены модели, а не ранжирует их случайно. Неиспользуемая серверная страница /search удалена (поисковый виджет сайта работает через GraphQL и не затронут).
  • Зачем. Исправления и настройка поиска попадали на одну поверхность и молча пропускали другую; агенты и посетители могли видеть разную выдачу по одному запросу. На сайтах с включённым показом черновиков анонимные MCP-клиенты могли читать черновики публичных заметок.
  • Как. Автоматически. Если интеграция полагалась на то, что анонимный MCP-поиск видит черновики, авторизуйте её API-ключом — клиенты с API-ключом по-прежнему ищут по последним версиям.

Руководство по SMTP-провайдерам

  • Что. Новая двуязычная страница документации ru/user/smtp — как выбрать провайдера транзакционной почты для self-hosted инстанса trip2g. Перечислены переменные окружения (SMTP_HOST, SMTP_PORT, SMTP_FROM и другие), разобраны категории провайдеров (dedicated transactional, почта регистратора, бесплатные тиры) и дан однозначный вывод: не запускайте собственный исходящий MTA.
  • Зачем. Доставляемость почты для self-hosted инстансов — частый вопрос на старте. Доступные переменные конфигурации были описаны разрозненно; единого места для сравнения вариантов не было.
  • Как. Прочитайте ru/user/smtp перед настройкой email на новом инстансе.

Instagram-фреймы (instaframes)

  • Что. Для instaframes появились двуязычное руководство и галерея-лендинг. На страницах с каруселью теперь есть виджет редактирования прямо на странице: кнопка открывает колоду слайдов для правки, не уходя с опубликованной страницы. Устаревший reel/teleprompter-layout удалён — carousel остаётся единственным layout для instaframes.
  • Зачем. Руководство и галерея делают функцию обнаруживаемой. Виджет редактирования закрывает петлю обратной связи: увидел опечатку на слайде — исправил здесь же. У reel-layout не было активных пользователей, и он дублировал кодовый путь карусели.
  • Как. Полное руководство и галерея: ru/user/instaframes. Виджет редактирования появляется на страницах карусели автоматически, если вы вошли как владелец сайта.

Исправления в панели администратора

  • Что. Два небольших исправления в admin-дашборде: ссылка на документацию по онбордингу теперь ведёт на нужную страницу (опечатка приводила к 404), а объём хранилища подписан MiB, что соответствует реальным расчётам в коде.
  • Зачем. Ссылка на онбординг была первым, что нажимал новый оператор; попасть на 404 — плохое первое впечатление. Прежний ярлык «MB» подразумевал десятичные мегабайты, тогда как код отдавал двоичные мебибайты.
  • Как. Автоматически после обновления.

Улучшения MCP и федерации

  • Что. Четыре точечных улучшения MCP-эндпоинта и слоя федерации. (1) Новый инструмент federated_instructions позволяет клиенту получить инструкционный текст для любого маршрута с кэшированием на маршрут. (2) Глубина федеративного обхода теперь работает по включающей семантике: запрос с max_depth=2 может пройти ровно 2 прыжка — раньше он останавливался на один прыжок раньше. Запросы, превышающие лимит, теперь возвращают чистый отказ. (3) Hop-rewrite распространяет kb_id вызывающего фрейма на федеративные результаты и ошибки — клиент всегда знает, от какого пира пришёл ответ. (4) Инструменты чтения заметок (note_html, note_text) теперь работают по path или match_id; документально зафиксировано, что note_id — это внутренний целочисленный идентификатор, непригодный для долгосрочных ссылок.
  • Зачем. Ошибка «на единицу» означала, что max_depth=1 не достигал ни одного пира — конфигурация выглядела рабочей, но не работала. Hop-rewrite позволяет строить цепочки атрибуции через федерированные хранилища. Ясные указания по note_id предотвращают кэширование агентами внутренних идентификаторов между синхронизациями.
  • Как. Изменений конфигурации не требуется. Если вы опирались на старую семантику глубины, уменьшите max_depth на единицу, чтобы сохранить прежнее поведение.

Визуализатор обхода графа MCP

  • Что. Новая интерактивная страница документации ru/search_visualizer позволяет наблюдать, как AI-модель обходит федеративный граф в реальном времени. Каждый вызов инструмента отображается как узел; есть мини-карта топологии федерации, быстрый выбор модели, временна́я ось шагов, панель импорта трейсов для воспроизведения сохранённых сессий. Бюджет — 50 шагов, достаточно для глубоких многоуровневых спусков.
  • Зачем. Обход федеративного графа непрозрачен: трудно понять, почему агент выбрал тот или иной путь и откуда взялась задержка. Визуализатор делает обход наблюдаемым.
  • Как. Откройте ru/search_visualizer, выберите модель и начальную базу знаний, введите запрос. Обход разворачивается узел за узлом. Трейс можно скачать и воспроизвести позднее.

memcli: локальный векторный поиск

  • Что. memcli теперь включает нативный arm64-ретривер, который выполняет векторный поиск локально — без обращений к внешнему сервису. Ретривер обрабатывает и эмбеддинги, и (опционально) ранжирование.
  • Зачем. Векторный поиск на локальном инстансе memcli раньше требовал сетевого вызова к серверу эмбеддингов. Встроенный ретривер делает локальный семантический поиск автономным на Apple Silicon.
  • Как. Ретривер запускается автоматически с memcli up на arm64 macOS. Дополнительная настройка не требуется. Гайд: ru/user/memcli.

Ретривер: поддержка Metal/MPS и безопасные сниппеты для UTF-8

  • Что. Ретривер-сайдкар теперь запускает инференс на Metal (Apple GPU) и MPS с точностью fp16 и исправлениями стабильности для micro-batch. Сниппеты результатов поиска обрезаются по границам rune, поэтому многобайтовые символы (кириллица, CJK, эмодзи) больше не обрезаются посередине кодпоинта.
  • Зачем. Инференс на CPU был в 3–10 раз медленнее, чем на GPU. Усечённый UTF-8 приводил к искажённому тексту сниппетов в многоязычных хранилищах.
  • Как. Автоматически. Ретривер выбирает лучшее доступное устройство при старте. Изменений конфигурации не требуется.

Операционные метрики: конвейер эмбеддингов и очереди задач

  • Что. На внутреннем эндпоинте метрик появились две новые группы Prometheus-метрик. (1) Метрики конвейера эмбеддингов — количество чанков, задержка и процент ошибок для каждого прохода эмбеддинга. (2) Метрики глубины очередей задач — сколько задач ждёт в каждой именованной очереди. Дополнительно: запросы на эмбеддинг чанков теперь разбиваются на под-батчи по максимальному размеру, который объявляет сервер ретривера, — это предотвращает шторм повторного эмбеддинга при лимите батча ниже числа чанков.
  • Зачем. Без метрик глубины очередей у операторов не было раннего предупреждения о росте бэклога. Фикс под-батчинга устранял цикл падений: oversized-батч → отказ эмбеддера → полный повторный эмбеддинг → снова oversized-батч.
  • Как. Новые метрики появляются на существующем эндпоинте без изменений конфигурации. Обновите дашборды, добавив панели глубины очередей и задержки эмбеддингов.

Telegram: навигационный браузер только для публичных live-заметок

  • Что. Встроенный в Telegram навигационный браузер теперь показывает только публичные live-заметки. Раньше в нём могли появляться приватные заметки и черновики.
  • Зачем. Пользователь, нажавший навигационную ссылку в Telegram, должен попадать на доступный ему контент. Черновики и приватные заметки открывали битые или закрытые страницы.
  • Как. Автоматически. Черновики и приватные заметки больше не отображаются в навигационном браузере Telegram.

v0.8.0 (2026-07-01)

Флот агентов (fleet)

  • Что. Заметки trip2g теперь могут запускать LLM-агентов. Вы пишете «роль-заметку» в папке (по умолчанию roles/): frontmatter описывает конфигурацию (модель, инструменты, шаблоны путей чтения/записи, триггер, лимиты бюджета, политика конкурентности), тело содержит инструкцию в виде Jet-шаблона против контекста триггера. Демон fleet обнаруживает роль-заметки, согласует change/cron-вебхуки и при срабатывании триггера запускает ограниченный агентный цикл с инструментами: search, read_note, patch_note, write_note. Инструмент executor: code (например, Python) отключён по умолчанию и контролируется через --allowed-programs / TRIP2G_FLEET_ALLOWED_PROGRAMS.
  • Зачем. Хранилище превращается в поверхность автоматизации (обработка транскриптов, построение баз знаний, сортировка, суммаризация) без внешней оркестрации. Trip2g остаётся простым источником событий; fleet является единственной движущейся частью.
  • Как. Бинарный файл fleet поставляется в образе trip2g по адресу /fleet и как отдельная загрузка. Настройте через переменные окружения TRIP2G_FLEET_* (или флаги cmd/fleet); аутентификация через admin HAT, сгенерированный из JWT-секрета приложения. Гайд: ru/agents_how_it_works.

Готовые бинарные файлы с контрольными суммами

  • Что. К каждому релизу на GitHub теперь прикреплены готовые архивы: linux amd64/arm64, macOS arm64/amd64, Windows amd64. В каждом архиве находятся trip2g-server и fleet плюс файл .sha256.
  • Зачем. Trip2g можно запустить без Docker: единственный бинарный файл на любой из пяти целевых платформ.
  • Как. Скачайте архив для своей ОС со страницы Release, проверьте через sha256sum -c *.sha256, распакуйте и запустите. macOS-бинари не подписаны: Gatekeeper предупредит при первом запуске; откройте через правый клик → «Открыть», чтобы разрешить.

trip2g lint docs

  • Что. Новая подкоманда lint docs запускает реальный загрузчик заметок над деревом документации и сообщает о проблемах: утечки межъязыковых вики-ссылок (русская заметка ссылается на английскую страницу), ошибки рендеринга layout-ов, битые ссылки (информационный режим). Заменяет прежний bash-скрипт check-doc-lang-links.sh; встроена в CI.
  • Зачем. Обнаруживает проблемы публикации до того, как они попадут в эфир: русская заметка ссылается на английскую страницу, layout не рендерится.
  • Как. trip2g lint docs (или go run -tags dev ./cmd/server lint docs из исходников). Код выхода ненулевой при предупреждениях; битые ссылки на ещё несозданные заметки считаются информационными и не блокируют проверку.

Метрики базы данных и более строгий SQL

  • Что. На существующем эндпоинте метрик теперь доступны три новые Prometheus-метрики: состояние пула соединений, размер файла базы данных и размер WAL. Двойные кавычки в SQL-строках отклоняются прагмой _dqs при старте, чтобы SQL-опечатки выявлялись сразу. Последний прямой импорт mattn/go-sqlite3 удалён из тестового инструментария; приложение работает на pure-Go modernc с более ранней версии.
  • Зачем. Метрики дают операторам видимость нагрузки на базу до того, как она стала инцидентом. Прагма _dqs превращает целый класс тихих SQL-ошибок в явную ошибку запуска.
  • Как. Метрики появляются на существующем эндпоинте внутренних метрик без изменения конфигурации. Прагма _dqs может обнаружить имеющиеся SQL-опечатки при обновлении; проверьте логи запуска, если сервер отказывается стартовать.

Поиск: cross-encoder reranker удалён

  • Что. Опциональный второй этап ранжирования на основе cross-encoder (добавлен по умолчанию отключённым в одном из предыдущих релизов) удалён вместе с Python-сайдкаром reranker-server/.
  • Зачем. Два раунда бенчмаркинга показали снижение качества поиска: nDCG упал с 0.9221 до 0.8881 на отрывках в 512 символов и до ~0.39 на полных текстах заметок. Cross-encoder переоценивал поверхностное совпадение терминов и продвигал тематически близкие, но нерелевантные результаты, которые bi-encoder + BM25 + RRF корректно располагал ниже. Подробнее: docs/dev/reranker.md.
  • Как. Ничего делать не нужно: функция была отключена по умолчанию. Любые ключи vector_search.reranker.* теперь игнорируются.

v0.7.1 (2026-06-26)

Широкие страницы (wide: true)

  • Что. Любую заметку теперь можно отрисовать на всю ширину, добавив wide: true во frontmatter: страница убирает обе боковые панели и узкую читаемую колонку, и контент занимает всё основное поле.
  • Зачем. Широкий контент (kanban-доски, большие Mermaid-диаграммы, широкие таблицы) был зажат в дефолтной колонке 65ch.
  • Как. Добавьте wide: true во frontmatter заметки. Гайд: ru/user/default-template.

Инструмент превью layout-ов: trip2g-preview, замена renderlayout.py (19483421, d0fe4179)

  • Что. Новый standalone node-CLI scripts/trip2g-preview.mjs рендерит Jet-layout против заметки через /_system/renderlayout и добавляет режим --watch: пере-POST-ит при каждом сохранении, а открытая по ?live страница перезагружается сама. Заменяет старый scripts/renderlayout.py (удалён), без зависимости от Python.
  • Зачем. Ускоряет цикл вёрстки: правишь _layouts/*.html и сразу видишь результат, ловишь ошибки Jet в терминале. Работает против любого сервера: локального memcli (читает data.json) или удалённого/staging через --api-url/--api-key.
  • Как. node scripts/trip2g-preview.mjs --watch --layout-file _layouts/article.html --note-path /about, затем открыть напечатанный ?live URL (с memcli сначала memcli open, чтобы браузер был залогинен). Гайд: ru/user/renderlayout; два локальных дизайн-цикла описаны в docs/dev/local_design_iteration.md.

memcli: изолированные инстансы через --name (5f0542f8, 353841e0)

  • Что. memcli up --name <id> поднимает второй инстанс в своём контейнере trip2g-memory-<id>. Тот же --name передавайте в down/status/logs и задавайте отдельный --port. Без --name поведение по умолчанию (trip2g-memory) не меняется.
  • Зачем. Позволяет держать несколько локальных memcli-инстансов рядом (например, по одному на vault), не конфликтуя за единственное захардкоженное имя контейнера.
  • Как. node cli/memcli/dist/memcli.js up --folder ./v2 --name v2 --port 24381. Состояние хранится отдельно для каждого --folder. Гайд: ru/user/memcli.

v0.7.0 (2026-06-23)

Режим read replica (a4423895)

  • Что. Второй инстанс trip2g теперь может работать как реплика только для чтения. Задайте TRIP2G_LEADER_ADDR на нём: он будет обслуживать все GET-запросы из локальной копии SQLite (реплицируемой через LiteFS) и пересылать каждую запись на первичный инстанс.
  • Зачем. Это снижает задержку на чтение при нагрузке на primary, позволяет перезапускать primary без потери ни одного читательского запроса и открывает возможность горизонтального масштабирования на отдельных машинах. В тестах во время перезапуска лидера не было зафиксировано ни одного сбоя чтения на реплике.
  • Как. Запустите LiteFS на обоих серверах (реплика получает потоковую копию WAL SQLite). Запустите реплику с --leader-addr=http://10.x.x.x:8082 --leader-shared-secret=.... Значение --leader-shared-secret должно совпадать с TRIP2G_LEADER_REPLICA_SECRET на primary. Полная инструкция по настройке: ru/user/read-replica.

Вход через OIDC / корпоративный SSO (1d2b12b5, b6446f76, e6d7afe9)

  • Что. Пользователи теперь могут входить с корпоративной учётной записью через Authentik, Keycloak или любой стандартный OpenID Connect-провайдер. На странице входа появляется кнопка «Войти через SSO», когда OIDC-провайдер настроен. Автопровизиинг опционален: при включении валидная идентичность IdP создаёт пользователя trip2g автоматически; при отключении пускаются только предварительно заведённые аккаунты.
  • Зачем. Команды с корпоративным IdP больше не управляют отдельными паролями trip2g, а MFA обеспечивает сам IdP.
  • Как. Задайте OIDC_CLIENT_ID, OIDC_CLIENT_SECRET и OIDC_DISCOVERY_URL на сервере. Строка в базе данных не нужна: провайдер читается из переменных окружения при каждом запросе. CRUD учётных данных администратора доступен через GraphQL-мутации для установок, которым это нужно. Полная инструкция: ru/user/oidc.

Хранилище на локальной файловой системе (0f5b84e2)

  • Что. Trip2g теперь может хранить загруженные ассеты (изображения, вложения) на локальной файловой системе вместо S3 или MinIO. Задайте STORAGE_BACKEND=local (или --storage-backend=local) и при необходимости укажите путь через STORAGE_LOCAL_PATH.
  • Зачем. Работа без объектного хранилища убирает главную внешнюю зависимость для одиночного сервера. Дешёвый VPS с подключённым томом становится полноценным автономным деплоем.
  • Как. Добавьте STORAGE_BACKEND=local в файл переменных окружения. Путь по умолчанию: ./data/storage; переопределите через STORAGE_LOCAL_PATH. При переходе с S3 нужно предварительно скопировать содержимое бакета в локальный путь. Полная инструкция для одного сервера: ru/user/local-quickstart.

Деплой без даунтайма (08a6cfde, 22dd8cf3)

  • Что. Trip2g теперь поддерживает socket activation systemd (LISTEN_FDS) и публикует два health probe на отдельном внутреннем порту: /livez (всегда 200, даже в период прогрева) и /readyz (503 до тех пор, пока инстанс не прогрелся, и снова во время дрейна). Вместе они дают балансировщику или оркестратору сигналы, необходимые для переключения трафика со старой версии на новую без потери запросов.
  • Зачем. Раньше при rolling restart возникал разрыв: старый процесс уже останавливался, пока новый ещё прогревал кэш заметок. Теперь новый инстанс прогревается параллельно, и трафик переходит только после того, как /readyz вернул 200.
  • Как. Добавьте socket unit в systemd, чтобы ОС удерживала порт в момент перезапуска. Задайте --internal-listen-addr=:8081 и настройте балансировщик на ожидание /readyz перед маршрутизацией. --shutdown-grace-period управляет тем, как долго старый инстанс продолжает обслуживать запросы после того, как /readyz переключился на 503. Используйте --simple-backup-on-shutdown=false, чтобы пропустить финальный бэкап во время rolling restart. Готовые рецепты (Nomad/Traefik, Caddy, k3s): ru/user/zerodowntime.

memcli: CLI для агентной памяти (a4e6fd1e, 951d52ed)

  • Что. memcli запускает инстанс trip2g как долгосрочную память для AI-агентов одной командой. Одна команда (node memcli.js up --folder ./memory) запускает Docker-контейнер с локальным хранилищем, создаёт admin-ключ через HAT, стартует sidecar trip2g-sync --watch и записывает заметку hub.md в memory-vault. Подкоманда hub и MCP-инструмент memory_bind_hub привязывают инстанс к удалённому federation hub, чтобы поисковые запросы агента охватывали федеративные базы знаний через единственный MCP-эндпоинт.
  • Зачем. Раньше настройка отдельного trip2g для агента требовала четырёх ручных шагов (сервер, ключ, синхронизация, MCP-конфиг). memcli сворачивает их в одну команду. Скомпилированный dist/memcli.js поставляется в репозитории, шаг сборки не требуется.
  • Как. node cli/memcli/dist/memcli.js up --folder ./memory-vault. После завершения MCP-эндпоинт доступен по адресу http://localhost:24081/_system/mcp. Добавьте его в .mcp.json вашего агента. Полная документация: ru/user/agent-memory.

Стабильность gitapi-зеркала (2845bb82, 8082c24d)

  • Что. Два исправления в зеркале DB→git (gitapi). Если вызов materialize завершается с ошибкой на полпути, осиротевшие loose-объекты теперь очищаются перед возвратом ошибки. После успешного materialize сразу запускается gc для упаковки loose-объектов. Раньше неудачные запуски могли оставлять orphaned-файлы, накапливавшиеся с каждой ночной перестройкой и в итоге заполнявшие диск.
  • Зачем. На инстансах с большим числом заметок повторные сбои materialize приводили к бесконтрольному росту директории git-данных. У операторов с небольшим VPS возникало давление на диск, требовавшее ручной очистки.
  • Как. Ничего делать не нужно. Оба поведения автоматические после обновления. Если наблюдался рост диска от осиротевших объектов, запустите git gc --prune=now в директории репозитория (или дождитесь следующего запуска materialize при перезапуске сервера).

v0.6.1 (2026-06-22)

Живые обновления в плагине Obsidian (плагин v0.5.0)

  • Что. Плагин trip2g sync теперь использует подписку noteChanges (появилась в v0.6.0) и подтягивает изменения с сервера в хранилище в реальном времени, без нажатия синхронизации и без ожидания периодической проверки.
  • Зачем. Для работы с нескольких устройств и правок агентами изменение на сервере (или на другом устройстве) появляется в Obsidian за секунду, а не после следующего опроса. Это изменение UX: мгновенная свежесть и меньше холостого трафика, а не прирост сырой скорости. Запрос списка заметок и так был чтением по индексу на ~10 мс.
  • Как. Обновите плагин до 0.5.0 (через BRAT), включите Two-way sync, затем задайте шаблоны Live pull в настройках плагина (include/exclude по glob, например **, или blog/** с исключением drafts/**). Безопасность сохранена: локальные правки никогда не перезаписываются (показывается окно конфликта), а удаление на сервере сначала спрашивает. Опрос раз в 60 секунд заменён на более лёгкую сверку-страховку раз в 5 минут. Документация: docs/ru/user/Двухсторонняя синхронизация.md. История: docs/ru/thoughts/sync-benchmark.md.

Намного быстрее массовая и CLI-синхронизация заметок с ассетами

  • Что. Синхронизация множества заметок с картинками стала радикально быстрее из CLI и browser-sync. Холодный пуш 2000 заметок с 2000 картинок упал с 231.8 с до 8.8 с (~26×).
  • Зачем. Каждая загрузка ассета запускала полный reload всех заметок на сервере, потому что CLI и browser-sync не батчили загрузки так, как уже делал плагин Obsidian. Один забытый флаг (skipCommit) превращал 2000 загрузок в 2000 полных reload-ов.
  • Как. Ничего делать не нужно, кроме обновления до плагина/CLI 0.5.0. Интерактивный плагин Obsidian был не подвержен.

Стабильность: подписка реального времени могла ронять сервер (c283963b)

  • Что. Гонка в in-process шине событий за подпиской noteChanges могла уронить весь сервер, когда подписчик отключался во время сохранения (send on closed channel).
  • Зачем. Пока подписчиков не было, она не стреляла, но новый плагин live-pull подключается и отключается регулярно, что делало баг реальным риском для всех, кто использует подписку.
  • Как. Ничего делать не нужно; шина теперь использует отдельный done-канал на подписчика и прогнана под нагрузкой с детектором гонок. Также в плагин добавлена команда Sync now (палитра команд).

v0.6.0 (2026-06-17)

Диаграммы Mermaid

  • Что. Блок ```mermaid в заметке рендерится как диаграмма на опубликованной странице: блок-схемы, диаграммы последовательности, круговые, Ганта, классов, состояний, ER и все остальные типы, которые поддерживает Mermaid.
  • Зачем. Диаграммы пишутся так же, как в Obsidian. Блок работает сразу.
  • Как. Добавьте блок кода с тегом mermaid и вставьте синтаксис диаграммы внутрь. Библиотека Mermaid загружается лениво, только на страницах, где есть блок mermaid; страницы без диаграмм ничего не платят. Документация: docs/en/user/mermaid.md, docs/ru/user/mermaid.md.

Графики из блоков datachart (7cadad3e, cb1403f5)

  • Что. Блок ```datachart превращается в интерактивный график на опубликованной странице (движок Apache ECharts). Данные берутся из четырёх источников: inline (строки прямо в блоке); frontmatter (файл из vault-а по [[вики-ссылке]] в frontmatter); url (внешний HTTP-JSON эндпоинт, который trip2g запрашивает на сервере и кеширует); internal (данные вашего сайта через SQL, скоро). Ошибки при загрузке URL фиксируются и видны автору сразу при синхронизации, а не только в браузере (97997bb4).
  • Зачем. Публикуйте живые графики так же естественно, как пишете любую заметку в Obsidian. Виджет ECharts загружается лениво, только на страницах с блоком datachart.
  • Как. Добавьте блок с тегом datachart. Внутри разместите JSON-объект с ключами data и config. Объект config передаётся прямо в ECharts: работают все типы графиков и опции, которые он поддерживает. Документация: docs/en/user/chartdata.md, docs/ru/user/chartdata.md.

MCP Federation: эндпоинт топологии для администраторов и настраиваемый kb_id (4485b6cd, 5c7492ae)

  • Что. Два дополнения к федерации, появившейся в v0.4.1. Новый эндпоинт GET /_system/federation/admin (только для администраторов) возвращает полную топологию федерации: все зарегистрированные KB-пиры, их скоупы и статус доступности. Идентификатор kb_id вашего инстанса теперь настраивается вручную; если не задан, берётся хост публичного URL.
  • Зачем. Операторы нескольких федеративных инстансов видят топологию без погружения в базу данных. Явный kb_id даёт стабильный, читаемый идентификатор, который остаётся корректным независимо от домена инстанса.
  • Как. Эндпоинт требует admin API-ключ или сессию. Задайте kb_id в конфигурации инстанса, чтобы переопределить значение по умолчанию. Существующие федеративные настройки менять не нужно.

SSE-подписки на изменения заметок в реальном времени (854c56b0)

  • Что. Новая GraphQL-подписка noteChanges передаёт клиентам события upsert и удаления заметок через SSE с опциональной фильтрацией по glob. Каждое событие содержит diff изменённых HTML-селекторов, чтобы клиент мог точечно обновить DOM без перезагрузки страницы.
  • Зачем. Позволяет строить интерфейсы, которые отражают изменения vault-а в момент, когда они попадают на сервер: редактор в браузере, панель предварительного просмотра, кастомный дашборд.
  • Как. Подпишитесь на noteChanges(glob: "posts/**") через GraphQL SSE-эндпоинт. Поле changedHtmlSelectors в каждом событии перечисляет CSS-селекторы, чей рендер изменился; это позволяет обновлять только нужные части страницы.
  • Что. В редакторе файлов в браузере (появился в v0.5.0) Ctrl+Click (или Cmd+Click на macOS) по wikilink открывает связанную заметку.
  • Зачем. Повторяет поведение Obsidian и убирает необходимость искать нужный файл вручную.
  • Как. Откройте редактор, наведите курсор на любую [[вики-ссылку]]; курсор меняется на указатель. Нажмите Ctrl+Click, и связанная заметка откроется.

v0.5.1 (2026-05-27)

Секреты вебхуков: зашифрованные данные в теле доставки (0b72acf2)

  • Что. У каждого change-вебхука и cron-вебхука в админке появился раздел Секреты. Добавляйте именованные пары ключ-значение (например auth_token, api_key); они хранятся зашифрованными и отправляются в каждом запросе доставки в поле payload.secrets. Получатель вебхука читает их без дополнительных вызовов API.
  • Зачем. Cron-вебхуки служат основой системы плагинов. Плагин представляет собой веб-сервер (или serverless-функцию), который получает payload с временным API-токеном и обрабатывает его, как правило в фоне, а затем патчит хранилище, когда готов. Плагины чаще всего stateless: им некуда безопасно хранить собственные учётные данные. Секреты решают эту проблему: trip2g хранит их зашифрованными и доставляет при каждом вызове, так что плагин остаётся credential-free на своей стороне. Если плагину нужно больше времени, он использует API-токен для асинхронных обновлений; секреты дают ему всё остальное для работы с внешними сервисами.
  • Как. Откройте Admin → Change Webhooks (или Cron Webhooks) → выберите вебхук → прокрутите до раздела Секреты. Введите название и значение, нажмите Add Secret. Чтобы обновить значение, введите его в поле строки и нажмите Save. Чтобы удалить, нажмите иконку корзины (подтверждение на второй клик). Секреты появляются в теле доставки в виде { "secrets": { "auth_token": "...", "api_key": "..." } }.

v0.5.0 (2026-05-26)

Редактор файлов в браузере (для администраторов)

  • Что. Администратор теперь может отредактировать любую страницу прямо на сайте. Иконка редактора появилась в правом верхнем углу админки и рядом с поиском на каждой странице. Откройте редактор, чтобы просмотреть все загруженные файлы деревом папок, открыть и отредактировать любой и сохранить. Файл можно откатить к прошлой версии.
  • Зачем. Поправить опечатку или обновить страницу за секунды. Без Obsidian и повторной синхронизации.
  • Как. Нажмите иконку редактора (только админы). Заметка текущей страницы открывается сразу; любой другой файл выбирается в дереве слева. Правки хранятся в браузере, пока не нажмёте «Сохранить»; панель версий позволяет загрузить и восстановить старую версию.

Публичный хаб курируемых баз

  • Что. Раздел hub/ с двуязычным индексом баз знаний, доступных через хаб (первая запись: «Журнал Ника Сенина», отфильтрованные кейсы Code with Claude 2026).
  • Зачем. Просматриваемая публичная точка входа к федеративным базам.
  • Как. См. docs/ru/hub/_index.md; добавьте свою через docs/ru/hub/_create.md.

v0.4.1 (2026-05-25)

MCP Federation: один хаб поверх многих баз знаний

  • Что. Ваш инстанс может работать как федеративный хаб. KB-заметка (заметка с mcp_federation_kb_url во frontmatter) регистрирует другую MCP-совместимую базу, а federated_search / federated_similar / federated_note_html обращаются ко всем сразу через ваш единственный MCP-эндпоинт. Публичным базам аутентификация не нужна; приватные пиры используют общий HMAC-секрет.
  • Зачем. Один эндпоинт, одна точка авторизации: агент ищет по вашим заметкам, инстансам партнёров и внешним адаптерам (GitHub, Telegram) одновременно, без правки .mcp.json.
  • Как.
    • Документация: docs/en/user/federation.md, docs/ru/user/federation.md
    • Публичная база: создайте заметку с mcp_federation_kb_url (+ опционально mcp_federation_kb_id) и free: true.
    • Приватный пир: обменяйтесь федеративным секретом в Админка → Federation, затем добавьте KB-заметку.

Файлы Canvas (Base и Excalidraw позже)

  • Что. Файлы .canvas синхронизируются и рендерятся. .base и .excalidraw тоже принимаются синхронизацией, но их рендеринг появится позже; пока вместо сломанной страницы показывается понятная заглушка.
  • Зачем. Vault-ы с Canvas работают уже сейчас; Base и Excalidraw синхронизируются без ошибок, пока готовится полная поддержка.
  • Как. Просто синхронизируйте: плагин и CLI принимают все три расширения; Canvas рендерится уже сейчас.

Telegram-боты навигации и canvas

  • Что. Бот-браузер по wikilink-ам и навигация на основе canvas поверх Telegram business connection.
  • Зачем. Читатели могут ходить по графу вашего vault прямо из Telegram.
  • Как. См. документацию по Telegram; включите на business connection.

Админка и конфиг

  • Что. GraphQL API для истории версий заметки; фильтр отправок форм в админке (статус / дата / обработано); переменные окружения принимают префикс TRIP2G_ (неизвестные переменные вызывают предупреждение).
  • Зачем. Смотреть и откатывать контекст, разбирать отправки и безопаснее настраивать self-hosted инстансы.
  • Как. Панели админки; добавьте префикс TRIP2G_ к любой переменной окружения.

Плагин синхронизации Obsidian + CLI

  • Что.
    • Принимает файлы .canvas, .base, .excalidraw.
    • Показывает детали GraphQL-ошибки при неудачном push (больше нет «тихих» сбоев).
    • Новый флаг --exclude <glob> (можно повторять). Исключённые пути никогда не пушатся; если они уже есть на сервере, они скрываются. Простое имя вроде dev совпадает с этой папкой и всем внутри неё. По умолчанию ничего не исключается: грузится всё.
  • Зачем. Держать тестовые/демо или внутренние папки (например, dev/, demo/) в репозитории, но вне опубликованного сайта, и обратимо скрывать их на сервере.
  • Как. trip2g-sync ./docs --exclude dev --exclude demo. Если вернуть путь обратно, он снова публикуется и автоматически перестаёт быть скрытым.

v0.4.0 (2026-05-21)

Мутация updateNotes: атомарный find/replace по заметкам

  • Что. Новая GraphQL-мутация патчит несколько заметок одной транзакцией через PathMap вида {path → [{find, replace}]}.
  • Зачем. Позволяет внешним инструментам, агентам и скриптам согласованно править весь vault без отдельных запросов на каждую заметку. Никаких частичных состояний, если одна замена не прошла.
  • Как.
    • Документация: docs/en/user/update_notes.md, docs/ru/user/update_notes.md
    • Пример: updateNotes(input: { pathMap: { "notes/post.md": [{ find: "old", replace: "new" }] } }).
    • End-to-end спецификация: e2e/updatenotes/* (см. коммит test(e2e): add updateNotes e2e spec and demo fixture).

Forms admin: обработка отправок формы

  • Что. Новая мутация markFormSubmitProcessed и поля processed у submit-ов; админ помечает отправку как обработанную, UI по умолчанию скрывает обработанные.
  • Зачем. Замыкает работу с формами внутри админки. Не нужно дёргать внешние сервисы.
  • Как.

Smoke-render шаблонов: runtime-ошибки Jet видны сразу при загрузке

  • Что. При загрузке заметок каждый успешно распарсенный Jet-шаблон выполняется на первых 10 заметках, которые ссылаются на него через frontmatter layout:. Ошибки и паники рендера превращаются в NoteWarning на шаблоне.
  • Зачем. Раньше шаблон, который парсится, но падает на рендере (например, {{ note.NoSuchField }}), ломался только при открытии страницы в браузере. Агент, делающий push-notes, об этом не знал. Smoke-render переносит ошибку на этап загрузки: варнинги попадают в тот же канал, что и parse-ошибки, и видны через pushNotes / админский список шаблонов без браузера.
  • Как. Автоматически, без флагов. После синхронизации ищите в варнингах шаблона smoke render error / smoke render panic. Шаблоны без View (parse-ошибка) и без ссылающихся на них заметок пропускаются.

Отладка шаблонов: Meta.Debug() и глобальный debug()

  • Что. В Jet-шаблонах: {{ Meta.Debug() }} выводит метаданные заметки; глобальный {{ debug(<expr>) }} через reflection печатает тип, значение и набор методов любого выражения.
  • Зачем. Убирает цикл «угадай, что видит шаблон» при работе с layout-ами и компонентами.
  • Как.

CLI renderlayout.py: рендер шаблона на заметке из терминала

Исправления

  • layoutloader: nil-guard для YieldNode.Parameters; ID шаблона в preview нормализуется как в продакшене.
  • Preview renderlayout: autoimport, проводка yield_blocks и htmlInjections совпадают с продакшеном.
  • renderpreview парсит YAML-frontmatter из note.src как реальный загрузчик.
  • templateviews.GetStrings возвращает пустой слайс вместо nil (нет сюрпризов при итерации в шаблоне).

Документация и chore

  • Dev-справка по Forms + roadmap, BEM rendering skill, секция про debug() в Jet.
  • Lint чист в updatenotes, layoutloader, noteloader.

v0.3.1 (исторический backfill)

Формы в заметках (первая версия)

  • Что. Формы встраиваются в vault-заметки через frontmatter и рендерятся стандартным шаблоном. Поддержка нескольких форм в одной заметке; submit хранит note_version_id и form_id.
  • Зачем. Опубликованный сайт собирает ввод (регистрации, контакты, опросы) без внешних сервисов.
  • Как. См. docs/dev/forms.md и docs/{en,ru}/user/forms.md.

HTML-инъекции в layout-ах

  • Что. Кастомные HTML-инъекции (placement head / body_end) теперь применяются и внутри Jet-layout-ов, не только в стандартном шаблоне.
  • Зачем. Аналитика, кастомные скрипты и SEO-теги работают и на страницах с кастомными layout-ами.
  • Как. Админка → HTML injections, placement head или body_end.

Переработанный переключатель языка

  • Что. Dropdown с полными нативными названиями языков и нормализацией; флаг US для английского; многоязычные документы.
  • Зачем. Мультиязычные сайты выглядят корректно и правильно выбирают альтернативу по языку.
  • Как. Frontmatter lang: / lang_redirect:; переключатель рендерится автоматически.

Preview-эндпоинт renderlayout (/_system/renderlayout)

  • Что. Админский эндпоинт для рендера произвольного layout-а на заметке.
  • Зачем. Редактор / IDE-интеграции могут показывать живой preview изменений в _layouts/*.
  • Как. Спецификация: docs/superpowers/specs/2026-05-10-renderlayout-endpoint-design.md.

Админка: включение/отключение API-ключей

  • Что. GraphQL-мутация и кнопка в админке для переключения состояния API-ключа; автоматическая чистка логов API-ключей через 90 дней.
  • Зачем. Можно приостановить ключ без его ротации; логи не разрастаются.
  • Как. Админка → панель API keys.

Onboarding vault: конфиги для агентов

  • Что. Скачиваемый онбординг-vault теперь содержит .mcp.json, codex.json, antigravity-конфиг и AGENTS.md.
  • Зачем. Drop-in настройка AI-агентов над Obsidian-vault без ручной проводки.
  • Как. Скачайте онбординг-vault, конфиги уже внутри.

Cronjob-ы заблокированы для редактирования по умолчанию

  • Что. Редактирование cronjob-ов выключено, пока не передан --cronjobs-allow-edit.
  • Зачем. Снижает риск ошибок в общих / production-развёртываниях.
  • Как. Добавьте флаг в стартовый скрипт, если правда нужно редактировать cron через админку.

Заметные исправления

  • Backlinks / similar notes исключают системные заметки (пути с _).
  • TOC-якоря снова работают (id у заголовков попадает в HTML).
  • Mesh template: yield_blocks перенесён в <head> с документированными ограничениями.

v0.3.0 (исторический backfill)

Документированный self-hosted деплой

  • Что. End-to-end гайд по запуску trip2g на своей инфраструктуре.
  • Зачем. Воспроизводимая установка вне хостинга.
  • Как. docs/{en,ru}/user/hosting.md и связанные документы.

Sign-in wall + капча (Auth phase 1A)

  • Что. Требование входа на конкретные заметки, капча на auth-флоу, усиленные сессии.
  • Зачем. Закрывает приватный контент; снижает абьюз публичных auth-эндпоинтов.
  • Как. Frontmatter / subgraph require_signin; стандартный шаблон рендерит стену.

Vault-секции layout-а

  • Что. Header / footer / sidebar могут браться из vault-заметок.
  • Зачем. Авторы правят «обвязку» так же, как контент, без хаков в шаблонах.
  • Как. Размещайте заметки по конвенциональным путям (см. docs/dev/default_template.md).

Vault-патчи frontmatter

  • Что. Markdown-файлы в vault могут декларировать патчи, которые применяются к frontmatter других заметок при загрузке.
  • Зачем. Массово тегировать, ставить layout или нормализовать метаданные без правки каждой заметки.
  • Как. docs/dev/frontmatter_patches.md.

Поиск: эмбеддинги bge-m3 + микросервис эмбеддингов

  • Что. Переход на модель bge-m3; отдельный сервис embedding-server; топ-K векторного поиска с matchOrigin.
  • Зачем. Лучше семантический поиск и развязка embedding-нагрузки.
  • Как. Настройте эндпоинт эмбеддингов; векторный поиск доступен через существующие search-API.

Улучшения MCP

  • Что. Результаты MCP-поиска адресуемы и самоописываемы, открываются как сфокусированный chunk-read; текстовые хиты маппятся в ближайшие чанки.
  • Зачем. RAG-клиенты получают богаче и проще навигируемые результаты.
  • Как. Подключайтесь по MCP; для проводки клиента см. docs/user/ai-agent-docs-setup.md (если есть в вашем vault).

«Читать в Telegram» + Telegram UX

  • Что. Кнопка на странице заметки; для опубликованных постов используются публичные TG-ссылки; UTM-теги на трафике из Telegram.
  • Зачем. Замыкает связь между публикациями на сайте и аудиторией Telegram.
  • Как. Автоматически для постов, опубликованных через TG; схема UTM описана в docs/superpowers/specs/.

CLI exporttgchannel

  • Что. Новая CLI-команда для экспорта Telegram-канала в Obsidian-markdown.
  • Зачем. Один шаг от существующего канала к vault-у.
  • Как. go run ./cmd/exporttgchannel --help.

Заметные исправления

  • Настраиваемая нормализация URL с 301-редиректами для альтернативных вариантов.
  • Аудио рендерится как <audio>, документы рендерятся как ссылки.
  • Очередь: устранена утечка горутин при двойном старте и deadlock при остановке.
  • Wikilink [[slug#anchor]]: якорь отрезается до lookup-а заметки.
  • Все варнинги golangci-lint исправлены, добавлен pre-push хук.