Değişiklik günlüğü

Tüm sürümler, en yenisi en üstte — uygulamanın kendini güncellediğinde gösterdiği notların aynısı. İndirmeler sürümler sayfasında. Daha eski sürümler İngilizce gösterilir.

Yeni uygulama simgesi artık macOS 26’da doğru görünüyor. Koyu stilde ok ve halka artık birbirine karışıp dolu lekelere dönüşmüyor; kedinin başı ve kulakları da tırtıklı değil, temiz kenarlı.

Çalışma alanını kapatmak artık sürüm notlarının kullandığı belleği serbest bırakıyor. Önceden, açtığınız bir sürüm notları sayfası DuoUpdater’dan çıkana kadar arka planda çalışmaya devam ediyordu.

Yeni bir uygulama simgesi. Kıvrılmış bir Siyam kedisi; kuyruğu yenileme okunu oluşturuyor. macOS 26 ve sonrasında seçtiğiniz açık, koyu veya renklendirilmiş simge stiline uyuyor.

Düşük Veri Modu'ndayken veya iPhone erişim noktası gibi ölçülü bir bağlantıdayken arka plan denetimleri bekliyor. Normal bir ağa döndüğünüz anda çalışıyorlar. Elle denetleme ve güncelleme yükleme eskisi gibi çalışıyor.

Anlık bir ağ aksaklığı yüzünden başarısız olan denetimler iki dakika sonra bir kez yeniden deneniyor. Önceden başarısız satırlar ve uyarı, bir sonraki zamanlanmış denetime, varsayılan olarak altı saat sonrasına kadar kalıyordu.

Perde arkasında. Sürüm notlarındaki görseller diskte çok daha az yer kaplıyor, İstekler bölmesi yeniden doğrulanan bir isteği artık iki kez saymıyor ve Muse denetimi artık onun giriş sayfasını indirmiyor.

Quark Cloud Drive gibi kendi kurulum betiğiyle kurulan Homebrew uygulamaları artık tek tıkla güncelleniyor. Önceden her deneme, kurulum paketi bulunamadığını söyleyen bir hatayla bitiyordu.

Yükleyicisini sizin çalıştırmanız gereken Homebrew uygulamaları artık başarısız olmak yerine güncellemelerini bir bağlantıyla gösteriyor. Önceden DuoUpdater yükleyicinin tamamını indiriyor, ardından bir hatayla duruyordu.

Daha fazla Homebrew uygulaması tanınıyor. Visual Paradigm Community Edition gibi Homebrew’un farklı bir adla kurduğu uygulamalar artık güncellemeler için denetleniyor ve benzer adlı başka bir uygulama artık onlarla karıştırılmıyor.

Homebrew cask’ı geri çekilmiş uygulamalara, Homebrew’un kurmayı reddettiği bir güncelleme artık önerilmiyor. Bunun yerine, varsa uygulamanın kendi güncelleme kaynağından denetleniyorlar.

VS Code sürüm notları yeniden görünüyor.

Perde arkasında. Ayarlar › Tanılama, Antigravity ve OpenLens güncellemeleri başka bir yoldan bulunduğunda artık bu uygulamalar için uyarı göstermeye devam etmiyor.

blender.org’dan indirilen Blender artık tek tıkla güncelleniyor. Önceden yalnızca Homebrew ile kurulmuş kopya denetleniyordu.

Blender’ın alfa, beta ve sürüm adayı (RC) derlemeleri kendi kanallarını izliyor. DuoUpdater hangi tür derlemeye sahip olduğunuzu anlıyor ve aynı türden daha yeni bir derleme çıktığında haber veriyor. Bir alfaya asla kararlı sürüm önerilmiyor, tersi de geçerli.

Muse güncellemeleri yeniden görünüyor. Muse indirme bağlantısı için oturum açmayı istemeye başladığından beri, satırında yeni sürüm yerine bir hata görünüyordu.

Perde arkasında. Menü çubuğu açılır penceresi ve çalışma alanı, açılıştan sonraki ilk seferde biraz daha hızlı açılıyor; duo check de artık her şeyin güncel olduğunu söylemek yerine denetimi başarısız olan uygulamaları listeliyor.

DuoUpdater artık İtalyanca, Geleneksel Çince, Portekizce (Brezilya) ve Türkçe konuşuyor. Böylece toplam on bir dil oldu. Almanca, İspanyolca ve Japonca’daki yanlış veya kesik metinler düzeltildi. Ayarlar → Klasörler artık klasör adlarını Finder’ın sizin dilinizde gösterdiği gibi gösteriyor.

Homebrew ile yüklediğiniz uygulamalar artık Homebrew üzerinden güncelleniyor. Bu, brew ile yüklenmiş ve kendi güncelleyicisi de olan uygulamaları kapsar. Önceden DuoUpdater bunları doğrudan güncelliyor, Homebrew bundan haberdar olmuyordu; bir sonraki brew upgrade de zaten sahip olduğunuz sürümü yeniden indirip yüklüyordu.

Pencereler bulunduğunuz Space’te açılıyor. Önceden Ayarlar’ı veya başka bir DuoUpdater penceresini kapatıp yeniden açmak, sizi pencerenin en son gösterildiği Space’e geri geçirebiliyordu.

Bir güncelleme, bir bildirim. Bazı uygulamalar iki kaynak üzerinden denetleniyor ve bu kaynaklar aynı yeni sürümü tekrar tekrar duyurabiliyordu.

Sürüm Günlüğü artık tarihi gelecekte olan sürümler göstermiyor. Bir geliştiricinin akışı, DuoUpdater’ın sürümü ilk gördüğü andan daha sonraki bir tarih verirse, günlük o anı kullanıyor.

Yedekleme diski takılı değilken çalışma alanı penceresi yeniden ekrana sığıyor ve Şimdi Kopyala neden kopyalayamadığını söylüyor. Önceden pencere ekrandan uzun olabiliyor, listeler sonuna kadar kaydırılamıyordu; Şimdi Kopyala da hiçbir şey söylemeden hiçbir şey yapmıyordu.

Xcode betaları ve sürüm adayları artık tek tıkla güncelleniyor. Ayarlar → Xcode’da Apple Developer hesabınızla bir kez oturum açın; DuoUpdater yeni betaları ve RC’leri diğer tüm güncellemeler gibi indirip yükler. Önceden yalnızca yenisinin çıktığını haber verebiliyordu.

İstediğiniz Xcode sürümünü mevcut olanların yanına yükleyin. Ayarlar → Xcode tüm Xcode sürümlerini sürüm numarasına göre gruplanmış olarak listeler; macOS sürümünüze uyan grup zaten açık gelir. Yükle, seçtiğiniz sürümü Uygulamalar klasörüne ayrı bir kopya olarak koyar (örneğin Xcode-26.6.app) ve hiçbir şeyin yerine geçmez. İsterseniz yalnızca arşivi (.xip) de kaydedebilirsiniz. Oturum açtığınızda Apple’ın kendi listesi de dahil edilir; böylece yeni sürümler birkaç dakika içinde görünür.

Apple Developer oturumunuz kendi kendini açık tutuyor. Apple bir geliştirici oturumunu yaklaşık sekiz saat sonra sonlandırır. Apple bu Mac’i tanımaya devam ettiği sürece DuoUpdater artık arka planda, pencere açmadan ve parola sormadan yeni bir oturum alıyor. Bunu Ayarlar → Xcode’dan kapatabilirsiniz.

Yeni Xcode sürümleri daha erken görünüyor. Hafta içi, Apple’ın olağan yayın saatlerinde DuoUpdater beş dakikada bir yeni bir Xcode çıkıp çıkmadığına bakıyor.

Geliştiricileri bazı şeyleri değiştirdikten sonra çalışmayan birkaç uygulama yeniden çalışıyor. CapCut beta ve Superconductor nightly yeniden bulunup yükleniyor; Superconductor mevcut uygulama kimliğini de koruyor. VLC 3.0.24 ve JetBrains Air sürüm notlarını yeniden gösteriyor.

Qoder CN IDE artık destekleniyor. Qoder IDE’nin Çin anakarası baskısı güncelleme denetimi, tek tıkla yükleme ve pencerede sürüm notları alıyor. Masaüstü uygulaması Qoder CN de artık sürüm notlarını gösteriyor.

Qoder IDE en son sürüm konusunda artık fikir değiştirmiyor. Qoder güncellemeleri kademeli olarak dağıtıyor; DuoUpdater artık sizin IDE kopyanızla aynı şekilde soruyor ve bu yüzden her seferinde aynı yanıtı alıyor. Önceden sunulan sürüm iki sürüm arasında gidip gelebiliyor, yanıt değiştiği için tek tıkla yükleme de yarıda kalabiliyordu.

İndirdikleri güncelleme sonradan eskiyen Sparkle uygulamaları yeniden güncellenebiliyor. Sparkle ile kendini güncelleyen bir uygulama bir derleme indirmişse ve ardından daha yenisi çıkmışsa, DuoUpdater artık eski indirmeyi temizleyip en yenisini yüklüyor. Önceden Güncelle, şimdi yüklemenin geri alınacağını söyleyip duruyor ve satır hiç değişmiyordu.

duo install, en son derleme zaten hazır beklerken bunu size söylüyor. Bir uygulamanın kendi güncelleyicisi en son sürümü zaten indirmişse artık bunu belirtiyor ve uygulamadan çıkmanızı ya da duo restart çalıştırmanızı öneriyor. Önceden, uygulamanın yüklenemeyeceğini, yalnızca denetlenebileceğini yanlışlıkla söylüyordu.

搜狗输入法 artık tek tıkla güncelleniyor. DuoUpdater güncellemeyi, giriş yönteminin kendini güncellediği şekilde uyguluyor — yüklü paketi yerinde bırakarak — ve önce sözlüğünüzün ve ayarlarınızın bir kopyasını alıyor; böylece geri alma bunları da geri getiriyor.

Başka bir diskteki yedekler artık giriş yönteminin sözlüğünü ve ayarlarını da saklıyor. Önceden yedek diskine yalnızca uygulamanın kendisi taşınıyordu; bu yüzden bir giriş yöntemini oradan geri almak, yeni sürümün verilerini geride bırakıyordu.

Asla yüklenemeyecek güncellemeler artık yok. JetBrains Air artık Toolbox’ın gerçekten sunduğu derlemeyi gösteriyor. Geliştiricisi adını değiştirdikten sonra eski adıyla geride kalan bir App Store uygulaması, yalnızca diğer kopyayı yeniden yükleyen bir güncelleme sunmak yerine artık App Store’un hangi kopyayı güncellediğini söylüyor.

Daha fazla uygulamanın sürüm notları biçimlendirilmiş olarak görünüyor. Notlarını Markdown olarak yayımlayan uygulamalar artık diğer herkesle aynı yerel liste görünümünü alıyor. Önceden bu notlar düz metin olarak görünüyordu.

Yeniden Başlat artık bir uygulamanın kendi yükleyicisiyle çakışmıyor. Bir uygulama kendi güncellemesini indirmişse ve geri alma yedeğinin harici bir diske alınması gerekiyorsa, bu kopya artık yükleyici işini bitirene kadar bekliyor. Önceden, macOS’un yükleyiciye işini yapması için tanıdığı o birkaç saniye içinde çalışıyordu.

Geri alma yedekleri artık başka bir diskte durabiliyor. Bir yedek, uygulamanın eksiksiz bir kopyasıdır ve başlangıç diskinde bunlar hızla birikir. Ayarlar → Yedekler bağlı diskleri her birindeki boş alanla birlikte listeler, mevcut yedeklerinizi oraya taşır ve yenilerini arka planda oraya yazar — diski çıkarırsanız yalnızca bir gecikme yaşarsınız, geri alma noktanızı kaybetmezsiniz. duo backups komutuna disks, sync, verify ve probe eklendi.

千问输入法 artık destekleniyor. DuoUpdater yeni bir sürüm çıktığında haber veriyor ve giriş yöntemini, kendi kendini güncellediği şekilde güncelliyor.

Sürüm notları artık önceki sürümde takılı kalmıyor. Bir geliştirici bir güncellemeyi, değişiklik günlüğü sayfasında anmadan birkaç dakika önce yayımladığında, eski notlar yeni sürümün altına kaydediliyor ve sonsuza dek öyle kalıyordu. CleanShot X, 5.0.1 çıktığı günden beri onun altında 5.0’ın notlarını gösteriyordu.

Bir yedeği silmek artık söylediği kadar yer açıyor. DuoUpdater’ın eski sürümlerinin aldığı yedekler, macOS’un silmeyi reddettiği bir biçimde yazılmıştı; bu yüzden Temizle, kopyanın büyük kısmını diskte bırakırken o alanı geri kazanılmış sayıyordu.

Temizle hemen açılıyor. Önceden her bastığınızda saklanan tüm yedekleri baştan ölçüyordu.

WorkBuddy en yeni sürümünü yeniden gösteriyor. Güncelleme hizmeti en yeni derleme yerine bir yükseltme zincirinin bir sonraki adımıyla yanıt veriyor; bu yüzden WorkBuddy’nin dört baskısı da iki sürüm geriden geliyordu.

Perde arkasında. Hangi ikili dosyayı çalıştırdığını hiç bildirmeyen uygulamaların — Meta’nın Muse’u da bunlardan biri — çerçeveleri ve SDK’sı artık yine de okunuyor.

Yeniden Başlat ile tamamlanan güncellemeler artık geri alınabiliyor. Bir uygulama kendi güncellemesini zaten indirmişken Yeniden Başlat’a basarsanız, DuoUpdater artık önce mevcut sürümü kaydediyor; böylece bu güncelleme de diğerleri gibi Geri Alma altında görünüyor. Önceden yalnızca DuoUpdater’ın kendi yüklediği güncellemeler geri alınabiliyordu.

Bir güncellemenin uygulamanın içinde neleri değiştirdiğini görün. Önceki sürümü kaydedilmiş her uygulama için çalışma alanında artık Sürüm Notları’nın yanında bir Paket Farkı görünümü var: imzalama ve izinler, gereken en düşük macOS sürümü, arka plan ve giriş öğeleri, paketle gelen kitaplıklar ve eklenen, kaldırılan ya da boyutu değişen dosyalar. duo diff aynısını Terminal’de, bir uygulamanın herhangi iki kopyası için yapıyor.

Yeniden Başlat, bir uygulamanın kendi güncelleyicisi güncellemeyi uygulamadığında bunu size söylüyor. Uygulama kapanır ama güncelleme gerçekleşmezse satır artık bunu belirtiyor ve Yeniden Başlat’ı sunmaya devam ediyor. Önceden dönen gösterge tek söz etmeden duruyordu.

Cherry Studio en yeni sürümünü yeniden gösteriyor. Cherry Studio Mac indirmelerinin adlarını değiştirdikten sonra DuoUpdater daha eski bir sürümü en yenisi sanıyordu; bu yüzden yeni kopyalar “güncel” görünüyor, eski kopyalara ise o eski derleme sunuluyordu.

App Store güncellemeleri artık yanıt vermeyen bir yardımcı yüzünden takılmıyor. DuoUpdater’ın yardımcısı yanıt vermeyi bıraktığında güncelleme %0’da kalıyor, arkasında sıraya giren tüm App Store güncellemeleri de siz DuoUpdater’dan çıkana kadar bekliyordu.

Tümünü Güncelle artık yok saydığınız uygulamaları yeniden başlatmıyor. “Güncellenen uygulamaları otomatik yeniden başlat” açıkken, toplu işlemin sonunda yok sayılan bir uygulama ya da indirilmiş sürümünü atladığınız bir uygulama kapatılıp yeniden açılabiliyordu.

Tinycast ve SuperCmd artık destekleniyor. DuoUpdater, Tinycast’in ya da betasının yeni bir sürümü çıktığında haber veriyor; ayrıca SuperCmd 2’nin yanında özgün açık kaynak SuperCmd uygulamasını da artık tanıyor. Kimi Code’un sürüm notları da artık görünüyor.

Sürüm notları sunulan sürümle eşleşiyor. VS Code’un en son sürüm notları sayfası boş geliyordu; yeni bir sürüm çıktıktan hemen sonra da not bölmesi onun yerine önceki sürümü gösterebiliyordu.

Sürüm Günlüğü artık her açılışta aynı sürümü yeniden eklemiyor. Claude, Raycast ve Cline gibi uygulamalarda DuoUpdater her başladığında bir yinelenen kayıt daha oluşuyordu.

Çalışma alanının kenar çubuğu Uygulamalar, Brew ve Geri Alma sekmelerine ayrıldı. Geçiş yapmak için bir sekmeye tıklayın ya da sekmelerin üzerinde sürükleyin; arama üçünü birden daraltır.

Perde arkasında. Aynı uygulamada Yeniden Başlat ile Geri Al artık birbirine karışmıyor; bir güncelleme akışı artık DuoUpdater’a indirme klasörünün dışındaki dosyaları sildiremiyor; arka plan denetimleri artık macOS’un diğer uygulamaların verilerine erişim izni istemesine yol açma riski taşımıyor; İstekler filtresine girilen çok büyük bir sayı artık uygulamayı kapatmıyor; menü çubuğu da artık duo install sırasında reddettiğiniz yönetici istemine uyuyor.

iStat Menus güncellemeleri doğru algılanıyor. iStat Menus bir güncellemeyi yeniden yayımladığında DuoUpdater, güncelleme yüklendikten sonra da onu sunmaya devam edebiliyor, Güncelle’ye yeniden basmak ise bir hatayla sonuçlanıyordu.

Memoh Desktop artık destekleniyor. DuoUpdater yeni bir sürüm çıktığında haber veriyor ve uygulamayı tek tıkla güncelleyebiliyor.

Tümünü Güncelle artık zaten yeniden açılmış bir App Store uygulamasını yeniden başlatmanızı istemiyor. App Store bir uygulamayı kapatıp yeni sürümüyle yeniden açtığında, uygulamanın satırı artık tüm toplu işlem bitene kadar “Şimdi yeniden başlat” demek yerine onu hemen güncellenmiş olarak gösteriyor.

Kendi güncellemesini zaten indirmiş bir uygulamanın güncellemesi artık iki kez indirilmiyor. Bazı uygulamalar bir güncellemeyi arka planda sessizce indirir ve ardından onları yeniden başlatmanızı bekler. DuoUpdater’da Güncelle’ye bastığınızda artık diskinizde hazır bekleyen kopya yükleniyor: güncelleme saniyeler içinde tamamlanıyor ve hiçbir şey indirmek gerekmiyor. Önceden DuoUpdater aynı sürümü baştan indiriyordu.

Cua Driver ve Petex artık destekleniyor. DuoUpdater ikisinden birinin yeni bir sürümü çıktığında haber veriyor; Cua Driver ayrıca tek tıkla güncelleniyor ve sürüm notlarını gösteriyor.

Aynı güncelleme için artık tekrar tekrar bildirim gelmiyor. Bir geliştiricinin sunucusu iki sürüm arasında gidip geldiğinde her denetim yeni bir güncelleme gibi görünüyor ve bir bildirim daha gönderiliyordu.

Az önce yüklenmiş bir paket artık yeniden yüklenmeyi önermiyor. Satırı, indirilen paketin yeniden açılacağını söyleyip duruyordu.

DuoUpdater artık macOS 15 Sequoia veya sonrasını gerektiriyor. Hâlâ macOS 14 kullanan bir Mac mevcut sürümünde kalıyor ve ona artık güncelleme sunulmuyor; Apple Silicon’lu her Mac desteklenen bir macOS sürümüne yükseltilebilir.

Perde arkasında. Olağan denetimler artık indirme bağlantılarını önceden aramıyor; bu, bir geliştiricinin indirme sunucusu her zaman aşımına uğradığında çalışan bir Güncelle düğmesini kısa süreliğine gizleyebiliyordu.

Aside artık destekleniyor. DuoUpdater, Aside tarayıcısının yeni bir derlemesi çıktığında haber veriyor ve sürüm notlarını gösteriyor.

macOS sürümünüzün çalıştıramayacağı güncellemeler artık sunulmuyor ve satır bunun nedenini söylüyor. Bir geliştirici bir sürümün hangi macOS sürümlerini desteklediğini belirttiğinde DuoUpdater buna uyuyor: macOS yükseltmesinden sonra Little Snitch artık desteklediği en yüksek macOS sürümü sisteminizin altında kalan bir derleme sunmuyor; Xcode artık sizinkinden daha yeni bir macOS gerektiren bir derleme sunmuyor; uygulaması daha yeni bir macOS gerektiren bir yükleyici paketi de açılmayacak bir uygulamayı yüklemek yerine reddediliyor. Önceden boş bir tire gösteren satırlarda artık “Bu macOS için henüz değil” ya da “Daha yeni bir macOS gerekiyor” yazıyor; ayrıntılar bir tık uzakta.

Her uygulamanın hangi SDK ile geliştirildiğini görün. Bir uygulamanın adının yanındaki işarete tıklayın; ayrıntılarda artık örneğin “macOS 27.0 SDK’sı ile geliştirildi.” yazıyor — hangi uygulamaların en son macOS için yeniden derlendiğini anlamak için kullanışlı.

İki paket halinde gelen Homebrew uygulamaları — biri eski sistemler, biri en yenisi için — artık doğru paketten okunuyor. OnyX macOS 27 için bu şekilde ikiye ayrılıyor ve DuoUpdater yalnızca eski sistemlere yönelik pakete bakıyordu: ya OnyX için hiçbir şey göstermiyor ya da onu, Homebrew’un 27’ye yüklemeyi reddettiği bir sürüme göre güncel sayıyordu. Artık ikisinden hangisini yüklediyseniz DuoUpdater onu izliyor.

TestFlight betaları, TestFlight açıldığında artık güncellemelerini kaybetmiyor. Yeni bir derlemesi bekleyen bir beta “güncel” durumuna düşebiliyor ve TestFlight’ı yeniden açana kadar öyle kalıyordu.

Dropbox ve ToDesk için tek tıkla güncellemeler doğru dosyayı indiriyor. Apple Silicon’da Dropbox yalnızca Intel’e yönelik derlemeyi indiriyor, güvenlik denetimi de bunu reddediyordu; ToDesk’e ise genel sürümü yerine yalnızca bazı kullanıcılara dağıttığı erken erişim derlemesi sunuluyordu.

Yeniden Başlat, Spotify’ın güncellemesini hemen tamamlıyor. Spotify kendi güncellemesini zaten indirmişse Yeniden Başlat, güncelleme gerçekleşene kadar dakikalarca dönüp duruyordu.

Beta derlemeleri, dönüştükleri sürümlere geçiyor. Bir Xcode betasına güncel görünmek yerine sürüm adayı sunuluyor, CotEditor betaları sürüm adaylarını görüyor, test döngüsü sona ermiş bir Carbon Copy Cloner betasına da başarısız bir denetim yerine dönüştüğü sürüm sunuluyor.

Sürüm notları sahip olduğunuz sürümle eşleşiyor. Blender 5.2 önceden 5.1’in notlarını, Raycast 1.x ise 2.x’in notlarını gösteriyordu. Gemini’deki “Sayfayı aç” artık bir hata yerine Google’ın güncel masaüstü sayfasını açıyor.

Ayarlar her seçeneği hemen yanında açıklıyor. Bölümlerin altındaki uzun notların yerini her denetimin altında kısa bir satır aldı; seçiciler de yalnızca seçtiğiniz seçeneği açıklıyor.

Uygulama artık adını DuoUpdater olarak yazıyor, web sitesiyle aynı şekilde.

Güvenmediğiniz tap kaynaklarından gelen Homebrew paketleri yeniden görünüyor. Homebrew 6’dan beri brew, yüklü olanları listelerken güvenilmeyen tap kaynaklarındaki paketleri sessizce atlıyor; bu yüzden bu paketler DuoUpdater’dan hiçbir açıklama olmadan kayboluyordu. Artık “Denetlenmedi · tap güvenilir değil” olarak, kopyalanmaya hazır brew trust komutuyla birlikte listeleniyorlar — Terminal’de bu komutu (ya da bir yükseltmeyi) çalıştırdıktan sonra pencereye geri döndüğünüz anda pencere de durumu yakalıyor.

Kendini güncellemek için yönetici parolası gereken uygulamalar artık iki kez güncellenmiyor. Tailscale gibi bir uygulama kendi güncellemesini zaten indirip yeniden başlatılmayı beklerken DuoUpdater bunu göremiyor ve yine Güncelle’yi sunuyordu; bu da uygulamanın kendi yükleyicisiyle çakışabiliyordu. Satır artık onun yerine Yeniden Başlat’ı sunuyor, Tümünü Güncelle de bu uygulamaya dokunmuyor.

Homebrew bölümü artık Homebrew’un kendisini güncelleyebiliyor. Yeni bir Homebrew sürümü çıktığında en üstteki bir satır, brew update komutunu sizin için çalıştırmayı öneriyor. HOMEBREW_NO_AUTO_UPDATE ayarladıysanız bu satır gizli kalıyor.

Başarısız bir Homebrew yükseltmesi artık brew’un asıl hatasını gösteriyor. Satır önceden brew’un hatadan sonra yazdırdığı öneriyi gösteriyor ya da hiçbir şey göstermiyordu; bu yüzden “Command Line Tools’unuz çok eski” gibi bir mesaj size hiç ulaşmıyordu. Birkaç paketi aynı anda yükseltirken de işlem artık bitmeden bitti diye bildirilmiyor.

Menü çubuğu simgesi 50’nin ötesini sayıyor. 50’den fazla güncelleme beklerken simge 50’de kalıyordu.

Sürüm notları: Claude’unkiler, Claude’un kendisinin gösterdiği gibi Yeni, İyileştirildi ve Düzeltildi başlıkları altında gruplanıyor; Mac Mouse Fix’inkiler gömülü bir sayfa yerine metin olarak görünüyor; Homebrew’un kendi uygulamasının da artık notları var.

duo check artık gerçekte denetleyemediği durumlarda “Everything is up to date.” demiyor. TestFlight’ı okuyamadığında ya da uygulama taraması yarıda bırakıldığında artık bunu belirtiyor.

Bir uygulama sürüm notlarını birkaç dilde yayımlıyorsa, notlar artık sizin dilinizde görünüyor. Bazı uygulamalar notlarını her sürümle birlikte çevirileriyle yayımlıyor. DuoUpdater önceden, uygulama hangi çeviriyi ilk ya da son sıraya koyduysa onu alıyordu; bu yüzden bir uygulamanın notları herkese Almanca görünüyor, bir diğerininki ise sürümden sürüme dil değiştiriyordu.

