Steven
Steven6 мин четене

Четири издания за двайсет и шест часа: езиков водопровод и едно „bridge release"

GeekBye от v1.7.6 до v1.8.1: езикова настройка, която никога не беше напускала лаптопа, overlay на Cmd+/, който показва истинските ти клавишни комбинации, версия с нула промени по кода — и парадоксът кокошката или яйцето при миграция на auto-update фийда.

Инженерство
Release
Desktop
Издания на GeekBye
Четири издания за двайсет и шест часа: езиков водопровод и едно „bridge release"

Между четвъртък сутринта и петък следобед през февруари 2026 GeekBye достави четири издания: v1.7.6, v1.7.7, v1.8.0 и v1.8.1 — шестнайсет комита, около двайсет и шест часа между първия таг и последния. Нито едно от тях само по себе си не е заглавна новина. Заедно те са портрет на това, което всъщност съдържат седмиците с малки издания: функционалност, която най-накрая завършва пътуването си, един quality-of-life overlay, номер на версия без никакъв код в него и едно наистина поучително парче release инженерство.

Езикът, който никога не напусна лаптопа

GeekBye има настройка за езика на транскрипта още от септември 2025. Тя работеше — локално. Избираш испански и on-device speech-to-text конвейерът послушно транскрибираше испански. Но направи grep из кодовата база на v1.7.5 за тази настройка и я намираш на точно три места: audio handler-а, Settings UI-а и settings hook-а. Не и в API клиента. Не и в session tracker-а. Четири месеца всяка заявка, която напускаше машината, беше сляпа за езика: сесийните записи на бекенда нямаха представа какъв език представляват, а AI чатът получаваше испански транскрипти без никакъв намек, че са испански.

v1.7.6 е изданието, в което настройката завърши пътуването си — два комита, един ден. Стартът на аудио сесията вече носи transcriptLanguage в payload-а си, а AI stream-chat заявката получи същото поле, прекарано през малък helper, който чете настройката и умишлено връща undefined, когато е auto или не е зададена, така че по-старите бекенди деградират елегантно, вместо да се задавят с поле, което не познават. В diff-а се крие и един тих бонус: за да предаде езика, стартът на сесията трябваше да се премести след разрешаването на езика — което, както го четем, затвори и един път на грешка, при който сесия можеше да бъде стартирана (и преброена към лимитите), а после осиротена, когато разрешаването на езика се провали миг по-късно.

Урокът се обобщава: една настройка не е доставена, когато има UI и ефект. Доставена е, когато достигне всеки консуматор, който трябва да знае за нея. Нашата спря на мрежовата граница за четири месеца и никой не забеляза, защото локалното поведение — видимото поведение — беше вярно през цялото време. (За протокола, това беше грубият първи опит с обработката на езика; да научиш AI-я наистина да отговаря на езика на разговора е много по-късна глава от тази история.)

Cmd+/ — overlay, който не лъже за клавишните ти комбинации

Видимата за потребителя функционалност на v1.8.0 е overlay с клавишни комбинации на Cmd+/ — 193 реда нов компонент и едно дизайнерско решение, което си струва да се открадне: той не рендира твърдо кодиран cheat sheet. Взима живата shortcut конфигурация и рендира customKeys || defaultKeys, така че потребител, който е пренастроил клавишите си, вижда своите клавиши. Overlay с комбинации, който показва стойностите по подразбиране на човек, който ги е сменил, не е документация; той е дезинформация с хубава типография.

Останалото са малки корекции за коректност: overlay-ят се позиционира вляво или вдясно от картата на приложението според това от коя страна на екрана има място и се затваря с Escape, с повторно Cmd+/ или с клик отвън. Самото Cmd+/ влиза в същата система от пренастройваеми пресети като всяка друга комбинация — което е важно, защото Cmd+/ е „toggle comment" в повечето редактори, а инструмент за разработчици не бива да клечи върху редакторски клавиш, който не можеш да преместиш.

Мостовото издание

Интересното инженерство се случи в номерата на версиите, които никой не би погледнал втори път. v1.8.0 мигрира и изданията на проекта към нова GitHub организация — на пръв поглед организационно домакинство, ако не беше едно свойство на desktop auto-update: URL-ът на фийда е вграден в бинара. Всяка инсталация на v1.8.0 проверява изданията на новата организация. А всяка инсталация навън по света — всичките v1.7.7 или по-стари — проверява старата, завинаги, освен ако там не се появи нещо.

