Steven
Steven7 मिनट पढ़ें

26 घंटों में चार रिलीज़: language की plumbing और एक "bridge release"

GeekBye v1.7.6 से v1.8.1 तक: एक language setting जो कभी laptop से बाहर ही नहीं निकली, एक Cmd+/ overlay जो आपकी असली keybindings दिखाता है, एक version जिसमें code का एक भी बदलाव नहीं — और auto-update feed migrate करने की मुर्गी-पहले-या-अंडा वाली उलझन।

इंजीनियरिंग
रिलीज़
डेस्कटॉप
GeekBye रिलीज़
26 घंटों में चार रिलीज़: language की plumbing और एक "bridge release"

February 2026 में एक गुरुवार की सुबह और शुक्रवार की दोपहर के बीच, GeekBye ने चार रिलीज़ ship कीं: v1.7.6, v1.7.7, v1.8.0 और v1.8.1 — 16 commits, पहले tag से आख़िरी tag तक क़रीब 26 घंटे। इनमें से कोई अकेली रिलीज़ headline नहीं बनती। पर मिलाकर देखें तो ये एक तस्वीर हैं कि छोटी-छोटी रिलीज़ों वाले हफ़्तों में असल में क्या-क्या होता है: एक feature जो आख़िरकार अपना सफ़र पूरा कर पाया, quality-of-life बढ़ाने वाला एक overlay, एक version number जिसके अंदर code है ही नहीं, और release engineering का एक सचमुच सिखाने वाला टुकड़ा।

वह language जो कभी laptop से बाहर नहीं निकली

GeekBye में transcript-language की setting September 2025 से है। वह काम करती थी — locally। Spanish चुनो, और on-device speech-to-text pipeline पूरी ईमानदारी से Spanish transcribe करती। पर v1.7.5 के codebase में उस setting को grep करो, तो वह ठीक तीन जगह मिलती है: audio handler, Settings UI, और settings hook। API client में नहीं। session tracker में नहीं। चार महीने तक, machine से बाहर जाने वाली हर request language से अनजान थी: backend के session records को पता ही नहीं था कि वे किस language के हैं, और AI chat को Spanish transcripts मिलते थे — इस इशारे के बिना कि वे Spanish हैं।

v1.7.6 वह रिलीज़ है जहाँ इस setting ने अपना सफ़र पूरा किया — दो commits, एक दिन। audio session start अब अपने payload में transcriptLanguage लेकर चलता है, और AI की stream-chat request में भी वही field आ गई — दोनों एक छोटे helper से होकर, जो setting पढ़ता है और auto या unset होने पर जान-बूझकर undefined लौटाता है, ताकि पुराने backends किसी अनजान field पर अटकने की बजाय आराम से gracefully degrade हो जाएँ। diff में एक चुपचाप bonus फ़िक्स भी छिपा है: language pass करने के लिए session start को language resolution के बाद खिसकाना पड़ा — और हमारी समझ में, इसी ने एक error path भी बंद कर दिया जहाँ session शुरू हो जाता (और limits में गिना जाता), और अगले ही पल language resolution fail होने पर लावारिस छूट जाता।

सबक़ आम है: कोई setting तब shipped नहीं होती जब उसका UI हो और असर दिखे। वह तब shipped होती है जब वह हर उस consumer तक पहुँच जाए जिसे उसके बारे में पता होना चाहिए। हमारी setting network की सरहद पर चार महीने रुकी रही, और किसी ने ध्यान नहीं दिया — क्योंकि local behavior, यानी जो दिखता था, पूरे समय सही था। (record के लिए कह दें, यह language handling का कच्चा पहला क़दम था; AI को बातचीत की language में सचमुच जवाब देना सिखाना इस कहानी का काफ़ी बाद का अध्याय है।)

Cmd+/ — एक overlay जो आपकी keybindings के बारे में झूठ नहीं बोलता