Mac sürümü ekleyen uygulamalar artık “bu Mac’te desteklenmiyor” olarak görünmüyor. Apple Silicon’da çalıştırdığınız bir iPhone ya da iPad uygulaması, geliştiricisi gerçek bir Mac derlemesi yayımladığı anda yanlışlıkla işaretleniyordu — oysa bu, güncellemeyi daha az değil, daha çok erişilebilir kılan tek değişiklikti.

Beta testine de katıldığınız bir App Store uygulaması artık TestFlight derlemesi sanılmıyor. Bir geliştirici bir betayı hiç değiştirmeden yayına aldığında ikisi aynı derleme numarasını taşıyor ve satın aldığınız kopya TestFlight’a atanıyordu — bu yüzden App Store ona hiçbir zaman güncelleme sunamıyordu.

Kullandığınızdan daha yeni bir macOS gerektiren bir App Store güncellemesi artık bunu söylüyor. Önceden satır yine de yüklemeyi öneriyor, App Store son adımda reddediyor ve ekranda nedenini açıklayan hiçbir şey olmuyordu.

İstekler penceresi artık günlüğünün gerçekte ne kadar geriye gittiğini gösteriyor ve tam olarak kapsayamadığı tarih aralıklarını işaretliyor. Önceden, yalnızca birkaç saat geriye giden bir günlükte “Son 30 gün”ü seçmek, “Son 24 saat”i seçmekle tamamen aynı görünüyordu ve ekranda nedenini açıklayan hiçbir şey yoktu.

TestFlight betaları konusunda DuoUpdater’ın ne kadar iş yapacağını Ayarlar → Genel’de siz seçiyorsunuz. Ben yenilediğimde seçeneği TestFlight’ın zaten bildiklerini okur ve Yenile’ye bastığınızda ondan güncel bir yanıt ister. Güncel tut buna ek olarak DuoUpdater’ın kendiliğinden sormasına da izin verir: böylece TestFlight’ın arka planda yüklediği bir beta siz yenileyene kadar soru işareti olarak kalmaz, sizi bekleyen bir derleme de bir “güncel” ibaresinin arkasında gözden kaçmaz. Kapalı hiçbir şey okumaz; tahmin yürütmek yerine bu satırlarda bunu açıkça belirtir. Tam Disk Erişimi zaten verilmiş Mac’ler Ben yenilediğimde ile, diğer herkes Kapalı ile başlar.

TestFlight’ı kendiniz açmanız, DuoUpdater’ın onun yüklediklerini fark etmesi için artık yeterli. TestFlight üzerinden yüklediğiniz bir beta, bir sonraki yenilemeye kadar soru işareti olarak kalıyordu — TestFlight’ın “Test Etmeye Hazır” bildiriminin zaten sahip olduğunuz uygulamalar için artık gelmediği macOS 27’de bu, saatler sürebiliyordu.

Cline artık hem kararlı hem de beta derlemelerinde güncelleme alıyor ve sürüm notlarını gösteriyor. Şimdiye kadar sürüm numarası yerine bir soru işaretiyle duruyordu — DuoUpdater’ın okuyabileceği türden bir güncelleme akışı yayımlamıyor, Homebrew paketi de yok. DuoUpdater artık Cline’ın kendi güncelleyicisinin sorduğu adrese soruyor; böylece sunulan güncelleme, Cline’ın kendi kendine yükleyeceği güncellemenin aynısı oluyor ve beta derlemesi beta hattında kalıyor.

Değişiklikleri Added ve Fixed gibi başlıklar altında gruplayan sürüm notları artık bu başlıkları koruyor. Önceden tüm gruplar tek, düz bir listede birleştiriliyordu; bu yüzden hangi değişikliklerin yeni özellik, hangilerinin hata düzeltmesi olduğunu ayırt edemiyordunuz.

Mac Mouse Fix’in kendi Genel ayarlarında “Get Beta Versions” seçeneğini açtıysanız, uygulamanın beta sürümleri artık size sunuluyor. Önceden DuoUpdater yalnızca Mac Mouse Fix’in normal sürümlerini görebiliyordu; bu yüzden bir beta derlemesi, bir sonraki normal sürüm çıkana kadar fark edilmeden kalıyordu.

Derleme numarası düz bir sayaç olan uygulamalar artık kendi yama sürümlerini gizlemiyor. 12.10 gibi bir sürümü 282987 derleme numarasıyla bildiren bir uygulamada 12.10.1 sürümü “zaten güncel” olarak görünüyordu.

Aynı sürüm adını koruyan bir uygulamanın yeni derlemesi yeniden duyuruluyor. Bir derleme bir kez duyurulduktan sonra aynı ad altındaki sonraki tüm derlemeler sessizce geliyordu — satır vurgulanıyor, simgedeki işaret onu sayıyor, ama hiçbir bildirim görünmüyordu.

“Tümünü Güncelle” artık yalnızca gerçekten güncellenen uygulamaları sayıyor. İşlemi sizin bitirmeniz için Apple’ın Yükleyici’sini açan bir uygulama, penceresi hâlâ açıkken tamamlanmış sayılıyordu; bu yüzden “2 uygulama güncellendi” mesajı, henüz hiçbir şeyin değişmediği anlamına gelebiliyordu.

Yüklenen ama geride bir kalıntı bırakan bir güncelleme artık “Uygulama Yönetimi izni verin” olarak değil, yüklendi olarak bildiriliyor. Satır sizi Sistem Ayarları’na yönlendirirken yeni sürüm zaten çalışıyordu.

“Tümünü Güncelle”yi durdurmak artık süren indirmeyi de durduruyor. Önceden gigabaytlarca büyüklükteki bir aktarım sonuna kadar devam ediyor, beş kereye kadar yeniden deniyor ve ancak ondan sonra iptal edildiğini fark ediyordu.

Tek bir değişiklik günlüğü sayfasını paylaşan iki uygulamanın sürüm notları artık karışmıyor; notları sürüm başına ayrı sayfalarda duran uygulamaların notları da güncellemeden sonra güncel kalıyor. Antigravity ve Antigravity IDE on beş dakika boyunca birbirinin notlarını gösterebiliyordu; Thunderbird, WeChat, Opera ve birkaç uygulama daha, güncellemeden sonra bir süre önceki sürümün notlarını göstermeye devam ediyordu.

Uygulama listesinde arama, Ayarlar’daki arama gibi artık aksanları yok sayıyor. “cafe” yazdığınızda artık “Café” bulunuyor.

Tanılama sayfası artık her sürüm kanalı için ayrı bir sağlık satırı gösteriyor. Bozuk bir beta ya da önizleme kuralı önceden sağlıklı kararlı kardeşinin arkasında gizli kalıyordu.

GitHub’ın “forbidden” yanıtı artık hız sınırı olarak bildirilmiyor. Gizli hale getirilen bir depo ya da bir yetki kapsamı eksik olan bir token, önceden sizi hiçbir işe yaramayacak bir token eklemeye yönlendiriyordu.

Bekleyen derlemesi çalışandan daha eski olan, kendini güncelleyen bir uygulama için artık Yeniden Başlat sunulmuyor.

Perde arkasında. Yüklemeler, yedeklemeler ve paket denetimleri artık uygulamanın geri kalanının çalıştığı iş parçacıklarını meşgul etmiyor; böylece bunlardan biri sürerken menü yanıt vermeye devam ediyor. Büyük bir indirme sürerken de menü akıcı kalıyor. Sürüm Günlüğü, bir üreticinin tek bir sürüm adı altında yayımladığı her sürümü sayıyor. Uygulamanın kendi yürütülebilir dosyası eksik kalacaksa geri alma yedeği saklanmak yerine reddediliyor. Yeni bir Mac’teki ilk açılış artık günlüğe asılsız veritabanı hataları yazmıyor. duo verify ve duo reconcile artık kayıtları bozulup tek parçaya çöken bir değişiklik günlüğünü ve günlerdir başarısız olan bir yükleyici adresini bildiriyor. Takılan bir duo komutu da askıda kalmak yerine yirmi saniye sonra taramasından vazgeçiyor.

Kendini güncelleyen bazı uygulamalar, daha yeni bir sürüm çıkmışken artık güncel görünmüyor. Güncelleme bilgileri geç yenilenen bir indirme sunucusunun arkasında duran uygulamalarda DuoUpdater, bir sürüm çıktıktan sonra günlerce eski sürümü görmeye devam edebiliyordu.

Kimi’nin sürüm notları artık DuoUpdater’da görünüyor.

CodeEdit güncellemeleri artık görünüyor. Daha yeni bir CodeEdit sürümü, güncellemeyi sunmak yerine satırını soru işareti olarak bırakıyordu.

Perde arkasında. Menüdeki Homebrew listesi daha hızlı doluyor, duo komutları da daha hızlı başlıyor.

Bir TestFlight betasında Yeniden Denetle artık gerçek yanıtı veriyor. Önceden satırı bir sonraki yenilemeye kadar soru işaretine çeviriyordu.

Yenile düğmesi TestFlight’a danışırken TestFlight betaları yanıtlarını koruyor. Önceden birkaç saniyeliğine hepsi soru işaretine dönüşebiliyordu.

super.engineering artık destekleniyor: güncelleme denetimi, sürüm notları ve tek tıkla yükleme. Yeni bir nightly, içindeki değişikliklerle birlikte görünüyor ve Güncelle onu sizin için yüklüyor.

Microsoft Edge Beta size kararlı bir Edge derlemesi sunabiliyordu. Microsoft’un beta akışı kısa bir süre boş kaldığında satır kararlı bir sürüm gösteriyordu; güncellemek bu sürümü betanızın üzerine yazacaktı.

TestFlight betaları artık TestFlight’ın onlar için sunduğu güncellemeleri gösteriyor; iPhone ve iPad uygulamalarının betaları da buna dahil. Yenile düğmesi arka planda TestFlight’a danışıyor, bulunan bir güncelleme artık birkaç dakika sonra kaybolmuyor ve TestFlight düğmesi o betanın sayfasını açıyor.

DuoUpdater bir TestFlight betasının güncel olup olmadığını anlayamadığında bunu söylüyor. Satır onu güncel saymak yerine soru işareti gösteriyor — örneğin TestFlight’ta oturumunuz kapalıyken ya da o betayı artık test etmiyorken.

Tam Disk Erişimi artık açıklanıyor ve bu izin olmadan hiçbir şey sizi rahatsız etmiyor. Bu izin yokken DuoUpdater artık macOS’un diğer uygulamaların verilerinin okunmasıyla ilgili uyarılarını tetiklemiyor; bir TestFlight betası ya da CotEditor bu izne ihtiyaç duyarsa, nedenini ve iznin nereden verileceğini size bir kez söylüyor.

Güncellenen bir uygulama kapandığında Yeniden Başlat kayboluyor. Arkada bir yardımcı süreç bırakan bir uygulama, güncellemesi çoktan etkinleştikten sonra bile yeniden başlatılmayı istemeye devam ediyordu.

Yanıtlanmamış bir macOS gizlilik istemi artık güncelleme denetimlerini durdurmuyor. Denetim, o uygulamanın ayarı olmadan devam ediyor.

Rockxy ve Ollama’nın sürüm notları yeniden eksiksiz. Rockxy’ninkiler yalnızca en yeni sürümü değil, son sürümleri de kapsıyor; Ollama’nın en yeni sürümü de artık dışarıda kalmıyor.

İsteğe bağlı komut satırı yardımcısı duo, TestFlight’ı daha iyi idare ediyor. --refresh-testflight, TestFlight açık olsun ya da olmasın ekranınızı ele geçirmeden çalışıyor; duo check de TestFlight daha yeni bir derleme duyurmuşken bir betayı artık güncel saymıyor.

Telegram Desktop yeniden güncelleme denetimi alıyor. Telegram yayımladığı dosyanın adını değiştirdi ve satır artık bu addan bir sürüm okuyamıyordu — bu yüzden arkasında bekleyen güncelleme yerine bir denetim hatası gösteriyordu.

Bir iPhone ya da iPad uygulamasının TestFlight derlemesi artık TestFlight derlemesi olarak tanınıyor. DuoUpdater onu bir App Store satın alımı olarak okuyordu; bu yüzden satır uygulamayı kimin güncel tuttuğunu yanlış gösteriyor, mağazaya da var olmayan bir kayıt soruluyordu — uygulama yüklü kaldığı sürece her denetimde.

TestFlight betası, TestFlight’ın kendi simgesiyle işaretleniyor. App Store’un ilgilendiği satırlar zaten mağazanın simgesini taşıyordu; TestFlight’ın ilgilendiklerinde ise bunun yerine ad açıkça yazılıyordu, yani aynı türden satırlar iki farklı şekilde işaretleniyordu.

Ağ penceresinin başlığı, sekme değiştirdiğinizde yerinde duruyor. İki sekmenin başlıkları biraz farklı yüksekliklerdeydi; bu yüzden aralarında geçiş yapınca pencere seğiriyormuş gibi görünüyordu.

Tüm uygulama listenizde kaydırma yeniden akıcı. Tam listede hızlı kaydırma kare atlıyordu; artık her satır, önce oluşturulması gerekmeden yüksekliğini bildiriyor.

Bir App Store uygulamasının sürüm notları artık her zaman App Store’dan geliyor. Mağazanın bir uygulama için kendi sorgusu sonuç vermediğinde ya da başarısız olduğunda pencere, o uygulamanın diğer dağıtımının notlarına — kendi sürüm numaraları olan farklı bir derlemeye ait notlara — geri dönebiliyor ve sizin kopyanıza hiçbir zaman sunulmayacak bir sürümü anlatıyordu.

Beta ya da Guinea Pig kanalındaki Windscribe’a o kanalın derlemeleri sunuluyor. DuoUpdater, Windscribe’ın kendi ayarlarında hangi güncelleme kanalını seçtiğinizi okuyor; böylece bir ön sürüm hattını izleyen kopyaya, o hatta daha yeni derlemeler varken artık güncel olduğu söylenmiyor. Pencere ayrıca bu ön sürüm derlemelerinin notlarını da gösteriyor; önceden yalnızca kararlı olanlarınkini listeliyordu.

Windscribe artık sürüm notlarıyla birlikte güncelleme denetimi alıyor. Daha eski bir derleme çalıştıran bir kopya, geçebileceği sürümle ve o sürümdeki değişikliklerle listeleniyor; önceden DuoUpdater’ın Windscribe’ın sürümünü görmesinin hiçbir yolu yoktu. Güncelleme yine Windscribe’ın kendi yükleyicisiyle yapılıyor; bu yükleyici, uygulamanın kendisinin dışında duran parçalarını da kuruyor.

Siz tıklarken ortadan kalkan bir uygulamaya artık güncelleme uygulanmıyor. Uygulama, tıklamanızla yüklemenin başlaması arasında kaldırılır, değiştirilir ya da okunamaz hale gelirse DuoUpdater artık o konuma yine de yüklemek yerine durup bunu söylüyor.

İsteğe bağlı komut satırı yardımcısı duo, bir paket yüklemesini artık bitmeden bitti saymıyor. .pkg olarak gelen bir uygulamayı yüklemek macOS yükleyicisini açıp gerisini size bırakıyor, ama özet bunu yüklenmiş sayıyordu — henüz hiçbir şeyin yerine yenisi konmamışken “1 yüklendi”. Bunlar artık ayrı sayılıyor. --json çıktısı da artık her satırı o uygulamaya ne olduğuyla etiketliyor; böylece bir betik, bir başarısızlığı bilinçli bir atlamadan ayırt etmek için İngilizce açıklamayı okumak zorunda kalmıyor.

Perde arkasında. Tek tıkla Güncelle’yi koruyan yükleme öncesi yeniden denetim artık duo install komutunu da koruyor; bir indirmenin bir uygulamanın yerine geçmeden önce geçmesi gereken denetimler de bunları kullanan her iki yol için tek bir yerde tutuluyor.

Bir güncelleme kaynağı kendisiyle çeliştiğinde Güncelle’ye tıklamak artık boşa gitmiyor. Tıkladığınız anda çalışan denetim, satırın sunduğundan daha eski bir sürümle dönerse DuoUpdater artık bunu söylüyor ve güncellemeyi sunmaya devam ediyor. Önceden uygulamayı zaten güncel diye bildirip listeden çıkarıyor, aynı güncelleme de bir sonraki denetimde yeniden beliriyordu.

Fork, Develop kanalına ayarlandığında güncellemeler yeniden sunuluyor. DuoUpdater, Fork’un kanal ayarını ters okuyor ve epey geride kalan Stable akışını izliyordu — bu yüzden Fork’un kendisi daha yeni bir sürüm sunarken Develop kopyası güncel diye listeleniyordu.

Mac Performance Monitor artık sürüm notlarını gösteriyor. Uygulama notlarını bizim okuduğumuz akışta değil, deposunda yayımlıyor; bu yüzden pencerenin onun için gösterecek bir şeyi yoktu.

CotEditor artık hem kararlı hem de beta hattında destekleniyor. Bir kopyanın hangi hattı izlediği, çalıştırdığı sürümden ve CotEditor uygulamasının kendi “Update to prereleases when available” ayarından anlaşılıyor; böylece beta kopyaya, onu geriye götürecek bir kararlı sürüm yerine bir sonraki beta sunuluyor.

App Store’dan yüklediğiniz bir uygulamaya asla başka bir yerden indirme sunulmuyor. Mağazanın bu uygulama için kendi sorgusu başarısız olduğunda ya da boş döndüğünde satır artık, sürüm numarası vermeden, uygulamayı mağazanın yönettiğini söylüyor. Önceden denetim uygulamanın diğer dağıtımına — kendi sürüm numaraları olan farklı bir derlemeye — kayabiliyor ve onu mağaza kopyanızın üzerine yüklemeyi önerebiliyordu.

Bir uygulamaya asla onu daha eski bir sürüme götürecek bir güncelleme sunulmuyor. Bazı akışlar kararlı bir sürümü, aslında daha ileride olan bir ön sürümün üstünde listeliyor; onu almak uygulamayı geriye götürürdü.

Bir satırdaki uzun hata artık listenin geri kalanını aşağı itmiyor. İki satırla sınırlanıyor; tam metin, imleci üzerine getirince görünüyor.

Dört uygulama daha destekleniyor: WhatCable, Qoder IDE, Qoder ve Yaak. Her biri güncelleme denetimi ve tek tıkla yükleme alıyor; sürüm notları da pencereye gömülü bir sayfa olarak değil, metin olarak okunuyor.

Qoder’ın iki Mac uygulaması birbirinden ayırt ediliyor. IDE ile masaüstü uygulaması aynı adı ve aynı indirme sayfasını paylaşıyor ama ayrı sürüm hatlarında yayımlanıyor; bu yüzden artık her biri ayrı ayrı izleniyor.

WhatCable ve Yaak’ın beta derlemeleri kendi hatlarında izleniyor. Beta çalıştıran bir kopyanın önceden hiçbir kaynağı yoktu ve “Başarısız” durumunda kalıyordu; artık ona, kararlı sürümlerinkinden ayrı tutulan sürüm notlarıyla birlikte bir sonraki beta sunuluyor. WhatCable için buna, bir betanın sonunda dönüştüğü kararlı sürüm de dahil — onu almak kopyayı kararlı hatta geçiriyor.

App Store uygulamalarınızı denetlemek eskisine göre çok daha az ağ trafiği kullanıyor. Önceden her denetim her App Store uygulamasının ürün sayfasını yeniden indiriyordu; artık sayfalar bir saat saklanıyor ve mağazaya tüm uygulamalarınız, uygulama başına bir istek yerine birkaç istekle soruluyor. Beş dakikalık denetim aralığında bu, toplamda kabaca üçte bir daha az trafik demek; varsayılan altı saatlik aralıkta ise sayfaların süresi denetimler arasında yine doluyor, bu yüzden oradaki tasarruf daha küçük.

Tek bir uygulamayı yeniden denetlemek artık tüm App Store uygulamalarını yeniden indirmiyor. Tek bir “Yeniden Denetle” önceden önbelleğe alınmış tüm ürün sayfalarını atıyordu; bu yüzden bir sonraki zamanlanmış denetim hepsini baştan indirmek zorunda kalıyordu. Artık yalnızca sorduğunuz uygulamayı yeniliyor.

GitHub üzerinden dağıtılan uygulamaları denetlemek eskisine göre çok daha az ağ trafiği kullanıyor. Önceden her denetim, hiçbir şey yayımlanmamış olsa bile her sürümün tam açıklamasını yeniden indiriyordu; artık GitHub’a sürümün son seferden beri değişip değişmediğini soruyor ve değişmediyse hiçbir şey indirmiyor. Günde bir kez her sürümü baştan sona yeniden okuyor; böylece geri çekilen bir sürüm bir gün içinde fark ediliyor.

GitHub’da beta ya da nightly hattında izlenen uygulamalar artık bir sayfa dolusu sürüm yerine tek bir sürüm istiyor. Neredeyse her seferinde yanıt en yeni sürüm oluyor; tam sayfa yalnızca öyle olmadığı turlarda indiriliyor.

Vorssaint’in güncelleme denetimi artık bir yönlendirmeye dayanmıyor. Deposunun adı değişmişti ve eski adı izlemek, isteği sessizce GitHub’ın anonim hız sınırına düşürüyordu; denetim artık doğrudan yeni ada gidiyor.

Perde arkasında. Yayımlanan uygulama artık GitHub’ın barındırdığı bir Mac’te, herkesin doğrulayabileceği derleme kökeni kanıtıyla derleniyor, imzalanıyor ve noter onayından geçiriliyor; kaydedilen istek günlüğü de önbellekten gelen bir yanıtı ağdan gelenden ayırıyor.

Dışa aktardığınız istek günlükleri artık hesap adınızı içermiyor. Ana klasörünüzde yüklü bir uygulamanın her satırı önceden tam yolu açıkça yazıyordu; artık günlüğü hangi yolla dışarı alırsanız alın, onun yerine ~ gösteriliyor.

İstekler sekmesi artık neyi kapsayıp neyi kapsamadığını söylüyor. Burada DuoUpdater’ın kendi yaptığı istekler kaydediliyor. Bir sürüm notları sayfası kendi görsellerini ve yazı tiplerini kendisi yüklüyor; App Store ve Homebrew güncellemeleri de ayrı araçlarla yapılıyor — bunların hiçbiri orada görünmüyor ve pencere artık bunu sizin tahmininize bırakmak yerine açıkça söylüyor.

URL’yi Kopyala artık verdiği adresteki özel karakterleri kodluyor. Boşluk içeren yollar — aralarında Firefox, Thunderbird ve Bartender indirmeleri de var — olduğu gibi kopyalanıyordu; bir tarayıcı bunu hoş görür, komut satırı ise görmez.

CapCut’ın beta satırı artık başarısız bir denetim bildirmiyor. İki beta arasında — biri kararlı sürüme geçtikten sonra ve bir sonraki açılmadan önce — üreticisi o hatta hiçbir şey yayımlamıyor; bu da kırmızı bir satır ve işe yaraması mümkün olmayan bir Yeniden Dene olarak görünüyordu. Satırın artık bir sonraki beta çıkana kadar o kaynaktan bir yanıtı olmuyor, o kadar.

Audacity artık neyle geliştirildiğini gösteren işareti gösteriyor. Uygulama, yanındaki asıl programa devreden küçük bir başlatıcıyla açılıyor; işaret bu başlatıcıdan okunuyordu, o ise hiçbir kitaplığa bağlanmıyor.

App Store sürüm notları artık sizin dilinizde geliyor. Her zaman mağazanın varsayılan dilinde çekiliyorlardı; bu yüzden Çince ya da Japonca çalışan bir Mac’te bile İngilizce okunuyorlardı.

DuoUpdater’ın kendi güncellemeleri artık Ağ penceresinde kendi adıyla görünüyor. Sürüm denetimi, sürüm notları ve indirmesi, uygulama sütunu boş bırakılarak kaydediliyordu.

Perde arkasında. Bir web adresinin yolu içinde taşınan kimlik bilgisi artık istek kaydedilmeden önce kaldırılıyor; sorgu dizesindekiler için bu zaten hep yapılıyordu.

İndirme Trafiği penceresinin adı artık Ağ ve ikinci bir sekmesi var. İndirmeler, zaten var olan kayıt defteri: her güncellemenin dosya olarak ne kadar tuttuğu. İstekler ise yeni: DuoUpdater’ın sizin adınıza yaptığı her istek, ne için yapıldığı, hangi uygulamaya ait olduğu ve ne kadar tuttuğu; günlüğü kaydırmak yerine ona soru sorabileceğiniz bir filtre alanıyla birlikte. Üstteki rakamlar tüm zamanların toplamını değil, filtrelediğiniz kısmı yansıtıyor.

Spotify için güncelleme denetimi artık neredeyse hiç ağ kullanmıyor. Spotify hiçbir yerde bir sürüm dosyası yayımlamıyor; bu yüzden denetim sürümü iki megabaytlık küçük bir yükleyici dosyasından okuyor — ve günün her saatinde, her seferinde dosyanın tamamını indiriyordu. Artık dosyanın değişip değişmediğini soruyor, değişmediyse indirmeyi atlıyor.

PDF Expert artık güncellemelerini buluyor ve neyin değiştiğini gösteriyor. Üreticisinin 2022’de güncellemeyi bıraktığı bir sürüm listesini okuyordu; bu yüzden hangi sürüme sahip olursanız olun kendini güncel sayıyordu. Artık uygulamanın kendi güncelleyicisinin kullandığı listeyi izliyor ve yalnızca en yenisinin değil, geçmiş sürümlerin notlarını da getiriyor.

UTM önizleme derlemeleri artık kendi güncellemelerini alıyor, tek tıkla yükleniyor ve eşleşen sürüm notlarını gösteriyor. Bir önizleme kopyası önceden nihai sürüm hattına göre ölçülüyor ve sessizce güncel olduğu söyleniyordu; artık kendi hattını izliyor, o hattın nihai sürümünü aldığında da yeniden nihai sürüm hattına dönüyor.

