# Изменения Формат основан на [Keep a Changelog](https://keepachangelog.com/ru/1.1.0/), проект придерживается [семантического версионирования](https://semver.org/lang/ru/). ## [0.0.37] — 2026-08-10 Закрытие технического долга. Без изменений в продуктовой логике, кроме исправления лишнего отказа при первом входе в комнату (см. «Исправлено»). ### Исправлено - Тесты бэкенда были не изолированы от состояния `instance_settings` (`chat`, `hand_queue` и др.) в общей dev-БД: выключение любого модуля в админке локального стенда роняло не связанные с ним тесты. Изоляция — через фикстуру `clean_instance_settings`, явно подключаемую в тестах, которым нужен «чистый стол» по умолчанным значениям. - `RoomPage.tsx`: сохранённый выбор устройства «по умолчанию» (`usePersistentUserChoices`, литерал `"default"`) не отсекался `|| undefined` — в Chrome это давало лишний `OverconstrainedError` на первом визите (то же самое уже было исправлено для страницы проверки устройств в 0.0.33). - Локальный контейнерный стенд (`docker compose --profile media up`) не поднимался «как есть» — `DATABASE_URL` из корневого `.env` (указывает на `localhost`, нужен только для запуска backend на хосте) утекал внутрь контейнеров и ronял подключение к БД. Теперь compose всегда собирает строку подключения сам из `POSTGRES_USER`/`PASSWORD`/`DB` с хостом `postgres`, как уже было сделано для `REDIS_URL`. - `vidconf_pipeline_sessions` в `/metrics` читалась через основной пул БД — на нагрузке могла отвалиться вместе с остальным API ровно тогда, когда метрика нужнее всего (см. инцидент 07.08). Теперь читается через отдельный движок, как `vidconf_db_up`/`vidconf_db_pool_*`. ### Изменено - `.env.example`: убраны неиспользуемые `MEDIA_URL`/`VITE_API_URL`, добавлены живые `MEDIA_ROOT`/`EGRESS_START_TIMEOUT_S`/`LIVEKIT_WS_URL`. - 13 предупреждений `ruff` (длина строки): реальный код переформатирован, текст регламента персональных данных вынесен в отдельный модуль (`services/consent_policy_text.py`) — как и вёрстка email-писем, это прозаический текст, а не код. ## [0.0.36] — 2026-08-10 Исправление к 0.0.35: замена фона не появлялась в Safari и Firefox. ### Исправлено - Проверка поддержки замены фона была строже, чем требует библиотека, и молча отрезала два браузера — кнопки выбора фона не было ни в превью, ни в комнате. У библиотеки два конвейера обработки кадров: современный (только Chrome и производные) и запасной через `canvas.captureStream()`, который работает и в Safari, и в Firefox; проверка требовала именно современный. Теперь условие буквально повторяет проверку самой библиотеки. ## [0.0.35] — 2026-08-10 Замена фона видео на картинку — отключаемый модуль (по умолчанию выключен). Три готовые сцены и свои картинки (до 10 штук, загружаются в профиле). **Только на компьютере:** сегментацию силуэта считает нейросеть на каждом кадре, и на телефоне это греет устройство, ест батарею и просаживает FPS в самой встрече — портить основное ради украшения нельзя. ### Добавлено - Кнопка «Фон» в тулбаре комнаты и выбор фона в превью на входе. Выбранный до входа фон применяется к публикуемому треку сразу в конференции. - Три дефолтные сцены (офис, пляж с пальмами, космическая станция) — собственные векторные рисунки (`design/backgrounds/`), а не фотографии из интернета: у нарисованной сцены нет чужой лицензии, а продукт расходится по инсталляциям, и проверять права на каждую копию некому. - Раздел «Свои фоны» в профиле: загрузка (не больше 10 штук) и удаление. Картинка уменьшается до 1280px по длинной стороне и переводится в WebP прямо в браузере перед отправкой — «чтобы не грузили БД». Файлы лежат на диске, в БД только пути, как у аватаров. - Тумблер «Замена фона видео» в админке. Лимит на число картинок и формат файла проверяются на сервере, а не только в интерфейсе. ### Особенности реализации - **Модель сегментации и wasm-рантайм отдаются со своего домена.** По умолчанию библиотека тянет их с внешних CDN (jsdelivr и storage.googleapis.com), и в закрытом контуре фича молча не работала бы. Модель (Apache 2.0) лежит в репозитории, рантайм копируется из node_modules при сборке; nginx отдаёт их сжатыми и с долгим кэшем. - Библиотека и модель грузятся **лениво**, только когда фон реально включают: вход в конференцию не стал медленнее, основной бандл не вырос. - «Десктоп» определяется по возможностям устройства (точный указатель + hover + число точек касания), а НЕ по ширине окна: узкое окно на десктопе — всё ещё десктоп, а широкий планшет — всё ещё планшет. На мобильном кнопки нет вовсе, а не задизейбленной. - Фон переживает выключение и включение камеры и смену устройства съёмки. Удаление применённой сейчас картинки сбрасывает выбор на «без фона». ## [0.0.34] — 2026-08-09 Правка к проверке устройств на входе (0.0.33): превью и кнопки камеры/микрофона теперь и на шаге «Подключиться к конференции», не только на карточке «Как вас зовут?». Закрывает реальный пробел — авторизованный пользователь, входящий через `/join`, карточку «Как вас зовут?» не проходит вовсе (сразу подключение) и раньше проверку устройств не видел никогда. ### Исправлено - Превью камеры и кнопки вкл/выкл — на шаге ввода ссылки/номера конференции, тем же компонентом, что и на карточке гостя. Поток живёт непрерывно на обоих шагах — переход между ними не гасит и не переоткрывает камеру. - Состояние кнопок «войти с камерой/микрофоном» теперь доезжает до комнаты и для гостя (`input → guest-info → комната`), и для авторизованного пользователя (`input → connecting → комната`). - Починена грабля с превью между шагами: `