Steven
Steven7 min de leitura

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.

Engenharia
UX
Desktop
Lançamentos da GeekBye
Reuniões que você finalmente encontra de novo: o lançamento da timeline

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

  1. 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.
  2. 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.
  3. 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.