Steven
Steven5 min czytania

Cztery wydania w dwadzieścia sześć godzin: hydraulika języka i „bridge release"

GeekBye od v1.7.6 do v1.8.1: ustawienie języka, które nigdy nie opuściło laptopa, nakładka Cmd+/ pokazująca twoje prawdziwe keybindingi, wersja bez ani jednej zmiany w kodzie — i jajko i kura przy migracji feedu auto-update.

Inżynieria
Wydania
Desktop
Wydania GeekBye
Cztery wydania w dwadzieścia sześć godzin: hydraulika języka i „bridge release"

Między czwartkowym porankiem a piątkowym popołudniem w lutym 2026 GeekBye wypuścił cztery wydania: v1.7.6, v1.7.7, v1.8.0 i v1.8.1 — szesnaście commitów, około dwudziestu sześciu godzin między pierwszym a ostatnim tagiem. Żadne z nich z osobna nie nadaje się na nagłówek. Razem są portretem tego, co faktycznie zawierają tygodnie małych wydań: feature w końcu kończący swoją podróż, wygodnicka nakładka, numer wersji bez żadnego kodu w środku i jeden naprawdę pouczający kawałek release engineeringu.

Język, który nigdy nie opuścił laptopa

GeekBye ma ustawienie języka transkrypcji od września 2025. Działało — lokalnie. Wybierz hiszpański, a lokalny pipeline speech-to-text posłusznie transkrybował hiszpański. Ale przegrepuj bazę kodu v1.7.5 pod kątem tego ustawienia, a znajdziesz je dokładnie w trzech miejscach: w handlerze audio, w UI ustawień i w hooku ustawień. Nie w kliencie API. Nie w trackerze sesji. Przez cztery miesiące każdy request opuszczający maszynę był ślepy na język: backendowe rekordy sesji nie miały pojęcia, jaki język reprezentują, a czat AI dostawał hiszpańskie transkrypty bez żadnej wskazówki, że są hiszpańskie.

v1.7.6 to wydanie, w którym ustawienie dokończyło swoją podróż — dwa commity, jeden dzień. Start sesji audio niesie teraz transcriptLanguage w payloadzie, a request stream-chat do AI zyskał to samo pole, przeciągnięte przez mały helper, który czyta ustawienie i celowo zwraca undefined, gdy jest auto albo nieustawione — żeby starsze backendy degradowały się z wdziękiem, zamiast krztusić się polem, którego nie znają. W diffie kryje się też cicha poprawka-bonus: żeby przekazać język, start sesji musiał przenieść się za rozstrzygnięcie języka — co, jak to czytamy, zamknęło przy okazji ścieżkę błędu, w której sesja mogła zostać wystartowana (i policzona do limitów), a chwilę później osierocona, gdy rozstrzyganie języka zawiodło.

Lekcja się uogólnia: ustawienie nie jest dostarczone, gdy ma UI i efekt. Jest dostarczone, gdy dociera do każdego konsumenta, który powinien o nim wiedzieć. Nasze zatrzymało się na granicy sieci na cztery miesiące i nikt tego nie zauważył, bo lokalne zachowanie — to widoczne — było przez cały czas poprawne. (Dla porządku: to było zgrubne pierwsze podejście do obsługi języka; nauczenie AI, żeby faktycznie odpowiadało w języku rozmowy, to znacznie późniejszy rozdział tej historii.)

Cmd+/ — nakładka, która nie kłamie o twoich keybindingach

Widoczny dla użytkownika feature v1.8.0 to nakładka skrótów klawiszowych pod Cmd+/ — 193 linie nowego komponentu i jedna decyzja projektowa warta ukradzenia: nie renderuje zahardkodowanej ściągi. Pobiera żywą konfigurację skrótów i renderuje customKeys || defaultKeys, więc użytkownik, który przemapował swoje klawisze, widzi swoje klawisze. Nakładka skrótów pokazująca domyślne komuś, kto je zmienił, to nie dokumentacja; to dezinformacja z ładną typografią.

