Änderungen

Jede Version, die neueste zuerst – dieselben Hinweise, die die App zeigt, wenn sie sich selbst aktualisiert. Downloads gibt es auf der Release-Seite. Ältere Versionen werden auf Englisch angezeigt.

Das neue App-Symbol sieht unter macOS 26 jetzt richtig aus. Im dunklen Stil verschmelzen Pfeil und Ring nicht mehr zu massiven Flecken, und Kopf und Ohren der Katze haben saubere statt gezackter Kanten.

Wenn du die Werkbank schließt, wird jetzt der Speicher ihrer Versionshinweise freigegeben. Bisher lief eine geöffnete Seite mit Versionshinweisen im Hintergrund weiter, bis du DuoUpdater beendet hast.

Ein neues App-Symbol. Eine zusammengerollte Siamkatze, deren Schwanz der Aktualisieren-Pfeil ist. Ab macOS 26 folgt es deinem hellen, dunklen oder getönten Symbolstil.

Prüfungen im Hintergrund warten, solange du im Datensparmodus oder in einem getakteten Netz bist, etwa einem iPhone-Hotspot. Sie laufen, sobald du wieder in einem normalen Netz bist. Manuelles Prüfen und das Installieren von Updates funktionieren wie bisher.

Prüfungen, die an einem kurzen Netzwerkaussetzer scheitern, werden zwei Minuten später einmal wiederholt. Bisher blieben die fehlgeschlagenen Zeilen und die Warnung bis zur nächsten geplanten Prüfung stehen, standardmäßig sechs Stunden später.

Unter der Haube. Bilder in Versionshinweisen belegen deutlich weniger Speicherplatz, der Bereich Anfragen zählt eine erneut validierte Anfrage nicht mehr doppelt, und die Prüfung von Muse lädt nicht mehr dessen Anmeldeseite herunter.

Homebrew-Apps, die sich über ein eigenes Setup-Skript installieren, etwa Quark Cloud Drive, lassen sich jetzt mit einem Klick aktualisieren. Bisher endete jeder Versuch mit der Meldung, es sei kein Installationspaket enthalten.

Homebrew-Apps, deren Installer du selbst ausführen musst, zeigen ihr Update jetzt mit einem Link an, statt zu scheitern. Bisher lud DuoUpdater den ganzen Installer herunter und brach dann mit einem Fehler ab.

Mehr Homebrew-Apps werden erkannt. Apps, die Homebrew unter einem anderen Namen installiert, etwa Visual Paradigm Community Edition, werden jetzt auf Updates geprüft, und eine ähnlich benannte App wird nicht mehr mit ihnen verwechselt.

Apps, deren Homebrew-Cask zurückgezogen wurde, bekommen kein Update mehr angeboten, das Homebrew nicht installieren würde. Sie werden stattdessen über den eigenen Update-Feed der App geprüft, sofern es einen gibt.

Die Versionshinweise von VS Code werden wieder angezeigt.

Unter der Haube. Einstellungen › Diagnose zeigt nicht mehr ständig Warnungen zu Antigravity und OpenLens an, wenn deren Updates auf anderem Weg gefunden werden.

Blender, das von blender.org geladen wurde, bekommt jetzt Updates, mit einem Klick. Bisher wurde nur eine per Homebrew installierte Kopie geprüft.

Alpha-, Beta- und Release-Candidate-Builds von Blender folgen ihrem eigenen Track. DuoUpdater erkennt, welche Art von Build du hast, und sagt dir, wenn ein neuerer Build derselben Art erscheint. Einer Alpha wird nie eine stabile Version angeboten, und umgekehrt.

Updates für Muse werden wieder angezeigt. Seit Muse für seinen Download-Link eine Anmeldung verlangt, zeigte seine Zeile einen Fehler statt der neuen Version.

Unter der Haube. Das Popover in der Menüleiste und die Werkbank öffnen sich beim ersten Mal nach dem Start etwas schneller, und duo check listet jetzt Apps auf, deren Prüfung fehlgeschlagen ist, statt zu melden, alles sei aktuell.

DuoUpdater spricht jetzt Italienisch, traditionelles Chinesisch, Portugiesisch (Brasilien) und Türkisch. Das sind elf Sprachen. Auf Deutsch, Spanisch und Japanisch wurden falsche oder abgeschnittene Texte korrigiert. Einstellungen → Ordner zeigt Ordnernamen jetzt so an wie der Finder in deiner Sprache.

Apps, die du mit Homebrew installiert hast, werden jetzt über Homebrew aktualisiert. Das betrifft per brew installierte Apps, die auch einen eigenen Updater haben. Bisher hat DuoUpdater sie direkt aktualisiert, ohne dass Homebrew davon wusste, und das nächste brew upgrade hat die Version, die du schon hattest, erneut heruntergeladen und installiert.

Fenster öffnen sich auf dem Space, auf dem du gerade bist. Bisher konnte das erneute Öffnen der Einstellungen oder eines anderen DuoUpdater-Fensters nach dem Schließen dich zurück auf den Space wechseln, auf dem es zuletzt angezeigt wurde.

Ein Update, eine Mitteilung. Manche Apps werden über zwei Quellen geprüft, und diese konnten dieselbe neue Version immer wieder melden.

Das Release-Protokoll zeigt keine Releases mit einem Datum in der Zukunft mehr. Wenn der Feed eines Entwicklers ein späteres Datum angibt als den Zeitpunkt, zu dem DuoUpdater das Release zum ersten Mal gesehen hat, verwendet das Protokoll diesen Zeitpunkt.

Wenn das Backup-Laufwerk nicht angeschlossen ist, passt das Werkbank-Fenster wieder auf den Bildschirm, und „Jetzt kopieren“ sagt dir, warum es nicht kopieren kann. Bisher konnte das Fenster höher als der Bildschirm werden, sodass sich Listen nicht bis zum Ende scrollen ließen, und „Jetzt kopieren“ tat stillschweigend nichts.

Xcode-Betas und Release Candidates lassen sich jetzt mit einem Klick aktualisieren. Melde dich einmal unter Einstellungen → Xcode bei deinem Apple-Developer-Konto an, und DuoUpdater lädt neue Betas und RCs herunter und installiert sie wie jedes andere Update. Bisher konnte es dir nur sagen, dass eine neue erschienen ist.

Installiere jede Xcode-Version neben denen, die du schon hast. Einstellungen → Xcode listet jedes Xcode-Release auf, nach Version gruppiert, und die Gruppe für dein macOS ist schon geöffnet. „Installieren“ legt die gewählte Version als eigene Kopie in „Programme“ ab – zum Beispiel Xcode-26.6.app – und ersetzt nichts; oder du sicherst nur das Archiv (.xip). Wenn du angemeldet bist, ist Apples eigene Liste dabei, sodass neue Releases innerhalb von Minuten erscheinen.

Deine Apple-Developer-Anmeldung hält sich selbst am Leben. Apple beendet eine Developer-Sitzung nach etwa acht Stunden; DuoUpdater holt jetzt im Hintergrund eine neue – ohne Fenster, ohne Passwort –, solange Apple diesen Mac noch erkennt. Unter Einstellungen → Xcode kannst du das ausschalten.

Neue Xcode-Releases erscheinen früher. An Werktagen während Apples üblicher Veröffentlichungszeiten sieht DuoUpdater alle fünf Minuten nach einem neuen Xcode.

Einige Apps funktionieren wieder, nachdem ihre Entwickler etwas geändert haben. CapCut Beta und Superconductor Nightly werden wieder gefunden und installiert, und Superconductor behält seine bisherige App-Identität. VLC 3.0.24 und JetBrains Air zeigen wieder ihre Versionshinweise.

Qoder CN IDE wird jetzt unterstützt. Die Festlandchina-Ausgabe von Qoders IDE bekommt Update-Prüfungen, die Installation mit einem Klick und ihre Versionshinweise im Fenster. Auch Qoder CN, die Desktop-App, zeigt jetzt ihre Versionshinweise.

Qoder IDE ändert seine Meinung über die neueste Version nicht mehr. Qoder verteilt Updates schrittweise, und DuoUpdater fragt jetzt genauso wie deine IDE selbst, sodass es jedes Mal dieselbe Antwort bekommt. Bisher konnte die angebotene Version zwischen zwei Releases hin- und herspringen, und eine Installation mit einem Klick konnte auf halbem Weg abbrechen, weil sich die Antwort geändert hatte.

Sparkle-Apps, deren heruntergeladenes Update inzwischen veraltet ist, lassen sich wieder aktualisieren. Hat eine App, die sich über Sparkle selbst aktualisiert, einen Build geladen und ist danach ein neuerer erschienen, entfernt DuoUpdater jetzt den alten Download und installiert den neuesten. Bisher meldete „Aktualisieren“ immer wieder, dass eine Installation jetzt rückgängig gemacht würde, und die Zeile änderte sich nie.

duo install sagt dir, wenn der neueste Build schon bereitliegt. Hat der eigene Updater einer App die neueste Version bereits geladen, sagt es das jetzt und schlägt vor, die App zu beenden oder duo restart auszuführen. Bisher behauptete es fälschlich, die App lasse sich nur prüfen, nicht installieren.

搜狗输入法 lässt sich jetzt mit einem Klick aktualisieren. DuoUpdater spielt das Update so ein, wie die Eingabemethode sich selbst aktualisiert – das installierte Bundle bleibt dabei an seinem Platz – und sichert vorher dein Wörterbuch und deine Einstellungen, damit eine Wiederherstellung auch die zurückbringt.

Backups auf einem anderen Volume behalten jetzt Wörterbuch und Einstellungen einer Eingabemethode. Bisher wurde nur die App selbst auf das Backup-Volume verschoben, sodass eine Wiederherstellung von dort die Daten der neueren Version zurückließ.

Keine Updates mehr, die sich nie installieren lassen. JetBrains Air zeigt jetzt den Build, den die Toolbox tatsächlich anbietet. Eine App-Store-App, die nach einer Umbenennung durch den Entwickler unter ihrem alten Namen zurückgeblieben ist, sagt jetzt, welche Kopie der App Store aktualisiert – statt ein Update anzubieten, das nur die andere Kopie neu installiert.

Die Versionshinweise weiterer Apps erscheinen jetzt formatiert. Apps, die ihre Hinweise als Markdown veröffentlichen, bekommen jetzt dieselbe native Liste wie alle anderen. Bisher erschienen die Hinweise als reiner Text.

„Neu starten“ kommt dem eigenen Installationsprogramm einer App nicht mehr in die Quere. Hat eine App ihr Update selbst geladen und gehört ihr Backup für die Wiederherstellung auf ein externes Volume, wartet diese Kopie jetzt, bis das Installationsprogramm fertig ist. Bisher lief sie in genau den wenigen Sekunden, die macOS ihm dafür gibt.

Backups zum Wiederherstellen können jetzt auf einem anderen Volume liegen. Ein Backup ist eine vollständige Kopie einer App, und auf dem Startvolume summiert sich das. Unter Einstellungen → Backups stehen die angeschlossenen Volumes mit ihrem jeweils freien Speicher; bereits vorhandene Backups lassen sich dorthin verschieben, neue werden im Hintergrund dorthin geschrieben – ist das Volume abgezogen, bedeutet das eine Verzögerung und keinen fehlenden Wiederherstellungspunkt. duo backups hat disks, sync, verify und probe dazubekommen.

千问输入法 wird jetzt unterstützt. DuoUpdater meldet, wenn eine neue Version erschienen ist, und aktualisiert die Eingabemethode so, wie sie sich selbst aktualisiert.

Versionshinweise bleiben nicht mehr bei der vorherigen Version hängen. Veröffentlicht ein Entwickler ein Update ein paar Minuten, bevor seine Changelog-Seite es erwähnt, wurden die älteren Hinweise unter der neuen Version abgelegt und dort für immer behalten. CleanShot X zeigte seit dem Erscheinen von 5.0.1 die Hinweise zu 5.0.

Ein gelöschtes Backup gibt jetzt wirklich den Speicher frei, den es meldet. Backups aus älteren DuoUpdater-Versionen wurden in einer Form geschrieben, die macOS nicht löscht – „Aufräumen“ ließ den größten Teil der Kopie auf dem Volume und zählte sie trotzdem als freigegeben.

„Aufräumen“ öffnet sich sofort. Bisher wurde bei jedem Klick jedes gespeicherte Backup neu vermessen.

WorkBuddy zeigt wieder seine neueste Version. Der Update-Dienst antwortet mit dem nächsten Schritt einer Upgrade-Kette statt mit dem neuesten Build, weshalb alle vier WorkBuddy-Ausgaben zwei Releases zurücklagen.

Unter der Haube. Eine App, die nie angegeben hat, welche Binärdatei sie ausführt – darunter Metas Muse –, gibt ihre Frameworks und ihr SDK jetzt trotzdem preis.

Updates, die über „Neu starten“ abgeschlossen werden, lassen sich jetzt rückgängig machen. Hat eine App ihr Update schon selbst geladen und du klickst auf „Neu starten“, sichert DuoUpdater jetzt zuerst die aktuelle Version – das Update erscheint dann wie jedes andere unter „Wiederherstellen“. Bisher ließen sich nur Updates rückgängig machen, die DuoUpdater selbst installiert hatte.

Sieh dir an, was ein Update in einer App verändert hat. Für jede App mit einer gesicherten Vorversion hat die Werkbank jetzt neben „Versionshinweise“ die Ansicht „Bundle-Vergleich“: Signatur und Berechtigungen, minimale macOS-Version, Hintergrund- und Anmeldeobjekte, mitgelieferte Bibliotheken sowie hinzugefügte, entfernte oder in der Größe geänderte Dateien. duo diff macht dasselbe im Terminal für zwei beliebige Kopien einer App.

„Neu starten“ sagt dir, wenn der eigene Updater einer App das Update nicht angewendet hat. Schließt sich die App und das Update kommt nie an, steht das jetzt in ihrer Zeile, und „Neu starten“ wird weiter angeboten. Bisher hörte der Fortschrittskreis einfach wortlos auf.

Cherry Studio zeigt wieder seine neueste Version. Nachdem Cherry Studio seine Mac-Downloads umbenannt hatte, hielt DuoUpdater ein älteres Release für das neueste: Neuere Kopien galten als „aktuell“, ältere bekamen genau diesen älteren Build angeboten.

App-Store-Updates hängen nicht mehr an einem Hilfsprogramm, das nicht antwortet. Antwortete das Hilfsprogramm von DuoUpdater nicht mehr, blieb das Update bei 0 % stehen, und jedes dahinter eingereihte App-Store-Update wartete, bis du DuoUpdater beendet hast.

„Alle aktualisieren“ startet ignorierte Apps nicht mehr neu. War „Aktualisierte Apps automatisch neu starten“ eingeschaltet, konnte das Ende eines Durchlaufs eine ignorierte App beenden und wieder öffnen – oder eine, deren geladene Version du übersprungen hattest.

Tinycast und SuperCmd werden jetzt unterstützt. DuoUpdater meldet, wenn eine neue Version von Tinycast oder seiner Beta erschienen ist, und erkennt jetzt neben SuperCmd 2 auch das ursprüngliche Open-Source-SuperCmd. Die Versionshinweise von Kimi Code werden jetzt ebenfalls angezeigt.

Versionshinweise passen zur angebotenen Version. Die neuesten Versionshinweise von VS Code blieben leer, und kurz nachdem eine neue Version erschienen war, konnte der Bereich stattdessen die Hinweise des vorherigen Release zeigen.

Das Release-Protokoll trägt dasselbe Release nicht mehr bei jedem Start erneut ein. Apps wie Claude, Raycast und Cline bekamen bei jedem Start von DuoUpdater einen doppelten Eintrag.

Die Seitenleiste der Werkbank ist in die Tabs Apps, Brew und Wiederherstellen aufgeteilt. Klicke auf einen Tab oder ziehe über die Tabs, um zu wechseln; die Suche filtert alle drei gleichzeitig.

Unter der Haube. „Neu starten“ und „Wiederherstellen“ für dieselbe App kommen sich nicht mehr in die Quere; ein Update-Feed kann DuoUpdater nicht mehr dazu bringen, Dateien außerhalb seines Download-Ordners zu löschen; Prüfungen im Hintergrund riskieren nicht mehr, dass macOS nach Zugriff auf die Daten anderer Apps fragt; eine sehr große Zahl im Filter „Anfragen“ beendet die App nicht mehr; und die Menüleiste respektiert jetzt eine Administratoranfrage, die du in duo install abgelehnt hast.

Updates für iStat Menus werden jetzt richtig erkannt. Wenn iStat Menus ein Update neu veröffentlichte, konnte DuoUpdater es nach der Installation weiter anbieten, und ein erneuter Klick auf „Aktualisieren“ endete mit einem Fehler.

Memoh Desktop wird jetzt unterstützt. DuoUpdater meldet, wenn eine neue Version erschienen ist, und kann sie mit einem Klick aktualisieren.

„Alle aktualisieren“ fordert dich nicht mehr auf, eine App-Store-App neu zu starten, die schon wieder geöffnet ist. Wenn der App Store eine App schließt und mit der neuen Version wieder öffnet, zeigt ihre Zeile sie jetzt sofort als aktualisiert an, statt bis zum Ende des ganzen Durchlaufs „Jetzt neu starten“ anzuzeigen.

Eine App, die ihr Update schon selbst geladen hat, lädt es nicht mehr doppelt. Manche Apps laden ein Update still im Hintergrund und warten dann darauf, dass du sie neu startest. Klickst du in DuoUpdater auf „Aktualisieren“, installiert es jetzt die Kopie, die schon auf deinem Mac liegt: Das Update ist in Sekunden erledigt und kostet keinen Download. Bisher hat DuoUpdater dasselbe Release noch einmal heruntergeladen.

Cua Driver und Petex werden jetzt unterstützt. DuoUpdater meldet, wenn eine der beiden Apps ein neues Release hat; Cua Driver lässt sich außerdem mit einem Klick aktualisieren und zeigt seine Versionshinweise.

Dasselbe Update meldet sich nicht mehr immer wieder. Wenn der Server eines Entwicklers ständig zwischen zwei Versionen wechselte, sah jede Prüfung wie ein neues Update aus und löste eine weitere Mitteilung aus.

