
Чотири релізи за двадцять шість годин: мовна сантехніка та «bridge release»
GeekBye від v1.7.6 до v1.8.1: налаштування мови, яке жодного разу не покидало ноутбук, оверлей Cmd+/, що показує твої справжні гарячі клавіші, версія без жодної зміни в коді — і курка з яйцем при міграції фіда автооновлень.
Між ранком четверга й вечором п'ятниці в лютому 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, — і це заслуговує на мінорний бамп більше, ніж будь-яка фіча.
Три речі, яких нас навчив цей тиждень
- Простеж налаштування до кожного споживача. Мовна преференція була «готова» чотири місяці, поки бекенд лишався сліпим. Саме коректність видимої, локальної поведінки й дозволила розриву вижити — аудиторське питання звучить як «хто ще має знати це значення?» і ставиться на кожній межі.
- Рендери живий конфіг, а не документацію. Оверлей шорткатів читає те саме джерело правди, яким користується система шорткатів. Усе інше роз'їжджається за першої ж кастомізації користувача.
- Міграції фіда потрібен один реліз, що живе в обох світах. Новий фід у бінарнику, старий репозиторій для завантаження. Якщо твій релізний тулінг не вміє розділяти ці дві цілі — додай прапорець до того, як він знадобиться; наш прибув через шістнадцять хвилин після того, як знадобився, що досить близько, аби зарахувати.
Про попередній розділ історії v1 — сторінка логіна і Є демо (v1.7.5); а про всю дугу — анатомію доставки програмного забезпечення до досконалості.