Steven
Steven5 min læsning

Fire releaser på seksogtyve timer: sprog-VVS og en "bridge release"

GeekBye v1.7.6 til v1.8.1: en sprogindstilling der aldrig havde forladt laptoppen, en Cmd+/-overlay der viser dine rigtige tastebindinger, en version med nul kodeændringer — og hønen-og-ægget i at migrere sit auto-update-feed.

Udvikling
Release
Desktop
GeekBye-releaser
Fire releaser på seksogtyve timer: sprog-VVS og en "bridge release"

Mellem en torsdag morgen og en fredag eftermiddag i februar 2026 shippede GeekBye fire releaser: v1.7.6, v1.7.7, v1.8.0 og v1.8.1 — seksten commits, cirka seksogtyve timer mellem det første tag og det sidste. Ingen af dem er en overskrift i sig selv. Tilsammen er de et portræt af, hvad små-release-uger faktisk indeholder: en feature der endelig fuldender sin rejse, en quality-of-life-overlay, et versionsnummer uden kode i, og ét virkelig lærerigt stykke release engineering.

Sproget der aldrig forlod laptoppen

GeekBye har haft en indstilling for transkriptsprog siden september 2025. Den virkede — lokalt. Vælg spansk, og den lokale tale-til-tekst-pipeline transskriberede pligtskyldigt spansk. Men grep v1.7.5-kodebasen for den indstilling, og du finder den præcis tre steder: audio-handleren, Settings-UI-en og settings-hooket. Ikke i API-klienten. Ikke i sessionstrackeren. I fire måneder var hver request, der forlod maskinen, sprogblind: backendens sessionsposter anede ikke, hvilket sprog de repræsenterede, og AI-chatten modtog spanske transkripter uden antydning af, at de var spanske.

v1.7.6 er releasen, hvor indstillingen fuldendte sin rejse — to commits, én dag. Audiosessionens start bærer nu transcriptLanguage i sin payload, og AI-ens stream-chat-request fik samme felt, trukket gennem en lille hjælpefunktion, der læser indstillingen og bevidst returnerer undefined, når den er auto eller ikke sat, så ældre backends degraderer pænt i stedet for at få et felt, de ikke kender, galt i halsen. Der gemmer sig også et stille bonus-fix i diffen: for at kunne sende sproget med måtte sessionsstarten flyttes til efter sprogopløsningen — hvilket, som vi læser det, også lukkede en fejlsti, hvor en session kunne startes (og tælles med i limits) og derefter blive forældreløs, når sprogopløsningen fejlede et øjeblik senere.

Læringen generaliserer: en indstilling er ikke shippet, når den har en UI og en effekt. Den er shippet, når den når hver forbruger, der burde kende til den. Vores stoppede ved netværksgrænsen i fire måneder, og ingen opdagede det, fordi den lokale adfærd — den synlige adfærd — var korrekt hele tiden. (Det her var det grove første forsøg på sproghåndtering, for en ordens skyld; at lære AI-en faktisk at svare på samtalens sprog er et meget senere kapitel i denne historie.)

Cmd+/ — en overlay der ikke lyver om dine tastebindinger

v1.8.0's brugervendte feature er en genvejsoverlay på Cmd+/ — 193 linjer ny komponent, og én designbeslutning værd at stjæle: den renderer ikke et hardcodet snydeark. Den henter den levende genvejskonfiguration og renderer customKeys || defaultKeys, så en bruger, der har remappet sine taster, ser sine taster. En genvejsoverlay, der viser defaults til nogen, der har ændret dem, er ikke dokumentation; det er misinformation med pæn typografi.

Resten er små korrekthedsdetaljer: overlayen placerer sig til venstre eller højre for app-kortet, alt efter hvilken side af skærmen der har plads, og lukker på Escape, på Cmd+/ igen eller på et klik udenfor. Cmd+/ selv indgår i det samme remapbare preset-system som enhver anden genvej — hvilket betyder noget, for Cmd+/ er "toggle comment" i de fleste editorer, og et værktøj til udviklere bør ikke besætte en editortast, du ikke kan flytte.

Bridge-releasen

Den interessante engineering skete i de versionsnumre, ingen ville kigge to gange på. v1.8.0 migrerede også projektets releaser til en ny GitHub-organisation — org-oprydning på overfladen, hvis ikke det var for én egenskab ved desktop-auto-update: feed-URL-en er bagt ind i binaryen. Hver v1.8.0-installation poller den nye organisations releaser. Og hver installation derude i verden — alle sammen v1.7.7 eller ældre — poller den gamle, for evigt, medmindre noget dukker op dér.

Det er hønen-og-ægget: publicér din næste release kun til det nye repo, og hele den eksisterende flåde ser den aldrig. Seksten minutter efter v1.8.0-tagget landede et nyt flag i release-scriptet: --publish-owner, som omskriver, hvor electron-builder uploader artefakterne hen, efter buildet — eksplicit "uden at påvirke den kompilerede appkode", som kodekommentaren formulerer det. Det er hele tricket, og det er præcis den rigtige søm: binaryens indbagte feed og artefakternes upload-destination er to forskellige beslutninger, og en migrering har brug for dem afkoblet i én release. Byg v1.8.1 pegende på det nye feed, upload den til det gamle repo; gamle klienter ser opdateringen dér, installerer den og vågner op pollende den nye organisation. Commit-beskeden kalder det en "bridge release", hvilket er det rigtige navn. v1.8.1 blev tagget to timer og tyve minutter efter v1.8.0. (For oprindelseshistorien om, hvorfor dette projekt behandler auto-update med en respekt der grænser til frygt, se auto-opdateringen der gjorde vores app udødelig.)

Og v1.7.7? Én commit. Selve versionsbumpet. Intet fix, ingen revert, ingen forklaring i historikken — vores bedste læsning er en publicering, der skulle køres om, og det vil vi hellere indrømme end opfinde en historie. Nogle gange findes et versionsnummer, fordi det at udgive software er en virkelighedsproces med virkelighedshikke, ikke en ren funktion af kildetræet. Med hensyn til hvorfor 1.7 overhovedet blev til 1.8: ingen commit siger det, men feed-migreringen er den meningsfulde kompatibilitetsgrænse — hver 1.8.x-binary kigger på en anden organisation end hver 1.7.x-binary — og det fortjener et minor-bump mere, end nogen feature gør.

Tre ting denne uge lærte os

  1. Spor en indstilling til hver forbruger. Sprogpræferencen var "færdig" i fire måneder, mens backenden forblev blind. At den synlige, lokale adfærd var korrekt, er præcis det, der lod hullet overleve — audit-spørgsmålet er "hvem ellers burde kende denne værdi?", stillet ved hver grænse.
  2. Render levende konfiguration, ikke dokumentation. Genvejsoverlayen læser den samme kilde til sandhed, som genvejssystemet bruger. Alt andet glider ud af sync, første gang en bruger tilpasser noget.
  3. En feed-migrering har brug for én release, der lever i begge verdener. Nyt feed i binaryen, gammelt repo til uploaden. Hvis dit release-værktøj ikke kan adskille de to mål, så tilføj flaget, før du får brug for det — vores ankom seksten minutter efter, det var nødvendigt, hvilket er tæt nok på til at tælle.

For det forrige kapitel i v1-historien, login-siden ER demoen (v1.7.5); og for hele buen, anatomien i at shippe software til perfektion.