Ein gerade installiertes Paket bietet nicht mehr an, sich erneut zu installieren. Seine Zeile sagte bisher weiterhin, das geladene Paket werde erneut geöffnet.

DuoUpdater benötigt jetzt macOS 15 Sequoia oder neuer. Ein Mac, der noch mit macOS 14 läuft, behält seine Version und bekommt keine Updates mehr angeboten; jeder Mac mit Apple Silicon kann auf ein unterstütztes macOS aktualisieren.

Unter der Haube. Routinemäßige Prüfungen lösen Download-Links nicht mehr vorab auf – das konnte eine funktionierende „Aktualisieren“-Taste kurz verschwinden lassen, wenn der Download-Server eines Entwicklers nicht antwortete.

Aside wird jetzt unterstützt. DuoUpdater meldet, wenn ein neuer Build des Aside-Browsers erschienen ist, und zeigt dessen Versionshinweise.

Updates, die dein macOS nicht ausführen kann, werden nicht mehr angeboten – und die Zeile sagt jetzt, warum. Wenn ein Entwickler angibt, welche macOS-Versionen ein Release unterstützt, hält sich DuoUpdater daran: Nach einem macOS-Upgrade bietet Little Snitch keinen Build mehr an, dessen Obergrenze unter deinem System liegt; Xcode bietet keinen Build mehr an, der ein neueres macOS als deines braucht; und ein Installationspaket, dessen App ein neueres macOS braucht, wird abgelehnt, statt eine App zu installieren, die sich nicht öffnen lässt. Zeilen, die früher nur einen leeren Strich zeigten, sagen jetzt „Noch nicht für dieses macOS“ oder „Neueres macOS nötig“, die Details sind einen Klick entfernt.

Sieh, mit welchem SDK jede App gebaut wurde. Klick auf die Markierung neben dem Namen einer App, und die Details sagen jetzt zum Beispiel „Mit dem macOS 27.0 SDK gebaut.“ – praktisch, um zu erkennen, welche Apps schon für das neueste macOS neu gebaut wurden.

Homebrew-Apps, die als zwei Pakete erscheinen – eines für ältere Systeme, eines für das neueste –, werden jetzt aus dem richtigen gelesen. OnyX ist für macOS 27 so aufgeteilt, und DuoUpdater sah nur das Paket für ältere Systeme: Entweder zeigte es OnyX gar nicht an, oder es hielt OnyX für aktuell gemessen an einer Version, die Homebrew unter 27 nicht installiert. Jetzt folgt DuoUpdater dem der beiden, das du installiert hast.

TestFlight-Betas verlieren ihr Update nicht mehr, wenn TestFlight startet. Eine Beta mit einem wartenden neuen Build konnte auf „aktuell“ zurückfallen und so bleiben, bis du TestFlight erneut geöffnet hast.

Ein-Klick-Updates für Dropbox und ToDesk laden die richtige Datei. Auf Apple Silicon lud Dropbox bisher den reinen Intel-Build, den die Sicherheitsprüfung dann ablehnte; bei ToDesk wurde der Early-Access-Build angeboten, den ToDesk nur an einen Teil der Nutzer verteilt, statt der allgemeinen Version.

„Neu starten“ schließt das Update von Spotify sofort ab. Hatte Spotify sein eigenes Update bereits geladen, drehte sich „Neu starten“ minutenlang, bevor das Update durchging.

Beta-Builds gehen jetzt in ihre Releases über. Eine Xcode-Beta bekommt ihren Release Candidate angeboten, statt als aktuell zu gelten; CotEditor-Betas sehen dessen Release Candidates; und eine Carbon-Copy-Cloner-Beta, deren Testzyklus beendet ist, bekommt das Release angeboten, zu dem sie geworden ist, statt einer fehlgeschlagenen Prüfung.

Versionshinweise passen zu deiner Version. Blender 5.2 zeigte bisher die Hinweise zu 5.1, und Raycast 1.x die zu 2.x. „Seite öffnen“ bei Gemini öffnet jetzt Googles aktuelle Desktop-Seite statt einer Fehlerseite.

Die Einstellungen erklären jede Option direkt daneben. Lange Texte unter ganzen Abschnitten sind durch eine kurze Zeile unter jedem Bedienelement ersetzt, und Auswahlmenüs beschreiben nur die gewählte Option.

Die App schreibt ihren Namen jetzt DuoUpdater, passend zur Website.

Homebrew-Pakete aus Taps, denen du nicht vertraust, tauchen wieder auf. Seit Homebrew 6 überspringt brew beim Auflisten der Installationen stillschweigend Pakete aus nicht vertrauten Taps, sodass sie ohne Erklärung aus DuoUpdater verschwanden. Jetzt erscheinen sie als „Nicht geprüft · Tap nicht vertraut“, mit dem brew trust-Befehl zum Kopieren – und sobald du ihn (oder ein Upgrade) im Terminal ausgeführt hast, zieht das Fenster nach, wenn du zurückwechselst.

Apps, die für ihr eigenes Update ein Administratorpasswort brauchen, werden nicht mehr doppelt aktualisiert. Hatte eine App wie Tailscale ihr Update bereits geladen und wartete auf einen Neustart, sah DuoUpdater das nicht und bot trotzdem „Aktualisieren“ an – was mit dem eigenen Installer der App kollidieren konnte. Die Zeile bietet jetzt „Neu starten“ an, und „Alle aktualisieren“ lässt die App aus.

Der Homebrew-Bereich kann jetzt Homebrew selbst aktualisieren. Wenn eine neue Homebrew-Version erschienen ist, bietet eine Zeile ganz oben an, brew update für dich auszuführen. Hast du HOMEBREW_NO_AUTO_UPDATE gesetzt, bleibt sie ausgeblendet.

Ein fehlgeschlagenes Homebrew-Upgrade zeigt jetzt den eigentlichen Fehler von brew. Früher stand in der Zeile der Rat, den brew nach dem Fehler ausgibt, oder gar nichts – eine Meldung wie „deine Command Line Tools sind zu alt“ kam also nie bei dir an. Außerdem meldet ein Upgrade mehrerer Pakete nicht mehr, fertig zu sein, bevor es das ist.

Das Menüleistensymbol zählt über 50 hinaus. Bei mehr als 50 wartenden Updates blieb es bisher bei 50 stehen.

Versionshinweise: Die von Claude sind wie in Claude selbst nach New, Improved und Fixed gegliedert; die von Mac Mouse Fix erscheinen als Text statt als eingebettete Seite; und Homebrews eigene App hat jetzt Versionshinweise.

duo check meldet nicht mehr „Everything is up to date.“, wenn es gar nicht prüfen konnte. Es sagt jetzt, wenn es TestFlight nicht lesen konnte oder der App-Scan abgebrochen wurde.

Versionshinweise erscheinen jetzt in deiner Sprache, wenn eine App sie in mehreren veröffentlicht. Manche Apps liefern ihre Hinweise zu jeder Veröffentlichung übersetzt mit; DuoUpdater nahm bisher einfach die Übersetzung, die die App zufällig zuerst oder zuletzt aufführte, sodass die Hinweise einer App für alle auf Deutsch erschienen und die einer anderen von Veröffentlichung zu Veröffentlichung die Sprache wechselten.

Apps, die eine Mac-Version nachgereicht haben, gelten nicht mehr als „Auf diesem Mac nicht unterstützt“. Eine iPhone- oder iPad-App, die du auf Apple Silicon ausführst, wurde fälschlich genau in dem Moment so gekennzeichnet, in dem ihr Entwickler einen echten Mac-Build veröffentlichte — also durch die eine Änderung, die das Update verfügbarer macht statt weniger.

Eine App-Store-App, die du zugleich als Beta testest, wird nicht mehr für einen TestFlight-Build gehalten. Gab ein Entwickler eine Beta unverändert frei, trugen beide dieselbe Build-Nummer, und deine gekaufte Kopie wurde TestFlight zugeordnet — der App Store konnte ihr also nie ein Update anbieten.

Ein App-Store-Update, das ein neueres macOS erfordert als das laufende, sagt das jetzt. Bisher bot die Zeile die Installation trotzdem an, der App Store verweigerte sie im letzten Schritt, und nichts auf dem Bildschirm erklärte, warum.

Das Fenster „Anfragen“ zeigt jetzt, wie weit sein Protokoll tatsächlich zurückreicht, und kennzeichnet Zeiträume, die es nicht vollständig abdecken kann. Bisher sah „Letzte 30 Tage“ bei einem Protokoll, das nur ein paar Stunden zurückreichte, genauso aus wie „Letzte 24 Stunden“, und nichts auf dem Bildschirm erklärte, warum.

Du entscheidest unter „Einstellungen“ → „Allgemein“, wie viel DuoUpdater für TestFlight-Betas tut. Beim Aktualisieren liest, was TestFlight ohnehin schon weiß, und fragt dort nach einer frischen Antwort, wenn du aktualisierst; Aktuell halten lässt DuoUpdater auch von sich aus nachfragen, sodass eine im Hintergrund installierte TestFlight-Beta nicht mehr als Fragezeichen dasteht, bis du aktualisierst, und ein für dich bereitliegender Build nicht mehr hinter einem „aktuell“ übersehen wird; Aus liest nichts und sagt das in diesen Zeilen, statt zu raten. Macs mit bereits erteiltem Festplattenvollzugriff starten mit Beim Aktualisieren, alle anderen mit Aus.

Es genügt jetzt, TestFlight selbst zu öffnen, damit DuoUpdater bemerkt, was dort installiert wurde. Eine über TestFlight installierte Beta stand bisher als Fragezeichen da, bis du das nächste Mal aktualisiert hast — und unter macOS 27, wo TestFlights Hinweis „Ready to Test“ für bereits vorhandene Apps nicht mehr eintrifft, konnten das Stunden sein.

Cline bekommt jetzt Updates, sowohl für seine reguläre als auch für seine Beta-Version, und zeigt seine Versionshinweise. Bisher stand in seiner Zeile ein Fragezeichen statt einer Version: Es liefert keinen Update-Feed aus, den DuoUpdater lesen könnte, und ein Homebrew-Paket gibt es dafür nicht. DuoUpdater fragt jetzt dieselbe Adresse ab wie Clines eigener Updater, sodass das angebotene Update genau das ist, das Cline selbst installiert hätte, und die Beta-Version bleibt auf der Beta-Linie.

Versionshinweise, die ihre Änderungen unter Überschriften wie „Added“ und „Fixed“ gruppieren, behalten diese Überschriften jetzt. Bisher wurden alle Gruppen zu einer einzigen flachen Liste zusammengeführt, sodass nicht zu erkennen war, welche Änderungen neue Funktionen und welche Fehlerbehebungen waren.

Mac Mouse Fix bietet jetzt seine Beta-Veröffentlichungen an, wenn du in seinen eigenen Einstellungen unter „General“ die Option „Get Beta Versions“ eingeschaltet hast. Bisher sah DuoUpdater nur die regulären Veröffentlichungen von Mac Mouse Fix, sodass ein Beta-Build unbemerkt blieb, bis die nächste reguläre Version erschien.

Apps, deren Build-Nummer nur ein fortlaufender Zähler ist, verbergen ihre eigenen Korrekturversionen nicht mehr. Bei einer App, die sich als Version 12.10 mit Build 282987 meldet, las sich eine Veröffentlichung 12.10.1 bisher als „bereits aktuell“.

Ein neuer Build einer App, die denselben Versionsnamen behält, wird wieder angekündigt. War ein Build erst einmal angekündigt, kam jeder weitere unter diesem Namen still an — die Zeile leuchtete auf, die Zahl am Symbol zählte ihn mit, aber es erschien nie ein Banner.

„Alle aktualisieren“ zählt jetzt nur noch Apps, die tatsächlich aktualisiert wurden. Eine App, die zum Abschluss Apples Installationsprogramm öffnet, galt bisher schon als erledigt, während dessen Fenster noch offen war — „2 Apps wurden aktualisiert“ konnte also bedeuten, dass sich noch gar nichts geändert hatte.

Ein Update, das angekommen ist, aber einen Rest hinterlassen hat, wird jetzt als installiert gemeldet statt mit der Aufforderung, „App-Verwaltung“ zu erteilen. Die neue Version lief bereits, während die Zeile dich in die Systemeinstellungen schickte.

„Alle aktualisieren“ abzubrechen, bricht jetzt auch den laufenden Download ab. Bisher lief eine mehrere Gigabyte große Übertragung bis zum Ende weiter, versuchte es bis zu fünfmal erneut und bemerkte erst dann, dass sie abgebrochen worden war.

Versionshinweise werden nicht mehr zwischen zwei Apps verwechselt, die sich eine Changelog-Seite teilen, und bleiben nach einem Update aktuell, wenn die Hinweise einer App auf einer eigenen Seite pro Version liegen. Antigravity und Antigravity IDE konnten eine Viertelstunde lang die Hinweise der jeweils anderen zeigen; Thunderbird, WeChat, Opera und einige andere zeigten nach einem Update noch eine Weile die Hinweise der vorherigen Version.

Die Suche in der App-Liste ignoriert jetzt Akzente, so wie die Suche in den Einstellungen es schon tat. Die Eingabe „cafe“ findet jetzt „Café“.

Die Seite „Diagnose“ führt jetzt eine Zustandszeile pro Release-Kanal auf. Eine kaputte Beta- oder Preview-Regel blieb bisher hinter ihrem gesunden stabilen Gegenstück verborgen.

Eine „Forbidden“-Antwort von GitHub wird nicht mehr als Ratenbegrenzung gemeldet. Bei einem Repository, das auf privat gestellt wurde, oder einem Token ohne die nötige Berechtigung wurdest du bisher dazu gedrängt, ein Token zu hinterlegen, das gar nicht geholfen hätte.

„Neu starten“ wird nicht mehr für eine sich selbst aktualisierende App angeboten, deren bereitliegender Build älter ist als der laufende.

Unter der Haube. Installationen, Sicherungen und Paketprüfungen belegen nicht mehr die Threads, auf denen der Rest der App läuft, sodass das Menü währenddessen bedienbar bleibt; auch während eines großen Downloads bleibt das Menü flüssig; das Release-Protokoll zählt jede Veröffentlichung mit, die ein Anbieter unter einem Versionsnamen herausgibt; eine Backup-Kopie wird abgelehnt statt gespeichert, wenn darin das Programm der App selbst fehlen würde; der erste Start auf einem frischen Mac schreibt keine irreführenden Datenbankfehler mehr ins Protokoll; duo verify und duo reconcile melden jetzt auch ein Changelog, dessen Einträge in sich zusammengefallen sind, und eine Installationsadresse, die seit Tagen fehlschlägt; ein hängender duo-Befehl bricht seine Suche nach zwanzig Sekunden ab, statt stehen zu bleiben.

Manche Apps, die sich selbst aktualisieren, sehen nicht mehr aktuell aus, während schon eine neuere Version vorliegt. Bei Apps, deren Update-Informationen hinter einem träge aktualisierten Download-Server liegen, konnte DuoUpdater nach einer Veröffentlichung noch tagelang eine ältere Version sehen.

Die Versionshinweise von Kimi erscheinen jetzt in DuoUpdater.

Updates von CodeEdit erscheinen jetzt. Bei einer neueren CodeEdit-Version blieb in der Zeile bisher ein Fragezeichen stehen, statt dass das Update angeboten wurde.

Unter der Haube. Die Homebrew-Liste im Menü füllt sich schneller, und duo-Befehle starten schneller.

„Erneut prüfen“ liefert bei einer TestFlight-Beta jetzt das echte Ergebnis. Bisher wurde die Zeile dadurch bis zum nächsten Aktualisieren zu einem Fragezeichen.

TestFlight-Betas behalten ihr Ergebnis, während die Schaltfläche zum Aktualisieren bei TestFlight nachfragt. Bisher konnten sie für ein paar Sekunden alle zu Fragezeichen werden.

super.engineering wird jetzt unterstützt: Update-Prüfungen, Versionshinweise und Ein-Klick-Installation. Ein neuer Nightly-Build erscheint samt dem, was sich darin geändert hat, und „Aktualisieren“ installiert ihn für dich.

Microsoft Edge Beta konnte dir einen stabilen Edge-Build anbieten. Als Microsofts Beta-Feed kurzzeitig leer war, nannte die Zeile eine stabile Version, und ein Update hätte diese über deine Beta installiert.

TestFlight-Betas zeigen jetzt die Updates, die TestFlight für sie bereithält — auch Betas von iPhone- und iPad-Apps. Die Schaltfläche zum Aktualisieren fragt im Hintergrund bei TestFlight nach, ein Update verschwindet nicht mehr wenige Minuten, nachdem du es gefunden hast, und die TestFlight-Schaltfläche öffnet die Seite dieser Beta.

Wenn DuoUpdater nicht feststellen kann, ob eine TestFlight-Beta aktuell ist, sagt es das. Die Zeile zeigt ein Fragezeichen, statt die Beta aktuell zu nennen — zum Beispiel, wenn du bei TestFlight abgemeldet bist oder diese Beta nicht mehr testest.

Festplattenvollzugriff wird jetzt erklärt, und ohne ihn nervt dich nichts. Ohne ihn löst DuoUpdater die Warnungen von macOS zum Lesen der Daten anderer Apps nicht mehr aus; braucht ihn eine TestFlight-Beta oder CotEditor, erfährst du einmalig, warum er nötig ist und wo du ihn erteilen kannst.

„Neu starten“ verschwindet, sobald eine aktualisierte App beendet wurde. Eine App, die einen Hilfsprozess weiterlaufen ließ, bat noch lange um einen Neustart, nachdem ihr Update wirksam geworden war.

Eine unbeantwortete Datenschutzabfrage von macOS hält Update-Prüfungen nicht mehr auf. Die Prüfung läuft ohne die Einstellung der betreffenden App weiter.

Die Versionshinweise von Rockxy und Ollama sind wieder vollständig. Bei Rockxy reichen sie über die jüngsten Veröffentlichungen zurück, statt nur die neueste zu zeigen, und bei Ollama wird die neueste Veröffentlichung nicht mehr ausgelassen.

duo, der optionale Begleiter für die Kommandozeile, kommt besser mit TestFlight zurecht. --refresh-testflight funktioniert, ob TestFlight geöffnet ist oder nicht, ohne deinen Bildschirm in Beschlag zu nehmen, und duo check nennt eine Beta nicht mehr aktuell, wenn TestFlight einen neueren Build angekündigt hat.

