Steven
Steven5 хв читання

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

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

Інженерія
Релізи
Десктоп
Релізи GeekBye
Чотири релізи за двадцять шість годин: мовна сантехніка та «bridge release»

Між ранком четверга й вечором п'ятниці в лютому 2026 GeekBye випустив чотири релізи: v1.7.6, v1.7.7, v1.8.0 і v1.8.1 — шістнадцять commits, близько двадцяти шести годин між першим тегом і останнім. Жоден із них окремо не тягне на заголовок. Разом вони — портрет того, з чого насправді складаються тижні дрібних релізів: фіча, що нарешті завершує свою подорож, оверлей для зручності, номер версії без жодного рядка коду всередині та один по-справжньому повчальний шматок release engineering.

Мова, яка жодного разу не покидала ноутбук

Налаштування мови транскриптів є в GeekBye з вересня 2025. Воно працювало — локально. Обери іспанську, і локальний пайплайн speech-to-text слухняно транскрибував іспанську. Але прогрепай кодову базу v1.7.5 на це налаштування — і знайдеш його рівно в трьох місцях: в аудіообробнику, в UI налаштувань і в хуку налаштувань. Не в API-клієнті. Не в трекері сесій. Чотири місяці кожен запит, що покидав машину, був сліпим до мови: записи сесій на бекенді гадки не мали, яку мову вони представляють, а AI-чат отримував іспанські транскрипти без жодного натяку на те, що вони іспанські.

v1.7.6 — реліз, у якому налаштування довершило свою подорож: два commits, один день. Старт аудіосесії тепер несе transcriptLanguage у пейлоаді, а запит stream-chat до AI отримав те саме поле, протягнуте через маленький хелпер, який читає налаштування й навмисно повертає undefined, коли воно дорівнює auto або не задане, — щоб старі бекенди деградували граційно, а не давилися полем, якого не знають. У дифі ховається й тихий бонус-фікс: щоб передати мову, старт сесії довелося перенести після розв'язання мови — що, як ми це читаємо, заодно закрило шлях помилки, в якому сесія могла стартувати (і зарахуватися в ліміти), а мить по тому осиротіти, коли розв'язання мови падало.

Урок узагальнюється: налаштування не відвантажене, коли в нього є UI та ефект. Воно відвантажене, коли доходить до кожного споживача, який має про нього знати. Наше чотири місяці зупинялося на межі мережі, і ніхто не помітив — бо локальна поведінка, та сама видима, увесь цей час була коректною. (Для протоколу: це був грубий перший захід на роботу з мовою; навчити AI справді відповідати мовою розмови — значно пізніший розділ цієї історії.)

Cmd+/ — оверлей, який не бреше про твої гарячі клавіші

Користувацька фіча v1.8.0 — оверлей гарячих клавіш за Cmd+/ — 193 рядки нового компонента й одне дизайн-рішення, яке варто вкрасти: він не рендерить захардкоджену шпаргалку. Він забирає живу конфігурацію шорткатів і рендерить customKeys || defaultKeys, тож користувач, що перемапив клавіші, бачить свої клавіші. Оверлей шорткатів, який показує дефолти тому, хто їх змінив, — це не документація; це дезінформація з приємною типографікою.

Решта — дрібні штрихи коректності: оверлей позиціонує себе ліворуч або праворуч від картки застосунку залежно від того, з якого боку екрана є місце, і закривається за Escape, за повторним Cmd+/ або за кліком зовні. Сам Cmd+/ вливається в ту саму переналаштовувану систему пресетів, що й будь-який інший шорткат, — і це важливо, бо Cmd+/ — це «toggle comment» (закоментувати) в більшості редакторів, а інструмент для розробників не повинен окупувати редакторську клавішу, яку не можна переназначити.

«Bridge release» — міст між світами

Цікава інженерія сталася в номерах версій, на які ніхто не глянув би двічі. v1.8.0 заодно мігрував релізи проєкту в нову організацію на GitHub — на поверхні організаційне прибирання, якби не одна властивість десктопних автооновлень: URL фіда зашитий у бінарник. Кожна інсталяція v1.8.0 опитує релізи нової організації. А кожна інсталяція в дикій природі — усі вони v1.7.7 або старші — опитує стару, вічно, поки там щось не з'явиться.