Perde arkasında. Kaydedilen istekler, indirme kayıt defteriyle aynı depoya taşındı; böylece aynı indirmenin iki kaydı artık birbirinden ayrışamaz. Mevcut kayıt defteriniz hiç dokunulmadan aktarılıyor.

On beş uygulama daha güncellemeler için izleniyor ve biri hariç hepsi tek tıkla yükleniyor. AgentsView, AnythingLLM, Chatbox, ChatGPT Classic, DSH Desktop, FluidVoice, GitHub Copilot, Kun, Meetily, Microsoft 365 Copilot, OpenLogi, OpenSuperWhisper, Paseo, T3 Code — hem alpha hem de nightly hattında — ve Vorssaint. İstisna ChatGPT Classic: sizin için denetleniyor, ancak uygulamayı kendisi güncelleyen bir yükleyiciyle geliyor; bu yüzden onu çalıştırmak size kalıyor.

Sekiz uygulama artık sizi bir web sayfasına göndermek yerine sürüm notlarını DuoUpdater’ın içinde gösteriyor. Xcode, Antigravity, Antigravity IDE, AnyDesk, AnythingLLM, Chatbox, Headlamp ve Helium. Bunlardan üçünün zaten sizi gönderebileceği bir yer yoktu: AnyDesk’in sayfası bir bot doğrulamasıyla yanıt veriyor, Helium’un geliştiricileri hiç not sayfası yayımlamıyor, Antigravity IDE’nin ise hiçbir türde bağlantısı yoktu.

Xcode betaları her betada neyin değiştiğini söylüyor. Satır önceden bir derleme numarası ve bir bağlantı sunuyordu; artık Apple’ın, kullandığınız beta ve o sürümdeki önceki tüm betalar için yayımladığı notları listeliyor.

Word, Excel, PowerPoint, Outlook ve OneNote artık güncellemelerinin yüklendiğini fark ediyor. Bu beş uygulama, işinizi çoktan bitirdiğiniz yükleyiciyi yeniden açmayı önerip duruyor ve bir türlü yeniden başlatmayı önermeye geçmiyordu — beklemek ya da yeniden denetlemek bunu çözemezdi.

Yeniden başlatılmayı bekleyen bir satır, her iki pencerede de kendini yeniden açıklıyor. Bir uygulama hem üreticisinin yayımladığı sürümün ilerisindeyken hem de yeniden başlatılmayı beklediğinde, düğmenin üstündeki satır bambaşka bir şeyi anlatıyordu; pencere ile menü de Tümünü Güncelle sonrasında yeniden başlatılmayı bekleyen satırlar konusunda farklı şeyler söylüyordu.

Satır etiketleri Rusçada artık uygulama adını sıkıştırmıyor. Birkaç etiket de çevrilen tüm dillerde, ilgisiz dizelerden ifade ödünç alıyordu.

Üreticisinin bir sürüme saat belirtmeden yalnızca tarih koyduğu uygulamalarda sürüm notları artık görünüyor. Bu sürümler önceden hiçbir yerde iz bırakmıyordu.

Açmayı reddettiğimiz bir sürüm notları sayfası artık nedenini söylüyor. Önceden boş kalıyordu; bu da hiç not yayımlamayan bir uygulamayla tıpatıp aynı görünüyordu.

WeChat DevTools nightly sürüm notları artık boş değil.

Perde arkasında. Sürüm ve yayın tarihi işleme tek bir yerde toplandı; böylece bir derleme numarası asla pazarlama sürümü olarak okunamaz. Sürüm zaman çizelgesi de artık üreticinin hiç vermediği bir saat uydurmuyor.

Başarısız denetimler artık pencerede görünüyor. Pencere, denetimi başarısız olan bir satır için — ya da yok saydığınız, atladığınız veya App Store, Toolbox ya da TestFlight’ın yönettiği bir satır için — hiçbir şey göstermiyordu; bu da “güncel” ile tıpatıp aynı görünüyordu. İki pencere artık aynı uygulama için aynı şeyi söylüyor ve yeniden deneme düğmesi ikisinde de var.

Herhangi bir satırdaki “Yeniden Denetle” yalnızca o uygulamayı soruyor. Ayrıca hangi uygulamaların çalıştığını da yeniden okuyor; bu yüzden yanlış görünen yeşil bir noktayı düzeltmenin hızlı yolu bu.

Atlama ve yok sayma artık pencerenin sağ tık menüsünden yapılabiliyor. Her iki satır da işlemi iptal etmek için sağ tıklamanızı söylüyordu, ama pencerenin menüsünde böyle bir şey yoktu.

Arka plan denetimi artık okuduğunuz sürüm notlarını elinizden almıyor. Saatlik denetim, daha önce yüklenmiş tüm notları atıyordu; bu yüzden açık bir Sürüm Notları bölmesi yeniden dönen göstergeye dönüyordu. Artık notları yalnızca sizin istediğiniz bir yenileme baştan yüklüyor.

Yarıda kalan indirmeler, tamamlandı sayılmadan önce denetleniyor. Dosyanın tamamını yeniden gönderen ya da erken kesilen bir sunucuya körü körüne güveniliyordu; sorun bir adım sonra, bozuk bir arşiv yüzünden başarısız olan bir yükleme olarak ortaya çıkıyordu. Önceden her seferinde başarısız olan, proxy arkasındaki indirmeler artık çalışıyor.

Bir uygulamayı güncellemek artık diskinizdeki tüm uygulamaları yeniden taramıyor. Her tıklama, sorduğunuz tek uygulamaya bakmak için tüm uygulamalarınızı iki kez baştan sona tarıyordu.

Chrome’un sürüm notları artık donamaz. Google’ın blogundaki sıradan bir görünüm değişikliği onları dakikalarca takılı bırakmaya yetiyordu; artık sayfa nasıl görünürse görünsün hızla yükleniyorlar.

İndirilmiş bir yükleyici artık atılıp yeniden indirilmiyor. Bir üretici aynı sürümü iki farklı şekilde yazdığında (v1.2.3 ve 1.2.3), bekleyen paket tanınmıyor ve Yeniden Başlat çoktan gerçekleşmiş bir değişimi beklemeye devam edebiliyordu.

Başarısız bir yönetici yüklemesi artık sizin Vazgeç’e bastığınız sanılmıyor. Hiçbir hata gösterilmiyordu ve o uygulama, siz satır menüsünden yeniden yönetici erişimi isteyene kadar sessizce tek tıkla güncelleme sunmayı bırakıyordu.

Yeşil “çalışıyor” noktası artık her uygulamayı fark ediyor. macOS bazı uygulamaların açılışını ya da kapanışını hiç duyurmuyor; bunların noktası, ilgisiz bir şey onu yenileyene kadar yanlış kalıyordu.

“Tümünü Güncelle” yenileme sırasında artık bir görünüp bir kaybolmuyor; yenileme ortasında güncellediğiniz bir uygulamaya da zaten yüklediği güncelleme yeniden sunulmuyor.

Güncelle’ye bastığınız anda başarısız olan bir denetim, “yapılacak bir şey yok” diye kaydedilmek yerine artık bunu söylüyor.

Perde arkasında. Alışılmadık biçimlerde yazılmış yayın tarihleri doğru okunuyor, sürüm notları sayfalarındaki adres denetimi her eşdeğer yazımı kapsıyor ve rutin kayıt işleri artık Mac’inizde herhangi bir uygulama her açıldığında ya da kapandığında diske dokunmuyor.

Docker’ın işareti artık Docker’ın arka plan sürecini değil, arayüzünü tanımlıyor. Satırda “yerel” yazıyordu; oysa Docker Desktop bir Electron uygulaması. İşaret uygulamanın paketinden okunuyor ve Docker’ın paketi bir sarmalayıcı: adını verdiği program Go ile yazılmış bir arka plan hizmeti, kendine ait hiçbir çerçeve taşımıyor ve pencereleri çizen asıl uygulama onun bir seviye içinde duruyor. Her şey doğru okunuyordu, ama yanlış dosyadan. DuoUpdater artık iç içe geçmiş uygulamaya bakıyor, ama yalnızca şu durumda: dıştaki paket kendisi hiçbir şey getirmiyorsa ve neyle geliştirildiğini kanıtlayan tam olarak bir tane böyle uygulama barındırıyorsa. Böylece gerçek bir arayüzün yanında gelen bir yardımcı süreç, kimliğini yine de ana uygulamaya ödünç veremiyor. Docker artık Electron 42.5.0 olarak okunuyor ve bu notun yazıldığı makinedeki listede bulunan yüz kırk altı uygulama arasında değişen tek satır bu.

CleanShot X’in sürüm notları yeniden okunabiliyor — 5.0’ınkiler de dahil. CleanShot yıllardır yaptığı en büyük sürümü yayımladı ve değişiklik günlüğü sayfasını da onunla birlikte yeniden kurdu: tarih sürüm numarasının üstüne taşındı, çevresinde iki yeni katman belirdi ve bir özellik sürümü artık sürüm numarasıyla değişiklik listesi arasına bir giriş yazısı ve iki video bağlantısı koyuyor. DuoUpdater’ın kullandığı okuyucu bunların hiçbiriyle eşleşmez oldu. Durumu boş bir bölmeden daha da kötü yapan şey, bölmenin boş görünmemesiydi: önceki sürüm için zaten kaydedilmiş notlar yeni sürümün başlığı altında ekranda kaldı; böylece bölme 4.8.10’un değişikliklerinin üstünde “5.0” diyordu ve hiçbir yerde aksi söylenmiyordu.

Bir sürüm yayımlanmadan önce kaydedilen notlar, artık sonsuza dek doğru kabul edilmek yerine yeniden okunuyor. Bu, aynı hikâyenin diğer yarısı. DuoUpdater, CleanShot 5.0’da neler olduğunu yayımlamadan altı dakika önce 5.0’ın var olduğunu biliyordu; sayfayı o anki haliyle kaydetti ve 5.0’ın altına koydu — ve o andan itibaren her denetim zaten kaydedilmiş bir şey buldu ve bir daha hiç bakmadı. Kaydedilen notlar artık kesin sayılmadan önce oturum başına bir kez üreticiyle karşılaştırılarak doğrulanıyor; böylece notları geç gelen bir sürüm, yanlış kalmak yerine bir sonraki ziyarette kendiliğinden tamamlanıyor.

Menü çubuğundan açtığınız her şey artık ilk tıklamada açılıyor. Bir satırda Değişiklik Günlüğü’nü — ya da Ayarlar’ı veya Sürüm Günlüğü’nü — seçmek ilk seferde hiçbir şey yapmıyor, ancak ikinci tıklamadan itibaren çalışıyordu. Menüyü yeniden açmak her denemeyi yine ilk deneme yapıyordu; bu yüzden menüyü açıp bir kez tıklayan ve bir pencere bekleyen kişiler için hiç çalışmıyordu. Menü içindeki ilk tıklama, hedeflendiği işi yapmak yerine DuoUpdater’ı öne getirmeye harcanıyordu. Açılan pencere de artık önde tutuluyor: aynı anda hem öne alınıp hem de yeniden arkaya itiliyordu; bu da tıklamanın hiçbir şey yapmamış gibi görünmesinin diğer nedeniydi.

Kendi adını boş bırakan bir uygulama artık yine de bir ad alıyor. Eudic (欧路词典) listede bir simge ve bir sürümle duruyordu, ama adın olması gereken yerde hiçbir şey yoktu. Paketi bir görünen ad bildiriyor — ve onu boş bırakıyor, çünkü gerçek adlar uygulamanın çevirilerinde duruyor — DuoUpdater ise bir sonraki soruyu sormak yerine bu boş yanıtı geçerli yanıt kabul ediyordu. Artık uygulamanın diğer adına, ondan sonra da uygulama dosyasının adına başvuruyor; böylece hiçbir satır adsız kalmıyor. Buradaki yüz elli uygulamadan yalnızca biri etkilenmişti; asıl mesele, bilginin zaten orada olması ve es geçilmesiydi.

Yeniden Başlat, uygulama çıkmayı reddettiğinde artık hiçbir şey yapmayan bir tıklama gibi görünmek yerine bunu size söylüyor. Bir uygulamanın sizi bekleyen bir penceresi varsa — bir kaydetme istemi, bir oturum açma sayfası, herhangi bir iletişim kutusu — macOS onun çıkmasına izin vermez ve bu taraftan yapılabilecek hiçbir şey yoktur: o pencere uygulamaya aittir. DuoUpdater önceden otuz saniye boyunca dönüp aynı düğmeyi hiçbir açıklama yapmadan geri koyuyordu; bu tam olarak bozuk bir düğme gibi görünüyordu ve insanlar yeniden basıyordu. Satır artık ne olduğunu söylüyor ve o pencereyle ilgilenmeniz için sizi uygulamaya yönlendiriyor. Hiçbir şey değişmedi ve yeni sürüm zaten yüklü; yani geriye gerçekten yalnızca yeniden başlatma kalıyor — üstelik önümüzdeki on dakika içinde uygulamadan kendiniz çıkarsanız, DuoUpdater bunu fark ediyor ve siz hiçbir şeye tıklamadan uygulamayı yeni sürümüyle yeniden açıyor.

欧路词典 uygulamasının sürüm notları yeniden on altı yıllık bir tarihçe değil, tek bir sürümü kapsıyor. Uygulama tüm geçmişini — 2.5.0’a kadar her sürümü — en yeni sürümün notlarının içinde yayımlıyor; bu yüzden ayrıntı bölmesi hepsini “26.9.0” başlığı altında gösteriyor ve az önce neyin değiştiğini bulmak için on yılı kaydırarak geçmeniz gerekiyordu. Artık her sürüm, diğer tüm uygulamalarda olduğu gibi listede kendi kaydını alıyor.

Bir uygulamanın neyle geliştirildiğini gösteren işaret artık Tauri için benzerlik değil, kanıt istiyor. Tauri pakette bulunabilecek hiçbir iz bırakmıyor — ne bir çerçeve ne de kendine ait bir klasör — bu yüzden bu tek işaret, uygulamanın nasıl paketlendiğinden ve Apple’ın web görünümüne bağlanmasından çıkarılıyordu. Longbridge bunların hepsine uyuyor ama Tauri değil: kendi pencerelerini Zed’in kullandığı çizim motoruyla çiziyor ve arayüzünün bir köşesi için bir web görünümü gömüyor. DuoUpdater artık Tauri demeden önce Tauri’nin kendi parmak izini ikili dosyadan okuyor; böylece bir uygulamaya ancak gerçekten Tauri ise Tauri deniyor — Longbridge de olduğu gibi yerel bir Mac uygulaması olarak görünüyor.

CapCut, ByteDance’in sunucuları yarım saniyelik kötü bir an yaşadı diye artık kırmızıya dönmüyor. DuoUpdater’ın CapCut’ın sürümünü sorduğu uç nokta başarı koduyla yanıt veriyor, ama kabaca elli seferde bir, yanıtın yerine bir hata nesnesi gönderiyor — ByteDance’in kendi altyapısındaki dahili bir zaman aşımı; 436 kilobayt beklenirken yaklaşık 390 bayt. Bu taraftaki hiçbir şey bunu CapCut’ın yanıtının biçimini değiştirmesinden ayırt edemiyordu; bu yüzden satır denetimin başarısız olduğunu söylüyordu. Bu da bir sonraki denemede kendiliğinden düzelen bir şey için “bu bozuk, birinin düzeltmesi gerek” anlamına geliyordu. Bu özel biçim artık ne olduğuyla tanınıyor: istek hemen yeniden deneniyor ve ancak beş gün boyunca tekrarlanırsa gerçek bir sorun olarak bildiriliyor.

Listedeki her uygulama artık neyle geliştirildiğini söylüyor. Bir App Store uygulamasının satırı her zaman mağazanın rozetini taşırdı, diğer tüm satırlar ise birbirine benziyordu — bir Sparkle uygulaması, bir Electron uygulaması ve yerel bir uygulama ayırt edilemiyordu. Artık her adın yanında o teknolojinin kendi işareti var; bir sözcük ve bir cümlelik açıklama için tıklayın ya da ipucu için imleci üzerine getirin: Electron, Tauri, Flutter, Qt, Java, Chromium, Mac Catalyst, Apple Silicon’da çalışan bir iPhone uygulaması ya da yerel bir Mac uygulaması. Çalışma ortamının sürümü de, kesin olarak okunabildiği yerlerde yanında yer alıyor (Electron 42.4.1, Qt 6.2, bir uygulamanın gömdüğü Chromium, geliştirildiği Tauri). Bu bilgi paketin kendisinden okunuyor — bir paketleyicinin eklemek zorunda olduğu çerçeveden, bir başlatıcının ihtiyaç duyduğu çalışma ortamından, ikili dosyanın bağlandığı kitaplıklardan — yani uygulamanın adından yürütülen bir tahmin değil, yüklü olan şey hakkında bir olgu. Uzun bir adın yer bırakmadığı yerlerde simge, adı ikinci satıra itmek yerine kenara çekiliyor: satırın özü addır. Bunların hepsini Ayarlar → Genel’den kapatabilirsiniz.

LibreOffice artık zaten sahip olduğunuz sürüme bir sürüm düşürmesi olduğunu iddia etmiyor. İndirme dizini üç parçalı sürümler (26.8.0) listeliyor, yüklü kopya ise dört parçalı bir sürüm (26.8.0.3) bildiriyor; eksik parçayı sıfırla doldurmak yüklü kopyayı daha yeni gösteriyordu — bu yüzden satır, tam olarak güncel olan bir uygulama hakkında soluk renkli bir “üretici sizden geride” notu gösteriyordu. Uygulamanın bildirdiğinden daha az parça yayımlayan bir kaynak artık daha eski bir sürümü değil, aynı sürümü tanımlıyor sayılıyor; gerçek bir sürüm düşüşü ise yine öyle belirtiliyor.

Bir güncellemeyle eklenen bir ayar, kendini bir kez gösteriyor. Ayarlar penceresinin ortasına eklenen yeni bir tercih, kimsenin bulamadığı bir tercihtir. Yeni bir ayar ekleyen bir güncellemeden sonra menü çubuğundaki dişli simgesinde mavi bir nokta beliriyor, ayarın bulunduğu sayfanın kenar çubuğunda da bir tane oluyor, denetimin kendisi de siz ona bakana kadar bir nokta taşıyor. Bu yalnızca gerçekten güncelleyerek bu sürüme gelenler için geçerli — sıfırdan yapılan bir yükleme, yeni tanıştığı uygulamanın doğal bir parçası olan özellikler için noktalarla karşılanmıyor.

Geçen sürümde eklenen Electron manifest uygulamaları artık gerçekten güncellenebiliyor. 0.3.75, DuoUpdater’a bu uygulamaların içlerinde taşıdıkları dosyayı okumayı öğretti ve DuoUpdater onu okudu da — yeni sürümü, Mac’iniz için doğru indirmeyi ve doğrulama için sağlama toplamını buldu — ama sonra bunların hiçbirini gönderebileceği bir yer yoktu. Yükle düğmesi hiç görünmedi, duo install de reddi asıl neden olmayan bir gerekçeyle açıkladı. Yükleme yolu bu sürümde bağlandı. Pratikte hiçbir fark görmeyebilirsiniz: bu okuyucu elle yazılmış tüm kuralların arkasında duruyor, yani yalnızca başka hiçbir şeyin kapsamadığı bir uygulama için devreye giriyor — bu da bugün, bu sürümün derlendiği makinede, hiçbiri değil. Asıl önemi, yarın yükleyeceğiniz ve henüz kimsenin kural yazmadığı uygulama için.

Sizi yerel bir derlemeden uzaklaştıracak bir indirme artık reddediliyor. Apple Silicon Intel uygulamalarını çeviri yoluyla hâlâ çalıştırabiliyor; bu da yalnızca Intel’e yönelik bir indirmenin “Mac’inizde çalışır mı?” denetiminden geçip sorunsuz yüklenebilmesi demekti — yerel olarak çalışan bir uygulamanın sessizce çevrilmiş bir kopyasında kalıyor, sonraki her güncellemede de aynı şey yeniden oluyordu. Artık her yerinde yükleme, elinizdekini gelenle karşılaştırıyor ve böyle bir değişimi reddediyor. Ters yönde geçiş ya da evrensel bir derlemeden yalnızca Apple Silicon’a yönelik bir derlemeye geçmek olağandır ve hâlâ serbest.

Bir indirmenin hangi mimariye ait olduğunu kanıtlayamadığında artık tahmin yürütmek yerine geri çekiliyor. Bazı üreticiler varsayılan derlemelerinin yanında bir Apple Silicon derlemesi de yayımlıyor ve varsayılanın Intel derlemesi olduğunu anlamanın tek yolu, diğerinin var olduğunu fark etmek. Bu ikinci denetim temiz bir sonuç vermezse — üreticinin sunucusu reddederse, bağlantı koparsa ya da ikisi hangi sürüm olduklarında anlaşamazsa — DuoUpdater artık bu sessizliği yanıt saymıyor. Size sürümü söylüyor ve yükleme sunmuyor; dürüst olan sonuç da bu.

Bozuk bir kural artık Tanılama’dan kaybolamıyor. Hem elle yazılmış bir kuralın hem de yeni manifest okuyucusunun kapsadığı uygulamalarda — ki bilinçli olarak çoğu böyle — kuralın başarısızlığı, hemen ardından okuyucunun başarılı olmasıyla siliniyordu; bu yüzden kuralı gerçekten bozulmuş bir uygulama sağlıklı görünmeye devam ediyordu. İkisi artık ayrı kaydediliyor. Manifest okuyucusu da ilk kez kendi başarısızlıklarını bildiriyor; geliştirme makinesindeki üç uygulamanın bir süredir “bulunamadı” yanıtı veren adresleri gösterdiği ortaya çıktı — daha önce hiçbir şey bunu açıkça söylemezdi.

Güncellemeyi görebilen ama yükleyemeyen satırlar artık iki yerde de aynı şeyi sunuyor. Menü çubuğunda Finder’ı açan “Aç” etiketli bir düğme vardı, pencerede ise aynı satır için hiçbir şey görünmüyordu.

Electron ile yapılmış uygulamalar artık kimse onları önceden kaydetmeden tanınıyor. Pek çok Mac uygulaması, içinde güncellemelerinin nerede bulunduğunu söyleyen küçük bir dosya taşır. DuoUpdater şimdiye kadar yalnızca birinin elle kural yazdığı uygulamaları biliyordu — geri kalanların her biri listenizde yanında sürüm numarası olmadan duruyor ve yeni bir derlemenin çıktığını size bildirmenin hiçbir yolu yoktu. Artık bu dosyayı, Sparkle’ınkini her zaman okuduğu gibi doğrudan okuyor; böylece böyle bir uygulama, birinin sonunda ona el attığı gün değil, onu yüklediğiniz gün kapsanıyor.

Zaten elle yazılmış bir kuralı olan uygulamalara dokunulmuyor. Yeni okuyucu onların arkasında duruyor; bu yüzden yalnızca bir boşluğu doldurabilir — zaten çalışan bir şeyin yerini asla alamaz.

Sunulan indirmenin doğru olup olmadığını iki ayrıntı belirliyor ve ikisi de varsayılarak değil, gerçek uygulamalar denetlenerek netleştirildi. Bazı üreticiler, yanında bir Apple Silicon derlemesi yayımladıkları halde bir Intel derlemesini “birincil” indirme olarak işaretliyor; diğerleri ise Apple Silicon derlemesine Intel derlemesininkinden hiç farklı görünmeyen bir dosya adı veriyor, yani addan hiçbir şey anlaşılmıyor. DuoUpdater mimariye göre seçiyor ve bir indirmenin Mac’inizde çalışacağından emin olamadığı yerde, sorunsuz yüklenip sonra açılmayan bir şeyi size vermek yerine sürümü söylüyor ve yüklemeyi sunmuyor.

Bir uygulamanın beta, sürüm adayı ya da nightly derlemesini kullanıyorsanız, DuoUpdater sessizce yanlış hattı izliyordu. Hangi hatta olduğunuzu, derlemenizi üreticinin kendi sürüm listesinde bularak belirliyor — ama bir ön sürüm, türediği kararlı sürümle aynı genel sürüm numarasını koruduğunda (ki ön sürümlerde olağan olan budur) onun yerine kararlı kaydı eşleştiriyordu. Etkisi sessizdi: ekranda hiçbir zaman yanlış bir şey görünmüyordu; yalnızca kendi hattınızdaki bir sonraki derlemeden hiç haberiniz olmuyordu ve size gösterilen sürüm notları kararlı hatta aitti. Sorun, Supacode ve TypeWhisper’ın gerçek ön sürüm derlemeleri yüklenip ne olduğu izlenerek bulundu; ikisi de artık gerçekten bulundukları hattı izliyor.

CapCut’ın betası sizde olmayan bir sürüm gösteriyordu. Satırda “9.3.4545 → 9.4.0-beta6” yazıyordu; oysa CapCut’ın kendisi, Finder ve diğer tüm güncelleyiciler kopyanızı 9.4.0-beta5 olarak adlandırıyordu. Bazı uygulamalar gerçek sürümlerini çoğu uygulamadan farklı bir alana koyuyor; DuoUpdater da okun sizin tarafında daha derli toplu görünen alanı, üretici tarafında ise gerçek olanı okuyordu. Sunulan güncelleme her zaman doğruydu — yalnızca etiket yanlıştı. Satırın iki yarısı da artık aynı yerden geliyor; hem CapCut için hem de bu şekilde yapılmış diğer yedi uygulama için.

MacWhisper, GitHub Copilot for Xcode, TypeWhisper ve OpenUsage artık sürüm notlarını gösteriyor. Dördünün de not paneli boştu: güncelleme akışlarında hiç not yok ve bu, her biri üreticinin gerçekte yayımladıklarıyla karşılaştırılana kadar fark edilmemişti. DuoUpdater artık MacWhisper için uygulamanın kendi sürüm notları sayfasını, Copilot için değişiklik günlüğü dosyasını, TypeWhisper için de değişiklik günlüğü sitesini okuyor; OpenUsage için ise sürüm listesine yönlendiriyor.

