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.

Relaterede artikler

De tre verber, der holder Web Audio i live
Steven
Steven9 min læsning

De tre verber, der holder Web Audio i live

To GeekBye-punktreleases, to måneder fra hinanden og i to forskellige filer, lærte vores lydkode den samme lektie fra modsatte ender: hold op med at behandle browserens AudioContext som engangsbrug. Den ene release lærte at kalde resume() på en kontekst, macOS stille havde suspenderet midt i optagelsen; den anden lærte at kalde suspend() i stedet for close(), så optagelser i træk holder op med at buldre ind i Chromiums loft på cirka seks kontekster. Resume, suspend, close — det er hele handlingen.

Udvikling
Audio
Desktop
At skelne et opkald fra en åben app
Steven
Steven8 min læsning

At skelne et opkald fra en åben app

GeekBye kan bemærke, at du er gået med i et videomøde, og tilbyde at optage det. Detekteringen viser sig at være den lette halvdel — en Swift-binær, der læser vinduestitler hvert tiende sekund. Den svære halvdel er præcision: ikke at udløse, når Zoom bare er åben, ikke at spørge om et møde, du allerede optager, og ikke at dæmpe mikrofonen i det opkald, du faktisk sidder i. Tre releases, og hver enkelt er et værn, der måtte lære ikke at besejre sig selv.

Udvikling
macOS
Desktop
At tage backend ud af upload-stien
Steven
Steven8 min læsning

At tage backend ud af upload-stien

GeekBye optager din skærm og gemmer videoen til din Google Drive. Den første version sendte hver optagelse gennem GeekByes egne servere på vejen dertil; en release senere gik filen direkte fra din maskine til Drive, og backend blev degraderet til at holde en enkelt pointer. Den interessante del er, hvor lidt kode den 'direkte, genoptagelige' version faktisk indeholder — fordi genoptageligheden kom fra at slette en proxy, ikke fra at skrive en.

Udvikling
Arkitektur
Desktop