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.

Artigos Relacionados

Os três verbos que mantêm o Web Audio vivo
Steven
Steven10 min de leitura

Os três verbos que mantêm o Web Audio vivo

Duas releases pontuais da GeekBye, com dois meses de diferença e em dois arquivos distintos, ensinaram ao nosso código de áudio a mesma lição a partir de extremos opostos: parar de tratar o AudioContext do navegador como descartável. Uma release aprendeu a fazer resume() de um contexto que o macOS havia suspendido silenciosamente no meio da gravação; a outra aprendeu a fazer suspend() em vez de close() para que sessões consecutivas parem de se espatifar contra o teto de aproximadamente seis contextos do Chromium. Resume, suspend, close — é esse o enredo inteiro.

Engenharia
Audio
Desktop
Distinguir uma chamada de um app aberto
Steven
Steven9 min de leitura

Distinguir uma chamada de um app aberto

A GeekBye pode notar que você entrou em uma reunião por vídeo e oferecer gravá-la. A detecção acaba sendo a metade fácil — um binário Swift que lê títulos de janela a cada dez segundos. A metade difícil é a precisão: não disparar quando o Zoom está meramente aberto, não oferecer gravar uma reunião que você já está gravando, e não silenciar o microfone na chamada em que você realmente está. Três releases, e cada uma é uma salvaguarda que teve que aprender a não se sabotar.

Engenharia
macOS
Desktop
Tirando o backend do caminho de upload
Steven
Steven9 min de leitura

Tirando o backend do caminho de upload

A GeekBye grava sua tela e salva o vídeo no seu Google Drive. A primeira versão enviava cada gravação pelos próprios servidores da GeekBye no caminho; uma release depois, o arquivo ia direto da sua máquina para o Drive, e o backend foi rebaixado a segurar um único ponteiro. A parte interessante é o quão pouco código a versão «direta e retomável» realmente contém — porque a retomabilidade veio de apagar um proxy, não de escrever um.

Engenharia
Arquitetura
Desktop