v1.8.0 का user-facing feature है Cmd+/ पर keyboard-shortcuts overlay — 193 lines का नया component, और एक design decision जो चुरा लेने लायक़ है: वह कोई hardcoded cheat sheet render नहीं करता। वह live shortcut configuration fetch करता है और customKeys || defaultKeys render करता है, ताकि जिसने keys remap की हैं उसे उसकी अपनी keys दिखें। जो shortcuts overlay keys बदल चुके user को defaults दिखाए, वह documentation नहीं है; वह अच्छी typography में लिपटी ग़लत जानकारी है।

बाक़ी छोटे-छोटे correctness वाले touches हैं: overlay ख़ुद तय करता है कि screen के जिस तरफ़ जगह है, app card के left या right बैठे, और Escape से, दोबारा Cmd+/ से, या बाहर click करने से बंद हो जाता है। Cmd+/ ख़ुद भी उसी remappable preset system में शामिल हो जाता है जिसमें हर दूसरा shortcut है — और यह मायने रखता है, क्योंकि ज़्यादातर editors में Cmd+/ "toggle comment" है, और developers के लिए बने tool को editor की किसी ऐसी key पर कब्ज़ा नहीं जमाना चाहिए जिसे आप हटा भी न सकें।

Bridge release

दिलचस्प engineering उन version numbers में हुई जिन्हें कोई पलटकर भी न देखे। v1.8.0 ने project की releases को एक नए GitHub organization पर भी migrate किया — ऊपर से देखो तो बस org की साफ़-सफ़ाई, सिवाय desktop auto-update की एक ख़ासियत के: feed का URL binary में baked होता है। हर v1.8.0 install नए organization की releases poll करता है। और दुनिया में मौजूद हर install — सारे के सारे v1.7.7 या उससे पुराने — हमेशा-हमेशा पुराना ही poll करते रहेंगे, जब तक वहाँ कुछ आ न जाए।

यही है मुर्गी-पहले-या-अंडा: अगली रिलीज़ सिर्फ़ नए repo पर publish करो, तो पूरा मौजूदा fleet उसे कभी देख ही नहीं पाएगा। v1.8.0 के tag के सोलह minute बाद release script में एक नया flag आया: --publish-owner, जो build के बाद यह बदल देता है कि electron-builder artifacts कहाँ upload करे — code comment के शब्दों में, साफ़-साफ़ "compiled app code को छुए बिना"। पूरी तरकीब बस इतनी है, और जोड़ ठीक यहीं बनता है: binary में baked feed और artifacts की upload destination दो अलग फ़ैसले हैं, और migration को एक रिलीज़ भर के लिए इन्हें अलग करना ज़रूरी है। v1.8.1 को नए feed की तरफ़ इशारा करते हुए build करो, उसे पुराने repo पर upload करो; पुराने clients को update वहीं दिखता है, वे install करते हैं, और जागते ही नया organization poll करने लगते हैं। commit message इसे "bridge release" कहता है, और नाम बिल्कुल सही है। v1.8.1 को v1.8.0 के 2 घंटे 20 मिनट बाद tag किया गया। (यह project auto-update को डर की हद तक छूती इज़्ज़त से क्यों देखता है, उसकी शुरुआती कहानी के लिए देखें वह auto-update जिसने हमारे app को अमर बना दिया।)

और v1.7.7? एक commit। ख़ुद version bump। न कोई फ़िक्स, न revert, न history में कोई सफ़ाई — हमारी सबसे ईमानदार समझ यह है कि कोई publish था जिसे दोबारा चलाना पड़ा, और कहानी गढ़ने से बेहतर है कि हम यही मान लें। कभी-कभी कोई version number इसलिए होता है क्योंकि software release करना असल दुनिया की प्रक्रिया है, असल दुनिया की हिचकियों समेत — source tree का pure function नहीं। रही बात इसकी कि 1.7 आख़िर 1.8 क्यों बना: कोई commit बताता नहीं, पर feed migration ही असली compatibility की सरहद है — हर 1.8.x binary उस organization को देखती है जो हर 1.7.x binary से अलग है — और minor bump का हक़दार यह किसी भी feature से ज़्यादा है।

