# Описание релиза Galo — 23 октября 2026 **Версия:** `0.2.0` **База релиза:** `0.1-alpha` (`723b19b`, 21 октября 2026) → `develop` (`9e39e3d`, 23 октября 2026) **Объём:** 6 коммитов, 3 спецификации обновлены, 2 изменения реализованы --- ## Коротко о главном 1. **Инструмент «Цвет».** Баланс белого, вибрация и насыщенность, цветовой микшер по восьми диапазонам оттенков, цветокоррекция по зонам яркости и общая поканальная коррекция. Предпросмотр считает WebGL2, есть WASM/JS-фолбэк. 2. **Пресеты тоновой кривой.** Плавная монотонная кривая (PCHIP), подвижные крайние точки и плоские полки. Встроенные и пользовательские пресеты всех четырёх каналов хранятся в профиле, импортируются и экспортируются JSON-файлом. 3. **Настройки профиля больше не затирают друг друга.** Сохранение сведений о фото и пресетов кривой мержится на сервере по разделам. 4. **Исправлено переключение фото в редакторе.** Вкладка правой панели сохраняется, а несохранённые правки уходят тому фото, для которого сделаны. --- ## Новые возможности ### Инструмент «Цвет» - **Баланс белого:** температура и оттенок, пипетка по нейтральной точке на фото. - **Вибрация и насыщенность** с раздельными ползунками. - **Цветовой микшер** по восьми диапазонам (красный, оранжевый, жёлтый, зелёный, бирюзовый, синий, фиолетовый, пурпурный): тон, насыщенность и яркость каждого диапазона. - **Цветокоррекция по зонам:** колёса теней, средних тонов и светов, наложение и баланс зон. - **Поканальная коррекция** красного, зелёного и синего каналов. - **Живой предпросмотр на WebGL2:** кадр считает GPU, поэтому изменения видны сразу. Если WebGL2 недоступен, используется WASM/JS-фолбэк с тем же результатом. - Ползунки с градиентами, цветовые колёса и сброс значения двойным кликом. - Порядок операций совпадает в Go-рендере, WASM и JS-предпросмотре; паритет закреплён тестами. ### Тоновая кривая и пресеты - **Плавная кривая:** монотонная кубическая интерполяция (PCHIP) вместо прямых отрезков — и в SVG-графике, и в LUT для предпросмотра и серверного рендера. - **Крайние точки** `(0,0)` и `(1,1)` существуют сразу, двигаются по обеим осям; вне крайних точек кривая остаётся плоской. Первый клик по полю вставляет точку между крайними. - **Встроенные пресеты:** «Линейный», «Средний контраст», «Сильный контраст». Контраст задаётся в RGB, каналы R/G/B остаются линейными. - **Пользовательские пресеты** описывают кривые всех четырёх каналов: - сохранение, применение, переименование и удаление; - хранение в `users.preferences.curve_presets` в профиле пользователя; - приватность: чужие пресеты не видны; - импорт и экспорт JSON `{ "version": 1, "presets": [...] }`, upsert по имени; - старый формат одного канала конвертируется при чтении. - Подпись показывает активный пресет; при ручной правке любого канала — «Пользовательский». Сброс возвращает линейную кривую. ### Настройки профиля - `PATCH /api/auth/me/preferences` теперь **мержит** разделы, а не заменяет весь JSON-объект. - Сохранение `photo_info` не стирает `curve_presets`, и наоборот. - Валидация: не больше 100 пресетов, имя 1..64 символа, 2..16 точек на каждый из четырёх каналов, `x/y` в диапазоне 0..1. - Неизвестные разделы настроек сохраняются без изменений. --- ## Исправления - **Переключение фото в редакторе.** Вкладка правой панели больше не сбрасывается на «Сведения». Накопленные правки отправляются фото, для которого сделаны, даже если пользователь уже перешёл к следующему. - **Фоновые сохранения не подменяют текущее фото.** Устаревшие ответы сохранения и загрузки игнорируются; панель показывает только фото текущего маршрута. - **Копия фото не наследует отредактированную версию.** Копия показывает исходник, правка принадлежит своему фото (архивная синхронизация спецификации `media-objects`). - Устранены ошибки доступа к `photo = null` при кратковременной смене фото. --- ## Технические изменения ### API - `PATCH /api/auth/me/preferences` — мерж известных разделов; в ответе возвращается полный объединённый объект. - `PATCH /api/photos/:id/edit` — параметры правок теперь включают блок `color` и тоновую кривую; серверный рендер использует те же LUT, что и предпросмотр. - `DELETE /api/photos/:id/edit` — сброс правок без изменений. ### Данные и миграции - Схема БД не менялась: новые настройки лежат в JSON-блобе `users.preferences`; параметры правок — в `photos.edit_params`. - Новые роли объектов и миграции не добавлялись. - Старые сохранённые кривые начнут интерполироваться плавно — визуальный результат может немного измениться без миграции данных. ### Сборка - Обновлён WASM-модуль фильтров (`frontend/static/light.wasm`). - `make build-release` собирает статический бинарник с вшитой версией и сжимает его UPX, если UPX доступен. - Версия берётся из `git describe --tags`; релизный тег — `0.2.0`. ### Проверка - `npm run check` — 0 ошибок и предупреждений. - `npm run test` — 54 теста. - `go test ./...` — все пакеты зелёные. - E2E: сохранение/сброс цветовых правок, приватность и хранение пресетов кривой. - Проверено в браузере: WebGL2-предпросмотр, пипетка, меню пресетов, сохранение всех каналов, сохранение вкладки и правок при переключении фото. --- ## Как обновиться 1. Собрать релизный бинарник: `make build-release` (или взять готовый `bin/galo-0.2.0`). 2. Остановить сервис и заменить бинарник. Фронтенд вшит в бинарник. 3. Запустить сервис: миграции применяются автоматически при старте для выбранного бэкенда. Для этого релиза отдельных миграций нет. 4. Для видео по-прежнему нужны `ffmpeg`/`ffprobe` на хосте. 5. Android-клиент обновляется отдельно через `make install-android-app`. Откат: вернуть предыдущий бинарник. Схема не менялась, данные правок и профиля остаются совместимыми; новые ключи настроек старый бинарник просто игнорирует. --- ## Ограничения - Редактирование цвета и кривой доступно только для изображений; видео не редактируется. - WebGL2-предпросмотр ускоряет отрисовку, но при его отсутствии используется WASM/JS-фолбэк. - Пресеты не синхронизируются между пользователями: перенос возможен только через экспорт/импорт JSON. - Правки не создают отдельной записи в истории: параметры хранятся в метаданных фото, отредактированная версия — отдельный объект.