Wispr Flow, AionUi и Devin теперь обновляются в один клик, а не просто сообщают, что вышла новая версия. Все три и раньше видели свои обновления, но ни одно не могло его применить — с формулировкой, что поставщик выпускает отдельные сборки для Intel и Apple Silicon, а у DuoUpdater нет способа выбрать нужную. Проверка вместо предположения показала, что причина не выдерживает: конечные точки, из которых читаются эти три приложения, и так предназначены для Apple Silicon, а сам DuoUpdater работает только на Apple Silicon — выбирать было не из чего. Каждую загрузку получили и проверили до того, как подключить: внутри нужное приложение, подписанное тем же разработчиком, что и ваша копия, заверенное Apple, а у AionUi — ещё и сверенное с контрольной суммой, которую публикует его собственный манифест. Затем каждое действительно установили поверх более старой копии и убедились, что оно вернулось на новой версии.
Grok Bot теперь отслеживается — новые версии и обновление в один клик. Настольное приложение xAI собирает и подписывает Anysphere, компания, стоящая за Cursor, и обновляется оно через собственный сервис выпусков Cursor. Именно поэтому ни один из обычных путей не отвечал за него: нет ленты Sparkle, нет карточки в App Store, нет публичного репозитория релизов, а cask в Homebrew возвращает обновление самому приложению. Вместо этого DuoUpdater читает собственную конечную точку версии у поставщика. Были ещё две, и обе оставлены в стороне по названным причинам: та, что за кнопкой загрузки на x.ai, вообще не публикует номер версии, а та, которой пользуется собственный апдейтер приложения, отвечает пустым телом, когда у вас уже актуальная версия, — молчание, неотличимое от сломанной конечной точки. Загрузку проверили до того, как её подключить: в образе диска лежит нужное приложение, подписанное тем же разработчиком, что и ваша копия, и заверенное Apple. Одного он намеренно не предлагает — примечаний к выпуску: xAI не публикует их для этого приложения, а единственный changelog, который есть, относится к другому продукту.
Comet и Msty Studio теперь тоже обновляются в один клик, а новая проверка следит за приложениями, которые могли бы, но не обновляются. Это были последние двое из той группы, кто видел обновления, но не мог их применить, — и ни одному не понадобилось ничего нового: достаточно было внимательнее посмотреть, что именно присылает поставщик. Ссылка на загрузку Comet подписана и живёт час, поэтому кнопка обновления указывает на собственный шлюз Perplexity, а ссылка создаётся в момент нажатия, а не часами раньше, при проверке. Msty публикует четыре загрузки в одном файле, версия для Intel идёт первой, и отпечаток для проверки загрузки брался именно из этой первой записи; теперь он привязан к той сборке для Apple Silicon, которая действительно скачивается, — а заодно выпуск, вышедший между проверкой и нажатием, в большинстве случаев будет замечен, а не установлен молча. Обе загрузки перед выпуском были скачаны и проведены через настоящие установочные заслоны. Более общий вывод не касается ни того, ни другого приложения: ничто в DuoUpdater не могло заметить, что приложение осталось только для обнаружения по причине, которая давно перестала быть верной. Теперь ночной обход рецептов сообщает, когда приложение, за которым мы лишь наблюдаем, уже протягивает нам установщик.
QQ音乐 теперь отслеживается — новые версии, обновления одним кликом и его заметки о выпуске прямо в окне приложения. Ни один из обычных путей не отвечал за него. Он не публикует Sparkle-поток и вообще не несёт фреймворка Sparkle; его cask в Homebrew возвращает обновление самому приложению; а конечная точка обновлений, которую называет по имени его собственный бинарник, отвечает 200 и пустым телом на всё, что бы мы её ни спросили, — молчание, неотличимое от сломанной конечной точки, поэтому её оставили в стороне. Вместо неё DuoUpdater читает файл данных, из которого строится собственная страница загрузки поставщика: эта страница отдаётся пустой оболочкой и заполняется из этого файла — он же единственное место, где вообще существуют заметки о выпуске: нет ни блога, ни appcast, ни отдельной страницы на каждую версию. Поэтому заметки читаются прямо из него и отображаются в собственном окне DuoUpdater, а обновление устанавливает нотариально заверенный образ диска, названный в том же ответе. Одна ловушка стоит того, чтобы её записать: этот файл до сих пор несёт рядом с текущей записью вторую, шестилетней давности запись для Mac, поэтому оба правила опираются на версионированное имя файла загрузки для Mac, а не на само слово «Mac». И одно ограничение стоит назвать прямо: файл публикует ту версию, которую вам показывают, но никогда — номер сборки под ней, поэтому переупаковка версии, сохранившей своё имя, здесь невидима. Приложение не выдумывает обновление, которого нет, — оно просто не способно увидеть этот один тип.
TimeMachineEditor теперь отслеживается — новые версии и обновления одним кликом. Ни один из обычных путей не отвечал за него: нет ленты Sparkle (в приложении нет ни адреса ленты, ни фреймворка, который мог бы её использовать), нет карточки в App Store, нет публичного репозитория релизов, а cask в Homebrew возвращает обновление самому приложению. Зато у него есть небольшой сайт поставщика, единственная ссылка на загрузку которого называет версию прямо в своём тексте, — та же страница, прочитанная тем же способом, на который опирается собственная проверка версии в Homebrew, так что это та поверхность, которую и подразумевал поставщик, а не догадка. Обновление устанавливается как собственный пакет установщика поставщика, а не как простая замена приложения, и это сделано намеренно: загрузка также кладёт снаружи самого приложения фоновый планировщик, инструмент командной строки и launch daemon, поэтому замена одного лишь приложения оставила бы новую копию рядом с устаревшим планировщиком, и ничто не заметило бы несовпадение.
Little Snitch теперь отслеживается — и на стабильных, и на ночных релизах. Object Development публикует файл версии, на который опирается собственный апдейтер приложения, — тот же файл читает Homebrew, — и DuoUpdater читает его напрямую, потому что Little Snitch не публикует ленту Sparkle, а его cask возвращает обновление самому приложению. Оба релиза несут одну и ту же идентичность, из-за чего их обычно невозможно отличить друг от друга; но этот выдаёт себя в самой строке версии: ночная сборка пишет слово полностью («6.5 nightly (7301)»), тогда как стабильная сборка читается как простое «6.4.1». Стоит сказать прямо, чего это намеренно не делает: оно не устанавливает обновление за вас. Little Snitch запускает вместе с приложением системное расширение и привилегированную фоновую службу, а сохранится ли это в целости при простой замене приложения — не проверялось на настоящей машине, поэтому DuoUpdater сообщает вам, что вышла новая версия, и отправляет вас к собственной загрузке поставщика, вместо того чтобы гадать с сетевым фильтром.
Carbon Copy Cloner теперь отслеживается, и он не станет пытаться перевести вас между старшими версиями. Bombich одновременно поддерживает живыми три поколения — CCC 5, 6 и 7 — и все они сообщают системе одну и ту же идентичность, из-за чего вопрос «есть ли что-то новее?» оказывается хитрее, чем кажется: 7.1.6 действительно сортируется выше 6.1.13, но переход между ними — это отдельная покупка, а для CCC 7 нужна более новая macOS, чем та, что вообще может стоять на машине с CCC 5. Ответ по одному лишь номеру версии говорил бы каждому владельцу CCC 5 и 6, что его ждёт бесплатное обновление, — вечно, и каждый раз неверно. Поэтому DuoUpdater читает каждое поколение с его собственного адреса и предлагает только следующий релиз внутри того самого поколения, которое у вас действительно установлено. Бета-релизы тоже подхватываются — для тех, кто включил их прямо внутри CCC. Пока это только обнаружение — CCC устанавливает рядом с приложением привилегированный помощник, а это более серьёзная заявка, чем уже имеющиеся здесь обновления в один клик, — и стоит записать, почему раньше эти обновления вообще не были видны: собственная лента обновлений приложения успешно отвечает на каждый запрос совершенно пустой страницей.
Обновление, которое ваш Mac на самом деле не может запустить, больше не загружается и не устанавливается. Каждый бандл приложения указывает самую старую macOS, на которой оно запустится, а некоторые поставщики называют и самую новую — «эта сборка не для настолько новой ОС», это именно то, как приложение, ещё не угнавшееся за macOS 27, об этом сообщает. DuoUpdater не читал ни то, ни другое. Для приложений, отслеживаемых через ленту Sparkle, нижняя граница уже соблюдалась, но таких меньшинство: среди приложений на типичном Mac те, что читаются из собственной конечной точки поставщика или из релизов GitHub, составляют большую половину, а релиз GitHub вообще нигде не публикует требование к macOS. Так что приложение, ушедшее на более новую macOS, чем ваша, могло быть предложено, полностью загружено, подставлено на место — а затем просто не открыться. Теперь DuoUpdater читает это требование прямо из загруженного приложения, рядом с уже существующей проверкой того, что оно собрано под ваш процессор, и отказывается от замены, вместо того чтобы заменить рабочую копию той, что не запустится. Верхняя граница, названная поставщиком, тоже соблюдается там, где её публикует лента, поэтому сборка, которую разработчик пометил как не предназначенную для вашей macOS, вообще не предлагается. Три ограничения стоит назвать прямо. Чтение требования из загрузки означает, что загрузка уже состоялась, — это предотвращает сломанную установку, а не сам трафик, потому что для большинства приложений раньше спросить попросту негде. Приложение, чью новейшую версию ваш Mac не может запустить, будет и дальше показывать это обновление и дальше отказываться его устанавливать; отказ теперь называет нужную версию macOS, но DuoUpdater пока не запоминает этот ответ и не перестаёт предлагать обновление. И проверка охватывает только те пути, где DuoUpdater сам подставляет бандл приложения на место: пакет установщика передаёт файл macOS, которая сама следит за требованиями пакета, а Homebrew и App Store сами выбирают нужные им сборки; приложения, пришедшие из раздела App Store для iPhone и iPad, пропускаются намеренно, поскольку указанная в них версия — это версия iOS, и сравнивать её с macOS было бы хуже, чем вовсе не проверять. Одну вещь это пока не проговаривает вслух: там, где разработчик пометил сборку как не предназначенную для вашей macOS, это обновление попросту не предлагается, а приложение читается как актуальное, вместо того чтобы объяснить почему. Для более старого Mac это само собой разрешается в день, когда вы обновите macOS. Для Mac, который слишком новый, — нет, и здесь причитается ответ получше, чем молчание.