Telegram Desktop wird wieder auf Updates geprüft. Telegram hat die Datei, die es veröffentlicht, umbenannt, und die Zeile konnte daraus keine Version mehr lesen — sie zeigte deshalb einen Prüffehler statt des Updates, das dahinter wartete.

Eine über TestFlight installierte iPhone- oder iPad-App wird als solche erkannt. DuoUpdater hielt sie stattdessen für einen Kauf aus dem App Store, also nannte die Zeile den falschen Verwalter, während der Store nach einem Eintrag gefragt wurde, den es gar nicht gibt — bei jeder Prüfung, solange die App installiert blieb.

Eine TestFlight-Beta ist mit TestFlights eigenem Symbol gekennzeichnet. Zeilen, um die sich der App Store kümmert, trugen bereits das Symbol des Stores; die, um die sich TestFlight kümmert, schrieben den Namen stattdessen aus — dieselbe Art von Zeile war also auf zwei verschiedene Weisen gekennzeichnet.

Die Kopfzeile des Netzwerk-Fensters bleibt beim Wechsel der Tabs an ihrem Platz. Die beiden Tabs setzten ihre Überschrift auf leicht unterschiedliche Höhen, sodass der Wechsel zwischen ihnen aussah, als würde das Fenster zucken.

Das Scrollen durch die ganze App-Liste ist wieder flüssig. Ein schnelles Scrollen durch die vollständige Liste ließ Frames fallen; jede Zeile gibt ihre Höhe jetzt an, ohne dafür erst aufgebaut werden zu müssen.

Die Versionshinweise einer App aus dem App Store kommen jetzt immer aus dem App Store. Wenn die Abfrage des Stores für eine App ins Leere lief oder fehlschlug, konnte das Fenster auf die Hinweise der anderen Vertriebsform dieser App zurückfallen — ein anderer Build mit eigenen Versionsnummern — und beschrieb damit eine Veröffentlichung, die deiner Kopie nie angeboten worden wäre.

Windscribe im Beta- oder Guinea-Pig-Kanal bekommt die Builds dieses Kanals angeboten. DuoUpdater liest, welchen Update-Kanal du in Windscribes eigenen Einstellungen gewählt hast, sodass einer Kopie auf einer Vorabversionslinie nicht länger gesagt wird, sie sei aktuell, während es auf dieser Linie neuere Builds gibt. Das Fenster zeigt auch die Hinweise zu diesen Vorabversionen, die es zuvor nur für stabile Builds aufgeführt hat.

Windscribe wird jetzt auf Updates geprüft, mit seinen Versionshinweisen. Eine Kopie auf einem älteren Build wird mit der Version aufgeführt, auf die sie wechseln kann, und was sich darin geändert hat; zuvor hatte DuoUpdater keine Möglichkeit, Windscribes Version überhaupt zu sehen. Aktualisiert wird weiterhin über Windscribes eigenen Installer, der auch Teile einrichtet, die außerhalb der App liegen.

Ein Update wird nicht mehr auf eine App angewendet, die während deines Klicks verschwunden ist. Wird die App zwischen dem Klick und dem Beginn der Installation deinstalliert, ersetzt oder unlesbar, hält DuoUpdater jetzt an und sagt es — statt trotzdem über diesen Ort zu installieren.

duo, der optionale Begleiter für die Kommandozeile, nennt eine Paketinstallation nicht mehr abgeschlossen, bevor sie es ist. Beim Installieren einer App, die als .pkg ausgeliefert wird, öffnet sich der Installer von macOS und der Rest bleibt dir überlassen — die Zusammenfassung zählte das aber als installiert: „1 installed“, während noch nichts ersetzt war. Beides wird jetzt getrennt gezählt. Die --json-Ausgabe kennzeichnet außerdem jede Zeile damit, was mit dieser App geschehen ist, sodass ein Skript nicht mehr den englischen Erklärungstext lesen muss, um einen Fehlschlag von einem bewussten Überspringen zu unterscheiden.

Unter der Haube. Die Prüfung unmittelbar vor der Installation, die ein Ein-Klick-Update absichert, schützt jetzt auch duo install; und die Kontrollen, die ein Download bestehen muss, bevor er eine App ersetzt, liegen für beide Wege, die sie nutzen, an einer Stelle.

Ein Klick auf „Aktualisieren“ bleibt nicht mehr wirkungslos, wenn eine Update-Quelle sich selbst widerspricht. Meldet die Prüfung, die im Moment des Klicks läuft, eine ältere Version als die, die in der Zeile angeboten wurde, sagt DuoUpdater das jetzt und lässt das Update im Angebot. Zuvor galt die App als bereits aktuell und verschwand aus der Liste – und dasselbe Update tauchte bei der nächsten Prüfung wieder auf.

Fork-Updates werden wieder angeboten, wenn Fork auf den Develop-Kanal eingestellt ist. DuoUpdater las Forks Kanaleinstellung verkehrt herum und folgte dem Stable-Feed, der deutlich hinterherhinkt – eine Develop-Installation galt damit als aktuell, während Fork selbst schon eine neuere Version anbot.

Mac Performance Monitor zeigt jetzt seine Versionshinweise. Die App veröffentlicht sie in ihrem Repository statt in dem Feed, den wir lesen, sodass das Fenster nichts dazu anzuzeigen hatte.

CotEditor wird jetzt unterstützt – auf der Release- wie auf der Beta-Linie. Welcher Linie eine Installation folgt, ergibt sich aus der laufenden Version und aus CotEditors eigener Einstellung „Update to prereleases when available“; eine Beta-Installation erhält damit die nächste Beta statt einer Version, die sie zurückwerfen würde.

Eine aus dem App Store installierte App bekommt nie einen Download von anderswo angeboten. Schlägt die Abfrage des Stores fehl oder bleibt sie leer, weist die Zeile jetzt darauf hin, dass der Store diese App verwaltet – ohne Versionsnummer. Zuvor konnte die Prüfung auf den anderen Vertriebsweg der App ausweichen – ein anderer Build mit eigenen Versionsnummern – und anbieten, diesen über die Store-Kopie zu installieren.

Einer App wird nie ein Update angeboten, das sie auf eine ältere Version zurücksetzen würde. Manche Feeds führen eine stabile Version über einer Vorabversion, die in Wahrheit weiter ist – sie zu installieren hätte die App zurückgeworfen.

Eine lange Fehlermeldung in einer Zeile schiebt den Rest der Liste nicht mehr nach unten. Sie wird auf zwei Zeilen gekürzt, der vollständige Text erscheint beim Daraufzeigen.

Vier weitere Apps werden abgedeckt: WhatCable, Qoder IDE, Qoder und Yaak. Jede von ihnen erhält Update-Prüfungen und eine Installation mit einem Klick, und ihre Versionshinweise werden als Text ins Fenster geladen statt als eingebettete Seite.

Die beiden Mac-Apps von Qoder werden nun auseinandergehalten. Die IDE und die Desktop-App teilen sich Namen und Download-Seite, erscheinen aber in getrennten Versionsreihen; jede wird jetzt für sich verfolgt.

Beta-Builds von WhatCable und Yaak werden auf einem eigenen Kanal verfolgt. Eine Kopie mit einer Beta hatte bisher überhaupt keine Quelle und blieb auf „Fehlgeschlagen“ stehen; ihr wird nun die nächste Beta angeboten, mit Versionshinweisen getrennt von denen der finalen Versionen. Bei WhatCable gehört dazu auch die finale Version, in die eine Beta schließlich übergeht – wer diese nimmt, wechselt damit auf den finalen Kanal.

Das Prüfen deiner App-Store-Apps braucht nur noch einen Bruchteil des bisherigen Datenverkehrs. Bei jeder Prüfung wurde bisher die Produktseite jeder App-Store-App erneut geladen; die Seiten werden jetzt eine Stunde lang behalten, und der Store wird in wenigen Anfragen nach allen deinen Apps gefragt statt in einer pro App. Bei einem Prüfintervall von fünf Minuten sind das insgesamt etwa ein Drittel weniger Datenverkehr; beim voreingestellten Intervall von sechs Stunden verfallen die Seiten weiterhin zwischen zwei Prüfungen, dort ist die Ersparnis also geringer.

Eine einzelne App erneut zu prüfen lädt nicht mehr alle App-Store-Apps neu. Ein einzelnes „Erneut prüfen“ verwarf bisher jede zwischengespeicherte Produktseite, sodass die nächste geplante Prüfung für alle zahlte; es aktualisiert jetzt nur noch die App, nach der du gefragt hast.

Das Prüfen von Apps, die über GitHub ausgeliefert werden, kostet nur noch einen Bruchteil des bisherigen Datenverkehrs. Bei jeder Prüfung wurde bisher die vollständige Beschreibung jeder Version erneut geladen, auch wenn nichts veröffentlicht worden war; jetzt wird GitHub gefragt, ob sich die Version seit dem letzten Mal geändert hat, und nichts geladen, wenn nicht. Einmal täglich wird jede Version vollständig neu gelesen, sodass eine zurückgezogene Version innerhalb eines Tages auffällt.

Apps auf einem Beta- oder Nightly-Kanal von GitHub fragen jetzt nach einer Version statt nach einer ganzen Seite davon. Die neueste Version ist fast immer die Antwort; die vollständige Seite wird nur in den Runden geladen, in denen sie es nicht ist.

Die Update-Prüfung von Vorssaint läuft nicht mehr über eine Weiterleitung. Das Repository wurde umbenannt, und dem alten Namen zu folgen setzte die Anfrage stillschweigend auf das anonyme Anfragelimit von GitHub; die Prüfung geht jetzt direkt an den neuen Namen.

Unter der Haube. Das Release-Artefakt wird jetzt auf einem von GitHub gehosteten Mac gebaut, signiert und notarisiert, mit einer Build-Herkunft, die jede und jeder überprüfen kann, und das aufgezeichnete Anfrageprotokoll unterscheidet eine zwischengespeicherte Antwort von einer aus dem Netz.

Exportierte Anfrageprotokolle enthalten nicht mehr deinen Kontonamen. Für Apps in deinem Benutzerordner stand bisher in jeder Zeile der vollständige Pfad; jetzt steht dort ~, unabhängig davon, wie du das Protokoll herausnimmst.

Der Tab „Anfragen“ sagt jetzt, was er erfasst und was nicht. Erfasst werden die Abrufe, die DuoUpdater selbst durchführt. Eine Seite mit Versionshinweisen lädt ihre eigenen Bilder und Schriften, und Updates aus dem App Store und von Homebrew werden von eigenen Werkzeugen ausgeführt – nichts davon erscheint dort, und das Fenster sagt es nun, statt es deiner Annahme zu überlassen.

„URL kopieren“ maskiert die Adresse jetzt, bevor es sie herausgibt. Pfade mit einem Leerzeichen – etwa die Downloads von Firefox, Thunderbird und Bartender – wurden roh kopiert; ein Browser gleicht das aus, die Kommandozeile nicht.

Die Beta-Zeile von CapCut meldet keine fehlgeschlagene Prüfung mehr. Zwischen zwei Betas – nachdem eine zur finalen Version geworden ist und bevor die nächste beginnt – veröffentlicht der Hersteller auf diesem Kanal nichts. Das erschien als rote Zeile mit einem „Erneut“, das nicht funktionieren konnte. Die Zeile hat nun einfach keine Antwort aus dieser Quelle, bis die nächste Beta erscheint.

Audacity zeigt jetzt das Zeichen dafür, womit es gebaut ist. Es startet über einen kleinen Starter, der an das eigentliche Programm daneben übergibt, und das Zeichen wurde am Starter abgelesen – der nichts einbindet.

App-Store-Versionshinweise erscheinen jetzt in deiner Sprache. Sie wurden immer in der Standardsprache des Stores abgerufen, sodass ein Mac mit chinesischer oder japanischer Sprache sie weiterhin auf Englisch las.

Die eigenen Updates von DuoUpdater erscheinen jetzt unter seinem eigenen Namen im Fenster „Netzwerk“. Seine Versionsprüfung, seine Versionshinweise und sein Download standen alle mit leerer App-Spalte darin.

Unter der Haube. Ein Zugangsschlüssel im Pfad einer Webadresse wird jetzt entfernt, bevor die Anfrage aufgezeichnet wird – so wie einer in einer Abfragezeichenfolge schon immer.

Das Fenster „Download Traffic“ heißt jetzt „Netzwerk“ und hat einen zweiten Tab. „Downloads“ ist die Aufstellung, die du schon kanntest — was jedes Update als Datei gekostet hat. „Anfragen“ ist neu: jeder Abruf, den DuoUpdater für dich macht, wofür er war, zu welcher App er gehörte und was er gekostet hat, mit einem Filterfeld, um das Protokoll zu befragen statt es zu durchscrollen. Die Zahlen oben beantworten das, wonach du gerade gefiltert hast — nicht die Gesamtsumme.

Die Update-Prüfung für Spotify braucht kaum noch Netzwerk. Spotify veröffentlicht nirgends eine Versionsdatei, also liest die Prüfung die Version aus einem zwei Megabyte großen Installer-Stub — und holte sich jedes Mal die ganze Datei, rund um die Uhr. Sie fragt jetzt zuerst, ob sich die Datei geändert hat, und lädt sie nicht herunter, wenn nicht.

PDF Expert findet jetzt seine Updates und zeigt, was sich geändert hat. Es las eine Versionsliste, die der Hersteller seit 2022 nicht mehr ergänzt hat, und meldete sich deshalb als aktuell — ganz gleich, welche Version installiert war. Jetzt folgt es der Liste, die der eigene Updater der App verwendet, und zeigt auch die Hinweise zu früheren Versionen, nicht nur zur neuesten.

UTM-Vorschauversionen erhalten jetzt eigene Updates, lassen sich mit einem Klick installieren und zeigen die passenden Versionshinweise. Bisher wurde eine Vorschauversion am finalen Zweig gemessen und stillschweigend als aktuell gemeldet; sie folgt nun ihrem eigenen Zweig und wechselt zurück auf den finalen Zweig, sobald sie dessen finale Fassung übernimmt.

Unter der Haube. Die aufgezeichneten Anfragen liegen jetzt im selben Speicher wie die Download-Aufstellung, sodass die beiden Abrechnungen desselben Downloads nicht mehr auseinanderlaufen können. Deine bestehende Aufstellung wird unverändert übernommen.

Fünfzehn weitere Apps werden auf Updates überwacht, und alle bis auf eine lassen sich mit einem Klick installieren. AgentsView, AnythingLLM, Chatbox, ChatGPT Classic, DSH Desktop, FluidVoice, GitHub Copilot, Kun, Meetily, Microsoft 365 Copilot, OpenLogi, OpenSuperWhisper, Paseo, T3 Code — auf beiden Kanälen, Alpha und Nightly — und Vorssaint. Die Ausnahme ist ChatGPT Classic: Geprüft wird es für dich, aber es bringt ein Installationsprogramm mit, das die App selbst aktualisiert — dieses eine Update bleibt deine Sache.

Acht Apps zeigen ihre Versionshinweise jetzt in DuoUpdater, statt dich auf eine Webseite zu schicken. Xcode, Antigravity, Antigravity IDE, AnyDesk, AnythingLLM, Chatbox, Headlamp und Helium. Bei dreien gab es überhaupt nichts, wohin man dich hätte schicken können: Die Seite von AnyDesk antwortet mit einer Bot-Abfrage, die Macher von Helium veröffentlichen gar keine Hinweisseite, und Antigravity IDE hatte keinerlei Link.

Xcode-Betas sagen jetzt, was sich in der jeweiligen Beta geändert hat. Bisher bot die Zeile eine Build-Nummer und einen Link; jetzt listet sie Apples Hinweise zu deiner Beta und zu allen vorherigen Betas derselben Version.

Word, Excel, PowerPoint, Outlook und OneNote merken jetzt, wenn ihr Update angekommen ist. Diese fünf boten weiterhin an, das längst abgeschlossene Installationsprogramm erneut zu öffnen, und kamen nie beim Neustart an — Warten oder erneutes Prüfen half nicht.

Eine Zeile, die auf den Neustart wartet, erklärt sich wieder – in beiden Fenstern. War eine App zugleich neuer als das, was ihr Anbieter veröffentlicht, und wartete auf einen Neustart, beschrieb die Zeile über der Schaltfläche etwas ganz anderes; bei Zeilen, die auf einen Neustart nach „Alle aktualisieren“ warteten, widersprachen sich Fenster und Menü zusätzlich.

Statusetiketten verdrängen den App-Namen im Russischen nicht mehr. Einige Etiketten hatten außerdem in allen übersetzten Sprachen Formulierungen aus unverwandten Texten übernommen.

Für Apps, deren Anbieter eine Version nur datiert, ohne sie zu terminieren, erscheinen jetzt Versionshinweise. Bisher hinterließen solche Veröffentlichungen nirgends eine Spur.

Eine Seite mit Versionshinweisen, die wir nicht öffnen, nennt jetzt den Grund. Zuvor blieb sie leer, was genau wie eine App aussah, die gar keine Hinweise veröffentlicht.

Die Nightly-Versionshinweise der WeChat DevTools sind nicht mehr leer.

Unter der Haube. Versions- und Veröffentlichungsdaten werden an einer Stelle behandelt, sodass eine Build-Nummer nie als Marketing-Version gelesen wird und die Veröffentlichungs-Chronik keine Uhrzeit erfindet, die der Anbieter nie genannt hat.

Fehlgeschlagene Prüfungen sind jetzt auch im Fenster sichtbar. Das Fenster zeichnete für eine Zeile, deren Prüfung fehlgeschlagen war, gar nichts — ebenso wenig für ignorierte, übersprungene oder vom App Store, von Toolbox oder TestFlight verwaltete Zeilen. Das sah genauso aus wie „auf dem neuesten Stand“. Beide Fenster sagen jetzt dasselbe über dieselbe App, und die Schaltfläche zum erneuten Versuch gibt es in beiden.

„Erneut prüfen“ fragt in jeder Zeile nur nach dieser einen App. Dabei wird auch neu eingelesen, welche Apps laufen — der schnellste Weg, einen grünen Punkt zu korrigieren, der falsch aussieht.