Helium artık kendi güncelleme hizmeti üzerinden güncelleniyor; bu da beta kanalını ve çok daha küçük indirmeleri beraberinde getiriyor. Uygulama, yalnızca kararlı derlemeleri gösteren herkese açık sürüm listesi üzerinden izleniyordu — bu yüzden Helium betasını kullanan herkese kararlı derleme veriliyordu. Kendi hizmeti yamalar da yayımlıyor; böylece sıradan bir güncelleme, 124 MB’lık yeniden indirme yerine yaklaşık 40 MB tutuyor. Hem kararlı hem de beta derlemesiyle doğrulandı; indirilen dosya, herhangi bir şeyin yerine geçmeden önce yüklü kopyanızın içindeki imzalama anahtarına göre denetleniyor.

Firefox ve Thunderbird için beta, developer ve nightly sürümleri artık düzgün izleniyor — bugüne kadar bu beş hattın hiçbiri tek bir güncelleme bildirmemişti. Bunlar Mozilla’nın, yalnızca size gösterilen sürümü yayımlayan herkese açık sürüm dosyasından okunuyordu; bir beta yüklendiğinde ise sürümdeki “b5” eki düşüyor: bir Firefox betası tüm döngü boyunca kendini 155.0 olarak tanıtıyor, bu yüzden sorulan tek soru “155.0b5, 155.0’dan daha yeni mi?” oluyordu ve yanıt hayırdı. Nightly daha da kötüydü — Mozilla her gün bir tane yayımlıyor ve hepsinin adı 157.0a1; bu yüzden dört haftalık bir döngü kelimenin tam anlamıyla hiçbir şey üretmiyordu. DuoUpdater artık Mozilla’nın kendi güncelleme hizmetine — Firefox’un yerleşik güncelleyicisinin kullandığı ve uygulamanın kendi içinde adını verdiği adrese — soruyor ve iki tarafın da taşıdığı derleme kimliğini karşılaştırıyor. Yayımlamadan önce beş hattın tamamı gerçek indirmelerle denetlendi: bu hizmetin bildirdiği kimlik, sahip olduğunuz uygulamanın içindekiyle bayt bayt aynı; bir derleme geride olan bir beta artık güncellemesini gösteriyor, aynı gün daha erken derlenmiş bir nightly de öyle. Kararlı ve ESR sürümleri hiç etkilenmemişti ve onlara dokunulmadı. Açıkça belirtmeye değer bir sınır var: bu hizmet yayın tarihi yayımlamıyor; bu yüzden bu beş hat için Sürüm Günlüğü hâlâ Mozilla’nın bir derlemeyi yayımladığı zamanı değil, DuoUpdater’ın onu ilk gördüğü zamanı kaydediyor.

Wispr Flow, AionUi ve Devin artık yalnızca yeni bir sürüm olduğunu söylemekle kalmıyor, tek tıkla güncelleniyor. Üçü de güncellemelerini zaten görebiliyordu, ama hiçbiri güncelleme uygulayamıyordu. Öne sürülen gerekçe, üreticinin Intel ve Apple silicon için ayrı derlemeler yayımlaması ve DuoUpdater’ın bunlar arasında seçim yapmasının hiçbir yolu olmamasıydı. Varsaymak yerine ölçüldüğünde bu gerekçenin tutmadığı görüldü: Bu üç uygulamanın okunduğu uç noktalar zaten Apple silicon uç noktaları ve DuoUpdater yalnızca Apple silicon’da çalışıyor — yani ortada yapılacak bir seçim hiç yoktu. Her indirme, bağlanmadan önce indirilip denetlendi: içinden doğru uygulama çıkıyor, sizdeki kopyayla aynı geliştirici tarafından imzalanmış ve Apple’ın noter onayından geçmiş; AionUi’ninki ayrıca kendi manifestinin yayımladığı sağlama toplamıyla doğrulandı. Ardından her biri eski bir kopyanın üzerine gerçekten yüklendi ve yeni sürümle açıldı.

Grok Bot artık izleniyor — yeni sürümler ve tek tıkla güncellemeler. xAI’ın masaüstü uygulaması, Cursor’ın arkasındaki şirket olan Anysphere tarafından derlenip imzalanıyor ve Cursor’ın kendi sürüm hizmeti üzerinden güncelleniyor. Olağan yolların hiçbirinin bu uygulama için yanıt vermemesinin nedeni de bu: Sparkle akışı yok, App Store kaydı yok, herkese açık bir sürüm deposu yok ve Homebrew cask’i güncelleme işini uygulamanın kendisine geri bırakıyor. DuoUpdater bunun yerine üreticinin kendi sürüm uç noktasını okuyor. Kullanılabilecek iki uç nokta daha vardı ve ikisine de belirli gerekçelerle dokunulmadı: x.ai’daki indirme düğmesinin arkasındaki uç nokta hiçbir sürüm numarası yayımlamıyor; uygulamanın kendi güncelleyicisinin kullandığı ise zaten güncelseniz boş bir gövdeyle yanıt veriyor — bu sessizlik, bozuk bir uç noktadan ayırt edilemezdi. Yükleme, bağlanmadan önce denetlendi: Disk görüntüsü gerçek uygulamayı içeriyor, sizdeki kopyayla aynı geliştirici tarafından imzalanmış ve Apple’ın noter onayından geçmiş. Bilerek sunulmayan tek şey sürüm notları. xAI bu uygulama için hiç sürüm notu yayımlamıyor; yayımladığı tek değişiklik günlüğü ise başka bir ürüne ait.

Comet ve Msty Studio da artık tek tıkla güncelleniyor; yeni bir denetim de bunu yapabildiği halde yapmayan uygulamaları gözetliyor. Bu ikisi, güncellemeleri görebilen ama uygulayamayan gruptan geriye kalan son iki uygulamaydı ve ikisinin de yeni bir şeye ihtiyacı olmadığı ortaya çıktı — yalnızca üreticinin gerçekte ne gönderdiğine daha yakından bakmak gerekiyordu. Comet’in indirme bağlantısı imzalı ve bir saat içinde geçerliliğini yitiriyor; bu yüzden güncelleme düğmesi Perplexity’nin kendi ağ geçidine gidiyor ve bağlantı, denetimin çalıştığı saatler öncesinde değil, tıkladığınız anda üretiliyor. Msty dört indirmeyi tek bir dosyada yayımlıyor ve Intel olanı ilk sırada listeliyor; indirmeyi doğrulamak için kullanılan parmak izi de bu ilk girdiden alınıyordu. Parmak izi artık gerçekte indirilen Apple silicon derlemesine bağlı; bu sayede denetimle tıklama arasında yayımlanan bir sürüm de çoğu zaman sessizce yüklenmek yerine yakalanıyor. İkisi de yayımlanmadan önce indirildi ve gerçek yükleme denetimlerinden geçirildi. Asıl ders ise iki uygulamayla da ilgili değildi: DuoUpdater’da, artık geçerliliğini yitirmiş bir gerekçeyle yalnızca algılama modunda bırakılmış bir uygulamayı fark edebilecek hiçbir şey yoktu. Bu yüzden gece çalışan tarif taraması, yalnızca izlediği bir uygulama bize zaten bir yükleyici sunuyorsa artık bunu bildiriyor.

QQ音乐 artık izleniyor — yeni sürümler, tek tıkla güncellemeler ve sürüm notları pencerede. Olağan yolların hiçbiri bu uygulama için yanıt vermedi. Ne bir Sparkle akışı ne de Sparkle çerçevesi var; Homebrew cask’i güncelleme işini uygulamanın kendisine bırakıyor; uygulamanın kendi ikili dosyasında adı geçen güncelleme uç noktası ise sorabildiğimiz her şeye 200 ve boş bir gövdeyle yanıt veriyor — bozuk bir uç noktadan ayırt edilemeyen bir sessizlik, bu yüzden ona dokunulmadı. DuoUpdater bunun yerine üreticinin kendi indirme sayfasının beslendiği veri dosyasını okuyor: O sayfa boş bir kabuk olarak geliyor ve içeriğini bu dosyadan dolduruyor; bu dosya aynı zamanda sürüm notlarının bulunduğu tek yer — ne bir blog, ne bir appcast, ne de sürüm başına bir sayfa var. Bu yüzden notlar doğrudan bu dosyadan okunup DuoUpdater’ın kendi penceresinde gösteriliyor; güncelleme de aynı yanıtta adı geçen, noter onaylı disk görüntüsünü yüklüyor. Kayda değer bir tuzak var: Bu dosya, güncel Mac kaydının yanında altı yıllık ikinci bir Mac kaydı da taşıyor; bu yüzden her iki kural da “Mac” sözcüğüne değil, Mac indirmesinin sürüm numarası içeren dosya adına dayanıyor. Açıkça belirtilmesi gereken bir sınır da var: Dosya size gösterilen sürümü yayımlıyor, ama altındaki derleme numarasını hiçbir zaman yayımlamıyor; bu nedenle adı değişmeden yeniden çıkarılan bir sürüm burada görünmez. Olmayan bir güncellemeyi uyduramaz — yalnızca bu tek türü göremez.

TimeMachineEditor artık izleniyor — yeni sürümler ve tek tıkla güncellemeler. Olağan yolların hiçbiri bu uygulama için yanıt vermedi: Sparkle akışı yok (uygulamada ne bir akış adresi ne de onu kullanacak çerçeve var), App Store kaydı yok, herkese açık bir sürüm deposu yok ve Homebrew cask’i güncelleme işini uygulamanın kendisine bırakıyor. Buna karşılık küçük bir üretici sitesi var ve oradaki tek indirme bağlantısı sürümü kendi metninde belirtiyor. Homebrew’un kendi sürüm denetiminin dayandığı sayfa da bu ve aynı biçimde okunuyor; yani bu bir tahmin değil, üreticinin bu iş için öngördüğü yol. Güncelleme, düz bir uygulama değişimi olarak değil, üreticinin kendi yükleyici paketiyle yükleniyor ve bu bilinçli bir tercih: İndirme, uygulamanın dışına bir arka plan zamanlayıcısı, bir komut satırı aracı ve bir launch daemon da yerleştiriyor. Yalnızca uygulamayı değiştirmek, yeni kopyayı eskimiş bir zamanlayıcının yanında bırakırdı ve bu uyumsuzluğu fark edecek hiçbir şey olmazdı.

Little Snitch artık hem kararlı hem de nightly sürümleriyle izleniyor. Object Development, kendi güncelleyicisinin başka yol kalmadığında başvurduğu bir sürüm dosyası yayımlıyor — Homebrew’un okuduğu dosyanın aynısı — ve DuoUpdater bu dosyayı doğrudan okuyor; çünkü Little Snitch bir Sparkle akışı sunmuyor, cask’i de güncelleme işini uygulamaya bırakıyor. İki sürüm hattı aynı kimliği paylaşıyor ve bu normalde onları birbirinden ayırmayı imkânsız kılar. Ancak bu uygulama kendini sürüm dizesinde ele veriyor: Nightly derleme bu sözcüğü açıkça yazıyor (“6.5 nightly (7301)”), kararlı derleme ise düz bir “6.4.1” olarak görünüyor. Bilerek yapılmayan şeyi de belirtmekte yarar var: Güncellemeyi sizin yerinize yüklemeyecek. Little Snitch, uygulamanın yanında bir sistem uzantısı ve ayrıcalıklı bir arka plan hizmeti çalıştırıyor; yalnızca uygulamayı değiştirmenin bunları sağlam bırakıp bırakmadığı gerçek bir makinede doğrulanmadı. Bu yüzden DuoUpdater, bir ağ filtresi üzerinde tahmin yürütmek yerine yeni sürümün çıktığını söylüyor ve sizi üreticinin kendi indirme sayfasına yönlendiriyor.

Carbon Copy Cloner artık izleniyor ve sizi ana sürümler arasında taşımaya çalışmayacak. Bombich aynı anda üç kuşağı birden yaşatıyor — CCC 5, 6 ve 7 — ve hepsi sisteme aynı kimliği bildiriyor. Bu da “daha yeni bir şey var mı?” sorusunu göründüğünden daha çetrefilli hale getiriyor: 7.1.6 gerçekten de 6.1.13’ten büyük sayılıyor, ama aralarında geçiş ayrı bir satın alma gerektiriyor ve CCC 7, bir CCC 5 makinesinde belki hiç yüklü olmayan daha yeni bir macOS istiyor. Yalnızca sürüm numarasına bakarak yanıt vermek, her CCC 5 ve 6 sahibine ücretsiz bir güncellemenin beklediğini sonsuza dek söylerdi ve her seferinde yanılırdı. Bu yüzden DuoUpdater her kuşağı kendi adresinden okuyor ve yalnızca gerçekte sahip olduğunuz kuşak içindeki bir sonraki sürümü sunuyor. CCC içinde beta sürümleri açmış olanlar için betalar da algılanıyor. Şimdilik yalnızca algılama var — CCC, uygulamanın yanına ayrıcalıklı bir yardımcı yüklüyor ve bu, burada zaten sunulan tek tıkla güncellemelerden daha büyük bir iddia olurdu. Bu güncellemeleri daha önce hiçbir şeyin görememesinin nedenini de kayda geçirmekte yarar var: Uygulamanın kendi güncelleme akışı her isteğe başarıyla yanıt veriyor — ama tamamen boş bir sayfayla.

Mac’inizin gerçekte çalıştıramayacağı bir güncelleme artık indirilip yüklenmiyor. Her uygulama paketi, açılabileceği en eski macOS sürümünü belirtir; bazı üreticiler en yenisini de belirtir: “Bu derleme o kadar yeni bir işletim sistemi için değil.” macOS 27’ye henüz ayak uyduramamış bir uygulama bunu böyle söyler. DuoUpdater ikisini de okumuyordu. Sparkle akışıyla izlenen uygulamalarda alt sınıra zaten uyuluyordu, ama bunlar azınlıkta: Tipik bir Mac’teki uygulamaların büyük bölümü üreticinin kendi uç noktasından ya da GitHub sürümlerinden okunuyor ve bir GitHub sürümü hiçbir yerde macOS gereksinimi yayımlamıyor. Bu nedenle sizinkinden daha yeni bir macOS’a geçmiş bir uygulama size sunulabiliyor, eksiksiz indirilip yerine konabiliyor — ve sonra açılmıyordu. DuoUpdater artık bu gereksinimi, işlemcinize uygun derlenip derlenmediğine bakan mevcut denetimin hemen yanında, indirilen uygulamanın kendisinden okuyor ve çalışan bir kopyayı açılmayacak bir kopyayla değiştirmek yerine değişimi reddediyor. Bir akışın yayımladığı durumlarda üreticinin belirttiği üst sınıra da uyuluyor; böylece geliştiricinin sizin macOS sürümünüz için olmadığını işaretlediği bir derleme en baştan sunulmuyor. Açıkça belirtilmesi gereken üç sınır var. Gereksinimi indirilen dosyadan okumak, indirmenin çoktan gerçekleşmiş olması demek — bu, trafiği değil bozuk bir yüklemeyi önlüyor, çünkü çoğu uygulama için daha önce sorulabilecek bir yer yok. En yeni sürümünü Mac’inizin çalıştıramadığı bir uygulama o güncellemeyi göstermeye ve yüklemeyi reddetmeye devam edecek; ret mesajı artık istenen macOS sürümünü belirtiyor, ancak DuoUpdater bu yanıtı henüz hatırlayıp güncellemeyi sunmayı bırakmıyor. Son olarak denetim, DuoUpdater’ın uygulama paketini kendisinin değiştirdiği yolları kapsıyor: Bir yükleyici paketi dosyayı macOS’a teslim eder ve macOS paketin kendi gereksinimlerini uygular; Homebrew ile App Store ise kendi derlemelerini kendileri seçer. App Store’un iPhone ve iPad bölümünden gelen uygulamalar bilerek atlanıyor, çünkü belirttikleri sürüm bir iOS sürümü ve bunu macOS ile karşılaştırmak hiç denetlememekten daha kötü olurdu. Henüz açıkça söylenmeyen bir şey de var: Geliştiricinin bir derlemeyi sizin macOS sürümünüz için olmadığını işaretlediği durumlarda o güncelleme basitçe sunulmuyor ve uygulama, nedenini açıklamak yerine güncel görünüyor. Eski bir Mac’te bu sorun, macOS’u yükselttiğiniz gün kendiliğinden çözülür. Fazla yeni bir Mac’te ise çözülmez ve orada sessizlikten daha iyi bir yanıt borçluyuz.

百度网盘 artık izleniyor — yeni sürümler, tek tıkla güncellemeler ve sürüm notları pencerede. Olağan yolların hiçbiri açık değildi. Sparkle akışı yayımlamıyor; Homebrew cask’i elle yüklenmiş bir kopya adına konuşamıyor; uygulamanın kendi paketinde adı geçen güncelleme manifesti de artık ölü — o dosya, arm64 ikizi ve hepsini barındıran dizin 404 yanıtı veriyor. Bu yüzden DuoUpdater, üreticinin kendi indirme sayfasının beslendiği uç noktayı okuyor ve aynı yanıtta adı geçen, noter onaylı arm64 disk görüntüsünü yüklüyor. Sürüm notları da aynı yoldan geliyor: “版本更新” sayfasında bir Mac版 sekmesi var, ancak sayfanın kendisi boş geliyor ve içeriğini bir API’den dolduruyor; bu yüzden DuoUpdater o API’yi doğrudan okuyor ve son kırk sürümü kendi penceresinde gösteriyor. Açıkça belirtilmesi gereken bir sınır var: Bu akış size gösterilen sürümü yayımlıyor, ama altındaki derleme numarasını hiçbir zaman yayımlamıyor; bu nedenle adı değişmeden yeniden çıkarılan bir sürüm burada görünmez. Olmayan bir güncellemeyi uyduramaz — yalnızca bu tek türü göremez.

Başarısız olan bir denetim artık boş bir yer göstermek yerine başarısız olduğunu söylüyor. Sürümünü yalnızca üreticinin kendi uç noktasının yanıtlayabildiği bir uygulamanın “yanıt yok” demenin tek bir yolu vardı: boş bir tire. Bu da hiçbir şeyin kapsamadığı bir uygulamanın görünümüyle aynıydı. Bu yüzden bir üretici uç noktasının zaman aşımına uğraması ya da taşınması, tam olarak “DuoUpdater bu uygulamayı izlemiyor” gibi okunuyordu — kalıcı görünen bir hüküm; ne bir Yeniden Dene seçeneği vardı ne de “uygulama denetlenemedi” sayısında bir yer. Bunlar artık gerçekte oldukları şey olarak, yani başarısız bir denetim olarak görünüyor: bir Yeniden Dene düğmesi, sayımda bir yer ve adı konmuş bir neden. Bilerek her şey değil: Mac’inizin hiçbir şey yapamayacağı bir durum — bulunduğunuz sürüm hattı için bir tarif olmaması ya da bu makinede olmayan bir kimlik isteyen bir uç nokta — her zamanki sessiz tire olarak kalıyor; üst üste üç tur başarısız olan bir denetim de afişi sonsuza dek meşgul etmek yerine yine afişten çekiliyor. JetBrains Toolbox’ın yüklediği bir uygulama da arkasındaki sürüm okunamadığında “Toolbox’ı Aç” düğmesini koruyor, çünkü her iki durumda da yapılacak şey Toolbox’ı açmaktı.

“Uygulamak için yeniden başlatın” hatırlatması artık yeniden başlattığınızda kayboluyor. Bir uygulamanın kendi güncelleyicisi arka planda bir derleme indirdiğinde DuoUpdater bunu size bildiriyor ve bildirimde bir Yeniden Başlat düğmesi sunuyordu. Düğme işe yarıyordu — uygulama yeni derlemeyle geri geliyor ve “Şimdi 1.0 sürümü çalışıyor.” diyordu — ama yerini aldığı hatırlatma Bildirim Merkezi’nde altta kalıyor ve az önce yeniden başlattığınız bir şeyi yeniden başlatmanızı istemeyi sürdürüyordu. DuoUpdater hatırlatmanın geçerliliğini yitirmesini bekliyordu ve denetim yaptığı an, tam da zaten hesaba katılmış olan tek andı. Artık bekleyen bir yeniden başlatma olmadığı her durumda hatırlatmayı kaldırıyor; bu, DuoUpdater çalışmıyorken kendi güncellemesini uygulamış bir uygulamanın geride bıraktığı hatırlatmayı da temizliyor.

Tek bir sürüm numarası altında çok sayıda derleme yayımlayan uygulamalar artık her yerde doğru ele alınıyor. Bir Mac uygulaması iki sürüm dizesi taşır: size gösterdiği sürüm (“1.0”) ve gerçekten artan bir derleme numarası. Çoğu uygulama ikisini birlikte ilerletir. Bazıları yalnızca derlemeyi ilerletir: Amp tek bir günde on derleme yayımladı ve hepsinin adı 1.0’dı; Surge dört ayrı sürümü 6.9.0 adıyla çıkardı; JetBrains’in önizleme derlemeleri de aynısını yapıyor. DuoUpdater “bu değişti mi?” sorusuna yaklaşık bir düzine yerde gösterilen sürümü karşılaştırarak karar veriyordu; bu uygulamalar için o karşılaştırma, gerçekte ne olmuş olursa olsun, yalnızca “hayır” — ya da “bunlar aynı mı?” diye sorulan yerlerde “evet” — yanıtını verebiliyordu. Aşağıda bunun neleri bozduğu anlatılıyor. Hepsi tek bir hata; Amp onu görünür kıldığı için bulundu.

Yeniden Başlat artık üç dakika boyunca takılmış gibi görünüp ardından yaşanmamış bir hatayı bildirmiyor. Kendi güncelleyicisinde bekleyen bir derleme bulunan bir uygulamada Yeniden Başlat’a tıklamak, üç dakika boyunca dönen bir gösterge çıkarıyor ve ardından işlemin başarısız olduğunu söylüyordu — oysa güncelleme bir iki saniye içinde uygulanmış ve uygulama çoktan yeni derlemeyle yeniden açılmıştı. DuoUpdater, gösterilen sürümde hiçbir zaman gelmeyecek bir değişikliği bekliyordu. Amp’te ölçüldü: bir saniyeden kısa süren bir değişim için 189 saniye dönen gösterge. Artık bir saniyeden çok daha kısa sürede sonuçlanıyor ve gerçek bir hata yine hata olarak bildiriliyor.

Yeniden Başlat artık size çoktan eskimiş bir derleme sunmuyor. Bir uygulamanın güncelleyicisi bir derlemeyi indirmiş ve geliştirici o arada bir başkasını yayımlamışsa DuoUpdater yine de Yeniden Başlat’ı sunuyordu — böylece yeniden başlatıyor ve anında bir derleme geride kalıyordunuz; oysa o denetim tam da bunu önlemek için yazılmıştı. Bu satırlar artık onun yerine güncel derlemeyi indiren Güncelle düğmesini sunuyor.

Bir sürümü atlamak artık bir uygulamayı sonsuza dek susturmuyor. Bilinmesi gereken asıl madde bu. “Bu sürümü atla”, tek bir sürümü reddedip bir sonrakinin gelmesine izin vermek için var. Ancak yalnızca gösterilen sürümü kaydediyordu; bu yüzden derlemeler boyunca tek bir sürüm adını koruyan bir uygulamada bir kez atlamak, gelecekteki her sürümü reddediyordu — kalıcı olarak, yeniden başlatmalardan sonra da süren biçimde ve uygulamanın sessizleştiğini gösteren hiçbir şey ekranda belirmeden. Atlama artık reddettiği derlemeyi kaydediyor. Onarımın bir sonucu var: DuoUpdater’ın önceki bir sürümüyle atlanmış bir sürüm size bir kez daha sunulacak, çünkü eski kayıt hangi derlemeyi kastettiğini söyleyemiyor. Onu yeniden atlarsanız bu kez doğru kaydediliyor.

Hiçbir şey değiştirmemiş gibi görünen güncellemeler için geri alma yeniden görünüyor. Çalışma alanı, hiçbir şey yapmayacak bir geri almayı gizler — ve bu uygulamalarda her geri alma hiçbir şey yapmayacakmış gibi görünüyordu. Bu yüzden gerçek bir güncellemeden sonra satır kayboluyor, diskte eksiksiz bir yedek dururken ona ulaşmanın hiçbir yolu kalmıyordu.

Yeniden başlatma hatırlatması yine her derleme için bir kez duyuruluyor ve geliştiricinin bir derleme daha yayımlamasına da dayanıyor. 0.3.69, her beş dakikada bir tekrarlanan bir hatırlatmayı, hazırlanan her derleme için yalnızca bir kez konuşan bir hatırlatmayla değiştirmişti — ama derlemeyi adıyla tanımlıyordu; bu yüzden bu uygulamalarda ilkini duyurup sonraki her birinde sessiz kalıyordu. Bu düzeltildi. Ayrıca: Bir uygulama kaydedilmemiş işi olduğu için kapanmayı reddederse DuoUpdater, siz yanıt verdikten sonra onu yeniden açmak üzere bir not tutar. Siz karar verirken geliştirici başka bir derleme yayımlarsa bu not eskiden atılıyordu; uygulama değişimden sonra kapalı kalıyor ve onu yeniden açacak hiçbir şey olmuyordu. Not artık yeni derlemeyi izliyor.

Başarısız bir App Store güncellemesi artık sessizce başarılı olarak kaydedilmiyor, indirilmiş bir yükleyici paketi de daha eski bir derlemeyse artık şu an sunulan paket gibi değerlendirilmiyor. İkisi de aynı karşılaştırmadan kaynaklanıyordu. Sürüm geçmişi de bir uygulamanın on derlemesini tek bir sürüm olarak sayıyordu; bundan sonra bunları ayrı ayrı sayıyor, ancak zaten kaydedilmiş geçmiş geri kazanılamıyor.

Bir yeniden başlatmanın hangi derlemeyi uygulayacağını artık satırın kendisi söylüyor. Satırda “1.0 → 1.0” yazıyordu — hiçbir fark belirtmeyen bir satır. Artık “1.0 (129) → 1.0 (130)” yazıyor, ama yalnızca değişen şey derleme olduğunda; sürüm adlarının zaten farklı olduğu yerlerde satır değişmiyor. Aynı düzeltme Yeniden Başlat ipuçlarına, bildirime, bir yüklemenin neden ertelendiğini açıklayan nota ve duo install komutunun ret mesajına da uygulanıyor.

