
Reunions que realment pots tornar a trobar: la release de la línia de temps
GeekBye v1.7.3 va substituir el desplegable de reunions per una línia de temps de debò — dates humanes, cerca, un breadcrumb que et diu a quina reunió ets. A sota: una race d'auto-selecció, una captura de pantalla anterior a la seva pròpia reunió, i cinc fixes de Windows en vint-i-vuit minuts.
Al gener de 2026, els usuaris de GeekBye tenien un problema d'historial. L'app gravava i analitzava les seves reunions perfectament — i després les arxivava en un desplegable. Un desplegable va bé per a tres elements. A la reunió quinze, "aquella entrevista de dimarts passat" era una expedició arqueològica per files d'aspecte idèntic. La v1.7.3 — 64 commits entre mitjan desembre i el 16 de gener — és la release en què les reunions es van convertir en una cosa que realment podies tornar a trobar.
(Una nota de comptabilitat, perquè l'historial de git és honest fins i tot quan els números de versió no ho són: no hi ha cap tag de release v1.7.2. La versió es va apujar, però el següent tag que va sortir va ser la v1.7.3, així que els fixes de Windows de l'era v1.7.2 van viatjar dins d'aquesta release.)
Del desplegable a la línia de temps
El canvi estrella és una sola pull request: 12 fitxers, +640 línies, la majoria un nou component MeetingsTimeline de 381 línies. El desplegable es va convertir en una línia de temps desplaçable de targetes de reunió, agrupades en quatre cubells — Today, Yesterday, This Week, Older (avui, ahir, aquesta setmana, més antigues) — amb les dates escrites com les diria una persona: Today, 2:30 PM, Yesterday, 2:30 PM, Mon, 2:30 PM per a aquesta setmana, i Jan 5, 2:30 PM més enllà. Cmd/Ctrl+K enfoca un quadre de cerca que filtra per títol. La vista de detall de la reunió es va convertir en una pàgina de navegació de debò, així que els botons d'endarrere i endavant de la navbar per fi volen dir alguna cosa, i el breadcrumb va deixar de dir "Meetings / Meeting" per dir "Meetings / Interview with John" (truncat amb punts suspensius, perquè sempre hi haurà algú que posa a una reunió un títol de novel·la).
Hi van sortir dues petites millores de qualitat de vida: un botó d'esborrar dins de la vista de reunió (que et torna a la línia de temps després d'esborrar, en lloc de deixar-te tirat en una pàgina morta), i l'auto-navegació — quan una sessió d'escolta acaba amb contingut real de transcripció, el dashboard s'obre directament a la pàgina de detall d'aquella reunió. Acabes la trucada, veus la reunió. Les sessions que acaben buides s'esborren silenciosament en lloc d'embrutar la línia de temps.
La race que crees en millorar la navegació
Aquí ve la part que el changelog no t'explica. La vella llista de reunions tenia un costum: a cada càrrega, auto-seleccionava la sessió més nova. Inofensiu quan la llista era un desplegable que gairebé no tocaves. Fatal en el moment en què les reunions es van convertir en una pàgina per on navegues: cliques la reunió #5, un refetch en segon pla acaba, i la llista, servicial, selecciona la reunió més nova — sobreescrivint la tria que havies fet feia dos segons. El fix no va ser una guarda més astuta; va ser esborrar l'auto-select del tot. Qualsevol llista que selecciona coses en nom de l'usuari acabarà lluitant contra l'usuari.
Treure'l va exposar la segona race. L'auto-navegació salta a una reunió en l'instant en què la seva sessió acaba — cosa que pot passar abans que aquella sessió hagi acabat d'escriure a la base de dades SQLite local. Navega massa de pressa i arribes a una reunió que encara no existeix. El fix que va sortir és un retard de 500 mil·lisegons abans de carregar sessions en arribar a la vista de detall, i el handler de navegació porta les seves pròpies cobertures — esperar el did-finish-load de la finestra més 100ms si el dashboard s'acabava de crear, 50ms si ja era obert. La nostra lectura: la navegació en acabar la sessió creua tres dominis de timing — l'escriptura a la base de dades, la càrrega de la finestra i el mount de React — i cadascun va rebre el seu petit retard. Funciona, i direm ben clar que una pila de números màgics és deute honest, no una victòria.
La captura de pantalla anterior a la seva pròpia reunió
Una altra assumpció va morir en aquesta release: "les captures de pantalla pertanyen a una sessió si i només si es van fer durant la sessió." Perfectament lògic. Fals. Els usuaris reals premen Cmd+H sobre l'oferta de feina, l'agenda, el codi que estan a punt de discutir — abans de prémer Start. La pestanya Report casava les captures amb el rang temporal de la sessió de manera estricta, així que aquelles captures de preparació desapareixien de l'informe per al qual s'havien fet. El fix va eixamplar la finestra de coincidència 60 segons abans de l'inici de la sessió. (La maquinària de rangs temporals és més antiga — va sortir discretament a la v1.6.15; la contribució de la v1.7.3 és ensenyar-li que les reunions comencen una mica abans de començar.)
Cinc fixes en vint-i-vuit minuts
La batalleta d'aquesta release no és a la línia de temps — és a l'overlay d'onboarding de Windows, i és una cadena de manual d'"arregla l'arreglo": cinc commits entre les 10:50 i les 11:18 del mateix matí.
La finestra principal de GeekBye fa servir passthrough de ratolí — un hook que commuta el setIgnoreMouseEvents d'Electron a cada moviment de ratolí perquè els clics travessin les zones transparents. Durant l'onboarding a Windows, aquell hook es barallava amb l'overlay del tutorial, i al pas on apareix la finestra del dashboard, l'app es congelava. Fix u: fer que el hook no faci res mentre l'onboarding és actiu. Pau per desarmament.
Excepte que ara els botons de l'onboarding no responien, perquè el reenviament d'esdeveniments enviava els clics a la finestra del dashboard sota l'overlay. Els fixes dos i tres van remenar forward: false per assistent. Llavors va arribar el commit que va trobar la causa arrel de debò: quan la finestra del dashboard s'obre, el seu handler d'arrossegament reinicia la finestra principal a mode click-through — i el primer fix havia deixat el hook de passthrough passiu, cosa que volia dir que no quedava res per corregir la interferència. El fix real va invertir l'estratègia: ara el hook re-afirma activament setIgnoreMouseEvents(false) a cada moviment de ratolí durant l'onboarding, precisament perquè el codi extern el pot reiniciar en qualsevol moment. També va esborrar 75 línies dels workarounds anteriors per assistent.
I fins i tot llavors hi va haver un cinquè commit, perquè guanyar la guerra de l'input no és guanyar la guerra del z-order: l'overlay i el dashboard seien al mateix nivell d'always-on-top, i Windows aixeca la finestra que rep el focus. L'overlay es va moure a un nivell de finestra més alt i es torna a aixecar amb un retard després que aparegui el dashboard. Val la pena recordar l'arc: un fix passiu que desarma el teu únic defensor és pitjor que la lluita original.
Tres coses que aquesta release ens va ensenyar
- Les millores de navegació fan aflorar bugs d'estat. La race de l'auto-select existia abans de la v1.7.3; un desplegable simplement mai no te la deixava sentir. En el moment en què les reunions es van convertir en una pàgina per on navegues deliberadament, cada tros de codi que seleccionava coses per tu es va convertir en un bug.
- Les fronteres temporals al voltant de la intenció de l'usuari necessiten marge. Sessions, gravacions, informes — els usuaris actuen una mica abans i una mica després de la finestra oficial de la màquina. El buffer de 60 segons per a captures és una línia que reflecteix com es comporta la gent de debò.
- No facis mai passiu el teu codi corrector. La congelació de Windows va necessitar cinc fixes perquè el fix u va apagar l'únic mecanisme que podia contrarestar la interferència externa. Si un altre codi pot trencar el teu invariant en qualsevol moment, la teva feina és re-afirmar-lo contínuament, no retirar-te.
Per al capítol anterior de la història de la v1 — construir dues apps amb marca des d'aquesta mateixa base de codi — vegeu una base de codi, dues apps: com fer white-label sense fork (v1.7.1); i per a tot l'arc, l'anatomia de publicar programari fins a la perfecció.