Überspringen und Ignorieren lassen sich jetzt auch über das Kontextmenü des Fensters rückgängig machen. Beide Zeilen forderten dazu auf, per Rechtsklick zu widerrufen — in einem Fenster, dessen Menü genau das nicht anbot.

Die Hintergrundprüfung nimmt dir keine Versionshinweise mehr weg, die du gerade liest. Die stündliche Prüfung verwarf alle bereits geladenen Hinweise, sodass ein offenes Fenster mit Versionshinweisen zurück zur Ladeanzeige sprang. Nur eine von dir ausgelöste Aktualisierung beginnt jetzt von vorn.

Unterbrochene Downloads werden geprüft, bevor sie als vollständig gelten. Ein Server, der die ganze Datei erneut schickte, und einer, der vorzeitig abbrach, wurden bislang beide beim Wort genommen; der Ärger zeigte sich erst einen Schritt später als Installation aus einem defekten Archiv. Downloads hinter bestimmten Proxys, die zuvor dauerhaft fehlschlugen, funktionieren jetzt.

Das Aktualisieren einer App liest nicht mehr alle Apps auf deiner Festplatte neu ein. Jeder Klick führte zwei vollständige Durchläufe über alle deine Programme aus, nur um das eine angefragte anzusehen.

Chromes Versionshinweise können nicht mehr hängen bleiben. Eine gewöhnliche Umgestaltung von Googles Blog genügte, um sie minutenlang zu blockieren; jetzt laden sie zügig, wie die Seite auch aussieht.

Ein bereits geladenes Installationsprogramm wird nicht mehr verworfen und erneut geholt. Wenn ein Anbieter dieselbe Version auf zwei Arten schrieb (v1.2.3 und 1.2.3), wurde das wartende Paket nicht wiedererkannt, und „Neu starten“ konnte auf einen Austausch warten, der längst erfolgt war.

Eine fehlgeschlagene Installation mit Administratorrechten wird nicht mehr für einen Abbruch durch dich gehalten. Es wurde kein Fehler angezeigt, und die betreffende App bot stillschweigend keine Ein-Klick-Aktualisierung mehr an, bis du über ihr Zeilenmenü erneut Administratorrechte anfordertest.

Der grüne Punkt für „läuft“ bemerkt jetzt jede App. Bei manchen Apps meldet macOS das Starten oder Beenden überhaupt nicht, und ihr Punkt blieb falsch, bis etwas Unbeteiligtes ihn auffrischte.

„Alle aktualisieren“ flackert während einer Aktualisierung nicht mehr, und eine App, die du mitten in der Aktualisierung aktualisierst, wird nicht mehr auf den bereits installierten Stand zurückgesetzt.

Schlägt die Prüfung in dem Moment fehl, in dem du auf Aktualisieren drückst, wird das gesagt — statt als „nichts zu tun“ abgelegt zu werden.

Unter der Haube. Ungewöhnlich geschriebene Veröffentlichungsdaten werden korrekt gelesen, die Adressprüfung für Seiten mit Versionshinweisen erfasst jede gleichwertige Schreibweise, und die laufende Buchführung greift nicht mehr jedes Mal auf die Festplatte zu, wenn auf deinem Mac irgendeine App startet oder endet.

Dockers Kennzeichnung beschreibt jetzt Dockers Oberfläche statt seines Hintergrunddienstes. In der Zeile stand „nativ“; Docker Desktop ist eine Electron-App. Die Kennzeichnung wird aus dem Bundle der App gelesen, und Dockers Bundle ist eine Hülle: Das darin benannte Programm ist ein in Go geschriebener Hintergrunddienst, es bringt kein eigenes Framework mit, und die App, die tatsächlich Fenster zeichnet, sitzt eine Ebene darin. Alles wurde korrekt gelesen — nur aus der falschen Datei. DuoUpdater schaut nun in die verschachtelte App, aber ausschließlich dann, wenn die äußere selbst nichts beisteuert und genau eine solche App enthält, die belegt, womit sie gebaut ist. Ein Hilfsprozess, der neben einer echten Oberfläche ausgeliefert wird, kann seine Identität also weiterhin nicht an seinen Wirt verleihen. Docker liest sich als Electron 42.5.0, und von den hundertsechsundvierzig Apps in der Liste auf dem Rechner, auf dem dies geschrieben wurde, ist es die einzige Zeile, die sich ändert.

Die Release Notes von CleanShot X sind wieder lesbar — auch die zu 5.0. CleanShot hat seine größte Aktualisierung seit Jahren veröffentlicht und dabei die Changelog-Seite neu gebaut: Das Datum steht jetzt über der Versionsnummer, um sie herum sind zwei Ebenen hinzugekommen, und bei einer Funktionsversion stehen zwischen Version und Änderungsliste noch eine Einleitung und zwei Videolinks. Die Leseregel, die DuoUpdater verwendete, passte auf nichts davon mehr. Schlimmer als ein leeres Fenster war, dass es nicht leer aussah: Die bereits gespeicherten Notizen der vorherigen Version blieben unter der Überschrift der neuen stehen — das Fenster sagte „5.0“ über den Änderungen von 4.8.10, und nirgends stand etwas anderes.

Vor einer Veröffentlichung gespeicherte Notizen werden jetzt erneut gelesen statt für immer geglaubt. Das ist die andere Hälfte derselben Geschichte. DuoUpdater wusste sechs Minuten vor CleanShots Veröffentlichung des Inhalts, dass es 5.0 gibt, sicherte die Seite in ihrem damaligen Zustand und legte sie unter 5.0 ab — und von da an fand jede Prüfung etwas Gespeichertes und schaute nie wieder nach. Gespeicherte Notizen werden nun einmal pro Sitzung beim Anbieter bestätigt, bevor sie als endgültig gelten; eine Version, deren Notizen verspätet kommen, ergänzt sich damit beim nächsten Öffnen selbst, statt falsch stehen zu bleiben.

Was du aus der Menüleiste öffnest, öffnet sich jetzt beim ersten Klick. „Änderungsprotokoll“ in einer Zeile zu wählen — oder die Einstellungen oder das Release-Protokoll — bewirkte beim ersten Mal gar nichts und funktionierte erst ab dem zweiten Klick. Wer das Menü erneut öffnete, machte jeden Versuch wieder zum ersten; für alle, die das Menü öffnen, einmal klicken und ein Fenster erwarten, hat es also nie funktioniert. Der erste Klick im Menü wurde dafür verbraucht, DuoUpdater nach vorn zu holen, statt das zu tun, worauf er zielte. Das geöffnete Fenster wird jetzt außerdem vorn gehalten: Es wurde nach vorn gebracht und im selben Moment wieder nach hinten geschoben — die andere Art, auf die das wie ein wirkungsloser Klick aussah.

Eine App, die ihren eigenen Namen leer lässt, bekommt jetzt trotzdem einen. Eudic (欧路词典) stand mit Symbol und Version in der Liste, und dort, wo der Name hingehört, stand gar nichts. Das Bundle deklariert durchaus einen Anzeigenamen — und lässt ihn leer, weil die eigentlichen Namen in den Übersetzungen der App liegen — und DuoUpdater nahm diese leere Antwort als Antwort, statt die nächste Frage zu stellen. Jetzt greift es auf den anderen Namen der App zurück und danach auf den Namen der App-Datei, sodass keine Zeile mehr namenlos bleibt. Von hundertfünfzig Apps hier war eine betroffen; der Punkt ist, dass die Information längst da war und übersprungen wurde.

Der Neustart sagt jetzt, wenn die App sich geweigert hat zu beenden, statt wie ein Klick ins Leere zu wirken. Wenn eine App ein Fenster geöffnet hat, das auf dich wartet — eine Sicherungsabfrage, ein Anmeldeblatt, irgendein Dialog —, lässt macOS sie nicht beenden, und daran kann diese Seite nichts ändern: Es ist das Fenster der App. DuoUpdater drehte sich früher dreißig Sekunden lang und stellte dann kommentarlos dieselbe Taste zurück, was genau wie eine kaputte Taste aussieht — also drückt man sie noch einmal. Die Zeile sagt jetzt, was passiert ist, und verweist dich an die App, um sich um dieses Fenster zu kümmern. Nichts wurde verändert und die neue Version ist bereits installiert, es fehlt also wirklich nur der Neustart — und wenn du die App in den nächsten zehn Minuten einfach selbst beendest, merkt DuoUpdater das und bringt sie in der neuen Version zurück, ohne dass du irgendwo klickst.

Die Versionshinweise von 欧路词典 sind wieder eine Veröffentlichung und nicht sechzehn Jahre davon. Die App veröffentlicht ihre gesamte Geschichte — jede Version zurück bis 2.5.0 — innerhalb der Hinweise zu derjenigen Veröffentlichung, die gerade die neueste ist. Der Detailbereich zeigte das alles unter der Überschrift „26.9.0“, und man musste an einem Jahrzehnt vorbeiscrollen, um zu finden, was sich soeben geändert hatte. Jede Version bekommt jetzt ihren eigenen Eintrag in der Liste, so wie bei jeder anderen App auch.

Das Zeichen, das sagt, womit eine App gebaut ist, verlangt für Tauri jetzt einen Beweis statt einer Ähnlichkeit. Tauri hinterlässt in einem Bundle nichts Auffindbares — kein Framework, keinen eigenen Ordner —, also wurde dieses eine Zeichen daraus erschlossen, wie die App verpackt ist, plus der Tatsache, dass sie Apples Webansicht einbindet. Longbridge passt auf all das und ist kein Tauri: Es zeichnet seine Fenster mit demselben Renderer wie Zed und bettet für eine Ecke seiner Oberfläche eine Webansicht ein. DuoUpdater liest jetzt Tauris eigenen Fingerabdruck aus der Binärdatei, bevor es die Behauptung aufstellt — eine App heißt also Tauri, wenn sie eine ist, und Longbridge liest sich als das, was es ist: eine native Mac-App.

CapCut wird nicht mehr rot, weil ByteDances Server eine schlechte halbe Sekunde hatten. Der Endpunkt, den DuoUpdater nach CapCuts Version fragt, antwortet mit einem Erfolgscode — und etwa jedes fünfzigste Mal mit einem Fehlerobjekt statt mit der Antwort: eine Zeitüberschreitung innerhalb von ByteDances eigener Infrastruktur, rund 390 Bytes, wo 436 Kilobyte erwartet wurden. Diese Seite konnte das nicht davon unterscheiden, dass CapCut die Form seiner Antwort geändert hat, also meldete die Zeile eine fehlgeschlagene Prüfung — was sich liest wie „das ist kaputt und jemand muss es reparieren“ für etwas, das sich beim nächsten Versuch von selbst erledigt. Diese eine bestimmte Form wird jetzt als das erkannt, was sie ist: Die Anfrage wird sofort wiederholt, und als echtes Problem wird sie erst gemeldet, wenn sie fünf Tage lang anhält.

Jede App in der Liste sagt jetzt, womit sie gebaut ist. Eine Zeile für eine App-Store-App trug schon immer das Zeichen des Stores, und jede andere Zeile sah gleich aus — eine Sparkle-App, eine Electron-App und eine native waren nicht zu unterscheiden. Neben jedem Namen steht nun das Zeichen der Technologie selbst — ein Klick zeigt den Namen und einen Satz, ein Verweilen den Tooltip: Electron, Tauri, Flutter, Qt, Java, Chromium, Mac Catalyst, eine iPhone-App auf Apple Silicon oder eine native Mac-App — samt der Version der Laufzeit, wo sie sich als Tatsache lesen lässt (Electron 42.4.1, Qt 6.2, das eingebettete Chromium, das Tauri, mit dem gebaut wurde). Gelesen wird das aus dem App-Paket selbst — dem Framework, das ein Packager mitliefern musste, der Laufzeit, die ein Starter braucht, den Bibliotheken, die das Binary linkt — also eine Tatsache darüber, was installiert ist, und keine Vermutung aus dem Namen. Wo ein langer Name keinen Platz lässt, tritt das Zeichen zur Seite, statt den Namen in eine zweite Zeile zu drängen: die Zeile gehört dem Namen. Abschalten lässt sich das Ganze unter Einstellungen → Allgemein.

LibreOffice behauptet nicht länger ein Downgrade auf die Version, die du schon hast. Sein Download-Index führt dreiteilige Versionen (26.8.0), während die installierte Kopie vier meldet (26.8.0.3); das Auffüllen des fehlenden Teils mit einer Null ließ die installierte Kopie neuer aussehen — und so trug die Zeile einen gedämpften Hinweis „der Hersteller liegt hinter dir“ über eine App, die genau aktuell war. Eine Quelle, die weniger Teile veröffentlicht als die App meldet, wird nun als Beschreibung derselben Version gelesen und nicht als ältere; ein echter Rückschritt sagt das weiterhin.

Eine Einstellung, die ein Update hinzugefügt hat, weist jetzt einmal auf sich hin. Eine neue Option mitten im Einstellungsfenster ist eine Option, die niemand findet. Nach einem Update, das eine hinzugefügt hat, trägt das Zahnrad in der Menüleiste einen blauen Punkt, die zugehörige Seite einen in der Seitenleiste und das Bedienelement selbst einen, bis du es angesehen hast. Nur für die, die tatsächlich dorthin aktualisiert haben — eine frische Installation wird nicht mit Punkten auf Funktionen begrüßt, die für sie einfach zur App gehören.

Die Electron-Apps aus der letzten Version lassen sich jetzt tatsächlich mit einem Klick aktualisieren. 0.3.75 brachte DuoUpdater bei, die Datei zu lesen, die solche Apps in sich tragen — und gelesen hat es sie auch: die neue Version, den passenden Download für deinen Mac, die Prüfsumme dazu. Nur hatte es nirgendwohin damit. Der Installationsknopf erschien nie, und duo install nannte einen Grund für die Ablehnung, der nicht der wirkliche war. Mit dieser Version ist der Installationsweg angeschlossen. In der Praxis merkst du davon womöglich nichts: Dieses Lesen sitzt hinter jeder handgeschriebenen Regel und spricht nur für eine App, die sonst nichts abdeckt — und das ist heute, auf dem Rechner, auf dem dies gebaut wurde, keine einzige. Es zählt für die App, die du morgen installierst und für die noch niemand eine Regel geschrieben hat.

Ein Download, der dich von einem nativen Build wegholen würde, wird jetzt abgelehnt. Apple Silicon kann Intel-Apps weiterhin übersetzt ausführen — ein reiner Intel-Download bestand also die Prüfung „läuft das auf diesem Mac?“ und wurde sauber installiert. Zurück blieb eine übersetzt laufende Kopie einer App, die zuvor nativ lief; still, und bei jeder künftigen Aktualisierung aufs Neue. Jede Installation an Ort und Stelle vergleicht nun das Vorhandene mit dem Eingetroffenen und verweigert diesen Tausch. Der umgekehrte Weg, und der von einem Universal-Build zu einem Apple-Silicon-Build, ist normal und weiterhin erlaubt.

Wenn sich die Architektur eines Downloads nicht belegen lässt, wird jetzt abgelehnt statt geraten. Manche Anbieter veröffentlichen neben ihrem Standard-Download einen Apple-Silicon-Build, und der einzige Hinweis darauf, dass der Standard der Intel-Build ist, besteht darin, den anderen zu bemerken. Kommt diese zweite Prüfung nicht sauber zurück — der Server des Anbieters verweigert sie, die Verbindung bricht ab, oder beide sind sich über die Version uneins — behandelt DuoUpdater dieses Schweigen nicht länger als Antwort. Es nennt die Version und bietet keine Installation an. Das ist das ehrliche Ergebnis.

Eine defekte Regel kann nicht mehr aus der Diagnose verschwinden. Bei Apps, die sowohl von einer handgeschriebenen Regel als auch vom neuen Leseweg erfasst werden — absichtlich die Mehrzahl —, wurde ein Fehlschlag der Regel dadurch aufgehoben, dass der Leseweg unmittelbar danach Erfolg hatte. Eine App mit tatsächlich defekter Regel las sich weiterhin als gesund. Beide werden jetzt getrennt erfasst. Der Leseweg meldet außerdem erstmals eigene Fehlschläge: Auf dem Rechner, auf dem dies gebaut wurde, zeigten drei Apps auf Adressen, die seit geraumer Zeit „nicht gefunden“ zurückgeben — und nichts hätte das zuvor ausgesprochen.

Zeilen, die ein Update sehen, aber keines installieren können, bieten jetzt an beiden Stellen dasselbe an. In der Menüleiste erschien ein Knopf mit der Aufschrift „Öffnen“, der den Finder öffnete; im Fenster stand für dieselbe Zeile überhaupt nichts.

Mit Electron gebaute Apps werden jetzt erkannt, ohne dass sie vorher jemand eintragen muss. Sehr viele Mac-Apps führen im Inneren eine kleine Datei mit sich, die angibt, wo ihre Updates liegen. Bisher kannte DuoUpdater nur diejenigen, für die jemand von Hand eine Regel geschrieben hatte — alle übrigen standen ohne Versionsnummer in deiner Liste, und es gab keine Möglichkeit, dir einen neuen Build zu melden. Jetzt liest es diese Datei direkt, genauso wie es die von Sparkle schon immer gelesen hat. Eine solche App ist damit an dem Tag abgedeckt, an dem du sie installierst, und nicht erst an dem Tag, an dem jemand dazu kommt.

Apps mit einer bereits vorhandenen handgeschriebenen Regel bleiben unberührt. Der neue Leseweg sitzt hinter ihnen und kann deshalb nur eine Lücke füllen — niemals etwas übernehmen, das bereits funktioniert hat.

Zwei Details entscheiden darüber, ob der angebotene Download der richtige ist, und beide wurden an echten Apps geklärt statt angenommen. Manche Anbieter kennzeichnen einen Intel-Build als ihren „primären“ Download, obwohl sie daneben auch einen für Apple Silicon veröffentlichen; andere geben dem Apple-Silicon-Build einen Dateinamen, der sich von dem für Intel nicht unterscheidet, sodass der Name nichts verrät. DuoUpdater wählt nach Architektur aus, und wo es nicht sicher sein kann, dass ein Download auf deinem Mac läuft, nennt es dir die Version und bietet die Installation nicht an — statt dir etwas zu geben, das sauber installiert und sich dann nicht öffnen lässt.

