Steven
Steven6 min citire

Patru lansări în douăzeci și șase de ore: instalația limbii și un „bridge release"

GeekBye de la v1.7.6 la v1.8.1: o setare de limbă care nu părăsise niciodată laptopul, un overlay pe Cmd+/ care îți arată keybinding-urile reale, o versiune cu zero modificări de cod — și problema ou-găină a migrării feed-ului de auto-update.

Inginerie
Release
Desktop
Lansări GeekBye
Patru lansări în douăzeci și șase de ore: instalația limbii și un „bridge release"

Între o dimineață de joi și o după-amiază de vineri din februarie 2026, GeekBye a livrat patru lansări: v1.7.6, v1.7.7, v1.8.0 și v1.8.1 — șaisprezece commit-uri, cam douăzeci și șase de ore între primul tag și ultimul. Niciuna dintre ele nu e, singură, o știre de primă pagină. Împreună sunt un portret a ceea ce conțin de fapt săptămânile cu lansări mici: o funcționalitate care își încheie în sfârșit călătoria, un overlay de quality-of-life, un număr de versiune fără niciun cod în el și o bucată de release engineering cu adevărat instructivă.

Limba care n-a părăsit niciodată laptopul

GeekBye are o setare pentru limba transcriptului încă din septembrie 2025. Funcționa — local. Alegi spaniola și pipeline-ul de speech-to-text on-device transcria cuminte în spaniolă. Dar dă un grep prin baza de cod v1.7.5 după acea setare și o găsești în exact trei locuri: handler-ul audio, UI-ul de Settings și hook-ul de setări. Nu în clientul de API. Nu în tracker-ul de sesiuni. Timp de patru luni, fiecare cerere care pleca de pe mașină era oarbă la limbă: înregistrările de sesiune din backend habar n-aveau ce limbă reprezintă, iar chat-ul AI primea transcrieri în spaniolă fără niciun indiciu că sunt în spaniolă.

v1.7.6 e lansarea în care setarea și-a încheiat călătoria — două commit-uri, o zi. Pornirea sesiunii audio poartă acum transcriptLanguage în payload, iar cererea de stream-chat către AI a primit același câmp, trecut printr-un mic helper care citește setarea și returnează deliberat undefined când e auto sau nesetată, astfel încât backend-urile mai vechi degradează grațios în loc să se înece cu un câmp pe care nu-l cunosc. Mai e și un mic fix-bonus ascuns în diff: ca să transmită limba, pornirea sesiunii a trebuit mutată după rezolvarea limbii — ceea ce, așa cum citim noi diff-ul, a închis și o cale de eroare în care o sesiune putea fi pornită (și contorizată la limite) și apoi lăsată orfană când rezolvarea limbii eșua o clipă mai târziu.

Lecția se generalizează: o setare nu e livrată când are un UI și un efect. E livrată când ajunge la fiecare consumator care ar trebui să știe de ea. A noastră s-a oprit la granița rețelei timp de patru luni și nimeni n-a observat, pentru că comportamentul local — comportamentul vizibil — a fost corect tot timpul. (Aceasta a fost prima trecere, brută, prin gestionarea limbii, ca să consemnăm; a învăța AI-ul să răspundă efectiv în limba conversației e un capitol mult mai târziu al acestei povești.)

Cmd+/ — un overlay care nu te minte în privința keybinding-urilor

Funcționalitatea vizibilă pentru utilizator din v1.8.0 e un overlay cu scurtăturile de tastatură pe Cmd+/ — 193 de linii de componentă nouă și o decizie de design care merită furată: nu randează un cheat sheet hardcodat. Ia configurația live a scurtăturilor și randează customKeys || defaultKeys, astfel încât un utilizator care și-a remapat tastele își vede tastele lui. Un overlay de scurtături care arată valorile implicite cuiva care le-a schimbat nu e documentație; e dezinformare cu tipografie frumoasă.

Restul sunt mici retușuri de corectitudine: overlay-ul se poziționează la stânga sau la dreapta cardului aplicației, în funcție de partea ecranului unde e loc, și se închide la Escape, la un nou Cmd+/ sau la un click în afară. Cmd+/ însuși intră în același sistem de preset-uri remapabile ca orice altă scurtătură — ceea ce contează, pentru că Cmd+/ înseamnă „toggle comment" în majoritatea editoarelor, iar un tool pentru developeri n-ar trebui să ocupe abuziv o tastă de editor pe care n-o poți muta.

Lansarea-punte

Ingineria interesantă s-a petrecut în numerele de versiune la care nimeni nu s-ar uita de două ori. v1.8.0 a migrat și release-urile proiectului către o nouă organizație GitHub — curățenie de organizație la suprafață, cu excepția unei proprietăți a auto-update-ului desktop: URL-ul feed-ului e copt în binar. Fiecare instalare v1.8.0 interoghează release-urile noii organizații. Și fiecare instalare aflată deja în lume — toate v1.7.7 sau mai vechi — îl interoghează pe cel vechi, pentru totdeauna, dacă nu apare ceva acolo.