तीन बातें जो इस हफ़्ते ने हमें सिखाईं

  1. setting का पीछा उसके हर consumer तक करो। language preference चार महीने तक "done" थी जबकि backend अनजान बैठा रहा। दिखने वाला local behavior सही था — और यही वह वजह है जिसने इस फ़ासले को ज़िंदा रखा। audit का सवाल है: "इस value के बारे में और किस-किस को पता होना चाहिए?" — और यह हर boundary पर पूछा जाए।
  2. live config render करो, documentation नहीं। shortcuts overlay वही source of truth पढ़ता है जो shortcut system इस्तेमाल करता है। बाक़ी हर तरीक़ा पहली ही बार user के customize करते ही भटकने लगता है।
  3. feed migration को एक ऐसी release चाहिए जो दोनों दुनियाओं में रहे। binary में नया feed, upload के लिए पुराना repo। अगर आपकी release tooling इन दो targets को अलग नहीं कर सकती, तो flag ज़रूरत पड़ने से पहले जोड़ लो — हमारा flag ज़रूरत पड़ने के 16 मिनट बाद पहुँचा, जिसे time पर ही गिन लेते हैं।

v1 कहानी के पिछले अध्याय के लिए देखें Login page ही असली demo है (v1.7.5); और पूरे चाप के लिए, सॉफ़्टवेयर को परिपूर्णता तक पहुँचाकर भेजने की शारीर-रचना

संबंधित लेख

तीन क्रियाएँ जो Web Audio को ज़िंदा रखती हैं
Steven
Steven10 मिनट पढ़ें

तीन क्रियाएँ जो Web Audio को ज़िंदा रखती हैं

GeekBye की दो point releases, दो महीने के फ़ासले पर और दो अलग files में, हमारे audio code को उलटे छोरों से एक ही सबक़ सिखा गईं: browser के AudioContext को इस्तेमाल-कर-फेंको जैसा मानना बंद करो। एक release ने एक ऐसे context को resume() करना सीखा जिसे macOS ने record के बीचोंबीच चुपचाप suspend कर दिया था; दूसरी ने close() के बजाय suspend() करना सीखा ताकि पीठ-दर-पीठ चलती sessions Chromium की लगभग-छह-context वाली छत से टकराना बंद कर दें। resume, suspend, close — यही पूरी कहानी है।

इंजीनियरिंग
Audio
डेस्कटॉप
एक call को एक खुले हुए app से अलग पहचानना
Steven
Steven10 मिनट पढ़ें

एक call को एक खुले हुए app से अलग पहचानना

GeekBye यह ताड़ सकता है कि आप एक video meeting में शामिल हो गए हैं और एक क्लिक में उसे record करने की पेशकश करता है। पता चलता है कि detection ही आसान वाला आधा था — एक Swift binary जो हर दस सेकंड window titles पढ़ती है। मुश्किल आधा है सटीकता: जब Zoom बस खुला हो तब न भड़कना, एक ऐसी meeting के लिए न टोकना जिसे आप पहले से record कर रहे हैं, और उस call में microphone को mute न करना जिसमें आप असल में हैं। तीन releases, और हर एक एक ऐसा guard है जिसे ख़ुद को न हराना सीखना पड़ा।

इंजीनियरिंग
macOS
डेस्कटॉप
अपलोड के रास्ते से backend को हटा देना
Steven
Steven9 मिनट पढ़ें

अपलोड के रास्ते से backend को हटा देना

GeekBye आपकी स्क्रीन record करता है और video को आपके Google Drive में save कर देता है। पहला version हर recording को वहाँ तक पहुँचने के रास्ते में GeekBye के अपने servers से होकर भेजता था; एक release बाद, file आपकी मशीन से सीधे Drive चली जाती थी, और backend को महज़ एक pointer थामे रखने तक घटा दिया गया। दिलचस्प हिस्सा यह है कि वह «सीधा, resumable» version असल में कितना कम code रखता है — क्योंकि resumability एक proxy लिखने से नहीं, बल्कि उसे मिटाने से आई।

इंजीनियरिंग
आर्किटेक्चर
डेस्कटॉप