Wer die Beta-, Release-Candidate- oder Nightly-Version einer App nutzt, wurde von DuoUpdater stillschweigend auf dem falschen Zweig beobachtet. Welchen Zweig du nutzt, ermittelt es, indem es deinen Build in der Veröffentlichungsliste des Herstellers wiederfindet — doch eine Vorabversion behält meist dieselbe öffentliche Versionsnummer wie die Stable-Version, aus der sie stammt, und genau das ist bei Vorabversionen das Normale. Also traf die Zuordnung den Stable-Eintrag. Der Fehler blieb unsichtbar: Auf dem Bildschirm wirkte nichts falsch, du erfuhrst lediglich nie vom nächsten Build deines eigenen Zweigs, und die angezeigten Versionshinweise gehörten zur Stable-Linie. Gefunden wurde das, indem die echten Vorabversionen von Supacode und TypeWhisper installiert und beobachtet wurden; beide folgen nun dem Zweig, auf dem sie tatsächlich sind.

Die Beta von CapCut zeigte eine Version an, die du gar nicht hast. In der Zeile stand „9.3.4545 → 9.4.0-beta6“, während CapCut selbst, der Finder und jedes andere Update-Werkzeug deine Kopie 9.4.0-beta5 nannten. Manche Apps tragen ihre echte Version in ein anderes Feld ein als die meisten, und DuoUpdater las auf deiner Seite des Pfeils die ordentlicher aussehende Angabe, auf der Herstellerseite dagegen die echte. Das angebotene Update war immer das richtige — falsch war nur die Beschriftung. Beide Hälften der Zeile stammen jetzt aus derselben Quelle, bei CapCut wie bei den sieben weiteren so gebauten Apps.

MacWhisper, GitHub Copilot for Xcode, TypeWhisper und OpenUsage zeigen jetzt ihre Versionshinweise. Bei allen vieren blieb das Hinweisfeld leer: Ihre Update-Feeds enthalten überhaupt keine Hinweise, was erst auffiel, als jede einzelne mit dem abgeglichen wurde, was der Hersteller tatsächlich veröffentlicht. DuoUpdater liest nun MacWhispers eigene Seite mit Versionshinweisen, die Changelog-Datei von Copilot und die Changelog-Website von TypeWhisper und verweist bei OpenUsage auf dessen Veröffentlichungsliste.

Helium aktualisiert sich jetzt über seinen eigenen Update-Dienst, was den Beta-Kanal und deutlich kleinere Downloads bringt. Bisher wurde es über die öffentliche Veröffentlichungsliste verfolgt, in der nur Stable-Builds erscheinen — wer Heliums Beta nutzte, bekam also die Stable-Version gereicht. Der eigene Dienst veröffentlicht außerdem Patches, sodass ein gewöhnliches Update rund 40 MB statt eines erneuten Downloads von 124 MB benötigt. Geprüft wurde das mit einem Stable- und einem Beta-Build, und der Download wird gegen den Signaturschlüssel in deiner installierten Kopie verifiziert, bevor irgendetwas ersetzt wird.

Die Beta-, Developer- und Nightly-Ausgaben von Firefox und Thunderbird werden jetzt richtig verfolgt — bis heute hatte keine dieser fünf Ausgabelinien jemals ein einziges Update gemeldet. Gelesen wurden sie aus Mozillas öffentlicher Versionsdatei, die nur die angezeigte Version veröffentlicht, und beim Installieren einer Beta fällt das „b5“ weg: Eine Firefox-Beta nennt sich den ganzen Zyklus über 155.0, gefragt wurde also einzig „ist 155.0b5 neuer als 155.0?“, und die Antwort lautet nein. Nightly war schlimmer — Mozilla liefert täglich einen Build aus, und jeder davon heißt 157.0a1, sodass ein Zyklus von vier Wochen exakt nichts ergab. DuoUpdater fragt jetzt Mozillas eigenen Update-Dienst, dieselbe Adresse, die auch Firefox' eingebauter Updater benutzt und die die App selbst in sich stehen hat, und vergleicht die Build-Kennung, die beide Seiten tragen. Vor der Auslieferung gegen die echten Downloads aller fünf Linien geprüft: Die Kennung, die dieser Dienst meldet, ist Byte für Byte dieselbe wie die in deiner Kopie; eine Beta, die einen Build zurückliegt, zeigt ihr Update jetzt an, und ein Nightly vom selben Tag, nur früher gebaut, ebenfalls. Die stabile Ausgabe und ESR waren nie betroffen und bleiben unangetastet. Eine Einschränkung, klar gesagt: Dieser Dienst veröffentlicht kein Erscheinungsdatum, für diese fünf Linien hält das Release-Log also weiterhin fest, wann DuoUpdater einen Build zuerst gesehen hat — nicht, wann Mozilla ihn ausgeliefert hat.

Wispr Flow, AionUi und Devin lassen sich jetzt mit einem Klick aktualisieren, statt nur zu melden, dass es eine neue Version gibt. Alle drei konnten ihre Updates bereits sehen, keines konnte eines anwenden — mit der Begründung, der Hersteller liefere getrennte Builds für Intel und Apple Silicon aus und DuoUpdater habe keine Möglichkeit zu wählen. Nachgemessen statt angenommen hielt dieser Grund nicht stand: Die Endpunkte, aus denen diese drei gelesen werden, sind ohnehin die für Apple Silicon, und DuoUpdater läuft ausschließlich auf Apple Silicon — es gab nie eine Wahl zu treffen. Jeder Download wurde vor dem Einbau geholt und geprüft: die richtige App darin, signiert vom selben Entwickler wie deine Kopie, von Apple notarisiert, und der von AionUi zusätzlich gegen die Prüfsumme, die sein eigenes Manifest veröffentlicht. Anschließend wurde jedes tatsächlich über eine ältere Kopie installiert und kam auf der neuen Version zurück.

Grok Bot wird jetzt verfolgt — neue Versionen und Updates mit einem Klick. Die Desktop-App von xAI wird von Anysphere gebaut und signiert, der Firma hinter Cursor, und sie aktualisiert sich über Cursors eigenen Release-Dienst. Genau deshalb antwortete keiner der üblichen Wege für sie: kein Sparkle-Feed, kein Eintrag im App Store, kein öffentliches Release-Repository, und ein Homebrew-Cask, das das Aktualisieren an die App selbst zurückgibt. DuoUpdater liest stattdessen den Versions-Endpunkt des Herstellers. Zwei weitere Endpunkte standen zur Wahl und wurden aus genannten Gründen beide nicht genommen: der hinter dem Download-Knopf auf x.ai veröffentlicht überhaupt keine Versionsnummer, und der, den der eigene Updater der App benutzt, antwortet mit leerem Rumpf, sobald man bereits aktuell ist — ein Schweigen, das von einem kaputten Endpunkt nicht zu unterscheiden wäre. Der Download wurde vor dem Einbau geprüft: Das Disk-Image enthält die richtige App, signiert vom selben Entwickler wie deine Kopie und von Apple notarisiert. Eines bietet es bewusst nicht: Versionshinweise. xAI veröffentlicht für diese App keine, und das einzige Changelog, das es gibt, gehört zu einem anderen Produkt.

Comet und Msty Studio aktualisieren sich jetzt ebenfalls mit einem Klick, und eine neue Prüfung achtet auf Apps, die könnten und es nicht tun. Das waren die letzten beiden aus der Gruppe, die Updates sehen, aber nicht anwenden konnten — und beide brauchten nichts Neues, nur einen genaueren Blick darauf, was der Hersteller tatsächlich liefert. Comets Download-Link ist signiert und verfällt nach einer Stunde, deshalb zeigt der Update-Knopf auf Perplexitys eigenes Gateway: Der Link entsteht in dem Moment, in dem du klickst, und nicht Stunden früher bei der Prüfung. Msty veröffentlicht vier Downloads in einer Datei, den Intel-Build zuerst, und der Fingerabdruck zur Verifikation stammte aus genau diesem ersten Eintrag; er hängt jetzt an dem Apple-Silicon-Build, der wirklich geholt wird — wodurch eine zwischen Prüfung und Klick veröffentlichte Version in aller Regel auffällt, statt stillschweigend installiert zu werden. Beide wurden vor der Auslieferung heruntergeladen und durch die echten Installationsprüfungen geschickt. Die eigentliche Lehre betrifft keine der beiden Apps: Nichts in DuoUpdater konnte bemerken, dass eine App aus einem längst überholten Grund nur beobachtet wurde. Der nächtliche Rezept-Durchlauf sagt es jetzt, wenn eine bloß beobachtete App uns längst ein Installationspaket hinhält.

QQ音乐 wird jetzt erfasst — neue Versionen, One-Click-Updates und seine Versionshinweise im Fenster. Keiner der üblichen Wege antwortete. Es liefert weder einen Sparkle-Feed noch überhaupt das Sparkle-Framework aus; sein Homebrew-Cask gibt das Aktualisieren an die App selbst zurück; und der Update-Endpunkt, den die eigene Programmdatei benennt, antwortet auf alles, was wir ihn fragen können, mit 200 und leerem Rumpf — ein Schweigen, das von einem kaputten Endpunkt nicht zu unterscheiden ist, weshalb er unangetastet blieb. Was DuoUpdater stattdessen liest, ist die Datendatei, aus der die Download-Seite des Anbieters selbst gespeist wird: Diese Seite liefert nur eine leere Hülle aus und füllt sich erst aus dieser Datei — die zugleich der einzige Ort ist, an dem die Versionshinweise überhaupt existieren; es gibt weder einen Blog noch einen Appcast noch eine Seite pro Version. Die Hinweise werden also direkt aus ihr gelesen und im eigenen Fenster von DuoUpdater angezeigt, und das Update installiert das notarisierte Disk-Image, das in derselben Antwort genannt wird. Eine Falle, die man festhalten sollte: Diese Datei führt neben dem aktuellen noch einen zweiten, sechs Jahre alten Mac-Eintrag, weshalb beide Regeln am versionierten Dateinamen des Mac-Downloads ansetzen und nicht am Wort „Mac“. Und eine Einschränkung, die man klar benennen sollte: Die Datei veröffentlicht nur die angezeigte Version, nie die dahinterliegende Build-Nummer, sodass ein Neuschnitt einer Version, der den Namen behält, hier unsichtbar bleibt. Sie kann kein Update erfinden, das es nicht gibt — sie kann diese eine Art von Änderung schlicht nicht sehen.

TimeMachineEditor wird jetzt erfasst — neue Versionen und Updates mit einem Klick. Keiner der üblichen Wege antwortete für die App: kein Sparkle-Feed (sie trägt weder eine Feed-Adresse noch das Framework, das eine nutzen würde), kein Eintrag im App Store, kein öffentliches Release-Repository, und ein Homebrew-Cask, das das Aktualisieren an die App selbst zurückgibt. Was es gibt, ist eine kleine Anbieter-Seite, deren einziger Download-Link die Version im eigenen Text nennt — dieselbe Seite, auf demselben Weg gelesen, auf die sich auch Homebrews eigene Versionsprüfung stützt; das ist also die Fläche, die der Hersteller vorsieht, und keine Vermutung. Das Update installiert als das eigene Installationspaket des Herstellers statt als einfacher App-Austausch, und das ist Absicht: Der Download platziert außerdem einen Hintergrund-Scheduler, ein Kommandozeilen-Werkzeug und einen Launch Daemon außerhalb der App selbst, sodass ein bloßer Austausch der App eine neue Kopie neben einem veralteten Scheduler zurückließe, ohne dass etwas den Widerspruch bemerken würde.

Little Snitch wird jetzt erfasst, sowohl auf seinem Stable- als auch auf seinem Nightly-Release. Object Development veröffentlicht eine Versionsdatei, auf die auch der eigene Updater zurückfällt — dieselbe, die Homebrew liest —, und DuoUpdater liest sie direkt, weil Little Snitch keinen Sparkle-Feed ausliefert und sein Cask das Aktualisieren an die App zurückgibt. Die beiden Releases teilen sich eine Identität, was sie normalerweise ununterscheidbar machen würde; dieses Mal verrät sich der Unterschied im Versionsstring, wo eine Nightly-Build das Wort ausgeschrieben trägt („6.5 nightly (7301)“), während die Stable-Build als schlichtes „6.4.1“ erscheint. Es lohnt sich zu sagen, was das bewusst nicht tut: Es installiert das Update nicht für dich. Little Snitch betreibt neben der App eine System Extension und einen privilegierten Hintergrunddienst, und ob ein bloßer Austausch der App diese unversehrt ließe, wurde nicht an einer echten Maschine geprüft — deshalb sagt dir DuoUpdater nur, dass die neue Version da ist, und schickt dich zum eigenen Download des Herstellers, statt bei einem Netzwerkfilter zu raten.

Carbon Copy Cloner wird jetzt erfasst, und es wird nicht versuchen, dich zwischen Hauptversionen zu bewegen. Bombich hält drei Generationen gleichzeitig am Leben — CCC 5, 6 und 7 —, die alle dieselbe Identität an das System melden, was „gibt es etwas Neueres?“ zu einer trickreicheren Frage macht, als es aussieht: 7.1.6 sortiert sich tatsächlich über 6.1.13, aber der Wechsel zwischen ihnen ist ein separater Kauf, und CCC 7 braucht ein neueres macOS, als ein CCC-5-Rechner überhaupt laufen haben mag. Allein nach Versionsnummer zu antworten hätte jedem Besitzer von CCC 5 und 6 für immer gesagt, ein kostenloses Update warte — und das wäre jedes Mal falsch gewesen. DuoUpdater liest deshalb jede Generation von ihrer eigenen Adresse und bietet ausschließlich das nächste Release innerhalb der Generation an, die tatsächlich vorhanden ist. Beta-Releases werden ebenfalls erfasst, für alle, die das in CCC eingeschaltet haben. Vorerst nur Erkennung — CCC installiert neben der App einen privilegierten Helper, was ein größerer Anspruch ist als die One-Click-Updates, die es hier bereits gibt —, und der Grund, warum bisher nichts diese Updates sehen konnte, ist es wert, festgehalten zu werden: Der eigene Update-Feed der App beantwortet jede Anfrage erfolgreich, mit einer vollständig leeren Seite.

Ein Update, das dein Mac tatsächlich nicht ausführen kann, wird jetzt nicht mehr heruntergeladen und installiert. Jedes App-Bundle nennt das älteste macOS, unter dem es startet, und manche Hersteller nennen auch das neueste — „diese Build ist nicht für ein so neues Betriebssystem gedacht“, so drückt eine App aus, die mit macOS 27 noch nicht mitgezogen ist. DuoUpdater las bisher keines von beidem. Für Apps, die über einen Sparkle-Feed verfolgt werden, wurde die untere Grenze bereits beachtet, aber das ist eine Minderheit: Von den Apps auf einem typischen Mac ist die größere Hälfte diejenige, die aus dem eigenen Endpunkt eines Herstellers oder aus GitHub-Releases gelesen wird, und ein GitHub-Release veröffentlicht nirgendwo eine macOS-Anforderung. Also konnte eine App, die bereits zu einem neueren macOS gewechselt war als dem eigenen, angeboten, vollständig heruntergeladen, eingebaut werden — und sich dann nicht öffnen. DuoUpdater liest die Anforderung jetzt direkt aus der heruntergeladenen App aus, gleich neben der bereits bestehenden Prüfung, dass sie für deinen Prozessor gebaut ist, und verweigert den Austausch, statt eine funktionierende Kopie durch eine zu ersetzen, die nicht startet. Auch die vom Hersteller genannte Obergrenze wird beachtet, wo ein Feed eine veröffentlicht, sodass eine Build, die der Entwickler als nicht-für-dein-macOS markiert hat, gar nicht erst angeboten wird. Drei Einschränkungen, die man klar benennen sollte. Die Anforderung erst aus dem Download auszulesen bedeutet, dass der Download bereits stattgefunden hat — das verhindert eine kaputte Installation, nicht den Datenverkehr, denn bei den meisten Apps gibt es keine frühere Stelle, an der man fragen könnte. Eine App, deren neueste Version dein Mac nicht ausführen kann, zeigt dieses Update weiterhin an und lehnt die Installation weiterhin ab; die Ablehnung nennt jetzt das gewünschte macOS, aber DuoUpdater merkt sich die Antwort noch nicht und hört deshalb noch nicht auf, das Update anzubieten. Und die Prüfung deckt die Wege ab, auf denen DuoUpdater das App-Bundle selbst austauscht — ein Installationspaket übergibt die Datei an macOS, das die eigenen Anforderungen des Pakets durchsetzt, und Homebrew und der App Store wählen ihre eigenen Builds; Apps, die aus dem iPhone- und iPad-Bereich des App Store stammen, werden bewusst übersprungen, da die dort genannte Version eine iOS-Version ist und ein Vergleich mit macOS schlimmer wäre als gar keine Prüfung. Eine Sache, die es noch nicht laut ausspricht: Wo ein Entwickler eine Build als nicht-für-dein-macOS markiert hat, wird dieses Update einfach nicht angeboten, und die App erscheint als aktuell, statt zu erklären, warum. Bei einem älteren Mac löst sich das von selbst, sobald du macOS aktualisierst. Bei einem zu neuen Mac tut es das nicht, und dort ist eine bessere Antwort als Schweigen fällig.

百度网盘 wird jetzt erfasst — neue Versionen, One-Click-Updates und seine Versionshinweise direkt im Fenster. Keiner der üblichen Wege stand offen. Es veröffentlicht keinen Sparkle-Feed; das Homebrew-Cask kann für eine von Hand installierte Kopie nicht sprechen; und das Update-Manifest, das im eigenen Bundle-Namen genannt wird, ist tot — diese Datei, ihr arm64-Pendant und das Verzeichnis, das beide enthält, antworten mit 404. DuoUpdater liest deshalb den Endpunkt, aus dem die Download-Seite des Anbieters selbst gespeist wird, und installiert das notarisierte arm64-Disk-Image, das in genau dieser Antwort genannt wird. Seine Versionshinweise kommen auf demselben Weg: Die Seite „版本更新“ hat einen Tab „Mac版“, liefert aber selbst nichts aus und wird erst von einer API gefüllt — also liest DuoUpdater diese API direkt aus und zeigt die letzten vierzig Versionen im eigenen Fenster an. Eine Einschränkung, die man klar benennen sollte: Dieser Feed veröffentlicht nur die angezeigte Version, nie die dahinterliegende Build-Nummer, sodass ein Neuschnitt einer Version, der den Namen behält, hier unsichtbar bleibt. Es kann kein Update erfinden, das es nicht gibt — es kann diese eine Art von Änderung schlicht nicht sehen.