微信输入法 ve 豆包输入法 yeniden tek tıkla güncellenebiliyor — üstelik kendilerini güncelledikleri yöntemle. Giriş yöntemleri için tek tıkla güncelleme, bir kullanıcının giriş yöntemi ayarları kaybolduktan sonra 0.3.25’te, yayımlandığı gün geri çekilmişti. Sorun yüklemenin biçimindeydi: İlk kez yükleme yapan bir yükleyici gibi uygulamanın tamamını değiştiriyordu. Bir giriş yöntemi macOS’a uygulamasının konumuyla kaydedilir ve bu iki uygulama da kendilerini o konuma dokunmadan günceller — uygulamayı yerinde tutup içindekileri değiştirirler. DuoUpdater artık aynısını yapıyor; böylece kayıtlı uygulama güncellemeden aynı uygulama olarak çıkıyor ve herhangi bir noktadaki bir hata, çalıştırdığınız kopyayı olduğu yerde bırakıyor. Üstelik ikisi de artık parolanızı sormuyor.

İkisinden biri güncellenmeden önce öğrendiği her şey kopyalanıyor. Sözlüğünüz, ayarlarınız ve hesap durumunuz uygulamanın içinde durmuyor; bu yüzden DuoUpdater’ın zaten tuttuğu geri alma kopyası bunları kapsayamıyordu. Artık her giriş yöntemi güncellemesinden önce bunların anlık görüntüsü alınıyor ve geri almayla birlikte geri yükleniyor; kopyalamanın maliyeti de neredeyse sıfır — birinin 578 MB’lık verisini kopyalamak saniyenin onda biri kadar sürüyor ve neredeyse hiç disk alanı kaplamıyor. Bu bir onarım değil, bir güvenlik ağı: Bir uygulamanın bir sonraki açılışında verilerinizle ne yapmaya karar verdiği, uygulamanın kendi kodunun işidir ve hiçbir şey bunun önüne geçemez. Ama artık dönülebilecek bir yer var.

Bir güncelleme artık bir uygulamanın kendini güncelleme yeteneğini sessizce elinden almıyor. DuoUpdater bir uygulamayı değiştirmek için yöneticiye ihtiyaç duyduğunda uygulamanın sahibini geri yüklüyor, ancak uygulamanın yüklenirken aldığı izinleri geri yüklemiyordu — oysa bir indirme normalde bir yükleyicinin ayarladığından daha dar izinlerle açılır. İki giriş yöntemi için bu, kendi güncelleyicilerinin bir sonraki güncellemeyi tamamlayabilmesi ile arkasını toplayamaması arasındaki fark demek. Bir uygulamanın yüklenirken aldığı izinler artık onun yerini alan kopyaya da aktarılıyor.

DuoUpdater artık aynı uygulamayı her beş dakikada bir yeniden başlatmanızı istemiyor. Kendini güncelleyen bir uygulama yeni sürümü diske bırakır ve siz onu kapatana kadar bekler. DuoUpdater bunu her denetimde fark ediyor ve her seferinde bir hatırlatma gönderiyordu; böylece henüz yeniden başlatmamaya karar verdiğiniz bir derleme, siz onu öyle bıraktığınız sürece sizi rahatsız etmeyi sürdürüyordu. Artık her derleme bir kez duyuruluyor: Yeniden başlatın, atlayın ya da uygulamayı yok sayın, sessiz kalıyor; sonraki derleme ise kendini normal şekilde duyuruyor.

Yeniden başlatılmayı bekleyen bir uygulama artık güncelleme olarak sayılıyor, yok sayılan bir uygulama ise hiç sayılmıyor. Diskte zaten duran yeni bir sürüm bir güncellemedir — yalnızca erken indirilmiştir; bu yüzden artık yanlarında ayrı bir sayım olarak değil, simgedeki işarette ve “N güncelleme var” satırında sayılıyor. Yok sayılan uygulamalarda durum tersiydi: Yok saydığınız bir uygulama simgedeki işareti yakabiliyordu, oysa satırında soluk bir “Yok sayıldı” etiketi vardı ve basılacak bir düğme yoktu; yani sayı, üzerinde işlem yapamayacağınız bir şeyi gösteriyordu. Yok saymak ve atlamak artık üç yerin hepsinde aynı anlama geliyor: hatırlatmada, simgedeki işarette ve listede.

搜狗输入法 artık izleniyor — web sitesini okuyarak değil, kendi güncelleyicisine sorarak. Sogou’nun değişiklik günlüğü sayfası üç bölümlü sürüm numaraları yayımlıyor, yüklü kopya ise dört bölümlü bir numara taşıyor; bu yüzden sayfayla karşılaştırmak, önce gerçek sürümü kırpmak anlamına gelirdi. Uygulamanın kendi güncelleme denetimi ise paketin kendi numaralandırmasıyla yanıt veriyor. DuoUpdater bu uç noktaya uygulamanın sorduğu şekilde soruyor ve sürümü dört bölümüyle birlikte buradan okuyor; böylece yalnızca son bölümü değişen bir yeniden derleme de görülebiliyor. Bu uygulama için yalnızca algılama var: Sogou’nun güncelleyicisi uygulamayı değiştirmekten çok daha fazlasını yapıyor — bir QuickLook oluşturucusunu yeniden kaydediyor, verilerinizi yeni bir konuma taşıyor ve giriş yöntemini zorla kapatıyor — bu yüzden güncellemenin kendisi ona bırakılıyor. Bilinmesi gereken bir şey daha var ve bu bizim değil, Sogou’nun işi: Uç noktaları, soran macOS sürümüne göre yanıt veriyor ve macOS 28’deki bir Mac kendisi için sorduğunda 2023’ten kalma bir derleme alıyor. DuoUpdater kendi adına sormuyor; bu yüzden size gösterilen sürüm her Mac’te güncel olan sürüm.

Sonradan gelen bir düzeltmenin doğru çıkaracağı sürüm notları artık kalıcı olarak yanlış kalmak yerine yeniden okunuyor. Notlar, yayımlanmış bir sürümün notlarının hiç değişmeyeceği varsayımıyla sürüm başına önbelleğe alınıyor. Bu, notların kendisi için doğru, ama DuoUpdater’ın onlardan çıkarabildikleri için değil; bu yüzden notları bozuk çıkan bir uygulama, sonradan kaç ayrıştırma düzeltmesi yayımlanırsa yayımlansın, o sürüm için öyle kalıyordu. Artık önbellekteki her kayıt, onu çıkarma mantığının hangi kuşağının yazdığını da saklıyor ve daha eski bir kuşağın yazdığı kayıt yeniden indiriliyor. Her iki önbellek de bunu yapıyor: uygulama değişiklik günlükleri ve Homebrew formül notları.

Bir CDN’de başarısız olan bir denetim, bozuk sayılmadan önce bir kez daha deneniyor. 502, 503 ve 504’ün hepsi, aradaki bir sunucunun arkasındaki asıl sunucuya ulaşamadığı anlamına gelir: İstek hiç ulaşmamıştır, bu yüzden aynı istek bir an sonra genellikle başarılı olur. Headlamp’in denetimi tam da bu yüzden çöktü — GitHub hiçbir hız sınırı başlığı olmadan 504 yanıtı verdi. Bu üç kod artık saniyenin onda sekizi kadar bekledikten sonra bir kez yeniden deneniyor. Bilerek yalnızca bu üçü: 500, sunucunun kendisinin başarısız olduğu anlamına gelir ve tekrarlamak çoğunlukla hatayı yeniden üretir; hız sınırına takılan bir isteği yeniden denemek ise tam da şikâyet edilen kotayı harcar.

Bir Homebrew formülünün sürüm notları artık ait oldukları sürümü izliyor. Notlar sürüm başına değil formül başına hatırlanıyordu; bu yüzden bir formülün notları bir kez yüklendikten sonra, oturum boyunca ona her bakışta — daha yeni bir sürüm çıktıktan sonra bile — o ilk sürümün notları gösteriliyordu. Notları okumak ayrıca formül listesinin geri kalanının beklediği kuyruğu da meşgul ediyordu; bu yüzden yavaş bir brew info, çevresindeki listeyi durdurabiliyordu.

Çalışma alanının kenar çubuğunda bir uygulamaya sağ tıklayarak onu açabilirsiniz. Menü çubuğu satırlarının hep sunduğu Aç komutunun aynısı, artık ona ihtiyaç duymanızın daha olası olduğu pencerede.

İndirilmiş bir yükleyiciyi atmak, geride bıraktığı hatayı da beraberinde götürüyor. Hazırlanmış bir paketi atmak satırı zaten Güncelle durumuna döndürüyordu, ama az önce vazgeçtiğiniz denemeden kalan kırmızı hata mesajı satırda duruyordu — ve onu hiçbir şey temizlemeyecekti, çünkü bir hata ancak satır güncel duruma geçtiğinde kaldırılır; hâlâ güncelleme sunan bir satır ise bu duruma hiçbir zaman geçmez. Artık hata da indirmeyle birlikte gidiyor.

İsteğe bağlı komut satırı yardımcısı duo artık kendini yanlış tanımlamıyor. --timeout kaldırıldı — kabul ediliyor ve belgeleniyordu, ama hiçbir şey onu okumuyordu. --budget ilk kez belgelendi ve ondan söz eden tek mesaj artık her zaman “15” yerine gerçek bir dakika sayısı veriyor. --max-calls varsayılan değerinin 20 olduğunu iddia ediyordu, oysa 6. Sayı bekleyen bir seçeneğe sayı olmayan bir değer verilmesi artık hata: duo verify --max-concurrency 1x eskiden yok sayılıyor ve tarama varsayılan değer olan dörtle yapılıyordu; bir taramayı bilerek yavaşlatmak isteyen biri için bu tam ters bir sonuç. Ayrıca duo verify artık gerçekten yaptığı istekleri sayıyor: 502 yanıtı verip yeniden denemede başarılı olan bir akış, sessizce iki kez sorulmuşken artık temiz bir ok bildirmiyor. -h, --help’in çalıştığı her yerde çalışıyor.

Dört uygulama daha izleniyor, iki sürüm kanalı daha eklendi ve hepsi yerinde güncelleniyor. CapCut, Canva ve yayımlandığı iki sitenin ikisinde de WorkBuddy — uluslararası site ile Çin sitesi birbirinden bağımsız sürüm hatları işletiyor, bu yüzden yüklü bir kopyaya yalnızca kendi sitesine ait sürüm ve notlar sunuluyor. Termius ve VSCodium, zaten kapsanan kararlı derlemelerin yanına Beta ve Insiders kanallarını ekliyor. CapCut’ın ikinci hattı işin zor kısmı: CapCut’ın kendi içindeki bir anahtarla seçiliyor ve sürüm numarasında hiçbir yerde görünmüyor; bu yüzden hangi hatta olduğunuz, o anda çalıştırdığınız derlemeden tahmin edilmek yerine diskteki kopyadan okunuyor. O kutuyu işaretlerseniz bilmeniz gereken bir şey var: DuoUpdater size en yeni betayı çıktığı anda sunacak; bu da CapCut’ın kendi kademeli dağıtımının size ulaşacağı noktanın ilerisinde olabilir.

Android Studio’nun önizleme kanalları artık size elinizdekinden daha eski bir derleme sunmuyor. Google sürümlerini sürüm numarasına göre değil, yayımlandıkları sıraya göre listeliyor; DuoUpdater da bu listede üç ayrı arama yapıyordu — bir kez sürüm, bir kez tarih, bir kez de indirme için. Bu yüzden daha yeni bir canary’den sonra yayımlanan bir sürüm adayı, sürümü bir girdiden, dosyayı başka bir girdiden sağlayabiliyordu. 26 Ağustos’ta Canary kanalı, 2026.2.1 Canary 2 çoktan yayımlanmışken 2026.1.4 RC 2 yanıtını verdi. Bu yanıtların her biri artık aynı girdiden gelmek zorunda.

Yeniden derlenen bir sürüm artık yerini alması gereken kopyayı yüklemiyor. Bir proje bir sürümü sürüm numarasını değiştirmeden yeniden derlediğinde iki dosya da aynı etiketin altında kalır — KeePassXC, orijinal KeePassXC-2.7.11-arm64.dmg dosyasının yanında KeePassXC-2.7.11-1-arm64.dmg dosyasını yayımlıyor — ve DuoUpdater hangisi önce listelenmişse onu alıyordu. Bu sıra alfabetik; bu kez yeniden derlemeyi tesadüfen başa koymuştu, bir dahaki sefere sona koyacaktı. Bunların hiçbiri görünür değildi: Satırdaki sürüm doğruydu, yalnızca arkasındaki dosya yanlıştı. Doğru dosya artık dosya adının kendisinin söylediğine göre seçiliyor.

Nightly ve snapshot derlemeleri artık gerçekte oldukları şey, yani yayın öncesi derlemeler olarak tanınıyor. VLC’nin nightly derlemesi, KeePassXC snapshot’ı ve Freelens nightly, kararlı uygulamanın adı ve paket tanımlayıcısıyla yükleniyor; bu yüzden onları ele veren tek şey sürüm dizeleri — ve bu dize okunmuyordu. Kararlı yükleme olarak sayılıyorlardı; bir nightly derlemeye kendi üzerine yazılacak sıradan bir sürümün sunulması da böyle oluyor. DB Browser for SQLite’ın nightly derlemesi de aynı nedenle uygulamanın kendi dosya adından okunuyor. Orada sorun gerçekti ama gizliydi: Donmuş sürüm numarası, güncel kararlı sürümün ancak kararlı sürüm ona yetişene kadar üstünde kalıyor; o noktada yüklü her nightly kopyasına sessizce kararlı bir derleme verilmiş olacaktı.

Bir uygulamayı yeniden başlatmak artık gerçekte ne olduğunu bildiriyor. Birkaç uygulama kendi paketinin içinde ikinci bir uygulama taşıyor — Surge, Dashboard’unu orada tutuyor — ve yalnızca bu iç uygulamanın yeniden başlatılması gerektiğinde DuoUpdater, hiçbir şey olmamışken dış uygulamanın yeniden başlatıldığını söylüyordu. Artık iç uygulamanın kendi sonucunu bildiriyor ve hiç gerçekleşmemiş bir yeniden başlatma için bildirim göndermiyor.

İndirmesi tamamlanmış bir güncelleme artık bunu belirtiyor ve ondan vazgeçebiliyorsunuz. İndirmesi bitmiş bir yükleyici paketini tutan satır, mavi bir Yükle düğmesinden başka bir şey göstermiyordu — indirmenin zaten bittiğini ya da düğmenin güncellemeyi baştan başlatmak yerine yükleyiciyi yeniden açtığını söyleyen hiçbir şey yoktu ve fikrinizi değiştirmenin de bir yolu yoktu. Bu bilgi artık bir ipucunda gizli değil, doğrudan satırda; satırın sağ tıklama menüsündeki İndirilen Yükleyiciyi Sil komutu da indirmeyi silip satırı Güncelle durumuna döndürüyor. Aynı uygulamanın bir yüklemesi zaten sürerken birini atmak, indirmesi yeni bitmiş bir paketi de silebiliyordu; artık silemiyor.

Kaldırılmış sayfalara giden sürüm notu düğmeleri yeniden çalışan sayfaları açıyor. Microsoft, Edge’in kurumsal sürüm notu sayfalarının adını değiştirdi, Termius da değişiklik günlüğünü taşıdı; bu yüzden üç Edge kanalı ve Termius sizi artık var olmayan bir sayfaya gönderiyordu. Bu sayfaların hâlâ yerinde olup olmadığını hiçbir şey denetlememişti; geri kalan her şey sağlıklı görünürken süresiz olarak bozulabilmelerinin nedeni buydu. Artık düzenli aralıklarla denetleniyorlar. Edge’in Dev kanalına hiç düğme verilmiyor: Microsoft bu kanal için not yayımlamayı bıraktı ve hâlâ var olan her sayfa başka bir sürüm hattına ait.

Raycast, sürüm 2’ye geçişte izleniyor — ama yalnızca onu çalıştırabilen Mac’lerde. Raycast 2, macOS Tahoe ve Apple silicon gerektiriyor. Bu koşulları karşılamayan bir Mac sürüm 1 hattında kalıyor ve artık asla yükleyemeyeceği bir sürümden haberdar edilmiyor. İki hat artık sürüm notlarını da ayrı tutuyor; böylece sürüm 1 yüklü bir kopya sürüm 2’nin değil, sürüm 1’in geçmişini görüyor.

Sürüm notları artık daha fazla uygulama için DuoUpdater’ın kendi penceresinde gösteriliyor. Üç hattının tamamında BetterDisplay, Shotbase ve iki sitede de WorkBuddy. BetterDisplay’in notları artık indirme düğmesinin ham işaretleme koduyla bitmiyor ve katkıda bulunanlar listesini her sürümde yinelemiyor.

İsteğe bağlı komut satırı yardımcısı duo artık anlamadığı bir komut satırını reddediyor. Yanlış yazılmış bir seçenek eskiden yok sayılıyordu ve yok sayılan bir seçenek, hiç vermediğiniz bir seçenekle aynı etkiyi yapar — bu yüzden duo verify --githubb, istediğiniz tarif yerine sessizce tüm tarifleri denetliyordu. Bilinmeyen seçenekler, değeri verilmemiş bir seçenek ve fazladan argümanlar artık komutun gerçekte neleri kabul ettiğini belirten hatalar veriyor; --help de her komuttan sonra çalışıyor.

BetterDisplay’in yayın öncesi ve dahili derlemeleri artık bunları isteyenlere sunuluyor. BetterDisplay, üç sürüm hattının hepsini tek bir güncelleme akışında taşıyor ve aralarında kendi ayarlarındaki iki anahtarla seçim yapıyor. DuoUpdater hattınızı yalnızca o an çalıştırdığınız derlemeden tahmin edebiliyordu; oysa bu derleme, açtığınız ama henüz sonucunu görmediğiniz bir anahtar hakkında hiçbir şey söylemez. Bu yüzden iki anahtarı da açık olan ve kararlı bir derlemede duran birine güncel olduğu söyleniyordu, oysa BetterDisplay’in kendi güncelleyicisi dört sürüm ileride bir sürüm sunuyordu. Gerçek tercihiniz artık BetterDisplay’den okunuyor; dahili derlemeleri açmanın sıradan yayın öncesi sürümlerin de gelmeye devam etmesini sağladığı durum da buna dahil. Yalnızca Apple silicon’a yönelik önizleme derlemeleri bilerek dışarıda bırakılıyor; böylece bir Intel Mac’e çalıştıramayacağı bir derleme asla sunulmuyor.

Bir uygulamanın sürüm kanalını art arda iki kez değiştirmek artık satırı eski yanıtta takılı bırakmıyor. Bir kanal anahtarını değiştirmek, DuoUpdater’ın o uygulamayı yeniden denetlemesini sağlıyor; ilk denetim hâlâ sürerken yapılan ikinci bir değişiklik ise eskiden hesaba katılmıyordu. Satır, az önce betaları kapatmış birine beta sunmayı, ilgisiz bir şey başka bir denetimi tetikleyene kadar sürdürüyordu. Artık yeni değişiklik eskisinin yerini alıyor; yarıda kesilen bir denetim de ulaşamadığı uygulamaları işlenmiş olarak kaydetmek yerine bir sonraki tur için işaretliyor. Satırlar bir değişiklikten sonra denetim durumuna da daha çabuk geçiyor; böylece ekrandaki yanıtın, anahtarınızın çoktan geçersiz kıldığı bir yanıt olduğu süre kısalıyor.

Başka bir uygulamanın içinde yaşayan bir uygulama artık onunla birlikte kapatılıp yeniden açılıyor. Birkaç uygulama kendi paketinin içinde ikinci, eksiksiz bir uygulama taşıyor — Surge, Dashboard’unu orada tutuyor. macOS bunu ayrı bir uygulama olarak görüyor; bu yüzden çevresindeki uygulamaya bir güncelleme uygulandığında onu hiçbir şey kapatmıyordu: Az önce değiştirilen sürümü, artık sandığı yerde olmayan bir kopyadan çalıştırmaya devam ediyor ve bu noktadan sonra ait olduğu uygulamayla iletişim kuramıyordu. Bunlar artık içinde bulundukları uygulamayla birlikte kapatılıyor ve ondan sonra yeniden açılıyor; öne gelen pencere de gerçekte üzerinde çalıştığınız pencere oluyor. Bu şekilde yalnızca sizin de açabileceğiniz uygulamalar ele alınıyor; bir uygulamanın kendisi için çalıştırdığı görünmez yardımcı süreçlere dokunulmuyor.

Sessizce oluşturulmaz hale gelen geri alma noktaları yeniden oluşturuluyor. Bir uygulama kendi dosyalarından birini hiçbir şeyin silemeyeceği şekilde kilitleyebilir ve geri alma için tutulan kopya bu kilidi devralıyordu — bu yüzden bir sonraki kopyayla asla değiştirilemiyordu ve yarıda kesilen tek bir deneme, hiçbir şeyin temizleyemeyeceği bir kopya bırakabiliyordu. Bundan sonra o uygulamanın her güncellemesi geri dönüş yolu olmadan yapılıyor ve bu durum hiçbir neden belirtmeyen tek bir satırla bildiriliyordu. Geliştiricinin kendi Mac’indeki bir uygulama iki gündür bu durumdaydı. Geri alma için tutulan kopyalar artık kilidi taşımıyor, yüklü uygulama tam olarak geliştiricisinin ayarladığı gibi bırakılıyor ve takılı kalmış bir kopya artık yerini alması gereken kopyayı engelleyemiyor.

Başarılı olan bir güncelleme artık başarısız olduğunu bildirmiyor. macOS yeni bir sürümü yerine koyup ardından yerinden ettiği sürümü kaldırırken hata verebiliyor. Bu hata olduğu gibi kabul ediliyordu: DuoUpdater, güncellenmiş bir uygulamanın güncellenmediğini ya da yedek deposunda eksiksiz bir geri alma noktası dururken geri alma noktası olmadığını söylüyordu — ve ilk durumda sizi zaten vermiş olduğunuz ve her halükârda işe yaramayacak bir izni vermeye yönlendiriyordu. Artık bir şey bildirilmeden önce diskte gerçekte ne olduğu denetleniyor.

