DuoUpdaters native macOS-Menüleistenliste mit Katzen-Icon und anbieterbezogenen App-Updates.

DuoUpdater: Ein nativer macOS-Updater, der jeden Verteilungskanal respektiert

DuoUpdater scannt die Apps auf deinem Mac, folgt ihren eigenen Sparkle-, App-Store-, Homebrew-, GitHub- oder Anbieter-Kanälen, prüft Ersetzungen und bewahrt einen Rollback-Pfad.

Die wichtigsten Punkte
  • DuoUpdater ist eine native Swift-Menüleisten-App für macOS 15+ auf Apple Silicon und scannt installierte Apps samt echten Update-Kanälen.
  • Die App prüft Mac App Store, Xcode Releases, Sparkle, Homebrew, GitHub Releases, Alcove und ausgewählte Anbieter-Endpunkte in einer festen Reihenfolge.
  • Vor dem Ersetzen eines Bundles kann sie Signatur, Team ID, Bundle ID und ausführbare Architektur prüfen, ein Backup anlegen, die Quelle erneut prüfen und zurückrollen.
  • Das aktuelle notarized macOS-ZIP v0.4.1 wird über GitHub Releases verteilt; nach der ersten Installation aktualisiert sich die App über ihren Sparkle-Appcast.

Mac-Apps müssen nicht alle über denselben Downloadweg aktualisiert werden. Sparkle-Apps haben ihren eigenen Appcast, App-Store-Apps werden von Apple verwaltet, und Homebrew- sowie GitHub-Projekte haben jeweils eigene Veröffentlichungswege. Manche Apps müssen sogar ihren eigenen Updater öffnen. DuoUpdater verfolgt deshalb einen klaren Ansatz: Erst den echten Kanal der jeweiligen App erkennen, dann genau die dort vorgesehene Methode verwenden.

Das Repository ist jizhi0v0/duo-updater, in Swift geschrieben und unter der MIT-Lizenz veröffentlicht. Die aktuell geprüfte Version ist DuoUpdater 0.4.1; unterstützt werden Apple-Silicon-Macs mit macOS 15 oder neuer.

Welches Problem löst es?

DuoUpdater ist eine Menüleisten-App und scannt /Applications, /Applications/Utilities sowie ~/Applications. Die Liste zeigt nicht nur, dass ein Update verfügbar ist, sondern auch aktuelle und neue Version, Update-Kanal und die Aktion, die der Button tatsächlich ausführt. Wenn das Bundle auf der Festplatte bereits aktualisiert ist, die laufende Kopie aber noch nicht neu gestartet wurde, wird daraus Relaunch statt eines erneuten Downloads derselben Version.

Auch von Homebrew installierte Nicht-.app-Pakete werden separat aufgeführt, darunter Kommandozeilen-Formeln, Schriften und Treiber. Casks, die ein App-Bundle installieren, werden weiterhin als normale Apps behandelt und nicht doppelt gezählt. Dadurch bedeutet „meine installierte Software“ nicht mehr nur das, was im Finder als .app sichtbar ist.

Die App-Details enthalten außerdem Release Notes. Sparkle-Appcasts und GitHub Releases liefern meist direkt Version, Datum und einzelne Änderungen; für andere Quellen verwendet das Projekt pro App gepflegte Recipes. Wenn eine Anbieter-Seite nicht zuverlässig analysiert werden kann, fällt DuoUpdater auf eine nicht persistente WKWebView zurück, statt vorzugeben, die Release Notes verstanden zu haben.

Updates über den eigenen Kanal jeder App

Die Reihenfolge im README ist absichtlich festgelegt: Mac App Store, Xcode Releases, Sparkle, Homebrew Cask, GitHub Releases, Alcove und erst danach ausgewählte Anbieter-Endpunkte. Die erste Quelle, die eine App eindeutig erkennt, liefert die Antwort; nur bei „nicht anwendbar“ geht es weiter. Von JetBrains Toolbox verwaltete Apps und TestFlight-Builds werden außerhalb dieser Kette separat behandelt.

„Den Kanal respektieren“ heißt, dass DuoUpdater nicht jede App als ZIP herunterlädt und hart ersetzt. Sparkle nutzt die native Installation und EdDSA, wenn die App einen öffentlichen Schlüssel liefert; selbstaktualisierende Apps werden geöffnet und ihrem eigenen Updater überlassen. Homebrew nutzt Casks, App-Store-Updates laufen über mas und einen privilegierten Helper, und GitHub- oder Anbieter-Downloads werden nur bei eindeutig validierten installierbaren Assets ausgeführt.