Ось вона, курка з яйцем: опублікуй наступний реліз лише в новому репозиторії — і весь наявний флот його ніколи не побачить. Через шістнадцять хвилин після тега v1.8.0 у релізному скрипті приземлився новий прапорець: --publish-owner, який переписує, куди electron-builder заливає артефакти після збірки — явно «не зачіпаючи скомпільований код застосунку», як формулює коментар у коді. У цьому весь трюк, і це рівно правильний шов: зашитий у бінарник фід і місце завантаження артефактів — два різні рішення, і міграції треба розчепити їх на один реліз. Збери v1.8.1, націлений на новий фід, залий його в старий репозиторій; старі клієнти бачать там оновлення, ставлять його й прокидаються, опитуючи нову організацію. Повідомлення commitа називає це «bridge release» — релізом-мостом, — і це правильна назва. v1.8.1 затегували через дві години двадцять хвилин після v1.8.0. (Історію про те, звідки в цього проєкту повага до автооновлень, що межує зі страхом, читай в автооновленні, яке зробило наш застосунок невбивним.)

А v1.7.7? Один commit. Сам бамп версії. Ні фікса, ні реверта, ні пояснення в історії — наше найкраще прочитання: публікація, яку довелося перезапустити, і ми радше визнаємо це, ніж вигадуватимемо історію. Іноді номер версії існує тому, що випуск софту — процес із реального світу з гикавками з реального світу, а не чиста функція дерева сирців. А чому 1.7 узагалі став 1.8: жоден commit не каже, але міграція фіда — ось змістовна межа сумісності: кожен бінарник 1.8.x дивиться на іншу організацію, ніж будь-який бінарник 1.7.x, — і це заслуговує на мінорний бамп більше, ніж будь-яка фіча.

Три речі, яких нас навчив цей тиждень

  1. Простеж налаштування до кожного споживача. Мовна преференція була «готова» чотири місяці, поки бекенд лишався сліпим. Саме коректність видимої, локальної поведінки й дозволила розриву вижити — аудиторське питання звучить як «хто ще має знати це значення?» і ставиться на кожній межі.
  2. Рендери живий конфіг, а не документацію. Оверлей шорткатів читає те саме джерело правди, яким користується система шорткатів. Усе інше роз'їжджається за першої ж кастомізації користувача.
  3. Міграції фіда потрібен один реліз, що живе в обох світах. Новий фід у бінарнику, старий репозиторій для завантаження. Якщо твій релізний тулінг не вміє розділяти ці дві цілі — додай прапорець до того, як він знадобиться; наш прибув через шістнадцять хвилин після того, як знадобився, що досить близько, аби зарахувати.

Про попередній розділ історії v1 — сторінка логіна і Є демо (v1.7.5); а про всю дугу — анатомію доставки програмного забезпечення до досконалості.

Схожі статті

Три дієслова, що тримають Web Audio живим
Steven
Steven8 хв читання

Три дієслова, що тримають Web Audio живим

Два точкові релізи GeekBye, розділені двома місяцями і в двох різних файлах, дали нашому аудіокоду той самий урок із протилежних кінців: перестань поводитися з браузерним AudioContext як з одноразовим. Один реліз навчився робити resume() контексту, який macOS тихо призупинив посеред запису; інший навчився suspend() замість close(), щоб сесії одна за одною перестали врізатися в накинуту Chromium стелю приблизно в шість контекстів. Resume, suspend, close — ось і весь сюжет.

Інженерія
Аудіо
Десктоп
Відрізнити дзвінок від відкритого застосунку
Steven
Steven8 хв читання

Відрізнити дзвінок від відкритого застосунку

GeekBye вміє помітити, що ти приєднався до відеозустрічі, і запропонувати її записати. Виявлення виявляється легшою половиною — нативний Swift-бінарник читає заголовки вікон кожні десять секунд. Важка половина — точність: не спрацьовувати, коли Zoom просто відкритий, не пропонувати записати зустріч, яку ти вже записуєш, і не глушити мікрофон у дзвінку, в якому ти насправді сидиш. Три релізи, і кожен із них — запобіжник, якому довелося навчитися не перемагати самого себе.

Інженерія
macOS
Десктоп
Прибираємо backend зі шляху завантаження
Steven
Steven7 хв читання

Прибираємо backend зі шляху завантаження

GeekBye записує твій екран і зберігає відео у твій Google Drive. Перша версія проганяла кожен запис через власні сервери GeekBye дорогою туди; релізом пізніше файл ішов прямо з твоєї машини на Drive, а backend був понижений до тримання єдиного вказівника. Цікава частина в тому, як мало коду насправді містить «пряма, відновлювана» версія — бо відновлюваність прийшла з видалення proxy, а не з його написання.

Інженерія
Архітектура
Десктоп