Eine fehlgeschlagene Prüfung sagt jetzt, dass sie fehlgeschlagen ist, statt einen leeren Strich zu zeigen. Eine App, deren Version nur der eigene Endpunkt des Anbieters beantworten kann, hatte bisher genau eine Art, „keine Antwort“ auszudrücken: einen leeren Strich — genau das Bild, das auch eine App zeigt, die überhaupt nicht abgedeckt ist. Ein Anbieter-Endpunkt, der einen Timeout wirft oder umzieht, las sich also exakt wie „DuoUpdater verfolgt diese App nicht“ — ein dauerhaft wirkendes Urteil, ohne angebotene Schaltfläche „Erneut versuchen“ und ohne Eintrag im Zähler „Apps konnten nicht geprüft werden“. Aus solchen Fällen wird jetzt eine fehlgeschlagene Prüfung, was sie tatsächlich sind: eine Schaltfläche „Erneut versuchen“, ein Platz im Zähler und ein genannter Grund. Bewusst nicht alles: Ein Zustand, gegen den dein Mac schlicht nichts tun kann — kein Recipe für den Release-Track, auf dem du bist, ein Endpunkt, der eine Identität braucht, die diese Maschine nicht hat — bleibt der stille Strich, der es immer war, und eine Prüfung, die drei Runden in Folge fehlgeschlagen ist, tritt weiterhin aus dem Banner heraus, statt es für immer festzunageln. Eine App, die von JetBrains Toolbox installiert wird, behält außerdem ihre Schaltfläche „Toolbox öffnen“, wenn das Auslesen der dahinterliegenden Version fehlschlägt — Toolbox zu öffnen war ohnehin in jedem Fall die richtige Antwort.

Die Erinnerung „zum Anwenden neu starten“ verschwindet jetzt, sobald du neu gestartet hast. Wenn der eigene Updater einer App im Hintergrund eine neue Build heruntergeladen hatte, sagte DuoUpdater dir das und bot auf der Benachrichtigung eine Schaltfläche „Neu starten“ an. Sie zu klicken funktionierte — die App kam mit der neuen Build zurück und meldete „Es läuft jetzt 1.0.“ —, aber die Erinnerung, die sie hätte ersetzen sollen, blieb darunter im Mitteilungszentrum liegen und forderte weiterhin dazu auf, etwas neu zu starten, das man gerade neu gestartet hatte. DuoUpdater prüfte, ob die Erinnerung aufgehört hatte, relevant zu sein, und ausgerechnet der Moment der Prüfung war genau der, der bereits erledigt war. Die Erinnerung wird jetzt immer entfernt, sobald kein Neustart mehr aussteht — das räumt auch eine Erinnerung weg, die eine App hinterlassen hat, die ihr eigenes Update angewendet hat, während DuoUpdater gar nicht lief.

Apps, die viele Builds unter derselben Versionsnummer ausliefern, werden jetzt überall korrekt behandelt. Eine Mac-App trägt zwei Versionsangaben: die, die sie dir zeigt („1.0“) und eine Build-Nummer, die tatsächlich hochzählt. Die meisten Apps bewegen beide. Manche bewegen nur die Build-Nummer: Amp hat an einem einzigen Tag zehn Builds veröffentlicht, jede davon „1.0“ genannt; Surge hat vier getrennte Versionen als 6.9.0 herausgebracht; die Preview-Builds von JetBrains machen es genauso. DuoUpdater entschied die Frage „hat sich das geändert?“ an rund einem Dutzend Stellen durch den Vergleich der angezeigten Version — und für diese Apps kann dieser Vergleich immer nur „nein“ antworten, oder, wo gefragt wurde „sind das dieselben?“, immer nur „ja“, ganz gleich, was tatsächlich passiert war. Was folgt, ist das, was dieser eine Fehler kaputtgemacht hat — gefunden, weil Amp ihn sichtbar gemacht hat.

Neu starten wirkt nicht mehr, als würde es drei Minuten lang hängen, um dann einen Fehler zu melden, der gar nicht aufgetreten ist. Ein Klick auf „Neu starten“ bei einer App, deren eigener Updater bereits eine Build bereithielt, ließ die Anzeige drei Minuten lang drehen und meldete dann einen Fehlschlag — während das Update in Wirklichkeit innerhalb von ein, zwei Sekunden angewendet worden war und die App bereits mit der neuen Build wieder geöffnet hatte. DuoUpdater wartete auf eine Änderung der angezeigten Version, die niemals kommen würde. Gemessen an Amp: 189 Sekunden Ladeanzeige für einen Austausch, der unter einer Sekunde dauerte. Das Ganze ist jetzt in deutlich unter einer Sekunde erledigt, und ein echter Fehlschlag wird weiterhin als solcher gemeldet.

Neu starten bietet dir nicht mehr eine Build an, die bereits veraltet ist. Hatte der Updater einer App eine Build heruntergeladen und der Entwickler inzwischen eine weitere veröffentlicht, bot DuoUpdater trotzdem „Neu starten“ an — man startete neu und war sofort eine Build im Rückstand, genau das, was diese Prüfung eigentlich verhindern sollte. Solche Zeilen bieten jetzt stattdessen Aktualisieren an, was die aktuelle Build lädt.

Eine Version zu überspringen verstummt eine App nicht mehr für immer. Das ist der Punkt, den man kennen sollte. „Diese Version überspringen“ soll eine Veröffentlichung ablehnen und die nächste durchlassen. Gespeichert wurde aber nur die angezeigte Version — bei einer App, die über mehrere Builds hinweg denselben Versionsnamen behält, lehnte ein einziges Überspringen also jede künftige Veröffentlichung ab: dauerhaft, Neustarts überdauernd, ohne dass irgendetwas auf dem Bildschirm anzeigte, dass die App verstummt war. Ein Überspringen speichert jetzt die Build, die es abgelehnt hat. Eine Folge dieser Reparatur: Eine Version, die von einem älteren DuoUpdater übersprungen wurde, wird dir noch einmal angeboten, weil der alte Datensatz nicht sagen kann, welche Build gemeint war. Sie erneut zu überspringen speichert es dann korrekt.

„Wiederherstellen“ taucht wieder auf bei Updates, die aussahen, als hätten sie nichts verändert. Die Werkbank blendet ein Wiederherstellen aus, das ohnehin nichts bewirken würde — und bei diesen Apps sah jedes Wiederherstellen so aus, als würde es nichts bewirken. Die Zeile verschwand also nach einer echten Aktualisierung, während ein vollständiges Backup auf der Festplatte lag, ohne dass ein Weg dorthin bestand.

Die Erinnerung zum Neu-Starten meldet sich wieder einmal pro Build und übersteht es, wenn der Entwickler eine weitere veröffentlicht. 0.3.69 hatte eine Erinnerung, die sich alle fünf Minuten wiederholte, durch eine ersetzt, die sich einmal pro bereitliegender Build meldet — identifizierte die Build aber anhand ihres Namens, sodass sie bei diesen Apps die erste ankündigte und danach für jede weitere stumm blieb. Das ist behoben. Getrennt davon: Weigert sich eine App zu beenden, weil sie ungespeicherte Arbeit hat, merkt sich DuoUpdater, sie wieder zu öffnen, sobald man geantwortet hat. Diese Notiz wurde bisher verworfen, wenn der Entwickler während der Entscheidung eine weitere Build veröffentlichte — die App blieb nach dem Austausch geschlossen, ohne dass etwas sie wieder öffnete. Jetzt folgt die Notiz stattdessen der neuen Build.

Ein fehlgeschlagenes App-Store-Update wird nicht mehr stillschweigend als Erfolg verbucht, und ein bereits heruntergeladenes Installationspaket gilt nicht mehr als das aktuell angebotene, wenn es sich um eine ältere Build handelt. Beides ging auf denselben Vergleich zurück. Auch die Versionshistorie zählte zehn Builds einer App als eine einzige Veröffentlichung; ab jetzt zählt sie sie einzeln, auch wenn bereits aufgezeichnete Historie sich nicht mehr nachträglich korrigieren lässt.

Die Zeile selbst zeigt jetzt, welche Build ein Neustart anwenden wird. Sie las sich als „1.0 → 1.0“ — eine Zeile, die überhaupt keinen Unterschied benennt. Jetzt liest sie sich als „1.0 (129) → 1.0 (130)“, und zwar nur dann, wenn sich tatsächlich die Build geändert hat; unterscheiden sich die Versionsnamen bereits, bleibt die Zeile unverändert. Dieselbe Korrektur erreicht auch die Tooltips von „Neu starten“, die Benachrichtigung, die Notiz, die erklärt, warum eine Installation aufgeschoben wurde, und die Ablehnungsmeldung von duo install.

微信输入法 und 豆包输入法 lassen sich wieder mit einem Klick aktualisieren — und zwar so, wie sie sich selbst aktualisieren. One-Click für Eingabemethoden wurde in 0.3.25 noch am Tag der Veröffentlichung wieder zurückgezogen, nachdem bei jemandem die Einstellungen der Eingabemethode verschwunden waren. Das Problem lag in der Art der Installation: Sie ersetzte die gesamte App, so wie es ein Erstinstallationsprogramm tut. Eine Eingabemethode wird bei macOS über den Ort ihrer App registriert, und beide Apps aktualisieren sich selbst, ohne diesen Ort anzufassen — sie behalten die App und tauschen nur aus, was in ihr steckt. DuoUpdater macht jetzt dasselbe, sodass die registrierte App ein Update als dieselbe App durchläuft und ein Fehlschlag an jeder Stelle die laufende Kopie genau dort belässt, wo sie war. Auch verlangt keine der beiden Apps mehr nach deinem Passwort.

Bevor eine der beiden aktualisiert wird, wird zuerst alles gesichert, was sie gelernt haben. Dein Wörterbuch, deine Einstellungen und dein Kontostatus leben nicht innerhalb der App, sodass die Backup-Kopie, die DuoUpdater ohnehin schon anlegte, für sie nichts aussagen konnte. Sie werden jetzt vor jedem Update einer Eingabemethode als Schnappschuss gesichert und beim Wiederherstellen mit zurückgespielt, und die Kopie kostet fast nichts — 578 MB bei einer der beiden brauchen ein Zehntel einer Sekunde und praktisch keinen Speicherplatz. Das ist ein Sicherheitsnetz, keine Reparatur: Was eine App beim nächsten Start mit deinen Daten macht, ist ihr eigener Code, der da läuft, und dem kann sich nichts in den Weg stellen. Jetzt gibt es aber etwas, zu dem man zurückkehren kann.

Ein Update nimmt einer App nicht mehr stillschweigend die Fähigkeit, sich selbst zu aktualisieren. Wenn DuoUpdater einen Administrator brauchte, um eine App zu ersetzen, stellte es zwar wieder her, wem die App gehörte, aber nicht die Berechtigungen, mit denen die App installiert worden war — und ein Download entpackt sich normalerweise mit engeren Berechtigungen, als ein Installationsprogramm setzt. Bei beiden Eingabemethoden macht das den Unterschied aus, ob ihr eigener Updater sein nächstes Update abschließen kann oder nicht einmal hinter sich selbst aufräumen kann. Die Berechtigungen, mit denen eine App installiert wurde, werden jetzt auf die Kopie übertragen, die sie ersetzt.

DuoUpdater fragt nicht mehr alle fünf Minuten, ob du dieselbe App neu starten willst. Eine App, die sich selbst aktualisiert, legt die neue Version auf der Festplatte ab und wartet darauf, dass du sie beendest. DuoUpdater bemerkte das bei jeder Prüfung und postete jedes Mal aufs Neue eine Erinnerung, sodass eine Build, die du noch nicht neu starten wolltest, so lange weiter nervte, wie du sie liegen ließest. Jede Build wird jetzt einmal angekündigt: Startest du sie neu, überspringst du sie oder ignorierst du die App, bleibt es still — und die nächste Build kündigt sich wieder ganz normal an.

Eine App, die auf einen Neustart wartet, zählt als Update, und eine ignorierte zählt jetzt überhaupt nicht mehr. Eine neue Version, die schon auf der Festplatte liegt, ist ein Update — sie ist nur früh heruntergeladen worden —, deshalb fließt sie jetzt ins Badge und in die Zeile „N Updates verfügbar“ ein, statt in einen separaten Zähler daneben. Bei ignorierten Apps war es umgekehrt: Eine ignorierte App konnte das Badge aufleuchten lassen, während ihre Zeile nur ein blasses „Ignoriert“-Label ohne Schaltfläche zeigte — die Zahl zeigte also auf etwas, worauf man gar nicht reagieren konnte. Ignorieren und Überspringen bedeuten jetzt an allen drei Stellen dasselbe — in der Erinnerung, im Badge und in der Liste.

搜狗输入法 wird jetzt erfasst — indem der eigene Updater befragt wird, statt die Website auszulesen. Sogous Changelog-Seite veröffentlicht dreiteilige Versionsnummern, während die installierte Kopie vierteilige trägt, sodass ein Vergleich damit bedeutet hätte, die echte Version erst zu kürzen. Stattdessen antwortet die eigene Update-Prüfung in der Nummerierung des Bundles selbst. DuoUpdater fragt diesen Endpunkt so ab, wie es die App selbst tut, und liest die Veröffentlichung daraus aus, alle vier Segmente, sodass auch ein Neuschnitt, der nur das letzte Segment ändert, sichtbar wird. Das betrifft nur die Erkennung: Sogous Updater tut sehr viel mehr, als nur die App auszutauschen — er registriert einen QuickLook-Generator neu, verschiebt deine Daten an einen neuen Ort und beendet die Eingabemethode zwangsweise —, deshalb bleibt das Update selbst ihm überlassen. Eine Sache, die man wissen sollte, und die auf Sogous Konto geht, nicht auf unseres: Ihr Endpunkt antwortet abhängig von der macOS-Version, die anfragt, und ein Mac unter macOS 28, der für sich selbst anfragt, bekommt eine Build aus dem Jahr 2023 vorgesetzt. DuoUpdater fragt nicht für sich selbst an, sodass dir auf jedem Mac die aktuelle Version angezeigt wird.

Versionshinweise, die eine spätere Korrektur richtig gelesen hätte, werden jetzt erneut gelesen, statt für immer falsch zu bleiben. Versionshinweise werden pro Version zwischengespeichert, mit der Überlegung, dass sich die Hinweise einer veröffentlichten Version nie mehr ändern. Das stimmt für die Hinweise selbst, aber nicht für das, was DuoUpdater aus ihnen herausliest — eine App, deren Hinweise verstümmelt herauskamen, blieb für diese Version also so, egal wie viele Parsing-Korrekturen danach noch erschienen. Jeder zwischengespeicherte Eintrag verzeichnet jetzt, welche Generation der Extraktionslogik ihn geschrieben hat, und ein Eintrag einer älteren Generation wird erneut abgerufen. Das gilt für beide Caches — App-Changelogs und Homebrew-Formel-Hinweise.

Eine Prüfung, die an einem fremden CDN scheitert, wird ein zweites Mal versucht, bevor sie als kaputt gilt. 502, 503 und 504 bedeuten alle, dass ein Vermittler den dahinterliegenden Server nicht erreichen konnte: Die Anfrage kam nie an, weshalb dieselbe Anfrage einen Moment später in der Regel funktioniert. Genau daran scheiterte die Prüfung von Headlamp — GitHub antwortete mit 504, ganz ohne Rate-Limit-Header. Diese drei bekommen jetzt einen erneuten Versuch, nach acht Zehntelsekunden. Bewusst nur diese drei: Ein 500er ist ein Fehler des Servers selbst, und ihn zu wiederholen reproduziert ihn meist nur; und ein Rate-Limit erneut zu versuchen verbraucht genau das Kontingent, über das es sich beschwert.

Die Versionshinweise einer Homebrew-Formel folgen jetzt der Version, zu der sie gehören. Hinweise wurden pro Formel gespeichert und nie pro Version, sodass, sobald die Hinweise einer Formel einmal geladen waren, jeder spätere Blick darauf für den Rest der Sitzung die Hinweise dieser ersten Version bekam — auch nachdem eine neuere Version erschienen war. Sie zu lesen belegte außerdem die Warteschlange, auf die der Rest der Formelliste wartete, sodass ein langsames brew info die Liste drumherum ausbremsen konnte.

Rechtsklick auf eine App in der Seitenleiste der Werkbank öffnet sie. Dasselbe „Öffnen“, das die Zeilen im Menüleisten-Menü schon immer angeboten haben, jetzt auch in dem Fenster, in dem man es eher braucht.

Einen heruntergeladenen Installer zu verwerfen nimmt jetzt auch den Fehler mit, den er hinterlassen hat. Ein bereitliegendes Paket wegzuwerfen setzte die Zeile schon bisher auf „Aktualisieren“ zurück, aber ein roter Fehlschlag aus dem gerade abgebrochenen Versuch blieb darauf sitzen — und nichts hätte ihn je entfernt, denn ein Fehler wird erst zurückgezogen, sobald eine Zeile auf dem neuesten Stand ist, was eine Zeile, die noch ein Update anbietet, nie tut. Jetzt verschwindet er zusammen mit dem Download.

duo, der optionale Begleiter für die Kommandozeile, beschreibt sich selbst nicht mehr falsch. --timeout ist verschwunden — es wurde entgegengenommen, dokumentiert und von nichts gelesen. --budget ist erstmals dokumentiert, und die eine Meldung, die es erwähnt, nennt jetzt eine echte Zahl von Minuten statt immer „15“. --max-calls behauptete einen Standardwert von 20, tatsächlich sind es 6. Ein Zahlen-Flag, dem etwas übergeben wird, das keine Zahl ist, ist jetzt ein Fehler: duo verify --max-concurrency 1x wurde bisher ignoriert und mit dem Standardwert vier weitergefahren — genau die falsche Richtung für jemanden, der einen Durchlauf bewusst verlangsamen will. Und duo verify zählt die Anfragen, die es wirklich gestellt hat: Ein Feed, der mit 502 antwortet und beim erneuten Versuch klappt, meldet nicht mehr fälschlich ein sauberes ok, obwohl er heimlich zweimal gefragt hat. -h funktioniert jetzt überall dort, wo auch --help funktioniert.

