
Reuniões que você finalmente encontra de novo: o lançamento da timeline
GeekBye v1.7.3 substituiu o dropdown de reuniões por uma timeline de verdade — datas humanas, busca, um breadcrumb que diz em qual reunião você está. Por baixo: uma corrida de auto-seleção, uma captura de tela anterior à própria reunião e cinco correções de Windows em vinte e oito minutos.
Em janeiro de 2026, os usuários do GeekBye tinham um problema de histórico. O app gravava e analisava suas reuniões muito bem — e depois as arquivava em um dropdown. Um dropdown serve para três itens. Na reunião quinze, "aquela entrevista de terça passada" era uma expedição arqueológica por linhas de aparência idêntica. A v1.7.3 — 64 commits entre meados de dezembro e 16 de janeiro — é o lançamento em que as reuniões viraram algo que você finalmente encontra de novo.
(Uma nota de contabilidade, porque o histórico do git é honesto mesmo quando os números de versão não são: não existe tag de release v1.7.2. A versão foi incrementada, mas a tag seguinte a sair foi a v1.7.3, então as correções de Windows da era v1.7.2 pegaram carona neste lançamento.)
Do dropdown à timeline
A mudança manchete é um único pull request: 12 arquivos, +640 linhas, a maior parte um novo componente MeetingsTimeline de 381 linhas. O dropdown virou uma timeline rolável de cards de reunião, agrupados em quatro buckets — Today, Yesterday, This Week, Older (hoje, ontem, esta semana, mais antigas) — com datas escritas do jeito que um humano diria: Today, 2:30 PM, Yesterday, 2:30 PM, Mon, 2:30 PM para esta semana e Jan 5, 2:30 PM dali para trás. Cmd/Ctrl+K foca uma caixa de busca que filtra por título. A visão de detalhe da reunião virou uma página de navegação de verdade, então os botões de voltar e avançar da navbar finalmente significam alguma coisa, e o breadcrumb parou de mostrar "Meetings / Meeting" e passou a mostrar "Meetings / Interview with John" (truncado com reticências, porque sempre haverá alguém que batiza uma reunião como um romance).
Duas pequenas melhorias de qualidade de vida vieram junto: um botão de excluir dentro da visão da reunião (que navega você de volta para a timeline depois de excluir, em vez de te largar numa página morta), e a navegação automática — quando uma sessão de escuta termina com conteúdo real de transcrição, o dashboard abre direto na página de detalhe daquela reunião. Encerra a chamada, vê a reunião. Sessões que terminam vazias são excluídas em silêncio em vez de entulhar a timeline.
A corrida que você cria ao melhorar a navegação
Aqui está a parte que o changelog não conta. A lista de reuniões antiga tinha um hábito: a cada carregamento, auto-selecionava a sessão mais recente. Inofensivo quando a lista era um dropdown que você mal tocava. Fatal no momento em que reuniões viraram uma página pela qual você navega: clique na reunião nº 5, um refetch em segundo plano termina, e a lista, prestativa, seleciona a reunião mais recente — sobrescrevendo a escolha que você fez dois segundos atrás. A correção não foi um guard mais esperto; foi apagar a auto-seleção por completo. Qualquer lista que seleciona coisas em nome do usuário vai acabar brigando com o usuário.
Removê-la expôs a segunda corrida. A navegação automática pula para uma reunião no instante em que a sessão dela termina — o que pode ser antes de essa sessão ter terminado de escrever no banco SQLite local. Navegue rápido demais e você chega a uma reunião que ainda não existe. A correção lançada é um atraso de 500 milissegundos antes de carregar as sessões ao chegar na visão de detalhe, e o manipulador de navegação carrega suas próprias garantias — esperar o did-finish-load da janela mais 100ms se o dashboard tinha acabado de ser criado, 50ms se já estava aberto. Nossa leitura: a navegação de fim de sessão cruza três domínios de tempo — a escrita no banco, o carregamento da janela e a montagem do React — e cada um ganhou seu pequeno atraso. Funciona, e vamos dizer sem rodeios que uma pilha de números mágicos é dívida honesta, não uma vitória.
A captura de tela anterior à própria reunião
Mais uma suposição morreu neste lançamento: "capturas pertencem a uma sessão se e somente se foram feitas durante ela". Perfeitamente lógica. Errada. Usuários reais apertam Cmd+H na vaga de emprego, na pauta, no código que estão prestes a discutir — antes de apertar Start. A aba Report casava capturas com o intervalo de tempo da sessão de forma estrita, então essas capturas de preparação sumiam do relatório para o qual tinham sido feitas. A correção alargou a janela de casamento em 60 segundos antes do início da sessão. (A maquinaria de intervalos de tempo em si é mais antiga — saiu quietinha na v1.6.15; a contribuição da v1.7.3 é ensiná-la que reuniões começam um pouco antes de começarem.)
Cinco correções em vinte e oito minutos
O causo de guerra deste lançamento não está na timeline — está no overlay de onboarding do Windows, e é uma cadeia de manual de "consertar o conserto": cinco commits entre 10:50 e 11:18 da mesma manhã.
A janela principal do GeekBye usa passthrough de mouse — um hook que alterna o setIgnoreMouseEvents do Electron a cada movimento do mouse para que os cliques atravessem as áreas transparentes. Durante o onboarding no Windows, esse hook brigava com o overlay do tutorial, e no passo em que a janela do dashboard aparece, o app travava. Correção um: fazer o hook não fazer nada enquanto o onboarding está ativo. Paz pelo desarmamento.
Só que agora os botões do onboarding não respondiam, porque o encaminhamento de eventos despachava os cliques para a janela do dashboard embaixo do overlay. As correções dois e três mexeram em forward: false assistente por assistente. Então veio o commit que achou a causa raiz de verdade: quando a janela do dashboard abre, o manipulador de arraste dela reseta a janela principal para o modo click-through — e a primeira correção tinha tornado o hook de passthrough passivo, o que significava que não sobrava nada para corrigir a interferência. A correção real inverteu a estratégia: o hook agora reafirma ativamente setIgnoreMouseEvents(false) a cada movimento do mouse durante o onboarding, precisamente porque código externo pode resetá-lo a qualquer momento. Ela também apagou 75 linhas dos contornos anteriores por assistente.
E mesmo assim houve um quinto commit, porque vencer a guerra do input não é vencer a guerra do z-order: o overlay e o dashboard ficavam no mesmo nível always-on-top, e o Windows eleva a janela que recebe o foco. O overlay passou para um nível de janela mais alto e volta a se elevar com um atraso depois que o dashboard aparece. O arco vale a pena lembrar: uma correção passiva que desarma seu único defensor é pior do que a briga original.
Três coisas que este lançamento nos ensinou
- Upgrades de navegação revelam bugs de estado. A corrida da auto-seleção existia antes da v1.7.3; um dropdown só nunca deixava você senti-la. No momento em que reuniões viraram uma página pela qual você navega deliberadamente, cada pedaço de código que selecionava coisas por você virou um bug.
- Fronteiras de tempo em torno da intenção do usuário precisam de folga. Sessões, gravações, relatórios — usuários agem um pouco antes e um pouco depois da janela oficial da máquina. O buffer de 60 segundos para capturas é uma linha que reflete como as pessoas realmente se comportam.
- Nunca torne seu código corretivo passivo. O travamento do Windows levou cinco correções porque a correção um desligou o único mecanismo que podia neutralizar a interferência externa. Se algum outro código pode quebrar sua invariante a qualquer momento, seu trabalho é reafirmá-la continuamente, não bater em retirada.
Para o capítulo anterior da história v1 — construir dois apps de marca a partir desta única base de código — veja uma base de código, dois apps: como fazer white-label sem bifurcar (v1.7.1); e para todo o arco, a anatomia de entregar software até a perfeição.