Това е парадоксът кокошката или яйцето: публикуваш следващото си издание само в новото репо и цялата съществуваща флотилия никога не го вижда. Шестнайсет минути след тага на v1.8.0 в release скрипта кацна нов флаг: --publish-owner, който пренаписва къде electron-builder качва артефактите след билда — изрично „без да засяга компилирания код на приложението", както го казва коментарът в кода. Това е целият трик, и е точно правилният шев: вграденият в бинара фийд и целта на качване на артефактите са две различни решения, а една миграция има нужда те да бъдат разкачени за едно издание. Билдваш v1.8.1, сочещо към новия фийд, качваш го в старото репо; старите клиенти виждат ъпдейта там, инсталират го и се събуждат, проверявайки новата организация. Комит съобщението нарича това „bridge release" — мостово издание — и това е правилното име. v1.8.1 беше тагнато два часа и двайсет минути след v1.8.0. (За историята на произхода — защо този проект третира auto-update с уважение, граничещо със страх — вижте auto-update-ът, който направи приложението ни неубиваемо.)

А v1.7.7? Един комит. Самият version bump. Без поправка, без revert, без обяснение в историята — най-добрият ни прочит е publish, който е трябвало да се пусне наново, и предпочитаме да си го признаем, отколкото да измисляме история. Понякога един номер на версия съществува, защото издаването на софтуер е процес от реалния свят с реални засечки, а не чиста функция на дървото с изходния код. А защо изобщо 1.7 стана 1.8: никой комит не казва, но миграцията на фийда е смислената граница на съвместимост — всеки 1.8.x бинар гледа към различна организация от всеки 1.7.x бинар — и това заслужава minor bump повече от която и да е функционалност.

Три неща, на които ни научи тази седмица

  1. Проследи една настройка до всеки консуматор. Езиковата настройка беше „готова" четири месеца, докато бекендът оставаше сляп. Точно това, че видимото локално поведение беше вярно, позволи на пролуката да оцелее — одитният въпрос е „кой друг трябва да знае за тази стойност?", зададен на всяка граница.
  2. Рендирай живата конфигурация, а не документация. Overlay-ят с комбинации чете същия източник на истина, който използва shortcut системата. Всичко друго се разминава още първия път, когато потребител персонализира нещо.
  3. Миграцията на фийд се нуждае от едно издание, което живее и в двата свята. Новият фийд в бинара, старото репо за качването. Ако release инструментите ти не могат да разделят тези две цели, добави флага, преди да ти потрябва — нашият пристигна шестнайсет минути след като потрябва, което е достатъчно близо, за да се брои.

За предишната глава от историята на v1 — login страницата Е демото (v1.7.5); а за цялата дъга — анатомията на доставянето на софтуер до съвършенство.

Свързани статии

Три глагола, които поддържат Web Audio жив
Steven
Steven9 мин четене

Три глагола, които поддържат Web Audio жив

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

Инженерство
Audio
Desktop
Да различиш обаждане от отворено приложение
Steven
Steven8 мин четене

Да различиш обаждане от отворено приложение

GeekBye може да забележи, че си се присъединил към видео среща, и да ти предложи да я запише. Разпознаването се оказва лесната половина — Swift binary, който чете заглавия на прозорци на всеки десет секунди. Трудната половина е прецизността: да не се задейства, когато Zoom е просто отворен, да не пита за среща, която вече записваш, и да не заглушава микрофона в обаждането, в което всъщност си. Три издания, всяко от които е предпазител, който трябваше да се научи да не побеждава сам себе си.

Инженерство
macOS
Desktop
Изваждане на backend-а от пътя на качването
Steven
Steven8 мин четене

Изваждане на backend-а от пътя на качването

GeekBye записва екрана ти и запазва видеото в твоя Google Drive. Първата версия прекарваше всеки запис през собствените сървъри на GeekBye по пътя натам; едно издание по-късно, файлът тръгваше директно от машината ти към Drive, а backend-ът беше понижен до това да държи един-единствен указател. Интересната част е колко малко код всъщност съдържа „директната, resumable" версия — защото resumability дойде от изтриването на един proxy, не от написването на такъв.

Инженерство
Архитектура
Desktop