Vier weitere Apps werden erfasst, zwei weitere Release-Channels kommen dazu, und jede von ihnen aktualisiert sich an Ort und Stelle. CapCut, Canva und WorkBuddy auf beiden Seiten, von denen es ausgeliefert wird — die internationale und die chinesische Seite betreiben unabhängige Release-Züge, sodass eine Installation immer nur die Version und die Hinweise der eigenen Seite angeboten bekommt. Termius und VSCodium bekommen ihre Beta- und Insiders-Channels neben den bereits abgedeckten Stable-Builds. CapCuts zweiter Track ist der unangenehme Fall: Er wird über einen Schalter innerhalb von CapCut selbst gewählt und taucht in der Versionsnummer nirgends auf, sodass der Track, auf dem man sich befindet, von der Kopie auf der Festplatte abgelesen wird, statt aus der gerade laufenden Build geraten zu werden. Wissenswert, falls dieses Häkchen gesetzt ist — DuoUpdater bietet dir die neueste Beta an, sobald sie existiert, was dem Punkt voraus sein kann, den CapCuts eigenes gestaffeltes Rollout für dich erreicht hätte.

Android Studios Preview-Channels bieten dir keine Build mehr an, die älter ist als die, die du schon hast. Google listet seine Veröffentlichungen in der Reihenfolge ihres Erscheinens statt nach Version, und DuoUpdater durchsuchte diese Liste drei getrennte Male — einmal für die Version, einmal für das Datum, einmal für den Download —, sodass ein Release Candidate, der nach einem neueren Canary veröffentlicht wurde, die Version aus einem Eintrag und die Datei aus einem anderen liefern konnte. Am 26. August antwortete der Canary-Channel mit 2026.1.4 RC 2, während 2026.2.1 Canary 2 bereits erschienen war. Jede dieser Antworten muss jetzt aus demselben Eintrag stammen.

Ein neu geschnittenes Release installiert nicht mehr die Kopie, die es eigentlich ersetzen sollte. Baut ein Projekt ein Release neu, ohne die Version zu ändern, liegen beide Dateien unter demselben Tag — KeePassXC liefert KeePassXC-2.7.11-1-arm64.dmg neben dem ursprünglichen KeePassXC-2.7.11-arm64.dmg aus —, und DuoUpdater nahm einfach, was zuerst gelistet war. Diese Reihenfolge ist alphabetisch, was diesmal zufällig den Neuschnitt nach vorn stellte und ihn beim nächsten Mal nach hinten gestellt hätte. Nichts daran war sichtbar: Die Version in der Zeile stimmte, nur die Datei dahinter war falsch. Die richtige Datei wird jetzt danach gewählt, was der Dateiname selbst aussagt.

Nightly- und Snapshot-Builds werden jetzt als das erkannt, was sie sind: Vorabversionen. VLCs Nightly, der KeePassXC-Snapshot und Freelens Nightly installieren sich alle unter dem Namen und der Bundle-ID der Stable-App, sodass allein ihre Versionskennung sie verrät — und genau die wurde nicht ausgelesen. Sie zählten als Stable-Installationen, und so kommt es, dass einer Nightly-Version am Ende ein gewöhnliches Release zum Überschreiben angeboten wird. Die Nightly von DB Browser for SQLite wird aus demselben Grund aus dem eigenen Dateinamen der App gelesen, und dort war das Problem zwar vorhanden, aber verborgen: Ihre eingefrorene Version sortiert sich nur so lange über der aktuellen Stable-Version, bis Stable aufholt — ab dem Punkt hätte jede Nightly-Installation still eine Stable-Build vorgesetzt bekommen.

Ein Neustart meldet jetzt, was wirklich passiert ist. Ein paar Apps liefern eine zweite App innerhalb des eigenen Bundles mit — Surge hält dort sein Dashboard —, und wenn nur diese innere App neu gestartet werden musste, meldete DuoUpdater, die äußere App sei neu gestartet worden, obwohl nichts dergleichen geschehen war. Jetzt meldet es das tatsächliche Ergebnis der inneren App und löst keine Neustart-Benachrichtigung mehr für einen Neustart aus, der nie stattgefunden hat.

Ein bereits heruntergeladenes Update sagt das jetzt auch, und man kann es rückgängig machen. Eine Zeile mit einem fertig heruntergeladenen Installationspaket zeigte nur eine blaue Schaltfläche „Installieren“ und sonst nichts — nichts sagte, dass der Download bereits abgeschlossen war oder dass die Schaltfläche den Installer nur wieder öffnet, statt das Update von vorn zu starten, und es gab keine Möglichkeit, es sich anders zu überlegen. Das steht jetzt auf der Zeile selbst statt versteckt in einem Tooltip, und Geladenes Installationsprogramm verwerfen im Rechtsklickmenü der Zeile wirft den Download weg und setzt die Zeile zurück auf „Aktualisieren“. Einen Download zu verwerfen, während bereits eine Installation derselben App lief, konnte dabei auch ein Paket wegwerfen, das gerade erst fertig heruntergeladen worden war; das kann jetzt nicht mehr passieren.

Schaltflächen für Versionshinweise, die auf stillgelegte Seiten zeigten, öffnen jetzt wieder lebende Seiten. Microsoft hat die Enterprise-Versionshinweisseiten von Edge umbenannt, und Termius hat sein Changelog verschoben, sodass drei Edge-Channels und Termius auf eine Seite schickten, die es nicht mehr gab. Niemand hatte je geprüft, ob diese Seiten noch existierten, weshalb sie unbegrenzt verrotten konnten, während alles andere gesund aussah — sie werden jetzt regelmäßig geprüft. Der Dev-Channel von Edge bekommt gar keine Schaltfläche: Microsoft veröffentlicht dafür keine Hinweise mehr, und jede noch existierende Seite gehört zu einem anderen Release-Zug.

Raycast wird auf Version 2 mitverfolgt — aber nur auf den Macs, die sie ausführen können. Raycast 2 braucht macOS Tahoe und Apple Silicon. Ein Mac, der das nicht erfüllt, bleibt auf dem Version-1-Zug und wird nicht mehr über ein Release informiert, das er ohnehin nie hätte installieren können. Die beiden Züge behalten jetzt außerdem ihre eigenen Versionshinweise, sodass eine Version-1-Installation die Historie von Version 1 liest statt die von Version 2.

Versionshinweise werden jetzt für weitere Apps im eigenen Fenster von DuoUpdater dargestellt. BetterDisplay auf allen drei seiner Tracks, Shotbase, und WorkBuddy auf beiden Seiten. Die Hinweise von BetterDisplay enden nicht mehr im rohen Markup seiner Download-Schaltfläche und wiederholen auch nicht mehr bei jedem einzelnen Release die komplette Mitwirkendenliste.

duo, der optionale Begleiter für die Kommandozeile, verweigert jetzt eine Kommandozeile, die es nicht versteht. Ein falsch getipptes Flag wurde bisher ignoriert, und ein ignoriertes Flag liest sich wie eines, das man nie übergeben hat — sodass duo verify --githubb stillschweigend jedes Recipe prüfte, statt nur das gewünschte. Unbekannte Flags, ein Flag ohne seinen Wert und überzählige Argumente sind jetzt Fehler, die benennen, was der Befehl tatsächlich akzeptiert, und --help funktioniert jetzt nach jedem Befehl.

Die Vorab- und internen Builds von BetterDisplay werden jetzt den Leuten angeboten, die sie sich gewünscht haben. BetterDisplay führt alle drei seiner Release-Züge in einem einzigen Update-Feed und unterscheidet zwischen ihnen über zwei Schalter in den eigenen Einstellungen. DuoUpdater konnte deinen Zug bisher nur aus der gerade laufenden Build erraten, was nichts über einen Schalter aussagt, den man zwar eingeschaltet, aber noch nicht genutzt hat — sodass jemand mit beiden Schaltern an, aber noch auf einer Stable-Build, zu hören bekam, alles sei aktuell, während BetterDisplays eigener Updater bereits eine um vier Releases weiter fortgeschrittene Version anbot. Die tatsächliche Wahl wird jetzt direkt aus BetterDisplay ausgelesen, auch für den Fall, dass das Einschalten der internen Builds die gewöhnlichen Vorabversionen weiterhin mitliefert. Die nur für Apple Silicon gedachten Preview-Builds sind bewusst ausgenommen, sodass ein Intel-Mac nie eine angeboten bekommt, die er nicht ausführen kann.

Den Release-Channel einer App zweimal hintereinander umzuschalten lässt die Zeile nicht mehr auf der alten Antwort hängen. Ein Umlegen des Channel-Schalters veranlasst DuoUpdater, die App erneut zu prüfen, und ein zweites Umlegen, während die erste Prüfung noch lief, wurde bisher verworfen — die Zeile bot weiterhin eine Beta an, obwohl gerade Betas abgeschaltet worden waren, bis irgendetwas Unabhängiges eine weitere Prüfung auslöste. Das neuere Umlegen übernimmt jetzt gegenüber dem älteren, und eine Prüfung, die mittendrin unterbrochen wird, markiert die Apps, die sie nie erreicht hat, für den nächsten Durchlauf, statt sie als erledigt zu verzeichnen.

Eine App, die in einer anderen App wohnt, wird jetzt zusammen mit ihr geschlossen und wieder geöffnet. Ein paar Apps liefern eine zweite, vollständige App innerhalb des eigenen Bundles mit — Surge hält dort sein Dashboard. macOS behandelt das als eigenständige App, sodass beim Aktualisieren der umgebenden App nichts sie schloss: Sie lief einfach mit der Version weiter, die gerade ersetzt worden war, aus einer Kopie heraus, die nicht mehr dort lag, wo sie es vermutete, und konnte von dort aus nicht mehr mit der App sprechen, zu der sie gehört. Solche Apps werden jetzt zusammen mit der App geschlossen, in der sie wohnen, und danach wieder geöffnet, und genau das Fenster, in dem tatsächlich gearbeitet wurde, kommt wieder in den Vordergrund. Das gilt nur für Apps, die man selbst hätte öffnen können; die unsichtbaren Hilfsprozesse, die eine App für sich selbst betreibt, bleiben unangetastet.

Wiederherstellungspunkte, die still und heimlich nicht mehr angelegt wurden, werden jetzt wieder angelegt. Eine App kann eine ihrer eigenen Dateien so sperren, dass nichts sie löschen kann, und die für die Wiederherstellung aufbewahrte Kopie erbte diese Sperre — sie konnte also nie von der nächsten ersetzt werden, und ein einziger unterbrochener Versuch konnte eine Kopie hinterlassen, die nichts mehr entfernen konnte. Danach lief jedes Update dieser App ohne Weg zurück, und das mit einer einzigen Zeile, die keinen Grund nannte. Eine App auf dem eigenen Mac des Entwicklers steckte zwei Tage lang in genau diesem Zustand. Für die Wiederherstellung aufbewahrte Kopien tragen die Sperre jetzt nicht mehr, die installierte App bleibt exakt so, wie ihr Entwickler sie eingerichtet hat, und eine feststeckende Kopie kann die für sie vorgesehene Ersatzkopie nicht mehr blockieren.

Ein Update, das funktioniert hat, meldet nicht mehr, dass es fehlgeschlagen sei. macOS kann eine neue Version einrichten und dann beim Entfernen der verdrängten Version scheitern. Das wurde bisher für bare Münze genommen: DuoUpdater behauptete, eine App sei nicht aktualisiert worden, obwohl sie es war, oder es gebe keinen Wiederherstellungspunkt, während ein vollständiger im Backup-Speicher lag — und im ersten Fall wurde man aufgefordert, eine Berechtigung zu erteilen, die man bereits erteilt hatte und die ohnehin nicht hätte helfen können. Was tatsächlich auf der Festplatte passiert ist, wird jetzt geprüft, bevor irgendetwas gemeldet wird.

