Steven
Steven6 мин. чтения

Встречи, которые снова можно найти: релиз с таймлайном

GeekBye v1.7.3 заменил дропдаун встреч настоящим таймлайном — человеческие даты, поиск, хлебные крошки, показывающие, в какой встрече ты находишься. А под капотом: гонка авто-выбора, скриншот старше собственной встречи и пять фиксов для Windows за двадцать восемь минут.

Инженерия
UX
Десктоп
Релизы GeekBye
Встречи, которые снова можно найти: релиз с таймлайном

К январю 2026 года у пользователей GeekBye появилась проблема с историей. Приложение прекрасно записывало и анализировало их встречи — а потом складывало их в дропдаун. Дропдаун хорош для трёх элементов. К пятнадцатой встрече «то собеседование в прошлый вторник» превращалось в археологическую экспедицию по одинаково выглядящим строкам. v1.7.3 — 64 коммита между серединой декабря и 16 января — это релиз, в котором встречи стали тем, что снова можно найти.

(Одна бухгалтерская заметка, потому что история git честна, даже когда номера версий — нет: тега релиза v1.7.2 не существует. Версию подняли, но следующим отгруженным тегом стал v1.7.3, так что фиксы для Windows эпохи v1.7.2 поехали в этом релизе.)

От дропдауна к таймлайну

Главное изменение — один pull request: 12 файлов, +640 строк, большая часть которых — новый 381-строчный компонент MeetingsTimeline. Дропдаун стал прокручиваемым таймлайном карточек встреч, сгруппированных в четыре корзины — Today, Yesterday, This Week, Older (Сегодня, Вчера, На этой неделе, Старше) — с датами, отрендеренными так, как их произнёс бы человек: Today, 2:30 PM, Yesterday, 2:30 PM, Mon, 2:30 PM для этой недели и Jan 5, 2:30 PM дальше. Cmd/Ctrl+K фокусирует поле поиска, фильтрующее по названию. Детальный вид встречи стал настоящей страницей навигации, так что кнопки «назад» и «вперёд» в навбаре наконец что-то значат, а хлебные крошки перестали показывать «Meetings / Meeting» и начали показывать «Meetings / Interview with John» (обрезанное многоточием, потому что кто-нибудь обязательно назовёт встречу как роман).

Вместе с этим приехали две маленькие приятности: кнопка удаления внутри вида встречи (которая после удаления возвращает тебя на таймлайн, вместо того чтобы бросить на мёртвой странице), и авто-навигация — когда сессия прослушивания заканчивается с реальным содержимым транскрипта, дашборд открывается сразу на детальной странице этой встречи. Заканчиваешь звонок — видишь встречу. Сессии, закончившиеся пустыми, тихо удаляются вместо того, чтобы захламлять таймлайн.

Гонка, которую создаёшь, улучшая навигацию

А вот часть, которую changelog тебе не расскажет. У старого списка встреч была привычка: при каждой загрузке он авто-выбирал новейшую сессию. Безобидно, пока список был дропдауном, который ты редко трогал. Смертельно в тот момент, когда встречи стали страницей, по которой ты навигируешь: кликаешь встречу #5, фоновый refetch завершается — и список услужливо выбирает новейшую встречу, перезаписывая выбор, сделанный тобой две секунды назад. Фиксом стал не более хитрый гард; фиксом стало полное удаление авто-выбора. Любой список, который выбирает что-то от имени пользователя, рано или поздно начнёт с ним драться.

Его удаление обнажило вторую гонку. Авто-навигация прыгает во встречу в момент окончания её сессии — что может случиться до того, как эта сессия закончит запись в локальную базу SQLite. Навигируешь слишком быстро — и приходишь во встречу, которая ещё не существует. Отгруженный фикс — 500-миллисекундная задержка перед загрузкой сессий при входе в детальный вид, а обработчик навигации несёт собственные подстраховки — ждать did-finish-load окна плюс 100ms, если дашборд был только что создан, 50ms, если он уже был открыт. Наше прочтение: навигация по окончании сессии пересекает три временных домена — запись в базу, загрузку окна и монтирование React — и каждый получил свою маленькую задержку. Это работает, и мы скажем прямо: стопка магических чисел — это честный долг, а не победа.

Скриншот старше собственной встречи

В этом релизе умерло ещё одно допущение: «скриншоты принадлежат сессии тогда и только тогда, когда были сделаны во время неё». Совершенно логично. Неверно. Реальные пользователи жмут Cmd+H на вакансии, повестке, коде, который они собираются обсуждать — до нажатия Start. Вкладка Report сопоставляла скриншоты с временным диапазоном сессии строго, так что эти подготовительные скриншоты исчезали из отчёта, ради которого их сделали. Фикс расширил окно сопоставления на 60 секунд до старта сессии. (Сама машинерия временных диапазонов старше — она тихо приехала в v1.6.15; вклад v1.7.3 — научить её тому, что встречи начинаются чуть раньше, чем начинаются.)