Reszta to drobne poprawki poprawnościowe: nakładka pozycjonuje się na lewo lub na prawo od karty aplikacji zależnie od tego, po której stronie ekranu jest miejsce, i znika po Escape, po ponownym Cmd+/ albo po kliknięciu obok. Sam Cmd+/ dołącza do tego samego przemapowywalnego systemu presetów co każdy inny skrót — co ma znaczenie, bo Cmd+/ to „toggle comment" (przełącz komentarz) w większości edytorów, a narzędzie dla deweloperów nie powinno okupować edytorowego klawisza, którego nie da się przenieść.

„Bridge release" — wydanie pomostowe

Ciekawa inżynieria wydarzyła się w numerach wersji, na które nikt nie spojrzałby dwa razy. v1.8.0 zmigrował też wydania projektu do nowej organizacji na GitHubie — na pozór organizacyjne porządki, gdyby nie jedna właściwość desktopowego auto-update: URL feedu jest wypieczony w binarce. Każda instalacja v1.8.0 odpytuje wydania nowej organizacji. A każda instalacja w świecie — wszystkie v1.7.7 lub starsze — odpytuje starą, na zawsze, chyba że coś się tam pojawi.

To jest to jajko i kura: opublikuj następne wydanie tylko w nowym repo, a cała istniejąca flota nigdy go nie zobaczy. Szesnaście minut po tagu v1.8.0 w skrypcie wydania wylądowała nowa flaga: --publish-owner, która przepisuje, dokąd electron-builder wgrywa artefakty po buildzie — jawnie „bez wpływu na skompilowany kod aplikacji", jak ujmuje to komentarz w kodzie. To cały trik i to dokładnie właściwy szew: wypieczony w binarce feed i miejsce uploadu artefaktów to dwie różne decyzje, a migracja potrzebuje ich rozprzęgnięcia na jedno wydanie. Zbuduj v1.8.1 wycelowane w nowy feed, wgraj do starego repo; starzy klienci widzą tam aktualizację, instalują ją i budzą się, odpytując nową organizację. Commit message nazywa to „bridge release" — wydaniem pomostowym — i to właściwa nazwa. v1.8.1 został otagowany dwie godziny i dwadzieścia minut po v1.8.0. (Historię tego, skąd u tego projektu szacunek do auto-update graniczący ze strachem, znajdziesz w auto-update, który uczynił naszą aplikację niezabijalną.)

A v1.7.7? Jeden commit. Sam version bump. Bez poprawki, bez reverta, bez wyjaśnienia w historii — nasze najlepsze odczytanie to publish, który trzeba było odpalić jeszcze raz, i wolimy to przyznać, niż wymyślać historię. Czasem numer wersji istnieje, bo wydawanie oprogramowania to proces z prawdziwego świata z prawdziwymi czkawkami, a nie czysta funkcja drzewa źródeł. A czemu 1.7 w ogóle stało się 1.8: żaden commit tego nie mówi, ale migracja feedu to prawdziwa granica kompatybilności — każda binarka 1.8.x patrzy na inną organizację niż każda binarka 1.7.x — i to zasługuje na minor bump bardziej niż jakikolwiek feature.

Trzy rzeczy, których nauczył nas ten tydzień

  1. Prześledź ustawienie do każdego konsumenta. Preferencja języka była „gotowa" przez cztery miesiące, podczas gdy backend pozostawał ślepy. To, że widoczne, lokalne zachowanie było poprawne, jest dokładnie tym, co pozwoliło luce przetrwać — pytanie audytowe brzmi „kto jeszcze powinien znać tę wartość?", zadawane na każdej granicy.
  2. Renderuj żywą konfigurację, nie dokumentację. Nakładka skrótów czyta to samo źródło prawdy, którego używa system skrótów. Wszystko inne rozjedzie się przy pierwszej personalizacji użytkownika.
  3. Migracja feedu potrzebuje jednego wydania żyjącego w obu światach. Nowy feed w binarce, stare repo dla uploadu. Jeśli twój tooling wydań nie umie rozdzielić tych dwóch celów, dodaj flagę, zanim będzie potrzebna — nasza przyszła szesnaście minut po tym, jak była potrzebna, co jest na tyle blisko, że się liczy.

Po poprzedni rozdział historii v1 — strona logowania JEST demem (v1.7.5); a po cały łuk — anatomia dostarczania oprogramowania do perfekcji.