
Quatre releases en vint-i-sis hores: canonades d'idioma i una bridge release
GeekBye de la v1.7.6 a la v1.8.1: un ajust d'idioma que mai no havia sortit del portàtil, un overlay Cmd+/ que mostra les teves keybindings reals, una versió amb zero canvis de codi — i el problema de l'ou i la gallina de migrar el teu feed d'auto-update.
Entre un dijous al matí i un divendres a la tarda de febrer de 2026, GeekBye va publicar quatre releases: v1.7.6, v1.7.7, v1.8.0 i v1.8.1 — setze commits, unes vint-i-sis hores entre el primer tag i l'últim. Cap d'elles és un titular per si sola. Juntes són un retrat del que contenen de debò les setmanes de releases petites: una funcionalitat que per fi acaba el seu viatge, un overlay de qualitat de vida, un número de versió sense codi a dins, i una peça de release engineering genuïnament instructiva.
L'idioma que mai no va sortir del portàtil
GeekBye té un ajust d'idioma del transcript des del setembre de 2025. Funcionava — localment. Tria espanyol i el pipeline d'speech-to-text local transcrivia espanyol obedientment. Però fes grep a la base de codi de la v1.7.5 per aquest ajust i el trobes exactament a tres llocs: el handler d'àudio, la UI de Settings i el hook de settings. No al client d'API. No al tracker de sessions. Durant quatre mesos, cada petició que sortia de la màquina era cega a l'idioma: els registres de sessió del backend no tenien ni idea de quin idioma representaven, i el xat d'IA rebia transcripts en espanyol sense cap pista que fossin en espanyol.
La v1.7.6 és la release on l'ajust va acabar el seu viatge — dos commits, un dia. L'inici de sessió d'àudio ara porta transcriptLanguage al seu payload, i la petició d'stream-chat de la IA va guanyar el mateix camp, enfilat a través d'un petit helper que llegeix l'ajust i retorna deliberadament undefined quan és auto o no està definit, de manera que els backends més antics degraden amb elegància en lloc d'ennuegar-se amb un camp que no coneixen. També hi ha un fix de regal amagat al diff: per poder passar l'idioma, l'inici de sessió havia de moure's després de la resolució de l'idioma — cosa que, tal com ho llegim, també va tancar un camí d'error on una sessió podia iniciar-se (i comptar contra els límits) i quedar òrfena quan la resolució de l'idioma fallava un moment després.
La lliçó generalitza: un ajust no està publicat quan té una UI i un efecte. Està publicat quan arriba a cada consumidor que n'hauria de saber. El nostre es va aturar a la frontera de la xarxa durant quatre mesos, i ningú no se'n va adonar, perquè el comportament local — el comportament visible — era correcte tota l'estona. (Aquesta va ser la primera passada rudimentària a la gestió d'idiomes, que consti; ensenyar la IA a respondre de debò en l'idioma de la conversa és un capítol molt posterior d'aquesta història.)
Cmd+/ — un overlay que no menteix sobre les teves keybindings
La funcionalitat de cara a l'usuari de la v1.8.0 és un overlay de dreceres de teclat amb Cmd+/ — 193 línies de component nou, i una decisió de disseny que val la pena robar: no renderitza una xuleta hardcoded. Obté la configuració de dreceres en viu i renderitza customKeys || defaultKeys, de manera que un usuari que hagi remapat les seves tecles veu les seves tecles. Un overlay de dreceres que mostra els valors per defecte a algú que els ha canviat no és documentació; és desinformació amb bona tipografia.
La resta són petits tocs de correcció: l'overlay es posiciona a l'esquerra o a la dreta de la targeta de l'app segons quin costat de la pantalla té espai, i es tanca amb Escape, amb Cmd+/ una altra vegada, o amb un clic a fora. Cmd+/ mateix s'uneix al mateix sistema de presets remapables que qualsevol altra drecera — cosa que importa, perquè Cmd+/ és "toggle comment" a la majoria d'editors, i una eina per a desenvolupadors no hauria d'ocupar una tecla d'editor que no pots moure.
La bridge release
L'enginyeria interessant va passar als números de versió que ningú no miraria dues vegades. La v1.8.0 també va migrar les releases del projecte a una nova organització de GitHub — neteja d'organització en aparença, excepte per una propietat de l'auto-update d'escriptori: la URL del feed va incrustada al binari. Cada instal·lació de la v1.8.0 consulta les releases de la nova organització. I cada instal·lació que hi ha pel món — totes v1.7.7 o anteriors — consulta l'antiga, per sempre, tret que hi aparegui alguna cosa.
Aquest és el problema de l'ou i la gallina: publica la teva pròxima release només al repo nou i tota la flota existent no la veurà mai. Setze minuts després del tag de la v1.8.0, un flag nou va aterrar a l'script de release: --publish-owner, que reescriu on electron-builder puja els artefactes després del build — explícitament "sense afectar el codi compilat de l'app", com diu el comentari del codi. Aquest és tot el truc, i és exactament la costura correcta: el feed incrustat del binari i la destinació de pujada dels artefactes són dues decisions diferents, i una migració les necessita desacoblades durant una release. Construeix la v1.8.1 apuntant al feed nou, puja-la al repo antic; els clients antics veuen l'actualització allà, la instal·len, i es desperten consultant la nova organització. El missatge de commit en diu una "bridge release", que és el nom correcte. La v1.8.1 es va etiquetar dues hores i vint minuts després de la v1.8.0. (Per a la història d'origen de per què aquest projecte tracta l'auto-update amb un respecte que voreja la por, mira l'auto-update que va fer la nostra app immortal.)
I la v1.7.7? Un commit. El bump de versió mateix. Cap fix, cap revert, cap explicació a l'historial — la nostra millor lectura és un publish que va necessitar tornar-se a executar, i preferim admetre-ho que inventar-nos una història. De vegades un número de versió existeix perquè publicar programari és un procés del món real amb entrebancs del món real, no una funció pura de l'arbre de codi. Pel que fa a per què 1.7 va passar a ser 1.8: cap commit ho diu, però la migració del feed és la frontera de compatibilitat significativa — cada binari 1.8.x mira una organització diferent que cada binari 1.7.x — i això mereix un bump menor més que qualsevol funcionalitat.
Tres coses que aquesta setmana ens va ensenyar
- Traça un ajust fins a cada consumidor. La preferència d'idioma va estar «acabada» durant quatre mesos mentre el backend seguia cec. Que el comportament visible i local fos correcte és exactament el que va deixar sobreviure el forat — la pregunta d'auditoria és «qui més hauria de saber d'aquest valor?», feta a cada frontera.
- Renderitza la config en viu, no documentació. L'overlay de dreceres llegeix la mateixa font de veritat que fa servir el sistema de dreceres. Qualsevol altra cosa es desvia el primer cop que un usuari personalitza.
- Una migració de feed necessita una release que visqui als dos mons. Feed nou al binari, repo antic per a la pujada. Si el teu tooling de release no pot separar aquestes dues destinacions, afegeix el flag abans de necessitar-lo — el nostre va arribar setze minuts després que fes falta, cosa que és prou a prop per comptar.
Per al capítol anterior de la història de la v1, la pàgina de login ÉS la demo (v1.7.5); i per a tot l'arc, l'anatomia de publicar programari fins a la perfecció.