
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.
Î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ă
- 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ță.
- 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.
- 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.