Sicherheitsprüfung vor dem Update

Bei Bundles, die DuoUpdater selbst installiert, werden zusätzlich zur Quellenprüfung Codesignatur, Team ID, Bundle ID und ausführbare Architektur kontrolliert. Eine native Apple-Silicon-App darf nicht durch eine Intel-only-Version ersetzt werden. Vor der Installation wird das Bundle auf der Festplatte erneut gelesen und die Quelle erneut abgefragt, damit eine veraltete Liste keine doppelte Installation auslöst.

Vor dem Update kann ein Rollback-Backup gespeichert werden; in den Einstellungen lässt sich auch der automatische Neustart festlegen. DuoUpdater beendet laufende Apps nicht gewaltsam, sondern ruft normales terminate() auf. Die App kann eine Speichern-Abfrage anzeigen und den Vorgang ablehnen. Dann liegt die neue Datei zwar auf der Festplatte, aber die Oberfläche behält die Aktion Restart, damit keine ungespeicherte Arbeit verloren geht.

Bei großen Versionssprüngen erscheint zunächst eine Warnung, weil kommerzielle Apps eine neue Lizenz verlangen können. Eine weitere Grenze betrifft .pkg/.mpkg: Nach der Übergabe an den Systeminstaller kann DuoUpdater Paket-Signatur, Team ID, Zielort und Systemversion prüfen, aber nicht die Architektur jedes einzelnen Mach-O im Paket. Nach Abschluss des Installers gibt es deshalb keinen automatischen Architektur-Rollback.

App Store, TestFlight und Berechtigungen

Eine App-Store-App ist kein gewöhnlicher Download-Link. DuoUpdater kann den vollständigen Download über mas und einen Hintergrund-Helper ausführen. Wenn der Helper noch nicht genehmigt ist oder eine App regional gesperrt wird, fällt die App auf einen Deep Link oder die App-Store-Updates-Seite zurück und kennzeichnet die Regionssperre. Der Hintergrund-Helper muss in macOS unter „Login Items & Extensions“ erlaubt werden.

TestFlight-Betas sind ein eigener Schalter. Ist er deaktiviert, liest DuoUpdater keine TestFlight-Daten. Ist er aktiv, können Aktualisierung oder stündliche Prüfung TestFlight kurz im Hintergrund starten. Für verfügbare TestFlight-Builds und den CotEditor-Kanal wird Full Disk Access benötigt; für normale App-Updates ist das nicht nötig.

Die Berechtigungen sind nach Funktionen getrennt: Ohne Berechtigungen lassen sich App-Liste, Versionsprüfung und Release Notes anzeigen. App Management erlaubt das Ersetzen von Apps in /Applications, Notifications beeinflusst nur Hinweise und Dock-Badge, und Accessibility wird nur benötigt, wenn der grafische App-Store-Weg oder das Schließen eines Installers aktiviert wurde. DuoUpdater verwechselt Erkennen nicht mit Installieren.

Release Log ist mehr als eine Update-Liste

DuoUpdater speichert jede beobachtete Version und baut so nach und nach ein Software-Release-Log auf. Bei der Zeitgenauigkeit bleibt das Projekt zurückhaltend: Nur wenn Sparkle, GitHub, Alcove oder ein electron-builder-Manifest einen Zeitpunkt liefert, wird eine exakte Zeit angezeigt. Quellen mit nur einer Versionsnummer erhalten ein geschätztes Fenster zwischen dem letzten alten und dem ersten neuen Beobachtungszeitpunkt, markiert mit ≈.

So behandelt die Heatmap Vermutungen nicht als Tatsachen. Ein Anbieter kann eine neue Version veröffentlicht haben, ohne den Veröffentlichungszeitpunkt an den Client zu melden. DuoUpdater speichert den Beleg, dass sich etwas geändert hat, und tarnt den Prüfzeitpunkt nicht als Veröffentlichungszeit. Strukturierte Release Notes werden rechts als nativer Text dargestellt, nicht einfach als Webseite in die Oberfläche eingebettet.

Auch die Release Notes von v0.4.1 zeigen diese fortlaufende Pflege: Sogou Input Method kann jetzt mit einem Klick aktualisiert werden und Wörterbuch sowie Einstellungen sichern, JetBrains Air verwendet den von Toolbox gelieferten Build, die umbenannte App-Store-Kopie erklärt, welche Kopie tatsächlich aktualisiert, und Markdown-Release-Notes werden als native Liste formatiert.

