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.