Steven
Steven6 min de leitura

Quatro lançamentos em vinte e seis horas: encanamento de idioma e uma "bridge release"

GeekBye v1.7.6 até v1.8.1: uma configuração de idioma que nunca tinha saído do laptop, um overlay de Cmd+/ que mostra seus keybindings reais, uma versão com zero mudanças de código — e o ovo-e-galinha de migrar seu feed de auto-update.

Engenharia
Release
Desktop
Lançamentos da GeekBye
Quatro lançamentos em vinte e seis horas: encanamento de idioma e uma "bridge release"

Entre uma quinta-feira de manhã e uma sexta-feira à tarde de fevereiro de 2026, a GeekBye entregou quatro lançamentos: v1.7.6, v1.7.7, v1.8.0 e v1.8.1 — dezesseis commits, cerca de vinte e seis horas entre a primeira tag e a última. Nenhum deles é manchete sozinho. Juntos, são um retrato do que as semanas de lançamentos pequenos realmente contêm: uma feature finalmente terminando sua jornada, um overlay de qualidade de vida, um número de versão sem código dentro e uma peça genuinamente instrutiva de release engineering.

O idioma que nunca saiu do laptop

A GeekBye tem uma configuração de idioma de transcrição desde setembro de 2025. Ela funcionava — localmente. Escolha espanhol e o pipeline de speech-to-text no dispositivo transcrevia espanhol obedientemente. Mas faça um grep no código da v1.7.5 por essa configuração e você a encontra em exatamente três lugares: o handler de áudio, a UI de Settings e o hook de settings. Não no cliente de API. Não no tracker de sessões. Por quatro meses, toda requisição que saía da máquina era cega ao idioma: os registros de sessão do backend não tinham ideia de que idioma representavam, e o chat de IA recebia transcrições em espanhol sem nenhuma pista de que estavam em espanhol.

A v1.7.6 é o lançamento em que a configuração terminou sua jornada — dois commits, um dia. O início da sessão de áudio agora carrega transcriptLanguage no payload, e a requisição de stream-chat da IA ganhou o mesmo campo, costurado por um pequeno helper que lê a configuração e deliberadamente retorna undefined quando ela é auto ou não está definida, de modo que backends mais antigos degradam graciosamente em vez de engasgar com um campo que não conhecem. Há também uma correção bônus escondida discretamente no diff: para passar o idioma, o início da sessão precisou mover-se para depois da resolução do idioma — o que, pela nossa leitura, também fechou um caminho de erro em que uma sessão podia ser iniciada (e contada contra os limites) e depois ficar órfã quando a resolução do idioma falhava um instante depois.

A lição generaliza: uma configuração não está entregue quando tem uma UI e um efeito. Ela está entregue quando alcança todo consumidor que deveria conhecê-la. A nossa parou na fronteira da rede por quatro meses, e ninguém notou, porque o comportamento local — o comportamento visível — esteve correto o tempo todo. (Essa foi a primeira passada, tosca, do tratamento de idiomas, que fique registrado; ensinar a IA a de fato responder no idioma da conversa é um capítulo bem posterior desta história.)

Cmd+/ — um overlay que não mente sobre seus keybindings

A feature voltada ao usuário da v1.8.0 é um overlay de atalhos de teclado em Cmd+/ — 193 linhas de componente novo, e uma decisão de design que vale a pena roubar: ele não renderiza uma cola hardcoded. Ele busca a configuração de atalhos ao vivo e renderiza customKeys || defaultKeys, de modo que um usuário que remapeou suas teclas vê as teclas dele. Um overlay de atalhos que mostra os padrões para alguém que os mudou não é documentação; é desinformação com tipografia bonita.

O resto são pequenos toques de correção: o overlay se posiciona à esquerda ou à direita do card do app dependendo de qual lado da tela tem espaço, e fecha com Escape, com Cmd+/ de novo ou com um clique fora. O próprio Cmd+/ entra no mesmo sistema de presets remapeáveis de todos os outros atalhos — o que importa, porque Cmd+/ é "comentar/descomentar" na maioria dos editores, e uma ferramenta para desenvolvedores não deveria ocupar uma tecla de editor que você não consegue mover.

A "bridge release"

A engenharia interessante aconteceu nos números de versão que ninguém olharia duas vezes. A v1.8.0 também migrou os lançamentos do projeto para uma nova organização do GitHub — faxina organizacional na superfície, exceto por uma propriedade do auto-update de desktop: a URL do feed vai embutida no binário. Toda instalação da v1.8.0 consulta os releases da organização nova. E toda instalação lá fora — todas v1.7.7 ou mais antigas — consulta a antiga, para sempre, a menos que algo apareça lá.

Esse é o ovo-e-galinha: publique seu próximo lançamento só no repositório novo e a frota existente inteira nunca o verá. Dezesseis minutos depois da tag v1.8.0, uma flag nova aterrissou no script de release: --publish-owner, que reescreve para onde o electron-builder sobe os artefatos depois do build — explicitamente "sem afetar o código compilado do app", como diz o comentário no código. Esse é o truque inteiro, e é exatamente a costura certa: o feed embutido no binário e o destino de upload dos artefatos são duas decisões diferentes, e uma migração precisa delas desacopladas por um lançamento. Construa a v1.8.1 apontando para o feed novo, suba-a para o repositório antigo; os clientes antigos veem a atualização lá, instalam e acordam consultando a organização nova. A mensagem de commit chama isso de "bridge release" (lançamento-ponte), que é o nome certo. A v1.8.1 foi taggeada duas horas e vinte minutos depois da v1.8.0. (Para a história de origem de por que este projeto trata auto-update com um respeito que beira o medo, veja o auto-update que tornou nosso app impossível de matar.)

E a v1.7.7? Um commit. O próprio bump de versão. Sem correção, sem revert, sem explicação no histórico — nossa melhor leitura é um publish que precisou ser rodado de novo, e preferimos admitir isso a inventar uma história. Às vezes um número de versão existe porque lançar software é um processo do mundo real com soluços do mundo real, não uma função pura da árvore de código. Quanto a por que 1.7 virou 1.8: nenhum commit diz, mas a migração do feed é a fronteira de compatibilidade significativa — todo binário 1.8.x olha para uma organização diferente de todo binário 1.7.x — e isso merece um bump minor mais do que qualquer feature.

Três coisas que esta semana nos ensinou

  1. Rastreie uma configuração até todo consumidor. A preferência de idioma esteve "pronta" por quatro meses enquanto o backend seguia cego. O comportamento local e visível estar correto é exatamente o que deixou a lacuna sobreviver — a pergunta de auditoria é "quem mais deveria conhecer esse valor?", feita em cada fronteira.
  2. Renderize configuração ao vivo, não documentação. O overlay de atalhos lê a mesma fonte de verdade que o sistema de atalhos usa. Qualquer outra coisa deriva na primeira vez que um usuário personaliza.
  3. Uma migração de feed precisa de um lançamento que viva nos dois mundos. Feed novo no binário, repositório antigo para o upload. Se o seu tooling de release não consegue separar esses dois alvos, adicione a flag antes de precisar dela — a nossa chegou dezesseis minutos depois de ser necessária, o que é perto o bastante para contar.

Para o capítulo anterior da história v1, a página de login É a demo (v1.7.5); e para todo o arco, a anatomia de entregar software até a perfeição.