Ăsta e cercul vicios ou-găină: publici următoarea lansare doar în repo-ul nou și întreaga flotă existentă n-o vede niciodată. La șaisprezece minute după tag-ul v1.8.0, un flag nou a aterizat în scriptul de release: --publish-owner, care rescrie unde încarcă electron-builder artefactele după build — explicit „fără a afecta codul compilat al aplicației", cum spune comentariul din cod. Ăsta e tot trucul, și e exact cusătura potrivită: feed-ul copt în binar și destinația de upload a artefactelor sunt două decizii diferite, iar o migrare are nevoie ca ele să fie decuplate pentru o singură lansare. Construiești v1.8.1 țintind feed-ul nou, îl încarci în repo-ul vechi; clienții vechi văd update-ul acolo, îl instalează și se trezesc interogând noua organizație. Mesajul de commit numește asta un „bridge release" — o lansare-punte — și e numele potrivit. v1.8.1 a fost tag-uit la două ore și douăzeci de minute după v1.8.0. (Pentru povestea originii — de ce tratează acest proiect auto-update-ul cu un respect vecin cu frica — vezi auto-update-ul care ne-a făcut aplicația de neomorât.)

Și v1.7.7? Un singur commit. Bump-ul de versiune însuși. Niciun fix, niciun revert, nicio explicație în istoric — cea mai bună lectură a noastră e un publish care a trebuit re-rulat, și preferăm să recunoaștem asta decât să inventăm o poveste. Uneori un număr de versiune există pentru că lansarea de software e un proces din lumea reală, cu sughițuri din lumea reală, nu o funcție pură a arborelui de surse. Cât despre motivul pentru care 1.7 a devenit până la urmă 1.8: niciun commit nu spune, dar migrarea feed-ului e granița de compatibilitate cu adevărat semnificativă — fiecare binar 1.8.x se uită la o altă organizație decât fiecare binar 1.7.x — și asta merită un minor bump mai mult decât orice funcționalitate.

Trei lucruri pe care ni le-a predat această săptămână

  1. Urmărește o setare până la fiecare consumator. Preferința de limbă a fost „gata" timp de patru luni, în timp ce backend-ul rămânea orb. Tocmai faptul că comportamentul local, vizibil, era corect a lăsat golul să supraviețuiască — întrebarea de audit e „cine altcineva ar trebui să știe de această valoare?", pusă la fiecare graniță.
  2. Randează configurația live, nu documentația. Overlay-ul de scurtături citește aceeași sursă de adevăr pe care o folosește sistemul de scurtături. Orice altceva deviază din prima clipă în care un utilizator personalizează ceva.
  3. O migrare de feed are nevoie de o lansare care trăiește în ambele lumi. Feed-ul nou în binar, repo-ul vechi pentru upload. Dacă tooling-ul tău de release nu poate separa cele două ținte, adaugă flag-ul înainte să ai nevoie de el — al nostru a sosit la șaisprezece minute după ce a fost nevoie de el, ceea ce e destul de aproape cât să conteze.

Pentru capitolul anterior al poveștii v1, pagina de login ESTE demo-ul (v1.7.5); iar pentru întregul arc, anatomia livrării de software până la perfecțiune.

Articole Similare

Cele trei verbe care mențin Web Audio în viață
Steven
Steven9 min citire

Cele trei verbe care mențin Web Audio în viață

Două lansări punctuale GeekBye, la două luni distanță și în două fișiere diferite, au învățat codul nostru audio aceeași lecție din capete opuse: nu mai trata AudioContext-ul browserului ca pe ceva de unică folosință. O lansare a învățat să apeleze resume() pe un context pe care macOS îl suspendase în tăcere în mijlocul înregistrării; cealaltă a învățat să apeleze suspend() în loc de close(), ca sesiunile consecutive să nu mai izbească plafonul Chromium de aproximativ șase contexte. Resume, suspend, close — asta e toată intriga.

Inginerie
Audio
Desktop
A deosebi un apel de o aplicație deschisă
Steven
Steven9 min citire

A deosebi un apel de o aplicație deschisă

GeekBye poate observa că te-ai alăturat unei ședințe video și îți poate oferi s-o înregistreze. Detecția se dovedește a fi jumătatea ușoară — un binar Swift care citește titlurile ferestrelor la fiecare zece secunde. Jumătatea grea e precizia: să nu se declanșeze când Zoom e doar deschis, să nu întrebe pentru o ședință pe care deja o înregistrezi și să nu silențieze microfonul din apelul în care chiar te afli. Trei lansări, iar fiecare e o gardă care a trebuit să învețe să nu se învingă singură.

Inginerie
macOS
Desktop
Scoaterea backend-ului din calea de upload
Steven
Steven8 min citire

Scoaterea backend-ului din calea de upload

GeekBye îți înregistrează ecranul și salvează videoclipul în Google Drive-ul tău. Prima versiune trimitea fiecare înregistrare prin serverele proprii ale GeekBye pe drumul într-acolo; o lansare mai târziu, fișierul mergea direct de la mașina ta către Drive, iar backend-ul a fost retrogradat la a ține un singur pointer. Partea interesantă e cât de puțin cod conține de fapt versiunea „directă, resumabilă" — pentru că resumabilitatea a venit din ștergerea unui proxy, nu din scrierea unuia.

Inginerie
Arhitectură
Desktop