Пять фиксов за двадцать восемь минут

Военная история этого релиза вообще не в таймлайне — она в оверлее онбординга на Windows, и это хрестоматийная цепочка «чини фикс»: пять коммитов между 10:50 и 11:18 одним и тем же утром.

Главное окно GeekBye использует пропуск мыши — хук, который переключает Electron-овский setIgnoreMouseEvents при каждом движении мыши, чтобы клики проваливались сквозь прозрачные области. Во время онбординга на Windows этот хук воевал с оверлеем туториала, и на шаге, где появляется окно дашборда, приложение зависало. Фикс номер один: пусть хук ничего не делает, пока онбординг активен. Мир через разоружение.

Вот только теперь кнопки онбординга не отвечали, потому что форвардинг событий отправлял клики окну дашборда под оверлеем. Фиксы два и три ковырялись с forward: false для каждого мастера. Затем пришёл коммит, который нашёл настоящую первопричину: когда открывается окно дашборда, его обработчик перетаскивания сбрасывает главное окно в режим сквозных кликов — а первый фикс сделал хук пропуска пассивным, что означало: не осталось ничего, что могло бы исправить это вмешательство. Настоящий фикс перевернул стратегию: хук теперь активно переутверждает setIgnoreMouseEvents(false) при каждом движении мыши во время онбординга — именно потому, что внешний код может сбросить его в любой момент. Он также удалил 75 строк более ранних обходных путей для каждого мастера.

И даже тогда был пятый коммит, потому что выиграть войну за ввод — не значит выиграть войну за z-order: оверлей и дашборд сидели на одном и том же уровне always-on-top, а Windows поднимает то окно, которое получает фокус. Оверлей переехал на более высокий уровень окна и заново поднимает себя с задержкой после появления дашборда. Эту дугу стоит запомнить: пассивный фикс, обезоруживающий твоего единственного защитника, хуже исходной драки.

Три вещи, которым нас научил этот релиз

  1. Апгрейды навигации вскрывают баги состояния. Гонка авто-выбора существовала до v1.7.3; дропдаун просто никогда не давал её почувствовать. В момент, когда встречи стали страницей, по которой ты осознанно навигируешь, каждый кусок кода, выбиравший что-то за тебя, стал багом.
  2. Временным границам вокруг намерения пользователя нужен люфт. Сессии, записи, отчёты — пользователи действуют чуть раньше и чуть позже официального окна машины. 60-секундный буфер для скриншотов — одна строка, которая отражает то, как люди ведут себя на самом деле.
  3. Никогда не делай свой корректирующий код пассивным. Зависание на Windows потребовало пяти фиксов, потому что фикс номер один выключил единственный механизм, способный противодействовать внешнему вмешательству. Если какой-то другой код может сломать твой инвариант в любой момент, твоя работа — переутверждать его непрерывно, а не отойти в сторону.

Про предыдущую главу истории v1 — как из этой одной кодовой базы строятся два брендированных приложения — смотри одна кодовая база, два приложения: как сделать white-label без форка (v1.7.1); а про весь путь — анатомию доведения софта до совершенства.

Похожие статьи

Четыре релиза за двадцать шесть часов: языковая сантехника и «bridge release»
Steven
Steven5 мин. чтения

Четыре релиза за двадцать шесть часов: языковая сантехника и «bridge release»

GeekBye от v1.7.6 до v1.8.1: настройка языка, которая ни разу не покидала ноутбук, оверлей Cmd+/, показывающий твои настоящие горячие клавиши, версия без единого изменения в коде — и проблема курицы и яйца при миграции фида автообновлений.

Инженерия
Релизы
Десктоп
Страница логина и ЕСТЬ демо
Steven
Steven6 мин. чтения

Страница логина и ЕСТЬ демо

GeekBye v1.7.5 добавил скриншот продукта на страницу логина и удалил его в тот же день — пересобрав вместо него демо из настоящих компонентов. Плюс: пользователь, который оказался быстрее OCR, и как на самом деле выглядят 25 стилевых коммитов за один день.

Инженерия
Дизайн
UX
Разрыв соединения не должен ронять всё приложение — а наше ронял
Steven
Steven6 мин. чтения

Разрыв соединения не должен ронять всё приложение — а наше ронял

Когда наш бэкенд отвалился посреди встречи, он не просто приостановил транскрипцию — он уронил всё приложение. Причиной было единственное необработанное событие, а исправление уместилось в десять строк. Это кластер релизов, благодаря которому GeekBye остаётся залогиненным и на связи через то, что раньше его убивало.

Инженерия
Надёжность
Electron