Dieselbe Engine gibt es als duo CLI

Das Repository besteht nicht nur aus der Menüleisten-Oberfläche. Die duo-CLI verwendet das echte DuoUpdaterCore und damit dieselbe Quellenreihenfolge, Installationsstrategie sowie Ignore- und Skip-Regeln. Wenn CLI und GUI unterschiedlich entscheiden, sollte das als Fehler behandelt werden, nicht als zwei getrennte Produktlogiken. Nützliche Befehle sind duo list, duo check --json, duo install Cursor, duo doctor und duo backups.

duo list                     # installierte Apps ohne Netzwerkzugriff auflisten
duo check --json             # ein JSON-Objekt pro Zeile
duo install Cursor           # ein Update installieren, alternativ --all
duo doctor                   # prüfen, ob dieser Mac installieren kann
duo backups                  # Rollback-Punkte auflisten oder wiederherstellen

Die CLI unterstützt außerdem --source sparkle,github,…, --include-hidden, duo ignore und duo skip. App-Store-Updates verweigert sie ausdrücklich, weil der Kommandozeile App-Bundle, privilegierter Helper und Accessibility-Weg fehlen. Ebenso übernimmt sie nicht gewaltsam die Installationssperre der Menüleisten-App. Unvollständige Abläufe abzulehnen ist hier Teil der Sicherheitsgrenze.

Datenschutz: kein eigener Telemetrie-Server

Das Projekt erklärt, dass es keine Telemetrie, kein Analytics-SDK und keinen eigenen Server gibt. Netzwerkanfragen gehen direkt an den geprüften Anbieter oder an api.github.com beziehungsweise formulae.brew.sh und enthalten nur die für die Versionsprüfung nötigen Informationen. Dieses Modell ist leichter nachvollziehbar, als alle App-Versionen an eine zentrale Cloud-Datenbank zu senden.

„Keine Telemetrie“ bedeutet allerdings nicht, dass keinerlei externe Daten gelesen werden. Wenn CleanShot X installiert ist, liest DuoUpdater dessen activationKey aus den Einstellungen und fragt den eigenen Endpoint nach einem personalisierten Appcast. Auch der Beta-Schalter von TablePlus und Kanal-Einstellungen mancher Apps werden gelesen. Ein GitHub-Token kann aus GITHUB_TOKEN, GH_TOKEN oder gh auth token kommen, wird aber nur an api.github.com gesendet und bei Weiterleitungen außerhalb dieser Domain entfernt.

Diese Zugriffe sollten funktional verstanden werden und nicht pauschal als lokale Privatsphäre gelten. Vom Nutzer eingegebene Zugangsdaten wie GitHub-Token oder eine Alcove-Lizenz landen im Login-Keychain. Anbieter-Release-Notes werden in einer nicht persistenten WKWebView geöffnet und behalten nach einem Neustart keine Anbieter-Cookies. Vor der ersten Nutzung lohnt sich ein Blick auf Datenschutzhinweise und Berechtigungen der tatsächlich installierten Apps.

Installation

Eine eigene App-Store-Seite für DuoUpdater wurde nicht gefunden; der offizielle Installationsweg ist GitHub Releases. Laut Repository werden notarized Builds veröffentlicht. Das aktuelle DuoUpdater-0.4.1-macOS-ZIP ist für Apple Silicon und macOS 15 oder neuer gedacht.

# Die aktuelle Release-Seite öffnen:
open https://github.com/jizhi0v0/duo-updater/releases/latest

# Das Apple-Silicon-ZIP v0.4.1 direkt laden:
open https://github.com/jizhi0v0/duo-updater/releases/download/v0.4.1/DuoUpdater-0.4.1-macos.zip

Nach dem Download entpackst du die ZIP-Datei und legst DuoUpdater.app in /Applications. Beim ersten Start kannst du je nach Bedarf App Management, Benachrichtigungen oder weitere Funktionsberechtigungen erlauben. Ohne diese Berechtigungen kann die App weiter nach Updates suchen; macOS fragt erst beim jeweiligen Installationsweg nach. Apple Silicon ist zwingend erforderlich, Intel-Macs werden derzeit nicht unterstützt.

Nur für Änderungen am Code aus dem Quellcode bauen

