История изменений
Все значимые релизы 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; поставить к себе —
curllayout из репозитория шаблона и заметка с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 cloneURL_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, затем открыть напечатанный?liveURL (с 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, стартует sidecartrip2g-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-селекторы, чей рендер изменился; это позволяет обновлять только нужные части страницы.
Редактор в браузере: переход по wikilink через Ctrl+Click (a065fea2)
- Что. В редакторе файлов в браузере (появился в 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 по умолчанию скрывает обработанные. - Зачем. Замыкает работу с формами внутри админки. Не нужно дёргать внешние сервисы.
- Как.
- Документация:
docs/en/user/forms.md,docs/ru/user/forms.md - Dev-справка:
docs/dev/forms.md - Frontmatter
can_submit/success_urlзадаёт условия отправки и страницу-подтверждение.
- Документация:
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-ами и компонентами.
- Как.
- Документация:
docs/en/user/jet.md,docs/ru/user/jet.md(раздел про отладку). - Пример:
{{ debug(note.M()) }}или{{ debug(note.Title) }}.
- Документация:
CLI renderlayout.py: рендер шаблона на заметке из терминала
- Что. Отдельный скрипт
scripts/renderlayout.pyплюс skillcheck_templatesдля агента. - Зачем. Дает preview шаблонов и воспроизведение проблем без браузера, удобно в CI и при правке
_layouts/. - Как.
- Документация:
docs/en/user/renderlayout.md,docs/ru/user/renderlayout.md - Skill:
docs/skills/check_templates.md
- Документация:
Исправления
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 хук.