Versionszeilen wiederholen nicht mehr Ziffern, die die Versionsnummer bereits enthält. Wartet eine App auf einen Neustart, zeigt die Zeile die laufende Version und die, auf der man nach dem Neustart landet. Beide Seiten trugen bisher eine Build-Nummer — das macht den Unterschied lesbar, wenn ein Entwickler mehrere Builds unter demselben Versionsnamen ausliefert, und ist reines Rauschen, wenn sich die Versionen ohnehin schon unterscheiden. Chromes Zeile verbrauchte ihre gesamte Breite mit „151.0.7922.174 (7922.17…“ und war zu Ende, bevor die tatsächlich geänderten Ziffern kamen. Die Build-Nummern erscheinen jetzt nur noch dann, wenn sie das sind, was sich geändert hat.

Ein einziges Wort jetzt dafür, eine App zum Abschluss ihres Updates neu zu öffnen. Eine App, deren eigener Updater die neue Version bereits eingerichtet hatte, bat um „Restart“; eine, die die neue Version erst beiseitelegt, bis man sie beendet, bat um „Relaunch“. Dieser Unterschied war hinter den Kulissen real, machte für dich aber keinen: derselbe Klick in beiden Fällen, und dasselbe Ergebnis, wenn man nie klickt, weil das Update ohnehin beim nächsten Beenden der App landet. Es heißt jetzt überall „Neu starten“ — in den Benachrichtigungen, den Tooltips und in der Einstellung, die es automatisch erledigt —, also genau das Wort, das auch Chrome, Claude und die meisten Apps, die sich selbst aktualisieren, dir vor die Nase setzen. Nur Englisch kannte für diesen Vorgang je zwei Wörter; Deutsch, Japanisch, Russisch und Chinesisch haben dafür schon immer nur eines verwendet, und Spanisch und Französisch wechseln jetzt auf die Formulierung, die sie andernorts ohnehin schon benutzt haben.

Ein Update, das einen Administrator braucht, fragt jetzt danach, statt zu scheitern und eine Berechtigung zu beschuldigen. Ob ein Austausch ein Passwort brauchte, wurde bisher danach entschieden, in welchem Ordner eine App liegt, statt nach der App selbst. Alles, was macOS als root installiert hatte — jede App-Store-App und jede App, die ein Installationspaket abgelegt hat —, bestand diesen Test, nahm den Weg ohne Passwort und konnte damit gar nicht fertig werden: Das Entfernen der alten Version braucht Schreibzugriff auf die Verzeichnisse in ihrem Inneren. macOS meldet diese Verweigerung mit demselben Code, den es auch für eine verweigerte Berechtigung zur App-Verwaltung verwendet, sodass der Fehlschlag als Aufforderung ankam, die App-Verwaltung zu gewähren — was nie hätte helfen können, weil das eigentliche Hindernis die Dateibesitzverhältnisse waren. Auf einem gewöhnlichen Mac betraf das jede App-Store-App und eine Handvoll weitere, und es traf Administratorkonten — Standardkonten wurden bereits korrekt weitergeleitet. Solche Updates nehmen jetzt den Weg, der funktioniert, und die App behält den Besitzer, den sie hatte, statt still dir zu gehören.

App-Store-Apps bekommen jetzt genau wie alle anderen einen Wiederherstellungspunkt. Backups übergingen sie bisher, mit der Überlegung, der Store könne eine frühere Build ohnehin jederzeit wieder besorgen. Das kann er nicht — der App Store bietet nur die jeweils aktuelle Version einer App an —, wodurch der Store als der eine Weg übrig blieb, auf dem ein Update angewendet wurde, ohne es rückgängig machen zu können. Diese Apps werden jetzt vor einem Update genauso gesichert wie jede andere, und weil die Kopie per Klonen entsteht, kostet sie fast keinen Speicherplatz, solange das Update das Original nicht tatsächlich ersetzt hat. Eine solche Kopie zurückzuspielen sagt das, was für den Store spezifisch ist: Das Update taucht sofort wieder in der Updates-Liste auf und wird von selbst erneut angewendet, wenn automatische App-Updates eingeschaltet sind. Und wenn ein Store-Update ohnehin nie angewendet worden wäre — eine iPhone-App, die auf einem Mac läuft, ein Titel, der in deiner Region nicht verkauft wird —, wird gar kein Wiederherstellungspunkt mehr angelegt, sodass eine Zeile nicht mehr anbieten kann, die Version wiederherzustellen, die sowieso schon läuft.

Longbridge Desktop wird jetzt erfasst, auf beiden seiner Release-Züge. Stable und Preview bekommen jeweils Versionserkennung, Ein-Klick-Installation der offiziellen Apple-Silicon-Build und Versionshinweise, die im eigenen Fenster von DuoUpdater dargestellt werden, Illustrationen inklusive.

Die Versionshinweise von WhatsApp erscheinen jetzt schon, während seine App-Store-Prüfung noch läuft. Die in diesem Fenster angezeigte App-Store-Seite war unter einem Namen abgelegt, den die Suche nie zuordnen konnte, sodass der Hinweis-Bereich leer blieb, statt sie anzuzeigen.

Der Menü-Kopf zeigt jetzt mehr auf weniger Raum. Die eigene Version von DuoUpdater steht jetzt neben seinem Namen, und ein Klick darauf öffnet die eigenen Versionshinweise. „Alle aktualisieren“ ist auf eine eigene Zeile gezogen, wo ein übersetztes Label genug Platz hat, um ganz gelesen zu werden, und die Aktionen am unteren Rand sind jetzt Icons. Das Banner, das früher ankündigte, dass DuoUpdater sich selbst aktualisiert, ist verschwunden — stattdessen leuchtet das Glitzersymbol neben der Version auf und bleibt an, bis man gelesen hat, was sich geändert hat. Eine Statuszeile, die zu lang für das Menü ist, endet jetzt in Auslassungspunkten, statt es in die Breite zu ziehen.

Einstellungen schneidet die angebotenen Update-Optionen nicht mehr ab. Die beiden Menüs, die festlegen, wie ein Update angewendet wird, schnitten ihre eigenen Beschriftungen in mehreren Sprachen ab. Die Formulierungen sind jetzt kürzer, und wo die Wörter es noch immer brauchen, springen sie in eine zweite Zeile.

Neuigkeiten sagt jetzt, wann jede Version erschienen ist. Jede Version in der Leiste trägt jetzt ihr Veröffentlichungsdatum.

Architekturspezifische Updates wählen jetzt die Build, die dieser Mac tatsächlich ausführen kann. Ein paar Apps veröffentlichen dieselbe Version zweimal in einem Sparkle-Feed — einmal für Apple Silicon und einmal für Intel —, und DuoUpdater entschied diesen Gleichstand bisher danach, welche Download-Adresse zufällig zuerst sortiert wurde. Es liest jetzt die Hardware-Anforderung des Feeds aus und, wo ein Anbieter das leer lässt, die Architektur im Dateinamen. Die native Build gewinnt konsequent, und eine Build, die dieser Mac nicht starten kann, wird nicht angeboten. GitHub-Releases bekommen dieselbe Behandlung, ohne ein völlig gesundes Recipe als kaputt zu bezeichnen, nur weil sein neuestes Artefakt eine andere Architektur adressiert.

ChatGPT-Update-Prüfungen folgen jetzt dem Rollout-Track, der am Konto hängt. OpenAI hält Business- und Enterprise-Konten manchmal auf einer älteren Desktop-Build, während eine neue zuerst Consumer-Konten erreicht. DuoUpdater ließ den Plan des Kontos bei dieser Prüfung bisher aus, was für alle stillschweigend den vorsichtigen Track wählte: Es konnte behaupten, die installierte Kopie sei irgendwie voraus, während ChatGPT selbst bereits eine neuere Build herunterlud, oder eine Build anbieten, die der eigene Updater der App gleich wieder ersetzen würde. Es sendet jetzt das Plan-Label aus dem ChatGPT/Codex-Anmeldestatus mit derselben Update-Anfrage, die auch die App stellt. Ist dieses Label nicht verfügbar, bleibt es beim vorsichtigen Verhalten; Zugangsdaten selbst werden nie in die Anfrage oder in Diagnosen aufgenommen.

Ein Neustart, auf den macOS nie antwortet, kann nicht mehr jedes spätere Update blockieren. Launch Services nimmt gelegentlich eine Anfrage an, eine aktualisierte App wieder zu öffnen, und meldet sich dann nie zurück. Die Zeile blieb dann für immer bei „Wird neu gestartet …“ hängen, ihre Schaltfläche „Neu starten“ blieb deaktiviert, und DuoUpdaters eigenes Update wartete dahinter. Ein Start, der nach einer Minute nicht geantwortet hat, wird jetzt als fehlgeschlagen freigegeben, sodass sich die Zeile erholt und der Rest des Updaters weiterarbeitet.

Das Release-Protokoll bleibt gefüllt, auch wenn seine Scrollleiste schnell gezogen wird. Der alte Lazy Stack konnte von einem großen Sprung überholt werden und ließ das Fenster kurz leer, während rund um die neue Position Zeilen erst erzeugt wurden. Das Protokoll verwendet jetzt eine wiederverwertende Liste, die direkt zum Ziel springen kann. Auch das Aktualisieren-Steuerelement behält beim Wechsel zwischen Pfeil und Ladeanzeige denselben Platzbedarf, sodass die unterste Zeile nicht mehr zuckt, wenn eine Prüfung startet.

Download-Traffic markiert jetzt Updates, die einen Binärpatch verwendet haben. Neue Downloads verzeichnen den Weg, der tatsächlich abgeschlossen wurde — nicht bloß, ob ein Patch angeboten wurde — und tragen in ihrer Historie ein Delta-Badge. Auch die unverkennbar kleineren Patch-Downloads aus 0.3.62 werden erkannt, obwohl sie aufgezeichnet wurden, bevor das Traffic-Verzeichnis überhaupt ein Feld für den Weg hatte.

Updates laden jetzt nur noch das, was sich geändert hat, wenn der Entwickler es so veröffentlicht. Manche Apps liefern zu jedem Release einen kleinen Patch mit — genug, um die vorhandene Version in die neue zu verwandeln, ohne das Ganze erneut herunterzuladen. DuoUpdater ignorierte diese bisher und lud jedes Mal das vollständige Paket. Es nimmt jetzt den Patch, wenn einer genau zur laufenden Build passt. ChatGPTs letztes Update kam so auf 1,9 MB statt 605 MB; Dockers auf 87 MB statt 582 MB. Das Ergebnis ist in beiden Fällen dieselbe Anwendung — dieselbe Signatur, dieselben Bytes, geprüft gegen den vollständigen Download, bevor das ausgeliefert wurde. Passt kein Patch zur vorhandenen Version, oder scheitert einer beim Anwenden, läuft der vollständige Download wie zuvor ab, sodass daran keine Installation scheitern kann.

DuoUpdater lädt ein Update nicht mehr herunter, das eine App bereits selbst herunterlädt. Viele Apps aktualisieren sich auch selbst, und wenn beide gleichzeitig nach derselben 600-MB-Datei greifen, kostete das bisher die Datei doppelt. DuoUpdater bemerkt jetzt einen laufenden Download und lässt ihn in Ruhe, und sagt das auch auf der Zeile, statt stillschweigend nichts zu tun. Stellt sich dieser Download als abgebrochen heraus, hört das Warten nach zehn Minuten auf mitzuzählen, sodass nichts dauerhaft blockiert bleibt.

Ein Update, das eine App bereits selbst vorbereitet hat, wird nicht mehr überschrieben. Apps, die sich selbst aktualisieren, laden häufig im Hintergrund herunter und warten dann darauf, dass man sie beendet, bevor die neue Version eingesetzt wird. Darüber zu installieren sah aus, als hätte es funktioniert, machte sich dann aber in dem Moment rückgängig, in dem man die App beendete — und wo die eigene ausstehende Version der App älter war als das, was DuoUpdater gerade installiert hatte, landete man am Ende weiter zurück, als man begonnen hatte. Solche Updates dürfen jetzt zu Ende laufen, unabhängig davon, welche Version sie mitbringen.

Auch DuoUpdaters eigene Updates sind kleiner geworden. Seine Releases liefern jetzt dieselbe Art von Patch mit, sodass eine Aktualisierung von einer kürzlich installierten Version nur noch ein paar hundert Kilobyte statt elf Megabyte lädt.

Erklärungen, die ein Update hinterlassen hat, räumen sich jetzt selbst auf. Übergibt DuoUpdater eine App an deren eigenen Updater, sagt die Zeile das — „in den Vordergrund geholt, damit der eigene Updater das Update anwendet“. Dieser Satz blieb bisher für immer stehen: Das Einzige, was ihn je entfernte, war der Start eines weiteren Updates derselben App, sodass er noch lange nach der Landung des Updates unter der Zeile stand und etwas beschrieb, das schon Stunden zuvor abgeschlossen war. Er verschwindet jetzt, sobald die App auf dem neuesten Stand ist. Eine Warnung, dass ein Update ohne Wiederherstellungspunkt angewendet wurde, bleibt bewusst unangetastet, denn die beschreibt das bereits geschehene Update und wird erst wichtig, sobald es vorbei ist.

Ein abgelehntes Update erklärt sich jetzt in deiner Sprache. Installiert bereits etwas anderes — DuoUpdater, das einen Stapel abarbeitet, oder duo im Terminal —, sagt die Zeile das. Diese Meldung war bisher rein englisch, in einem sonst übersetzten Fenster, und endete mit einer Prozessnummer: nützlich in einem Terminal, aber nichts, worauf man in einem Menü reagieren kann. Sie ist jetzt übersetzt und sagt, was zu tun ist, statt wer die Sperre hält. Das Kommandozeilen-Tool gibt die Prozessnummer weiterhin aus, dort, wo man damit etwas anfangen kann.

Die Zeile zum Veröffentlichungsmuster, samt Uhrzeit, richtet sich jetzt nach deiner Ländereinstellung. Release-Protokoll → Muster fasste bisher alles zusammen als „Erscheint am häufigsten Freitag, gegen 18 Uhr“. Sprachen, die die Namen der Wochentage beugen, können das mit dem Tag mitten im Satz nicht korrekt ausdrücken und bekamen die falsche Wortform — Russisch las sich als „Чаще всего выходит пятница“, wo es „по пятницам“ heißen müsste. Es ist jetzt ein Label: „Spitze: Freitag, gegen 18 Uhr“, was überall korrekt ist. Die Uhrzeit zieht mit — schreibt dein Mac Uhrzeiten im 24-Stunden-Format, tut das jetzt auch dieses Label, ebenso auf der Achse des Diagramms.

Die Einstellungssuche versteht jetzt die Wörter auf deinem Bildschirm. Das Suchfeld über der Seitenleiste der Einstellungen glich gegen eine Liste zusätzlicher Begriffe ab, die auf Englisch geschrieben und nie übersetzt worden war — „rollback“ fand so den Weg zu Allgemein, während „Zurücksetzen“ und „回滚“ nichts fanden. Diese Begriffe existieren jetzt in jeder Sprache, die DuoUpdater spricht. Die englischen Begriffe funktionieren weiterhin zusätzlich in jeder Sprache, weil die Dokumentation, aus der sie stammen, auf Englisch ist.

„Alle anzeigen“ einzuschalten lässt das Menü nicht mehr stocken. Die vollständige Liste aller vorhandenen Apps wurde jedes Mal, wenn sie erschien, komplett vermessen — auf einem Mac mit 127 Apps kam das auf etwa eine Sekunde Arbeit, fast ausschließlich für das Layout von Zeilen weit unterhalb der sichtbaren. Bezahlt wurde das bei jedem Umschalten, nicht nur beim ersten. Jetzt werden nur noch die tatsächlich sichtbaren Zeilen aufgebaut.

Eine Erklärung, die von einem gescheiterten Update übrig geblieben ist, überlebt den Fehlschlag nicht mehr. Konnte ein Update nicht angewendet werden — etwa weil schon etwas anderes installierte —, sagte die Zeile das in Rot. Nichts entfernte diese Zeile je: Landete das Update später doch noch und die Zeile kehrte zu einem Häkchen zurück, saß die alte Erklärung immer noch darunter und blieb dort über jede weitere erneute Prüfung hinweg, bis DuoUpdater neu gestartet wurde. Sie verschwindet jetzt, sobald die App auf dem neuesten Stand ist. Gründe, die zu noch ausstehenden Updates gehören, bleiben unangetastet, sodass ein Grund, den man noch nicht gelesen hat, nicht von einer im Hintergrund laufenden Prüfung gelöscht werden kann.

Die Schaltfläche „Alle aktualisieren“ ändert ihre Größe nicht mehr mit der Länge der Liste. Standen nur wenige Updates aus, wurde sie eine Nummer kleiner gezeichnet, als sie sein sollte, mit achtzig Punkten leerem Raum daneben, und sprang auf ihre richtige Größe zurück, sobald die Liste wuchs. Jetzt behält sie die Größe, die sie haben soll.

Download-Traffic sagt jetzt, zu welcher Build ein Update gewechselt hat, nicht nur zu welcher Version. Etliche Apps liefern mehrere Builds unter demselben Versionsnamen aus — Surge hat vier getrennte Releases als „6.9.0“ herausgebracht —, sodass solche Zeilen „6.9.0 → 6.9.0“ lasen und nichts aussagten. Sie lesen jetzt „6.9.0 (12028) → 6.9.0 (12030)“, und zwar nur dann, wenn der Versionsname allein nicht genügt; hat sich die Version bereits geändert, wäre die Build-Nummer nur Rauschen und bleibt weg.

Die verzeichnete Build ist die, die tatsächlich gelandet ist — ausgelesen aus der App selbst, sobald das Update sitzt. Nicht die Zahl, die der Update-Feed des Entwicklers verkündet hat — Feeds melden durchaus falsch, und so funktioniert es auch für die Stellen, die überhaupt keine Build-Nummer veröffentlichen: GitHub, Homebrew und der App Store. Bei einem Update, das noch auf das Installationsfenster von macOS wartet, wird nie geraten; für es wird nichts verzeichnet, bevor es real ist.

Ein Download, der nichts verändert hat, wird jetzt auch so markiert. Gelegentlich lädt und installiert ein Update genau die Build, die schon auf dem Mac lag — eine falsche Versionsnummer auf Entwicklerseite, ein Mirror, der ausliefert, was man ohnehin schon hat. Das ist reale Bandbreite für kein Ergebnis, und genau das will man im Traffic-Fenster sehen. Solche Zeilen tragen jetzt ein Label „keine Änderung“. Vor diesem Release aufgezeichnete Downloads haben keine Build-Nummern zum Vergleichen, deshalb bleiben sie unangetastet, statt geraten zu werden: unbekannt ist nicht dasselbe wie unverändert.

DuoUpdater zeigt jetzt, was das Aktuellhalten deiner Apps an Downloads wirklich gekostet hat. Es hat schon die ganze Zeit über, byte-genau, jedes für dich geladene Update mitgezählt — nur hatte die Zählung nirgends einen Platz zum Erscheinen, sodass die Zahl in einer Datei lag, die niemand lesen konnte. Es gibt jetzt ein Download-Traffic-Fenster, das über die Diagramm-Schaltfläche am unteren Rand des Menüs geöffnet wird, mit dem Wert dieses Monats direkt neben dieser Schaltfläche, sodass die häufigste Frage beantwortet ist, ohne irgendetwas zu öffnen. Darin: die Gesamtsumme, die letzten drei Monate nebeneinander mit der Veränderung dazwischen, eine Aufschlüsselung, woher die Bytes kamen, und jede App gereiht nach dem, was sie gekostet hat — ein Klick zeigt jedes einzelne ihrer Updates, von welcher zu welcher Version es ging und wie groß der Download war.

Die Summe ist ehrlich darüber, was sie nicht sehen kann. Homebrew, der App Store und Apps, die über ihren eigenen eingebauten Updater aktualisieren, laden ihre Bytes selbst, und DuoUpdater bekommt sie nie zu fassen — die Zahl ist also eine Untergrenze, keine vollständige Abrechnung. Das war schon immer so; geändert hat sich, dass das Fenster das jetzt dauerhaft sagt, statt nur auf dem leeren Bildschirm, den man sieht, bevor überhaupt etwas verzeichnet wurde.

Apps, die inzwischen umbenannt oder gelöscht wurden, behalten ihre Historie. Traffic wird gegen den Ort verzeichnet, an dem eine App auf der Festplatte liegt — das ist auch, was zwei Channels derselben App, etwa Android Studio Canary und Beta, auseinanderhält, statt sie zusammenzuzählen. Der Preis dafür: Eine App umzubenennen lässt ihre Vergangenheit unter einem Namen zurück, den es nicht mehr gibt. Als OpenAI Codex in ChatGPT umbenannte, teilte das 30 GB an Downloads auf zwei Einträge auf, die wie Duplikate aussahen. Solche Einträge werden jetzt am unteren Ende der Liste gruppiert und abgeblendet dargestellt, unter einer Überschrift, die sagt, was sie sind. Nichts wird weggeworfen, und die Gesamtsumme schließt sie weiterhin ein.

Einer App, die aus dem App Store installiert wurde, wird nicht mehr der eigene Download des Entwicklers angeboten. Viele Apps werden gleichzeitig an zwei Orten veröffentlicht — im Store und als Direkt-Download von der eigenen Seite des Entwicklers — unter derselben Identität, aber als tatsächlich unterschiedliche Builds. Der Direkt-Download ist meist voraus, weil er nicht auf die Store-Prüfung warten muss. DuoUpdater prüft bei einer aus dem Store installierten App zuerst den Store, aber wenn diese Prüfung aus irgendeinem Grund fehlschlug — eine abgebrochene Verbindung, ein Storefront, der nicht antwortete —, ging es stillschweigend zur Seite des Entwicklers über und bot an, was dort lag. Bei WhatsApp zeigte sich das als „26.32.75 → 26.33.19“: eine echte Version, aber von der falschen Stelle. Sie zu übernehmen hätte die Store-Kopie durch eine ersetzt, die der App Store nie wieder hätte aktualisieren können. Aus dem Store installierte Apps werden jetzt ausschließlich gegen den Store geprüft, und sonst nirgends.

Den Update-Channel einer App innerhalb dieser App umzuschalten wird jetzt sofort erkannt. Manche Apps lassen dich zwischen ihren normalen Releases und ihren Beta-Releases wählen — Surge, Tailscale, Fork, OrbStack, IINA, Alfred und andere —, und DuoUpdater folgt der jeweils getroffenen Wahl, sodass es nie eine Build anbietet, die man nicht angefordert hat. Bisher bemerkte es die Änderung nur, wenn man die App beendete oder eines der Fenster von DuoUpdater öffnete. Keins von beidem deckt ab, was Leute tatsächlich tun: die Einstellung umschalten, die App weiterlaufen lassen und nur einen Blick in die Menüleiste werfen. Schlimmer noch: Apps speichern diese Einstellung auf der Festplatte, wann es ihnen passt, statt im Moment des Klicks — bei Surge dauerte das hier fünf Minuten —, sodass selbst ein Beenden zu früh gelesen werden konnte. DuoUpdater beobachtet jetzt die Einstellung selbst auf Änderungen und prüft diese eine App innerhalb von ein, zwei Sekunden erneut. Surge zurück auf normale Releases umzuschalten entfernt die Beta-Version jetzt sofort aus der Zeile, statt sie bis zu einer Stunde lang dort stehen zu lassen.

Eine Prüfung, die nichts erreichen konnte, sieht nicht mehr aus wie ein sauberer Befund. Scheiterten alle Quellen — kein Netzwerk, oder ein Proxy, der Verbindungen still verweigert, während das WLAN-Symbol weiterhin sagt, alles sei in Ordnung —, wurden die gescheiterten Apps versteckt, und das Panel meldete „127 Apps · aktuell“. Das ist genau derselbe Bildschirm, den man sieht, wenn wirklich alles aktuell ist, wodurch eine gescheiterte Prüfung von einer erfolgreichen nicht zu unterscheiden war. Das Panel sagt jetzt, wie viele Apps es nicht erreichen konnte, zeigt, was schiefgelaufen ist, und bietet an, genau diese erneut zu versuchen — nur diese, ohne alles anzurühren, was tatsächlich geprüft werden konnte.

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.