Für normale Nutzer ist die Release-ZIP oben der bessere Weg. Wer die Update-Engine untersuchen oder die Menüleisten-Oberfläche ändern möchte, findet im Repository drei getrennte Teile: DuoUpdaterCore/ ist ein unabhängig testbares Swift Package, App/ ist eine mit XcodeGen erzeugte SwiftUI-MenuBarExtra-App und CLI/ enthält den duo-Befehl.

# Core-Paket bauen und testen:
cd DuoUpdaterCore
swift build
swift test

# Das macOS-App-Projekt erzeugen:
cd ../App
xcodegen generate
open DuoUpdater.xcodeproj

Der aktuelle Source-Build benötigt Swift 6.4, also die Toolchain von Xcode 27; das Deployment-Ziel bleibt macOS 15. Für die Installation eines eigenen Builds in /Applications stellt das Repository make install bereit. Der Befehl baut einen Release, signiert mit einer stabilen Developer-ID und installiert an den Standardort. Bei einem Fork kannst du zuvor DUO_TEAM_ID=YOURTEAMID setzen.

Ein Source-Build umgeht die Signaturpflicht nicht. Helper und App leiten die Team ID zur Laufzeit aus der tatsächlichen Signatur ab; unsignierte oder ad-hoc signierte Builds verweigern die Verbindung, damit keine App mit unklarer Identität mit dem Root-Helper kommuniziert. Für eine öffentliche Veröffentlichung werden außerdem Apple-notarytool-Zugangsdaten benötigt; normale Nutzer müssen das nicht konfigurieren.

Die Grenzen

DuoUpdater ist keine magische Datenbank, die garantiert jede Mac-Software automatisch aktualisiert. GitHub Releases, Anbieter-Endpunkte und Recipes können sich ändern, wenn sich Seitenstrukturen ändern. Das Projekt pflegt deshalb geprüfte App-Regeln, statt für unbekannte Software zu raten. Wenn kein eindeutig installierbares Asset vorhanden ist, bleibt es bei der Prüfung oder öffnet die Originalseite, statt irgendeine Datei auszuwählen.

Systeminstaller, Regionssperren, App-Store-Helper, TestFlight-Datenberechtigungen und die Speichern-Abfrage einer App beeinflussen ebenfalls das Ergebnis. DuoUpdater kann den Ablauf in einer Oberfläche bündeln, aber keine Lizenz-, Netzwerk-, Konto- oder macOS-Berechtigungsprobleme der Anbieter lösen.

Lizenz

DuoUpdater steht unter der MIT License. Du darfst den Code prüfen, ändern und in kommerziellen Projekten verwenden, musst bei der Weitergabe aber Copyright- und Lizenzhinweise erhalten. mas, Sparkle, swift-subprocess, Anbieter-Dienste und die aktualisierten Drittanbieter-Apps haben jeweils eigene Lizenzen oder Nutzungsbedingungen; die MIT-Lizenz des Haupt-Repositories überträgt diese Bedingungen nicht automatisch.

Solltest du es installieren?

Wenn du einen Apple-Silicon-Mac nutzt, App-Updates zentral sehen möchtest und Sparkle, Homebrew, GitHub sowie App Store nicht in ein einziges Downloadmodell zwingen willst, ist DuoUpdater v0.4.1 einen Versuch wert. Seine Stärke liegt in der Kanalerkennung, der Prüfung vor der Installation und dem Rollback-Rahmen; die Grenzen sind ebenso klar: nur Apple Silicon, für manche Wege sind macOS-Berechtigungen nötig, und die Pflege von Recipes sowie Änderungen an Anbieter-Seiten lassen sich nicht vollständig vermeiden.

Projektübersicht

Lizenz
MIT
Plattform
macOS 15+ / nur Apple Silicon
Sprache
Swift 6.4, SwiftUI, AppKit, Swift Package Manager
Geprüfte Version
v0.4.1 (GitHub Release, geprüft am 21.09.2026)

Installation

# Die aktuelle GitHub-Release-Seite öffnen:
open https://github.com/jizhi0v0/duo-updater/releases/latest

# Das aktuelle Apple-Silicon-macOS-ZIP direkt laden:
open https://github.com/jizhi0v0/duo-updater/releases/download/v0.4.1/DuoUpdater-0.4.1-macos.zip

Lizenzübersicht

Das Repository steht unter der MIT-Lizenz. Bei der Weitergabe müssen Copyright- und Lizenzhinweise erhalten bleiben. Gebündelte Tools, Frameworks, Anbieter-Feeds und Drittanbieter-Apps haben eigene Bedingungen.