Sürüm satırları artık sürüm numarasında zaten bulunan rakamları yinelemiyor. Bir uygulama yeniden başlatılmayı beklerken satır, çalıştırdığınız sürümü ve yeniden başlatmanın getireceği sürümü gösterir. İki tarafta da bir derleme numarası vardı: Bu, geliştirici tek bir sürüm adı altında birkaç derleme yayımladığında farkı okunur kılar — sürümler zaten farklıysa ise saf gürültüdür. Chrome’un satırı genişliğini “151.0.7922.174 (7922.17…” yazmaya harcıyor ve gerçekten değişen rakamlara gelmeden yer kalmıyordu. Derleme numaraları artık yalnızca değişen şey onlar olduğunda görünüyor.

Bir uygulamayı güncellemesini tamamlamak üzere yeniden açmak için artık tek bir sözcük var. Kendi güncelleyicisi yeni sürümü çoktan yerine koymuş bir uygulama için “Restart” deniyordu; yeni sürümü siz kapatana kadar kenarda tutan bir uygulama için ise “Relaunch”. Bu fark perde arkasında gerçekti ama sizin için hiçbir şey değiştirmiyordu: Her iki durumda da aynı tıklama ve hiç tıklamazsanız aynı sonuç, çünkü güncelleme her halükârda uygulamayı bir sonraki kapatışınızda yerine geçiyor. Artık her yerde “Yeniden Başlat” yazıyor — bildirimlerde, ipuçlarında ve bunu sizin yerinize yapan ayarda da — ve bu, Chrome’un, Claude’un ve kendini güncelleyen çoğu uygulamanın karşınıza çıkardığı sözcükle de aynı. Bu iş için iki sözcüğü olan tek dil İngilizceydi; Almanca, Japonca, Rusça ve Çince her zaman tek bir sözcük kullandı; İspanyolca ve Fransızca da başka yerlerde zaten kullandıkları ifadeye geçiyor.

Yönetici gerektiren bir güncelleme artık başarısız olup bir izni suçlamak yerine yönetici izni istiyor. Bir değişimin parola gerektirip gerektirmediğine uygulamanın kendisine değil, bulunduğu klasöre bakılarak karar veriliyordu. macOS’un root olarak yüklediği her şey — her App Store uygulaması ve bir yükleyici paketinin yerleştirdiği her uygulama — bu testi geçiyor, parola gerektirmeyen yola giriyor ve işi asla tamamlayamıyordu: Eski sürümü kaldırmak, içindeki dizinlere yazma erişimi gerektiriyor. macOS bu reddi, reddedilmiş bir Uygulama Yönetimi izni için kullandığı kodla bildiriyor; bu yüzden hata, Uygulama Yönetimi izni verme isteği olarak geliyordu — oysa bu asla işe yaramazdı, çünkü engel dosya sahipliğiydi. Sıradan bir Mac’te bu, tüm App Store uygulamaları ve bunlara ek olarak birkaç uygulama demekti; sorun da yönetici hesaplarını etkiliyordu, çünkü standart hesaplar zaten doğru yola yönlendiriliyordu. Bu güncellemeler artık işe yarayan yolu izliyor ve uygulama, sessizce sizin olmak yerine önceki sahibini koruyor.

App Store uygulamaları artık diğer her şey gibi bir geri alma noktası alıyor. Yedeklemeler, mağazanın önceki bir derlemeyi her zaman geri getirebileceği varsayımıyla bunları atlıyordu. Getiremez — App Store yalnızca bir uygulamanın güncel sürümünü sunar; bu da mağazayı, bir güncellemeyi geri alma yolu olmadan uygulayan tek yol haline getiriyordu. Bu uygulamalar artık bir güncellemeden önce diğerleri gibi yedekleniyor ve kopya klonlanarak oluşturulduğu için, güncelleme orijinalin yerini gerçekten alana kadar neredeyse hiç disk alanı kaplamıyor. Birini geri yüklediğinizde mağazaya özgü durum belirtiliyor: Güncelleme, Güncellemeler listesinde hemen yeniden görünür ve otomatik uygulama güncellemeleri açıksa kendiliğinden yeniden uygulanır. Ayrıca bir mağaza güncellemesinin zaten hiç uygulanmayacağı durumlarda — Mac’te çalışan bir iPhone uygulaması ya da bölgenizde satılmayan bir ürün — artık geri alma noktası oluşturulmuyor; böylece bir satır, zaten çalıştırdığı sürüme geri almayı öneremiyor.

Longbridge Desktop artık iki sürüm hattında da izleniyor. Stable ve Preview hatlarının her biri sürüm algılama, resmi Apple silicon derlemesinin tek tıkla yüklenmesi ve DuoUpdater’ın kendi penceresinde görselleriyle birlikte gösterilen sürüm notları alıyor.

WhatsApp’ın sürüm notları artık App Store denetimi hâlâ sürerken görünüyor. O pencerede gösterilen App Store sayfası, aramanın asla eşleştiremeyeceği bir ad altında kaydedilmişti; bu yüzden notlar bölmesi onu göstermek yerine boş kalıyordu.

Menü başlığı daha az yerde daha fazlasını taşıyor. DuoUpdater’ın kendi sürümü artık adının yanında duruyor ve üzerine tıklamak sürüm notlarını açıyor. “Tümünü Güncelle” kendi satırına taşındı; çevrilmiş bir etiket orada tamamen okunabilecek kadar yer buluyor. Alttaki eylemler de artık simge olarak gösteriliyor. DuoUpdater’ın kendini güncellediğini duyuran afiş kaldırıldı — onun yerine sürümün yanındaki pırıltı simgesi yanıyor ve neyin değiştiğini okuyana kadar yanık kalıyor. Menüye sığmayacak kadar uzun bir durum satırı artık menüyü genişletmek yerine üç noktayla bitiyor.

Ayarlar artık sunduğu güncelleme seçeneklerini kırpmıyor. Bir güncellemenin nasıl uygulanacağını belirleyen iki menü, birkaç dilde kendi etiketlerini kırpıyordu. İfadeler artık daha kısa ve sözcüklerin hâlâ sığmadığı yerlerde ikinci bir satıra geçiyor.

Yenilikler artık her sürümün ne zaman yayımlandığını gösteriyor. Kenar şeridindeki her sürüm artık yayım tarihini taşıyor.

Mimariye özgü güncellemeler artık bu Mac’in gerçekten çalıştırabileceği derlemeyi seçiyor. Birkaç uygulama aynı sürümü tek bir Sparkle akışında iki kez yayımlıyor — bir kez Apple silicon, bir kez Intel için — ve DuoUpdater bu eşitliği, hangi indirme adresi sıralamada önce geliyorsa onu seçerek bozuyordu. Artık akışın donanım gereksinimini, üreticinin bunu boş bıraktığı durumlarda ise dosya adındaki mimariyi okuyor. Yerel derleme tutarlı biçimde tercih ediliyor ve bu Mac’in açamayacağı bir derleme sunulmuyor. GitHub sürümleri de aynı şekilde ele alınıyor; üstelik en yeni dosyası başka bir mimariyi hedefliyor diye son derece sağlıklı bir tarife bozuk denmeden.

ChatGPT güncelleme denetimleri artık hesaba bağlı dağıtım hattını izliyor. OpenAI zaman zaman yeni bir derlemeyi önce bireysel hesaplara ulaştırırken işletme ve kurumsal hesapları daha eski bir masaüstü derlemesinde tutuyor. DuoUpdater eskiden bu denetimde hesabın planını göndermiyordu; bu da herkes için sessizce temkinli hattı seçiyordu: ChatGPT’nin kendisi daha yeni bir derlemeyi çoktan indirirken yüklü kopyanın bir şekilde ileride olduğunu söyleyebiliyor ya da uygulamanın kendi güncelleyicisinin yeniden değiştireceği bir derleme sunabiliyordu. Artık plan etiketini ChatGPT/Codex oturum açma durumundan alıp uygulamanın yaptığı güncelleme isteğinin aynısıyla gönderiyor. Bu etiket kullanılamıyorsa temkinli davranışı sürdürüyor; kimlik bilgilerinin kendisi hiçbir zaman isteğe ya da tanılama verilerine konmuyor.

macOS’un hiç yanıtlamadığı bir yeniden başlatma artık sonraki tüm güncellemeleri kilitleyemiyor. Launch Services zaman zaman güncellenmiş bir uygulamayı yeniden açma isteğini kabul ediyor ve sonra hiç geri dönmüyor. Satır sonsuza dek “Yeniden başlatılıyor…” durumunda kalıyor, Yeniden Başlat düğmesi devre dışı kalmaya devam ediyor ve DuoUpdater’ın kendi güncellemesi de bunun arkasında bekliyordu. Bir dakika sonra hâlâ yanıt vermemiş bir başlatma artık başarısız sayılıp bırakılıyor; böylece satır toparlanıyor ve güncelleyicinin geri kalanı çalışmaya devam ediyor.

Sürüm Günlüğü, kaydırma çubuğu hızla sürüklendiğinde artık boş kalmıyor. Eski tembel yığın uzun bir sıçramaya yetişemeyebiliyor ve yeni konumun çevresinde satırlar oluşturulurken pencereyi kısa bir süre boş bırakabiliyordu. Günlük artık doğrudan hedefe atlayabilen, satırları yeniden kullanan bir liste kullanıyor. Yenileme düğmesi de ok ile dönen gösterge arasında geçiş yaparken aynı yeri kaplıyor; böylece bir denetim başladığında alt satır artık seğirmiyor.

İndirme Trafiği artık ikili yama kullanan güncellemeleri işaretliyor. Yeni indirmeler, yalnızca bir yamanın sunulup sunulmadığını değil, gerçekte tamamlanan yolu kaydediyor ve geçmişlerinde bir Delta rozeti taşıyor. 0.3.62’deki belirgin biçimde daha küçük yama indirmeleri de, trafik kaydında henüz bir yol alanı yokken kaydedilmiş olsalar bile tanınıyor.

Geliştirici bu şekilde yayımladığında güncellemeler artık yalnızca değişen kısmı indiriyor. Bazı uygulamalar her sürümün yanında küçük bir yama yayımlıyor — elinizdeki sürümü, her şeyi yeniden indirmeden yenisine dönüştürmeye yetecek kadar. DuoUpdater eskiden bunları yok sayıyor ve her seferinde paketin tamamını indiriyordu. Artık tam olarak kullandığınız derlemeyle eşleşen bir yama varsa onu alıyor. ChatGPT’nin son güncellemesi 605 MB yerine 1,9 MB tuttu; Docker’ınki 582 MB yerine 87 MB. Sonuç her iki yolda da aynı uygulama — aynı imza, aynı baytlar; bu, yayımlanmadan önce tam indirmeyle karşılaştırılarak doğrulandı. Elinizdekine uyan bir yama yoksa ya da yama uygulanamazsa tam indirme eskisi gibi yapılıyor; bu yüzden bu değişiklik hiçbir şeyin yüklenememesine yol açamaz.

DuoUpdater artık bir uygulamanın zaten kendisinin indirdiği bir güncellemeyi indirmiyor. Pek çok uygulama kendini de güncelliyor ve ikimizin aynı anda aynı 600 MB’lık dosyaya uzanması, o dosyayı size iki kez indirtiyordu. DuoUpdater artık süren bir indirmeyi fark edip ona dokunmuyor ve sessizce hiçbir şey yapmamak yerine bunu satırda belirtiyor. O indirme yarıda bırakılmış çıkarsa on dakika sonra dikkate alınmayı bırakıyor; böylece hiçbir şey engellenmiş halde kalmıyor.

Bir uygulamanın zaten hazırladığı bir güncellemenin üzerine artık yazılmıyor. Kendini güncelleyen uygulamalar çoğu zaman arka planda indirir ve yeni sürümü yerine koymak için sizin onları kapatmanızı bekler. Bunlardan birinin üzerine yüklemek işe yaramış gibi görünüyor, sonra uygulamayı kapattığınız anda boşa çıkıyordu — ve uygulamanın bekleyen kendi sürümü DuoUpdater’ın az önce yüklediğinden eskiyse, başladığınız noktadan da geride kalıyordunuz. Bu güncellemelerin, hangi sürümü taşırlarsa taşısınlar, artık tamamlanmasına izin veriliyor.

DuoUpdater’ın kendi güncellemeleri de küçüldü. Sürümleri artık aynı türden bir yamayla geliyor; bu yüzden yakın tarihli bir sürümden güncellemek on bir megabayt yerine birkaç yüz kilobayt indiriyor.

Bir güncellemenin geride bıraktığı açıklamalar artık kendiliğinden temizleniyor. DuoUpdater bir uygulamayı kendi güncelleyicisine devrettiğinde satır bunu belirtir: “Kendi güncelleyicisi güncellemeyi uygulasın diye öne getirildi.” Bu cümle eskiden kalıcı olarak orada kalıyordu: Onu kaldıran tek şey aynı uygulamada başka bir güncelleme başlatmaktı; bu yüzden güncelleme gerçekleştikten çok sonra bile satırın altında duruyor ve saatler önce bitmiş bir şeyi anlatıyordu. Artık uygulama güncel hale gelir gelmez kayboluyor. Bir güncellemenin geri alma noktası olmadan uygulandığına dair uyarıya ise bilerek dokunulmuyor, çünkü o uyarı zaten gerçekleşmiş güncellemeyi anlatıyor ve ancak güncelleme bittikten sonra önem kazanıyor.

Reddedilen bir güncelleme artık nedenini sizin dilinizde açıklıyor. Başka bir şey zaten yükleme yaparken — bir grup güncellemeyi sırayla işleyen DuoUpdater ya da bir terminaldeki duo — satır bunu size söyler. Bu mesaj, geri kalanı çevrilmiş bir pencerede yalnızca İngilizceydi ve bir süreç numarasıyla bitiyordu: Bu numara terminalde işe yarar, bir menüde ise üzerinde işlem yapabileceğiniz bir şey değildir. Mesaj artık çevrildi ve kilidi kimin tuttuğunu değil, ne yapmanız gerektiğini söylüyor. Komut satırı aracı ise süreç numarasını, onunla bir şey yapabileceğiniz yer olduğu için hâlâ yazdırıyor.

Sürüm deseni satırı ve saati artık yerel ayarlarınıza uyuyor. Sürüm Günlüğü → Desenler her şeyi “En sık Cuma, saat 18.00 civarında yayımlıyor” diye özetliyordu. Gün adlarını çekimleyen diller, gün cümlenin ortasına yerleştirildiğinde bunu doğru söyleyemiyor ve sözcüğün yanlış biçimini alıyordu — Rusçada “по пятницам” olması gereken yerde “Чаще всего выходит пятница” yazıyordu. Artık bu bir etiket: “Zirve: Cuma, yaklaşık 18.00” — her dilde doğru. Saat de buna uyuyor: Mac’iniz saatleri 24 saat biçiminde yazıyorsa bu satır da öyle yazıyor, grafiğin ekseni de.

Ayarlar araması artık ekranınızdaki sözcükleri anlıyor. Ayarlar kenar çubuğunun üstündeki arama alanı, İngilizce yazılmış ve hiç çevrilmemiş ek terimlerden oluşan bir listeyle eşleştirme yapıyordu; bu yüzden “rollback” Genel bölümüne ulaşırken “Zurücksetzen” ve “回滚” hiçbir yere ulaşmıyordu. Bu terimler artık DuoUpdater’ın konuştuğu her dilde var. İngilizce terimler de, kaynaklandıkları belgeler İngilizce olduğu için her dilde çalışmaya devam ediyor.

“Tümünü göster”i açmak artık menüyü duraksatmıyor. Sahip olduğunuz tüm uygulamaların tam listesi her görüntülendiğinde baştan sona ölçülüyordu — 127 uygulamalı bir Mac’te bu yaklaşık bir saniyelik iş demekti ve neredeyse tamamı, görebildiğiniz satırların çok altındaki satırları yerleştirmeye harcanıyordu. Bu bedel yalnızca ilk seferde değil, her açıp kapamada ödeniyordu. Artık yalnızca ekranda gerçekten görünen satırlar oluşturuluyor.

Başarısız bir güncellemeden kalan açıklama artık hatanın kendisinden uzun yaşamıyor. Bir güncelleme uygulanamadığında — örneğin başka bir şey zaten yükleme yaptığı için — satır bunun nedenini kırmızıyla belirtiyordu. O satırı hiçbir şey kaldırmıyordu: Güncelleme sonunda gerçekleşip satır yeniden onay işaretine döndüğünde eski açıklama hâlâ altında duruyor ve DuoUpdater yeniden başlatılana kadar her yeniden denetimde orada kalıyordu. Artık uygulama güncel hale gelir gelmez kayboluyor. Hâlâ bekleyen güncellemelere ait nedenlere dokunulmuyor; böylece henüz okumadığınız bir neden, arka planda çalışan bir denetim tarafından silinemiyor.

“Tümünü Güncelle” düğmesi artık listenin uzunluğuna göre boyut değiştirmiyor. Bekleyen yalnızca birkaç güncelleme olduğunda olması gerekenden bir boy küçük çiziliyor, yanında seksen punto boşluk kalıyor ve liste uzadığında doğru boyutuna geri sıçrıyordu. Artık hep olması gereken boyutta kalıyor.

İndirme Trafiği artık bir güncellemenin yalnızca hangi sürüme değil, hangi derlemeye geçtiğini de gösteriyor. Pek çok uygulama tek bir sürüm adı altında birkaç derleme yayımlıyor — Surge dört ayrı sürümü “6.9.0” adıyla çıkardı — bu yüzden o satırlarda “6.9.0 → 6.9.0” yazıyor ve size hiçbir şey anlatmıyordu. Artık “6.9.0 (12028) → 6.9.0 (12030)” yazıyor, ama yalnızca sürüm adı tek başına yetmediğinde; sürümün zaten değiştiği yerlerde derleme numarası yalnızca gürültü olacağı için gösterilmiyor.

Kaydedilen derleme, gerçekte yerine oturan derleme; güncelleme tamamlandıktan sonra doğrudan uygulamanın kendisinden okunuyor. Geliştiricinin güncelleme akışının duyurduğu numara değil — akışlar bazen yanlış bilgi veriyor ve bu yöntem, hiç derleme numarası yayımlamayan yerlerde de çalışıyor: GitHub, Homebrew ve App Store. macOS’un yükleyici penceresini hâlâ bekleyen bir güncelleme için asla tahmin yürütülmüyor; gerçekleşene kadar onun için hiçbir şey kaydedilmiyor.

Hiçbir şeyi değiştirmeyen bir indirme artık öyle işaretleniyor. Bir güncelleme ara sıra Mac’inizde zaten bulunan derlemeyi indirip yüklüyor — geliştirici tarafında bir sürüm numarası uyuşmazlığı ya da elinizdekini sunan bir yansı sunucu yüzünden. Bu, sonuç getirmeden harcanan gerçek bir bant genişliği ve bunu görmek isteyeceğiniz yer de trafik penceresi. Bu satırlar artık “değişiklik yok” etiketi taşıyor. Bu sürümden önce kaydedilen indirmelerde karşılaştırılacak derleme numarası yok; bu yüzden onlar hakkında tahmin yürütülmüyor, olduğu gibi bırakılıyorlar: Bilinmeyen, değişmemiş demek değildir.

DuoUpdater artık uygulamalarınızı güncel tutmanın indirme açısından size gerçekte neye mal olduğunu gösteriyor. Sizin için indirdiği her güncellemeyi bayt bayt sayıyordu — ama bu sayının görünebileceği bir yer yoktu; sayı kimsenin okuyamadığı bir dosyada duruyordu. Artık menünün altındaki grafik düğmesiyle açılan bir İndirme Trafiği penceresi var; bu ayın rakamı da o düğmenin yanında yazıyor, böylece en sık sorulan soru hiçbir şey açmadan yanıtlanıyor. İçeride şunlar var: toplam, son üç ay yan yana ve aralarındaki değişim, baytların nereden geldiğinin dökümü ve neye mal olduklarına göre sıralanmış tüm uygulamalar. Birine tıklayarak aldığı her güncellemeyi, hangi sürümden hangisine geçtiğini ve o indirmenin ne kadar büyük olduğunu görebilirsiniz.

Toplam, göremediği şeyler konusunda dürüst. Homebrew, App Store ve kendi yerleşik güncelleyicisiyle güncellenen uygulamalar kendi baytlarını kendileri indiriyor ve DuoUpdater bunlara hiç dokunmuyor — bu yüzden rakam eksiksiz bir hesap değil, bir alt sınır. Bu hep böyleydi; değişen şu: Pencere artık bunu yalnızca henüz hiçbir şey kaydedilmemişken gördüğünüz boş ekranda değil, kalıcı olarak belirtiyor.

Sonradan yeniden adlandırdığınız ya da sildiğiniz uygulamaların geçmişi korunuyor. Trafik, bir uygulamanın diskte bulunduğu yere göre kaydediliyor; aynı uygulamanın iki kanalının — örneğin Android Studio Canary ve Beta — toplanmak yerine ayrı kalmasını sağlayan da bu. Bedeli ise bir uygulamayı yeniden adlandırmanın, geçmişini artık var olmayan bir adın altında bırakması. OpenAI, Codex’in adını ChatGPT olarak değiştirdiğinde bu, 30 GB’lık indirmeyi birbirinin kopyası gibi görünen iki girdiye böldü. Bu girdiler artık listenin en altında, ne olduklarını belirten bir başlık altında gruplanıp soluk gösteriliyor. Hiçbir şey atılmıyor ve toplam onları da içeriyor.

App Store’dan yüklediğiniz bir uygulamaya artık geliştiricinin kendi indirmesi sunulmuyor. Pek çok uygulama aynı anda iki yerde yayımlanıyor — mağazada ve geliştiricinin kendi sitesinde doğrudan indirme olarak — aynı kimlikle, ama gerçekten farklı derlemeler olarak. Doğrudan indirme mağaza incelemesini beklemediği için genellikle öndedir. DuoUpdater mağazadan yüklenmiş bir uygulama için önce mağazayı denetliyor, ancak bu denetim herhangi bir nedenle — kopan bir bağlantı, yanıt vermeyen bir mağaza bölgesi — başarısız olduğunda sessizce geliştiricinin sitesine geçiyor ve orada ne varsa onu sunuyordu. WhatsApp bunu “26.32.75 → 26.33.19” olarak gösterdi: gerçek bir sürüm, ama yanlış yerden. Bunu almak, mağaza kopyanızı App Store’un bir daha asla güncelleyemeyeceği bir kopyayla değiştirirdi. Mağazadan yüklenen uygulamalar artık yalnızca mağazaya göre denetleniyor.

Bir uygulamanın güncelleme kanalını o uygulamanın içinden değiştirmek artık hemen algılanıyor. Bazı uygulamalar normal sürümleriyle beta sürümleri arasında seçim yapmanıza izin veriyor — Surge, Tailscale, Fork, OrbStack, IINA, Alfred ve diğerleri — ve DuoUpdater, istemediğiniz bir derlemeyi asla sunmamak için hangisini seçtiyseniz onu izliyor. Eskiden bu değişikliği yalnızca uygulamayı kapattığınızda ya da DuoUpdater’ın pencerelerinden birini açtığınızda fark ediyordu. İkisi de insanların gerçekte yaptığını kapsamıyor: ayarı kapatmak, uygulamayı açık bırakmak ve menü çubuğuna bir göz atmak. Daha kötüsü, uygulamalar bu ayarı tıkladığınız anda değil, işlerine geldiğinde diske kaydediyor — burada Surge için bu beş dakika sürdü — bu yüzden uygulamayı kapattığınızda bile ayar çok erken okunabiliyordu. DuoUpdater artık ayarın kendisindeki değişikliği izliyor ve o tek uygulamayı bir iki saniye içinde yeniden denetliyor. Surge normal sürümlere geri döndürüldüğünde beta sürümü, bir saate kadar satırda kalmak yerine artık hemen kayboluyor.

Hiçbir yere ulaşamayan bir denetim artık her şey yolundaymış gibi görünmüyor. Tüm kaynaklar başarısız olduğunda — ağ yoksa ya da Wi-Fi simgesi her şeyin yolunda olduğunu söylerken bir proxy bağlantıları sessizce reddediyorsa — başarısız olan uygulamalar gizleniyor ve panelde “127 uygulama · güncel” yazıyordu. Bu, her şey gerçekten güncel olduğunda gördüğünüz ekranın aynısıydı ve başarısız bir denetimi başarılı olandan ayırt edilemez hale getiriyordu. Panel artık kaç uygulamaya ulaşamadığını söylüyor, neyin ters gittiğini gösteriyor ve yalnızca onları yeniden denemeyi öneriyor — denetleyebildiği her şeye dokunmadan.

A helper macOS wouldn't switch on no longer sends you to reset your whole Mac. App Store updates install through a small background item macOS asks you to approve once. When that approval was refused, DuoUpdater had exactly one explanation for it: the system's record of the item is damaged, and repairing it takes a Terminal command that clears the background-item approvals of every app on your Mac. That is one cause among several, and macOS never says which one applies — the ordinary one is that the switch is simply off. The message now leads with that instead: turn DuoUpdater on under "Allow in the Background" in Login Items & Extensions, and DuoUpdater opens the pane for you. The Terminal reset is still written down, as the fallback for when DuoUpdater isn't listed there or switching it on changes nothing. The message also stopped running off the edge of its card.

Two Settings options read on one line again. The two options under Install routing — how App Store updates install, and what happens to apps that ship their own updater — used to put their name to the left of the menu, the way options do everywhere else on macOS. Adding six languages moved both names above their menus instead, because a German or Russian option can be long enough to run off the end of the line, and the safe layout was applied to every language at once. Each row now decides for itself: the name stays beside the menu as long as the menu leaves room for it, and only moves above when the text genuinely needs the width. In English, Japanese and Chinese both rows are back on one line; in German and French they stay stacked, which is the only way they fit without being cut off.

DuoUpdater now speaks Russian, Simplified Chinese, Japanese, German, French and Spanish. It follows whatever language your Mac is set to, and switches with it — there is nothing to turn on. If you would rather read it in a language your Mac isn't set to, macOS can do that per app: System Settings ▸ General ▸ Language & Region ▸ Applications. Everything the app writes itself is translated: the menu-bar panel, every Settings page, the setup window, the notifications, the alerts, and the small print under each option. Counts are handled the way each language actually handles them rather than by bolting an "s" onto the end, which matters most in Russian, where "1 update", "2 updates" and "5 updates" take three different endings — and in Chinese and Japanese, where they take none.

Two things stay in English on purpose. Release notes are the vendor's own words, so they arrive in whatever language the vendor wrote them in — translating them would mean rewriting what a developer said about their own release. And the duo command-line tool stays English, the way command-line tools generally are.

An App Store app that was open when you updated it comes back again. Last release drew a line in the wrong place. It was fixing something real — an update that failed, or that you cancelled, could bring an app back to life minutes after you had closed it yourself — but it decided whether to reopen by asking whether someone had answered a quit prompt. Almost no App Store update shows one: the prompt only appears on a route DuoUpdater stopped using a while ago. So from 0.3.53, updating an App Store app that was running closed it and left it closed, with nothing on screen to say why. The question it asks now is whether the update actually landed, which is the thing that decides whether a quit is coming at all. This is verified against a real App Store update rather than reasoned about: the store terminates your app to replace its files and never brings it back — despite its own prompt promising that it will.

DuoUpdater now tells you when App Store is waiting on you. The store cannot replace an app while it is open, so it puts up a "cannot be open during installation" prompt and waits — with no time limit, holding the update and a download slot for as long as it takes. That prompt is a small panel inside App Store's own window, which may be sitting on some entirely unrelated page; App Store bounces its Dock icon a few times and gives up; and DuoUpdater lives in the menu bar with no Dock icon to bounce. An update could sit there indefinitely with nothing anywhere telling you a click was needed — one took four and a half minutes here, ending only because someone thought to look. The row now says what is being waited for, from the moment the update starts.

The dot that marks an app as open no longer lags behind. macOS does not reliably announce that an app has launched — some apps never trigger it at all, while quitting is always announced. DuoUpdater listened only for those announcements, so a row could insist an app was closed while its window sat in front of you, and only correct itself when some unrelated app happened to open or quit. It now re-derives which apps are running whenever it rescans, which includes the moment you open the menu.

Two things a review caught before you did. The warning that an update was applied without a rollback point was being erased before it could be read: restarting an app cleared the whole note, and restarting after an update is the default. It is now retracted only by whoever wrote it. And Update All could refuse to restart an app — telling you its own updater had a version staged and waiting — when nothing was staged at all: it compared what was on disk now against a build number recorded before the install, so an app whose version name had not changed looked like a conflict.

An app that already downloaded its own update is no longer asked to download it again. Plenty of apps fetch their next version quietly in the background and hold it until you next quit them — that's the "relaunch to update" state you see inside Claude, TablePlus and others. DuoUpdater has always recognised that state in Electron apps and offered you Relaunch instead of an Update, because the bytes are already on your disk. Apps built on Sparkle, which is most of the rest, were invisible to it: TablePlus sat there with a 133 MB download and an unpacked 382 MB copy of 26.9.11 in its cache, while its row offered to fetch 26.9.11 for you all over again. Those apps are now recognised too — the row offers Relaunch, and nothing is downloaded twice.

One thing it deliberately won't do is offer Relaunch for an older build. An app can be holding a version behind the one you have, which happens when a vendor releases to some people before others and DuoUpdater installed the newer one first. Relaunching there would quietly move you backwards, so the row doesn't offer it — and DuoUpdater won't restart the app for you either, because that restart is the exact signal the app's own installer is waiting for.

Three ways an update could go wrong that a review caught before you did. An App Store update that failed, or that you cancelled, could bring the app back to life minutes later — you would quit it yourself and it would reopen, because DuoUpdater had noted "this app may need reopening" before anything had actually closed it. It now only reopens an app when a quit was genuinely asked for. Separately, the check added last release to stop an app's own updater undoing ours compared only the version name: a vendor that ships several builds under one version number slipped straight past it, which is the same failure it was written to prevent. It now compares the build number too. And an app's own updater is no longer assumed to be waiting just because a downloaded copy is sitting in its cache — Sparkle leaves those behind for ten days after an interrupted install, which could have left a Restart button that did nothing but explain itself.

Same changes as 0.3.51, reissued so it can actually reach you. 0.3.51 went out carrying the same internal build number as 0.3.50. That number, not the one in the version name, is what an update check compares — so anyone already running 0.3.50 was told they were up to date and never offered it. This release carries the changes below under a build number that is properly newer. If you are reading this on 0.3.51, nothing about the app changed between the two.

An update that kept coming back. ChatGPT would offer a new version, install it, restart — and a minute later the same update was waiting again. The install was never the problem: the new version really did land on disk. What happened next is that ChatGPT's own updater put a different one back. There are two lists involved, and DuoUpdater was reading the wrong one. The first is everything the vendor has published; the second is what the vendor is actually handing out to your Mac today, which can be an earlier build while a release is still rolling out. DuoUpdater was reading the published list — the same address ChatGPT itself is configured with, which is what made it look right — and offering you a build the vendor was still holding back. ChatGPT had meanwhile downloaded the build it was being offered and parked it, waiting for the app to close. Restarting to apply our update is what closed it. DuoUpdater now asks the same question ChatGPT's own updater asks, so the two agree on what the current version is.

Restarting an app no longer applies somebody else's update. That collision isn't unique to ChatGPT. A lot of apps download their next version quietly and install it the instant you quit them — the "relaunch to update" state you've seen in Claude, TablePlus and others. They'll wait hours for that quit; one was observed holding on for nearly seven. When DuoUpdater restarts an app to put its own update into effect, that restart is exactly the signal they're waiting for, and theirs runs second. Before restarting, DuoUpdater now checks whether anything is waiting, and what version it holds. If it's the same version — which is the common case, and harmless — nothing changes. If it's a different one, the app isn't restarted: the row says what's waiting and leaves the choice to you, rather than quietly swapping in a build you didn't pick.

An App Store update no longer leaves your app closed. Updating an app you have open through the App Store means closing it — the store's own installer quits it to replace the bundle, and doesn't open it again afterwards. DuoUpdater knew to reopen it, but only if you'd answered its own "quit to finish updating" prompt. Answer the identical prompt in the App Store window instead, or take an update that raises no prompt at all, and nothing remembered that your app had been open. It updated correctly, said "Updated ✓", and your app was simply gone — with no restart offered, because by then there was no running app to restart. What decides now is whether the app was running when the update started, which is the thing that was actually true, rather than which window you happened to click in.

豆包输入法 now gets checked, and shows its release notes. It was in the list — DuoUpdater looks inside /Library/Input Methods — but nothing anywhere knew where to ask about it, so the row sat blank forever and read like "nothing to do". It now reads the same endpoint the vendor's own download button reads, and compares the same build number the vendor versions by — so even a re-release that keeps the version name unchanged shows up, rather than passing as the version you already have. The release notes come from the feed the input method's own updater polls, laid out as a proper list rather than a link to a page that doesn't exist. As with 微信输入法, DuoUpdater will tell you a new version is out but will not install it for you: an input method is registered with the system by its installer, not merely copied into place, and quietly swapping the bundle is how you lose your personal dictionary.

Zed's release notes come back instead of an error. DuoUpdater asks GitHub about a lot of apps, and GitHub lets an unidentified caller ask only sixty questions an hour from one network — a budget every GitHub-hosted app on your machine shares. Zed's notes were the ones losing that race, and the panel showed a failure rather than the notes. Those requests now carry the GitHub token you saved in Settings ▸ GitHub, or the one the gh command-line tool already holds if you use it, which lifts the limit far out of the way. Without a token nothing gets worse: Zed's notes now come from a single, smaller source that covers both its channels, where before each one fetched its own web page.

Notion's release notes are about the app you have. They were being read from Notion's product announcements — the page that introduces features as they launch. Those posts are titled by feature, not by version, so nothing on that page ever lined up with the version number on Notion's row, and the notes for the update you were being offered were never there to find. They now come from Notion's own "What's new" page for the Mac and Windows app, where the versions are the ones you can actually compare against.

Some release notes were quietly incomplete, and no longer are. A release's final line could go missing from ChatWise's notes. Two of Postman's releases were cut off mid-sentence — both at the exact point where the text contained a quotation mark. Six apps' notes are now read from the same data the vendor's own site is built from, rather than picked out of the finished page, which is both sturdier and how those two ended up whole. HBuilderX is the one trade-off: its notes now come from the official release document, which covers the HBuilderX editor itself and not the bundled uni-app and uniCloud module logs, so its entries are shorter than before — the same releases, in the vendor's own words, minus the parts about other products.

Release notes that arrive inside an app's update feed are laid out properly. A good number of apps ship their notes as a small piece of a web page tucked inside the feed their updater reads. DuoUpdater used to hand that straight to the system's HTML renderer, which produced a serif font nothing else in the app uses, bullets indented into the margin, and — the part that mattered — a long list could be cut in half, with everything after the cut silently absent. Those notes are now read into the same list layout the rest of the panel uses: right font, right indentation, and nothing dropped. Where the markup is too tangled to be sure of, DuoUpdater leaves it to the old renderer rather than risk showing you part of a list as if it were all of it. TablePro benefits most — its notes had stopped being found at all.

Four more apps show their release notes properly, instead of an embedded web page. Alcove, Docker, Kiro and Waku each publish their notes somewhere a program can read them — Alcove and Docker on their own sites, Kiro as a feed, Waku on GitHub — but DuoUpdater was showing you the web page instead, which meant the vendor's fonts, the vendor's navigation, and no way to move between versions. They now read as proper entries in the list, the same as everything else. Kiro's feed covers three separate products; only the notes for the app you have installed are shown.

A release whose notes are written as sentences no longer vanishes. Some releases don't have a bulleted list of changes — they have a line or two of prose, sometimes only "no public-facing changes in this release". DuoUpdater understood lists and nothing else, so those releases were skipped entirely: if you happened to be running exactly that version, the panel had no entry for it at all, as though your own build had never shipped. They're kept now. Where the notes are laid out in a way that still can't be read cleanly — a table, mostly — the page is shown as before rather than half-converted into something misleading.

Antigravity IDE gets checked. It's a separate app from Antigravity, with its own version, and it was in your list but nothing ever checked it — the row just sat there with no version to compare against and no way to find out. It's checked now. DuoUpdater won't install it for you; it will tell you when a new version is out and where to get it.

DuoUpdater tells you when it updated itself, and what changed. It installs its own updates quietly, on purpose — it waits until you're away from the machine and swaps itself without asking, because a tool that interrupts you to talk about itself is getting in the way of the work it's supposed to protect. The cost was that you'd end up on a new version you never agreed to and never saw the notes for: every other app in your list has a "what changed" panel, and the one app that changed under you in silence was this one. Now the menu says so once, and opens its release notes. It's shown until you read it rather than for a set time — the update this is for is the one that landed while you were asleep. A fresh install doesn't get told it was updated, because it wasn't, and going back to an older build on purpose doesn't either.

And you can read those notes any time. The ✨ button at the bottom of the menu opens every release DuoUpdater has ever shipped, with the one you're running marked in the list.

Switching an app's update channel in that app is noticed straight away. Some apps let you choose between their stable and pre-release builds in their own settings — Tailscale, Fork, Surge, OrbStack, TablePlus, CleanShot, IINA, Alfred, DuoPaste. That choice lives in the app's own preferences, where nothing tells DuoUpdater it has changed, so switching from a beta track back to stable left the row still comparing you against the beta — and still offering it — until the next scheduled check, up to an hour later. DuoUpdater now re-reads that choice when one of those apps opens or quits, and when you come back to its own window, and re-checks just the app that changed.

Tailscale's Release Candidate track is one of the choices DuoUpdater understands. Tailscale publishes three: stable, release candidate, and unstable. Only two were known here, so a Mac opted into release candidates was quietly checked against stable instead, and reported up to date whenever a candidate build was newer than the stable one. All three are now checked against the track you actually chose.

Confirming a quit late no longer leaves the app updated but closed. Some apps guard their own quit with a dialog — Claude, for one, asks about an active conversation — and that dialog could land in the middle of a Relaunch. DuoUpdater rightly refuses to sit there while you decide (and it still won't force the quit past your unsaved work), but once it stepped aside it also stopped listening. Answer the dialog a minute later and the quit went through, the app's own updater swapped in the new version — and then nothing happened: some updaters deliberately don't reopen the app after installing, DuoUpdater was no longer watching, and you were left staring at an app that had simply closed. It now leaves a note for itself when it steps aside: if you do confirm that quit within the next few minutes, it waits for the update to finish landing and then brings the app back, in front if that's where it was. The note expires after a few minutes, so a quit hours later is just you closing the app, and stays that way.

The same late answer now works for a plain Restart. A save prompt could block the Restart button (and the automatic restart that follows a one-click Update) in exactly the same way, with a worse ending: the new version was already on disk, so when you finally dismissed that prompt and the app closed, DuoUpdater's next look around decided there was nothing left to restart and quietly dropped the badge too — an app closed, an update half-applied, and no trace that anything had been asked for. Answering a save prompt within a few minutes now finishes the restart it belonged to, and the app comes back on the new version.

App Store updates tell you they're waiting, and don't leave the app closed if you answer late. When the App Store finishes downloading an update for an app you have open, it asks for that app to be closed before it can install — and DuoUpdater waits, indefinitely and on purpose, for you to say when. Until now that request lived only inside the menu: if you never opened it, an update sat downloaded-but-not-installed all night, and background checks waited with it. It now also arrives as a notification with a Relaunch button, so you can answer it without hunting for the row. And if your app puts up a save prompt of its own after you tap Relaunch, answering it minutes later no longer strands the app closed — the update lands and the app is reopened, the same as if it had quit right away.

The list holds still while you are clicking down it. Every finished update used to re-sort the list on the spot: the app that just landed left the pending group, or picked up a Restart badge and jumped to the top, and everything below it slid up a row — under the pointer of anyone working down a list of Update buttons. Click the top one, go for the next, and the next one had moved. Now the order is held from the first click until the whole round is done: an app that finishes shows its confirmation in place, nothing else moves, and the list settles once at the end, when the finished apps drop away as they always did.

One less version number on a row that needs a restart. An app with an update waiting and an earlier update still needing a restart tried to print all three versions on one line — installed, available, and the older one still running. On four-part versions like Chrome's it did not fit, and the line was cut off exactly where the digits started to differ, so the part left visible said nothing at all. The line now sticks to the comparison that matters — what you have and what is offered — and the running version moved to the row's tooltip, where it fits.

No more Dock icon. DuoUpdater is a menu-bar app — everything it does starts from the icon up there — but it also held a Dock slot, and the only thing that slot ever did was open the same window the menu bar opens. It now runs from the menu bar alone. If you would rather keep the Dock icon, Settings ▸ General ▸ "Hide the Dock icon" turns it back on, and with it the badge that shows the number of pending updates; hidden, that count lives on the menu-bar icon instead.

An app you ignored is no longer checked at all. Ignoring an app hid its row, but every check still asked its vendor after it — one network request per app per round, spent on an answer nothing would ever be said about. On an unauthenticated GitHub budget of sixty requests an hour, those were requests taken from the apps you do watch. Ignoring now means not asking, which is what "hide an app from update checks" always claimed. Naming an app on the command line still checks it, and so does asking for hidden rows, since both are you asking about that app specifically. Skipping a version is unchanged and still checked — whether the version on offer is still the one you skipped can only be known by asking. And un-ignoring re-checks that app on the spot, instead of leaving the row blank until the next round comes due.

An app you ignored stops notifying you. An app that updates itself leaves a "Relaunch to apply it" reminder in Notification Center and repeats it every few minutes until you act on it. That reminder never consulted the ignore list, so an app you had ignored went on sending it — hidden in DuoUpdater's own list, still arriving every five minutes, with nothing on screen to explain where it was coming from. Ignoring an app now silences those reminders and clears any already waiting in Notification Center. Skipping a version does the same for that version.

A download no longer squeezes the app's name or its version off the row. While an app was downloading, the progress bar and its percentage claimed enough of the row that a long name wrapped onto a second line, a long date-style version was clipped at both ends to something unreadable, and at 100% the percentage itself broke across two lines. The row now measures what the name and the version actually need and fits the progress readout into what's left: the bar gives way to a compact ring, and the percentage stays. Nothing is given up until there is genuinely no room for it.

An update no longer looks like it fired twice. With one update pending, installing it briefly emptied the list: the row dropped out the moment the new version reached the disk, the "Everything is up to date" placeholder took its place and jumped the window's height, and then the row reappeared saying "Relaunching...". Nothing was actually wrong underneath — the app still had to be restarted to run the new code — but it read as though something had happened twice. The row now stays where it is from the click through to the relaunch. The step that used to announce "Done" while the app was still being restarted says "Installed" instead; "finished" is left for the confirmation at the end, where it belongs.

The workbench sidebar follows the arrow keys again. Holding an arrow key walked the selection off the edge of the list and left it there, moving through apps that were never drawn and not catching up when the keys stopped. The selected app stays in view.

Moving through that sidebar is quicker. Every keypress was re-deriving, once per app per row, a fact about the whole list that had not changed — on a machine with 124 apps that came to about fifteen thousand redundant filesystem-path lookups per keystroke. It is derived once now. Fast key repeat can still outrun the list; there is more to do here.

An App Store update says "Update", not "Get". When the background helper has not been approved there is no way to install an App Store update in place, so the row hands off to the App Store app instead — but the button for that read "Get", which is what the store says about an app you do not own yet. Every row that reaches it is an app you already have, with an update waiting. It says "Update" now, and when the helper is what is missing the tooltip says so, since approving it in Settings is what turns those updates into one click.

The action column lines up. A checkmark or a small badge at the end of a row was centred in its slot while a wide button sat flush against the row's edge, so the right-hand column read as ragged — and visibly out of line with the Homebrew row pinned below it. Everything ends on the same edge now.

WeType (微信输入法) now reports the version you actually have. Its version was being read off the name of the vendor's installer file, which turns out to carry the installer's version rather than the app's — the installer is a small downloader that fetches the real app separately, and the two numbers drift apart. DuoUpdater now reads the same manifest the vendor's own installer reads, so the version matches your copy and new releases show up when they ship. WeType still has to be updated with the vendor's installer rather than in place: replacing the bundle skips the input-method registration step and was found to lose settings.

A beta build can never arrive on the stable channel. The fix in 0.3.44 looks further back through an app's releases when the newest one has no Mac build attached. That wider search could also see the developer's beta and release-candidate builds, which the normal check never shows you — so an app that happened to publish a release without its Mac download could have offered you a beta. Nothing had actually hit this, and now nothing can: the wider search only ever considers finished releases.

Notion's release notes are readable again. Notion restyled its releases page and DuoUpdater could no longer pick the posts out of it, so the notes fell back to showing the raw web page. They render as proper entries again.

PureMac's updates are visible again. The developer publishes a separate command-line tool from the same place as the app, and its release was being read as if it were the app — as version 1.0.0, which looks older than what you have installed, so the app reported itself up to date and every real update stayed hidden. It now reads only the app's own releases.

An update that only ever existed for phones no longer sits in your list. Some apps share one version number across Mac, Windows, Linux and mobile, and sometimes a release goes out to the phones alone — the version number moves, but no Mac build is ever made. DuoUpdater was reading that as a Mac update, which left an update you could never install and that never went away. It now looks for the Mac download itself rather than trusting the version number, so those releases are correctly ignored. LocalSend was the app affected; its row now reads as up to date, which it is.

LocalSend installed from its own website updates in one click. Now that the right release is identified, its Mac disk image can be installed in place like the rest.

An App Store copy is never replaced with a build from elsewhere. A few apps are published both on the Mac App Store and as a download from their developer, under the same identity — LocalSend is one. Those are genuinely different builds, and the App Store's copy has to keep updating through the App Store. DuoUpdater now leaves those copies to the store instead of ever offering the developer's build over them.

Updates that the wider ecosystem never picks up get flagged for us. Our nightly recipe sweep could only tell whether an app's version could still be read, not whether the answer made sense for a Mac — which is why the LocalSend problem had to be spotted by hand. It now also compares against Homebrew, and raises a flag when we are reporting a version that nobody else has packaged long after it was published. Nothing about this is visible on your Mac; it is how this class of mistake gets caught by machine next time.

Package updates are read more thoroughly before they are opened. The check added in 0.3.41 asks an installer package where it installs, and refuses one that will not say. It was reading only the summary the package publishes about itself; it now also reads the package's own file list, which is what the installer actually follows. That means a package that keeps quiet in its summary is still understood instead of turned away. Every app that updates this way was re-checked against its real installer, and none of them changed.

A download link that stays broken now gets noticed. When a vendor's server has a bad minute, DuoUpdater waits it out rather than crying wolf — but that was letting a download link that had been broken for good slip by unremarked, because it looked the same as a bad minute on any single check. It now tells the difference: brief trouble is still ignored, trouble that lasts is flagged and fixed. Nothing changes on your Mac; this is about broken apps getting repaired sooner instead of quietly staying broken.

Release notes can't be pulled down to an insecure page. A vendor's notes page is loaded over a secure connection, but nothing stopped that page from redirecting itself to an insecure one. Now it can't.

Updating OneNote no longer installs the whole of Microsoft Office. OneNote's update was being fetched from Microsoft's combined Office installer, which puts Word, Excel, PowerPoint, Outlook and OneDrive on your Mac along with it. If you keep OneNote on its own, that was five applications you never asked for. It now downloads Microsoft's standalone OneNote update, which installs OneNote and nothing else.

Package updates are checked more strictly before they are opened. An update that arrives as a macOS installer package now has to say where it installs, and has to name the app you are updating. A package that will not say is refused rather than let through. Every app that updates this way — Office, Edge, Teams, OneDrive, Tailscale, ToDesk, AweSun and the rest — was checked against its real installer first, so this should never fire on a normal update.

Telegram's one-click update stops vanishing when Telegram's servers hiccup. Working out where to download Telegram from needs one extra request to their servers, and those servers were intermittently refusing it — a few minutes at a time, then fine again. When that happened the update was still detected, but the Update button quietly disappeared for that check and you had to go to the website yourself. DuoUpdater now retries before giving up, so a brief hiccup no longer costs you the one-click install.

Package installers are checked against the app they claim to update. Some updates arrive as a macOS installer package, which runs with administrator rights the moment you confirm it. Until now the only check was that the package came from the same developer as the app being updated — which would have let any package from that developer through, not just the right one. DuoUpdater now also reads where the package says it will install and refuses it if that is not the app you are updating. Nothing changes for a normal update; this only ever fires on a package that does not belong.

Release notes only open over a secure connection. The notes pane loads a vendor's own page for some apps, and one of those pages was still being fetched over plain http. Those pages now have to be https, and a handful of other malformed addresses are refused outright rather than loaded.

Fewer apps can go silently missing after a vendor renumbers. Zotero's jump to 10.0 in 0.3.37 exposed a whole class of this: an app disappears from the update list, with no error, because the vendor changed how many numbers are in its version. Twenty-one apps — among them VS Code, Discord, Obsidian, Figma, WhatsApp and GIMP — no longer depend on that staying the same. The rest were checked and deliberately left alone, because for those a looser check would risk reading the wrong number off the page.

The download percentage no longer spills out of its row. While an update downloaded, the number next to the progress bar sat too far right — clipped by the edge of the list instead of lining up with everything else in the column — and there was more empty space between the bar and the number than there needed to be. Both are fixed; the percentage still holds a fixed width, so the row stays steady as it counts up to 100%.

Zotero 10 shows up as an update again. Zotero numbered its new major release 10.0 — two numbers where every previous release had three — and DuoUpdater's check for it quietly stopped recognising the version. Nothing looked wrong: no error, no failed check, Zotero simply never appeared in the list, so anyone still on 9.0.6 was never offered the upgrade. It is recognised again, and the one-click install is unchanged.

A package update that leaves the old copy running now offers to restart it. Some updates install as a package handed to macOS's own installer, and when that finished it left the previous copy still running the old version — with no prompt, so you had to notice and quit it yourself. DuoUpdater now spots that and offers a Restart, the same as it already does for other kinds of update. It only offers one when a copy that was open before the install is genuinely still running the old code — if the installer (or you) already relaunched the app, or it wasn't open, nothing is shown.

WeChat DevTools (微信开发者工具) is checked for updates now — Stable, RC and Nightly each on their own track. It used to sit there as "unknown": since version 2.02 the app reports Electron's stock identity on disk, calling itself version 36.6.0, and all three channels look identical from the outside. DuoUpdater now reads the real version and channel out of the app's own configuration, so whichever track you installed is the only one you are offered — a Nightly install is never handed a Stable build, or the other way round. Updates install in one click, and the release notes for the exact build show up in the window.

App Store updates stop breaking every time DuoUpdater updates itself. Replacing the app left the background helper from the previous copy running, and macOS then never started the new one — so the helper looked switched on while every App Store update failed talking to a copy that no longer existed. Only a restart cleared it. The helper now steps aside when it has been idle for a minute, which means a replaced app heals itself by the next update. For a Mac already in that state there is a Restart Helper button in Settings → Diagnostics and on the update that failed; it asks for an administrator password and takes effect immediately, no restart.

Diagnostics can tell you whether the helper actually works. "Enabled" only ever meant "switched on", and the difference between that and "answering" showed up as a failed update. A Check button now says which one you have, in those words.

Backups: choose what to delete. "Clean Up Now" only removed backups belonging to apps you had uninstalled, so on most Macs it deleted nothing and said nothing while the size stayed put. It now opens a list — every backup with its app icon, the update it would roll back, its size and date — with everything selected and anything you want to keep unselectable. The button says how much the selection frees. Backups whose records had gone missing were previously counted in the total but impossible to see or remove; they are listed too, marked unusable.

A silent self-update no longer leaves DuoUpdater sitting in front of you. When it applied its own update in the background, macOS brought back the windows that had been open — and bringing a window back also brings the app forward, so an update nobody asked for landed on top of whatever was being worked on and stayed there. DuoUpdater now notes which application was in front before it replaces itself, and gives the front back to it on the way in. Windows still return exactly as they were.

Docker updated to the version it said it would. Docker publishes its releases in an order that puts an older one first, and DuoUpdater read the newest version from that list while taking the download link from the top of it — so it fetched 574 MB, kept a backup, installed 4.86.0 over the 4.86.0 already there, and went on offering 4.87.0. Downloads are now matched to the version each entry declares for itself, whatever order a vendor lists them in.

An update that changed nothing is no longer reported as done. The check that runs immediately after installing already knew Docker hadn't moved; it was overruled by a success message and an "Updated ✓". When an update we applied ourselves leaves the app exactly as it was, that is now shown as the failure it is, naming what was installed and what is still on disk.

Silent self-updates no longer wait for an empty screen. With the switch turned on, DuoUpdater would hold its own update back while any of its windows were open — which, for a window people leave open, meant waiting until the app was quit. Open windows no longer delay it (macOS brings them back after the restart), while a DuoUpdater you are actually using still does: it waits for the keyboard and mouse to go quiet before restarting itself.

Installing DuoUpdater's own updates silently now actually is silent. The switch introduced in 0.3.30 downloaded the new version in the background and then still asked before applying it — the one thing it was meant to spare you. It now applies the update itself, at a moment when doing so interrupts nothing: no check or install running, nothing waiting to be relaunched, no DuoUpdater window open, and you working in another app. It restarts itself there, without a prompt. Until such a moment arrives it simply waits, and if none ever comes the update is still applied when you quit — so the wait can delay a version, never lose one. Leaving the switch off is unchanged: you are asked, as before.

An App Store update no longer blames you for a permission you already gave. When DuoUpdater is replaced while it is running — by its own update, or by a rebuild during development — the previous copy of its background helper keeps holding the slot the system reserves for it, while macOS still reports the helper as switched on. Every App Store update then failed with a red line telling you to go turn it on in Login Items, where you would find it already on, and the button offered beside that message quietly did nothing. That state is now recognised and named for what it is, along with the one thing that clears it. DuoUpdater no longer tries to repair it by re-registering the helper: that was measured to switch the background item off and leave it unable to be switched back on.

DuoUpdater can now update itself without asking. Settings → Updates has a new switch for installing DuoUpdater's own updates in the background, taking effect the next time it restarts. It stays off unless you turn it on, and the prompt-and-wait behaviour is unchanged for everyone who leaves it alone.

Its own updates are noticed within the hour. DuoUpdater checked for its own new versions once a day, so a release could sit unseen for most of a day. It now checks hourly.

Eight more AI desktop apps are tracked. OpenCode Desktop and OpenChamber follow their GitHub releases; Wispr Flow, Granola, Comet, Windsurf, AionUi and Msty are read from their vendors' own version endpoints.

Installer packages stay the same package from verification to macOS Installer. DuoUpdater now seals the selected installer before closing or replacing any existing Installer window, checks it again immediately before opening, and refuses the hand-off if another local process changed the file in between. This preserves Sparkle's signature guarantee all the way to the package you see in Installer without making the menu-bar UI pause while large packages are checked.

Multi-installer disk images handle more real-world package names without guessing. Versioned beta, release-candidate, Apple Silicon, and universal package names are recognized when they identify one unique product, while similarly named helpers and sibling products remain excluded. Older bundle-style macOS installer packages are supported by the same integrity checks.

Failed installer downloads are cleaned up immediately. A bad signature, unreadable disk image, cancelled download, or rejected package no longer leaves a full installer sitting in temporary storage until the next day's cleanup.

Signed Sparkle updates that arrive as installer packages now work. A few apps publish a perfectly valid, cryptographically signed .pkg instead of an app archive. DuoUpdater offered those updates, downloaded them, and then tried to unpack the package as though it were a zip — an update that could never finish. They now go to macOS's own Installer, after DuoUpdater verifies both the Sparkle signature on the download and the installer identity inside it.

A disk image containing several installers is no longer allowed to make a guess. Some vendors put a main installer, helpers, and sibling products in one image. Matching on a fragment of the filename could pick a helper simply because its name contained the app's name. DuoUpdater now opens a package only when it is the sole choice or can be identified uniquely; otherwise it stops and leaves the decision to you instead of presenting the wrong installer.

The App Store helper is more tightly scoped to your login session. The privileged helper now takes the account identity directly from macOS's authenticated XPC connection and refuses a request whose claimed user does not match. Normal App Store updates behave exactly as before; the change closes off a signed client from redirecting the helper into another user's session.

Release notes show their formatting instead of its punctuation. Notes that come from a project's GitHub release were rendered exactly as written — **bold** with the asterisks, links as [text](url). Bold is now bold and links are links. This affected every app whose updates come from GitHub, which is most of the open-source ones.

Arrow-keying down the app list no longer crawls. Holding an arrow key felt like moving one row at a time through mud, and long release notes made it worse. Three things were doing it: a permission check on every app in the list ran again for every row drawn; the notes for whichever app you passed through were re-parsed on each keypress; and a long set of notes — one project's runs to 54,000 characters — was laid out in a single pass, which froze the window for about two seconds. The check is now computed once per list, parsed notes are kept, and long notes are laid out only as far as you have scrolled. Worst measured stall went from ~2.1 s to under 0.6 s, and what remains is the deliberate pause before the detail pane catches up rather than a freeze.

Input methods are never updated by replacing the app, and 微信输入法 (WeType)'s one-click from 0.3.25 is withdrawn. Settings were lost on a Mac during the work that added it. What we can show is that the copy in the protected system folder was never actually replaced by DuoUpdater — but an older copy of the input method was installed and launched elsewhere on that machine while testing, inside the window where the settings were rewritten. Nothing here is proven, and an input method's dictionary is not something to test a theory on: WeType now reports its version and sends you to the vendor's installer, which registers the input source with the system — a step that replacing the app bundle skips, and the likely reason that Mac then appeared twice in WeType's own device list.

The refusal is not specific to WeType: DuoUpdater no longer offers a one-click for anything installed as an input method, whichever vendor it comes from. Those apps still report their versions and link out.

Three more apps now report their updates, and all three install with one click. Hidden Bar, XQuartz and EasyFind were sitting in the list as a grey "unknown".

Hidden Bar is the interesting one: it ships with an update feed configured, so from the outside it looked like it was already covered. The feed answers, and is well-formed, and contains no releases at all — which is indistinguishable from a healthy feed until you look inside it. Its version now comes from its release tags instead. EasyFind ships no updater at all, so a copy installed from the vendor's site had no way to learn about new versions.

XQuartz installs through the system installer rather than by replacing the app, because it is not just an app: it lays down a whole X11 stack, and swapping only the app bundle would leave the rest at the old version. macOS asks for the administrator password itself, as it does for any package.

Thirteen more apps now report their updates, twelve of them with one click. GIMP, MongoDB Compass, Meld, Emacs, Tor Browser, Zotero, GrandPerspective, TigerVNC, qBittorrent, Opera, LibreOffice, pgAdmin 4 and Telegram Desktop were all sitting in the list as a grey "unknown" — installed, with nothing to say about them. Each was worked out by downloading the vendor's actual build and reading its identity out of it, so a one-click only appears where the download is signed by the same developer as the copy you already have. The exception is qBittorrent: its own build isn't signed by an identified developer at all, so it reports its version and sends you to the project's page.

Opera, LibreOffice and pgAdmin 4 nearly joined that exception. All three publish nothing but a directory listing, and listings sort alphabetically — "100" comes before "99" — so the newest release is not the first one on the page. Reading the version was never the problem; building a download link was, because the obvious way to build one would have picked whichever release happened to be listed first. They now download the release that was actually compared. That is the one mistake a signature check cannot catch for you: an older build of the right app, signed perfectly.

1Password and Inkscape now install with one click too, and both were previously written off. 1Password's official download turns out to be a small installer program rather than the app — signed and notarised by 1Password, so every safety check passes it, and installing it would have replaced your password manager with its own installer. DuoUpdater now fetches the package that installer itself downloads. Inkscape's download page hands out its file through a one-time link that changes with every release; the same file also sits at a plain, predictable address, which is what gets used.

微信输入法 (WeType) now installs with one click. It lives in a folder only an administrator can write to, which is why it used to only report its version. It now goes through the same administrator prompt as any other app in a protected location.

Release notes for Opera, Inkscape and 1Password. Opera publishes one page per major version, Inkscape one wiki page per release, and 1Password a feed — all three now render as proper change lists in the app instead of a link out. 1Password's version and its notes both come from that feed now, which is a published interface, rather than from scraping the page beside it.

Discord's version check works again. Discord moved its downloads to a different server and the check was still looking at the old address, so DuoUpdater quietly reported "no version" for Discord Stable while everything else kept working. It now keys off the part of the address that names the release channel, which is the part that actually has to be right.

Fifteen more apps now report their updates, and all but one install with one click. Rancher Desktop, Cherry Studio, RedisInsight, Upscayl, WailBrew, Wave Terminal, Lens, Termius, Unity Hub, iStat Menus, Inkscape, Google Gemini, Antigravity, AnyDesk and Kiro were all showing as a grey "unknown" — installed, with nothing to say about them. Each one was worked out by reading the vendor's own build rather than trusting a download page: the version now comes from wherever that app's own updater looks, and a one-click only appears where the download is signed by the same developer as the copy you already have. Three of them (Google Gemini, Antigravity, Kiro) publish nothing a download page can be scraped for; their real update services answer the same questions their own updaters ask, so that is what DuoUpdater asks too.

AnyDesk in particular was written off and shouldn't have been. Its download and changelog pages both refuse anything that isn't a person with a browser, so an earlier sweep concluded the app was unreachable. The plain-text changelog on the same server answers fine — and it is what AnyDesk's own Homebrew entry has always read.

Updating an app in a location that needs an administrator password now asks, once. Most apps live in /Applications, which you can write to; a few — input methods, for one — live where only an administrator can. Those used to show an Update button that could never work. Now the button asks for the password, and if you dismiss that prompt DuoUpdater takes the hint: the row switches to Open and stops asking on every release. "Ask for administrator access again" in the row's right-click menu brings the button back. The choice is remembered for that copy of the app specifically, so declining for one install doesn't silence another.

An up-to-date Xcode beta no longer claims the vendor is behind it. Under "Show all", a row whose vendor has fallen behind what you have installed shows a muted note saying so — you're ahead, nothing to do. Xcode was getting that note while sitting on exactly the build Apple was offering: it publishes a build number plus a human label ("27.0 beta 5"), and comparing that label against the plain "27.0" the bundle reports made a release look newer than its own beta. The note now settles on the build whenever both sides have one, so the same release is recognised as the same release however it is labelled. A vendor that has genuinely fallen behind is still called out.

44 more apps now report their updates. Apps that publish on GitHub but ship no update feed of their own used to sit in the list as a grey "unknown" — DuoUpdater could see them installed and had nothing to say about them. Bruno, UTM, kitty, KeePassXC, Godot, Bitwarden, VSCodium, draw.io, Podman Desktop, Anki, Raspberry Pi Imager, LuLu, MarkEdit, Clash Verge, Freelens, Tabby, Espanso, Moonlight, SwiftBar, Sequel Ace, balenaEtcher, DB Browser for SQLite, OpenLens, Headlamp, OpenMTP, Goose, Caffeine, noTunes, KeepingYouAwake, MiddleClick and a dozen more now show a real version, and 36 of them install with one click like any other app. Which ones was decided by downloading each vendor's actual build and reading the identity out of it, so a one-click only appears where the download is signed by the same developer as the copy you already have. Seven — Alacritty, Flameshot, MarkText, darktable, OWASP ZAP, BlueBubbles and Wine — publish builds Apple hasn't notarised, so those report their version and send you to the vendor rather than installing anything. LocalSend is report-only for a different reason, corrected here after this version shipped: its builds are notarised, but its newest release attaches no macOS download at all, so there is nothing to install until the project starts publishing one again.

Apps that already carry a Sparkle feed needed nothing: they were checked as part of this sweep and were already working, which is why names like Rectangle, Maccy, iTerm2 and Telegram aren't in the list above.

An update that your Mac couldn't run is now refused rather than installed. Where a developer publishes one download per processor, DuoUpdater picks between them by the file's name — and names are not always honest: three of the apps above ship an Apple silicon build under a name that says nothing about it, or says the opposite. Before an app is replaced, its new version is now checked against the processor in your Mac, read out of the program itself instead of its name. If it can't run here, the update stops and your working copy is left exactly as it was. Nothing about a normal update changes; this is the case that used to end with an app that no longer opened.

An unanswered permission prompt no longer leaves the update check hanging. To tell a TestFlight build apart from an App Store one, DuoUpdater reads TestFlight's own database, and macOS keeps that behind the "access data from other apps" permission. Until that was answered the read didn't fail — it waited, indefinitely, for a prompt that might be sitting behind another window or might never be answered at all, and the scan behind it simply never finished. Nothing timed out and nothing said why. It now waits a few seconds and then carries on without TestFlight's side of the story; the only thing missing in the meantime is whether those particular apps came from TestFlight, and it sorts itself out on the next scan once the permission is granted.

Homebrew updates work behind a proxy. If your Mac reaches the internet through a proxy, upgrading brew packages failed with curl: (28) Failed to connect while every other update went through fine. Homebrew shells out to curl, which — unlike the rest of DuoUpdater's networking — doesn't read the proxy you configured in System Settings; it only reads proxy environment variables, and an app launched from the Dock or at login has none. DuoUpdater now passes your system proxy settings down to Homebrew itself. Nothing changes on a machine with no proxy configured, and a proxy you've already exported in your own shell still wins.

Claude's updates now show up while they're still rolling out. Anthropic releases Claude in stages: a build goes to a fraction of Macs at a time, and the public download page only catches up at the end. DuoUpdater was reading that public page, so for the whole of a rollout — most of a day, in the case of 1.30096.5 — it told you Claude was up to date while Claude itself had already quietly downloaded the new version and was waiting for a relaunch. It now also asks the same endpoint Claude's own updater asks, which answers for your Mac specifically, and offers whichever of the two is further ahead. Nothing about which build you're offered has changed: it is either the public release or the one your Mac was already allocated. Claude also gains real publication times, so its releases now appear in the Release Log with the moment Anthropic shipped them rather than an estimate.

A superseded package update no longer leaves its window sitting there. Updates that go through macOS's own installer — Microsoft Office, AweSun, ToDesk — open an Installer window and then wait for you. If you left one open and a newer release came along, installing that one opened a second window, and they stacked up. The older window is now closed once its replacement is ready, and its download cleaned up with it. A window that's mid-install, or asking for your password, is left strictly alone.

duo says which copy is which when two apps share a name. Naming an app that is installed twice — two Xcode betas, say — printed both candidates as a bare "Xcode" and told you to name one exactly, which matches both again. The listing now carries each copy's version, and when the matches genuinely share a name it asks for the path instead of repeating advice that cannot work.

"Open download page" no longer downloads a file. On apps whose page DuoUpdater knows — ToDesk and UU Remote among them — that button handed your browser the installer package instead of opening anything: the link it used was the same one the updater downloads from, so clicking it started a download you didn't ask for. The page and the package are now kept apart, and the button opens the vendor's actual download page. Where a source only ever publishes a package and no page at all — a bare Sparkle feed — there is now no button rather than one that downloads something.

The app list responds to the arrow keys again. Opening the workbench window left the keyboard focus nowhere in particular, so ↑ and ↓ did nothing until you clicked a row — and after clicking into the release notes on the right, or switching to another app and back, they stopped working again. The list now takes the keyboard when it opens and takes it back at the points it used to lose it. Typing in the search box is untouched: a search you've started keeps the caret.

The Brew section starts collapsed. Casks and command-line formulae are a side channel for most people, and having that tree open by default pushed your actual apps up the sidebar every time the window opened. It now starts closed and remembers however you leave it.

Xcode betas and release candidates are now detected, and two copies can be told apart. Xcode was a grey "v27.0" with no update information at all, and if you keep more than one build around — a current beta beside the previous one — they were indistinguishable: same name, same version, same icon. Each row now reads its real build, so an update shows as "27.0 beta 1 (27A5194q) → 27.0 beta 5 (27A5237l)". Which track a copy belongs to is worked out from Apple's published builds rather than guessed from what you named the folder, and you'll only ever be pointed at something at least as finished as what you have — a beta can be superseded by a beta, a release candidate or the finished release, never the other way round. Updating still means going to Apple: the downloads need you signed in with your Apple ID, so the row links to Apple's download page and its release notes.

Cursor's release notes are shown properly instead of an embedded web page. Cursor writes its changelog as dated posts rather than numbered releases, so the notes pane fell back to loading the website. Each post is now shown as its own entry — its date, its headline and its changes — the same as every other app with readable notes.

duo check now shows what changed when the version number doesn't. Updates that keep the same version and only move the build — Surge, the JetBrains previews — printed as "6.9.0 → 6.9.0" on the command line, which was accurate and told you nothing. It now shows the builds, matching what the menu bar has always shown.

Apps that ship their own updater are now updated directly by default. These are the ones like Chrome, VS Code, Cursor and the Electron apps — and because they are also the apps you tend to leave running all day, the old default of stepping aside while they were open meant they were almost never updated at all: the row offered to open the app and left the rest to you. DuoUpdater now downloads the vendor's own installer and applies it whether or not the app is running, then quits and relaunches it so the new version takes effect. Anything that installs background components alongside the app — Tailscale, Office — ships a package that macOS's own installer handles, so those pieces are still put in place properly. If you would rather nothing was touched while an app is open, Settings → General → Self-updating apps still has the old behaviour, and changing it back does not affect anything already installed.

An app whose developer changed its update signing key can be updated again. Apps that update through Sparkle sign each release with a key, and the copy you already have carries the matching public key to check it against. If a developer generates a new key and ships it without a hand-over release signed by the old one, that check fails for everybody — the app's own updater is just as stuck as DuoUpdater was, and the update sits there refusing to install with a signature error. DuoUpdater now recognises that specific situation: when the new download carries a different key of its own and the release was signed with it, it stops trusting the signature and falls back to the same checks it uses for apps that publish no signature at all — the download must be validly signed by Apple's developer certificates, and by the same developer as the app it is replacing, for the same app. A download that fails any of that is still refused, as is a bad signature that isn't explained by a key change. Mirage Beacon 1.3.0 was the first to hit this.

Update All no longer says a running app is finished before its restart. When an update had already replaced an app on disk but Update All was still busy with other installers, the row briefly showed a green checkmark and disappeared even though the old version was still running. The app now stays visible with its running and installed versions, explains that it is waiting for the batch restart, and offers Restart now. The completion checkmark appears only when the update is actually in effect.

Apps installed by a .pkg can now be rolled back. DuoUpdater keeps a copy of the previous version before it updates an app, so a bad update can be undone. Apps that install through macOS's own installer — Microsoft Office, AweSun, ToDesk and the like — never got that copy: the rollback was skipped for them entirely, so the one kind of update DuoUpdater can't watch land was also the one you couldn't back out of. They're now backed up like everything else.

Rollback no longer refuses apps that write inside their own bundle. Some apps keep working files in amongst their own program files — ToDesk stores its settings database and logs there, and doing so breaks the seal Apple puts on an app. DuoUpdater checked that seal before restoring a backup, so for those apps it declared a perfectly good backup damaged and refused to put it back. It now checks the copy against a fingerprint taken when the copy was made, which is the thing that actually matters: that what's being restored is exactly what was saved. Tampering with a stored backup is still caught, and still refused.

When a backup isn't possible, it says so instead of failing quietly. A few apps keep program files that your account simply can't read — EasyConnect is one — and no copy of those can be made. Rather than attempting it and reporting a failure part-way through an update, DuoUpdater now checks first, tells you which file is in the way, and updates anyway; you just don't get a rollback point for that one app.

The same app no longer appears several times over. Some apps leave a dated copy of themselves behind every time they update — DuoPaste, for one, parks a DuoPaste.backup-20260716-183428.app next to the real thing on each self-update. Those copies are complete, working app bundles as far as anything on disk can tell, so DuoUpdater listed each one as its own app: three identical DuoPaste rows, each offering the same update. Worse, taking one of those offers would have installed the new version into the backup, leaving the app you actually use untouched and creating another stray copy. Backup and duplicate bundles are now recognised for what they are and left out of the list, as are exact clones of an app found in two places. Genuinely separate installs that happen to share an identity — Firefox alongside Firefox Beta, two versions of Android Studio kept side by side — still each get their own row.

The list now reliably notices apps appearing and disappearing. DuoUpdater watches your Applications folders so that an app updating itself in the background, or one you drag to the Trash, is reflected within a few seconds. That watch could quietly stop working — nothing crashed, nothing was reported, it simply stopped hearing about changes, and the list then went stale until you reopened the window. It's now rebuilt periodically and after your Mac wakes from sleep, with a fresh scan each time, so a watch that dies recovers on its own instead of staying dead for the rest of the session.

An app that gets restarted after an update no longer jumps in front of what you're doing. When DuoUpdater updates an app that's currently running, it quits and reopens it so the new version actually takes effect. Reopening it also pulled it to the front — so an update to something sitting quietly in the background could drop a window on top of the thing you were typing into. The app's position now survives the restart: whatever was in front comes back in front, and whatever was in the background comes back in the background, still there and still updated, just not in your way. The same applies to apps DuoUpdater reopens after an App Store update. Apps that weren't running at all are, as before, updated on disk and left closed — updating an app never starts it up.

Fixes AweSun's update failing with "the server returned HTTP 404". DuoUpdater worked out where to download AweSun's installer by building the filename itself from the version number. Oray then renamed the file — the same 16.6.0 build, one letter's difference — and every attempt at the update hit a dead link. It now takes the filename straight from Oray's own download listing rather than guessing at it, so a future rename won't break it again.

An installer you've already downloaded no longer downloads again. Some apps update through an installer package that macOS opens for you to confirm. If you closed that window without finishing — or quit DuoUpdater and came back — the row went back to offering "Update", and taking it fetched the whole package a second time. ToDesk's is 375 MB. The download was on your disk the entire time; nothing was pointing at it. Those rows now offer "Install" instead, which just re-opens the file you already have. If the installer window is still open it comes forward rather than opening a second one, and the offer stands until either the download is gone or a newer version comes out — at which point the old package would be the wrong one, so the row goes back to a normal "Update".

Homebrew packages that aren't apps now show up. DuoUpdater tracked outdated Homebrew formulae, and left casks alone on the grounds that a cask installs an app, which already gets its own row. That holds right up until a cask installs no app — a command-line tool like codex, a font, a driver. Those had no row anywhere: nothing for the app list to find, and not a formula either. codex sat three versions behind without a word. They're now part of the Homebrew panel, which reads "packages" rather than "formulae" to match. Casks that do install an app are still managed per-app exactly as before, and apps that update themselves are still left to their own updater.

"Update All" now includes apps that install from a package. A handful of apps — ToDesk and AweSun among them — ship their update as an installer package rather than something DuoUpdater can swap into place on its own. Those were quietly left out of "Update All" and had to be updated one row at a time; if such an app was the only other update pending, the button disappeared altogether rather than acting on just one. They're now part of the batch, and they run at the very end: everything that updates unattended finishes first, so nothing opens a window or asks for your admin password until the rest is already done. One caveat worth knowing — DuoUpdater can't tell when macOS's installer has finished, so if two package updates come up in the same batch, both installer windows open one after the other rather than waiting in line.

Fixes updates going unnoticed for days at a time. DuoUpdater re-uses the answers it gets from each app's version feed so it isn't re-downloading the same file every few minutes. The problem was how long it trusted a stored answer: when a vendor's server doesn't say how long its reply stays valid, macOS guesses — and it guesses longer the longer that feed has gone unchanged. So the very feeds that had been quiet for a while were exactly the ones DuoUpdater stopped re-reading, and a new release could sit there for days with the app still reporting "up to date" and no error to show for it. Every version check now always asks the server whether anything changed, while still skipping the download when nothing has. OrbStack 2.2.2 is the release that surfaced this; the same blind spot applied to most apps checked directly against their vendor, including Chrome, Cursor, Claude, ChatGPT, Warp, Spotify, and Visual Studio Code.

Homebrew-managed apps no longer get stuck at the version they were on when DuoUpdater started. The catalog DuoUpdater reads to learn the latest version of a Homebrew app was loaded once per launch and never refreshed, which is invisible if you quit the app daily and wrong if you leave it running for weeks. It now refreshes periodically. As a bonus, machines with no Homebrew casks installed no longer download that 5 MB catalog at all.

Uses less memory and does less work in the background. This release is entirely under the hood — nothing about what DuoUpdater does has changed, only what it costs to leave running. Every update it downloaded used to leave a small amount of memory behind that was never reclaimed; harmless once, but it adds up over the weeks a menu-bar app tends to stay open. Separately, while the main window was open DuoUpdater re-read every installed app from disk every 15 seconds and started a system process each time to see what was running — that now happens every three minutes, since the filesystem watcher already notices a real change the moment it happens. Recording the release history after each check also used to save its file once per app rather than once per check, and release notes could be fetched more than once when the same page was already on its way in.

No more beachball while an app is relaunching. Clicking Update on another app while one was being quit and relaunched could freeze DuoUpdater for a moment — the spinning rainbow cursor, an unresponsive window, a click that seemingly did nothing. Relaunching an app now happens in the background instead of on the interface, so the rest of the list stays live and clickable throughout. The same freeze could show up when opening an app from a row's right-click menu, or when handing an update off to an app's own updater; both are fixed too.

Backups from uninstalled apps are now cleaned up automatically. DuoUpdater keeps one backup of an app's previous version so an update can be rolled back. Backups for apps you've since uninstalled or moved were never reclaimed and could quietly pile up gigabytes of disk space over time. They're now deleted automatically during the regular update check. Settings shows how much space backups are currently using, with a toggle to turn off the automatic cleanup and a "Clean Up Now" button to run it on demand.

JetBrains Toolbox apps no longer show a stuck or incorrect "update available." Version checks for Toolbox-managed apps (IntelliJ, Android Studio, Fleet, Air, and others) now always ask live rather than sometimes falling back to a local cache that could never actually report a new version — it fixes both a status that lingered after Toolbox had already installed the update, and one that never appeared in the first place.

Claude Desktop's release notes are now shown in DuoUpdater. Update entries for Claude Desktop now include Anthropic's own per-version changelog instead of a generic notice.

Update All now also relaunches apps that were only waiting on a restart. If an app had already downloaded its update and just needed a relaunch to finish — Claude, for instance — clicking Update All used to skip it, leaving a stray "Relaunch" button behind. It now relaunches those too, in the same pass, whenever automatic restart-after-update is on.

App Store updates recover from a receipt hiccup instead of just failing. Occasionally a Mac App Store update downloads in full but the very last install step trips over a "receipt" error — a transient App Store glitch that a second attempt usually clears. DuoUpdater now retries once automatically. If it still doesn't take, the row offers an "Open App Store" button to finish the update from the App Store's Updates page, instead of leaving a raw error on screen.

ToDesk update detection fixed. A change to ToDesk's download page stopped DuoUpdater from reading its latest Mac version, so ToDesk updates went unnoticed. Detection now reads the version reliably again.

App Store updates no longer show a scary error for an app that's already up to date. If the Mac App Store had quietly updated an app in the background — TestFlight, say — DuoUpdater's row could go stale and, on Update, try to reinstall the version that was already there. macOS's installer rejects that with an alarming red "The upgrade failed", even though nothing was actually wrong. DuoUpdater now confirms an App Store app really is behind before reinstalling, and treats a no-op reinstall as "already up to date" — settling the row quietly instead of showing an error.

App Store updates now ride out network hiccups. A brief connection drop mid-update — a flaky link, or a proxy resetting the connection — used to fail an App Store update outright with a "could not connect to the server" error. Those updates now retry automatically a few times before giving up, so a momentary blip no longer strands an update that a second attempt lands cleanly. Clicking Update again after a failure also clears the old error immediately, instead of leaving it on screen next to the spinner.

Apps that update themselves clear from the list faster. When an app like Chrome finishes updating itself in the background while an App Store update is running, its "update available" row now clears promptly — it no longer lingers until the rest of the queue finishes.

One-click updates for four more apps. HBuilderX, JetBrains Toolbox, and Microsoft Edge's Beta and Dev channels now update in place with a single click, instead of only telling you that an update exists. HBuilderX also now reads its version straight from DCloud's own release feed, so it picks up new builds sooner and more reliably.

Self-updating apps stay in their own lane. A running app that ships its own Sparkle updater is now handed off to that updater — the same courtesy DuoUpdater already gave other self-updating apps — instead of being replaced underneath it, unless you've chosen "Always replace" in Settings.

Fixes

  • The running-app dot and "Relaunch" badge no longer briefly lose track of an app right after an in-place update, when macOS keeps its process pinned to the temporary swap location for a moment.
  • When you restart an app yourself after it updated in the background, the "Relaunch" badge now clears the moment the app comes back up — instead of lingering until the next background check.

Fixes

  • When you restart an app yourself after it updated in the background, the "Relaunch" badge now clears the moment the app comes back up — instead of lingering until the next background check.

See when your apps actually ship. DuoUpdater now keeps a Release Log: a running timeline of every release the apps you track put out, each stamped with its publish time. Open it from the clock icon at the bottom of the popover.

Release-habit heatmap. A new Patterns view charts releases by weekday and hour, so you can see when an app tends to ship — pick any single app for its own pattern and version history, or view all of them together. History is backfilled from each app's update feed, so the heatmap is useful right away instead of starting empty.

Honest about what it can't time. Apps that publish an exact release date (Sparkle, GitHub, Alcove) are timed to the minute. Apps that only expose a version number get a clearly-marked "≈" estimated window — bounded by when DuoUpdater last saw the old version and first saw the new one — and never skew the heatmap.

Fixes

  • ToDesk update checks no longer report an older grayscale build; they now track the version actually offered for download.

Passwordless App Store updates. Updating Mac App Store apps no longer interrupts you for your password every time. DuoUpdater now installs a small, signed privileged helper (one-time approval) and bundles mas, so App Store updates apply directly in the background.

Cleaner "Restart to finish" lines. When an app updates itself on disk while it's still running, the pending-restart line now shows the real marketing version on both sides — e.g. 1.8.x (build) → 1.9.0 (build) instead of a bare build number on the left.

Fixes

  • Fixed a build issue on Xcode 26.5 (changelog extractor name collision).

Apps that update themselves now clear correctly. If an app updated through its own updater (for example, Chrome via "About Chrome") while DuoUpdater was busy installing other updates, it could keep showing a stale "update available" row long after it was already current. DuoUpdater now re-checks the moment the installs finish, so the row clears right away instead of lingering.

"Update All" shows the whole queue. Every app in an "Update All" run now shows a "Queued" state immediately, instead of leaving the ones further down the list looking idle with a clickable Update button. Clicking Update on an app that's already queued can no longer start a second install of it.