Год назад, 6 июня 2025 года, я вышел на пенсию и горжусь тем, что за это время не добавил ни цента акционерной стоимости. Вместо этого я занялся NetNewsWire. Приложение отчаянно нуждалось в модернизации: техдолг висел камнем, баги плодились, а фундамент требовал капитального ремонта, прежде чем можно было добавлять фичи.
За 2 188 коммитов мы сделали кучу всего. Переписали всё на Swift structured concurrency и async/await. Внедрили Liquid Glass UI, не бросая поддержку свежих ОС. Перетащили парсеры XML, HTML и дат с Objective-C на Swift. Пофиксили тонны багов, включая вылеты. Сильно снизили расход батареи, памяти, частоту зависаний и записи на диск. Ускорили всё, что можно, особенно за счёт того, что приложение стало просто делать меньше лишней работы. Навели порядок: подняли GitHub CI, завели SwiftLint, включили treat-warnings-as-errors, начали локализацию, перешли на Logger, добавили тесты. Упростили и отрефакторили код, многое переименовали, навели ясность. Добавили поддержку Cache-Control для фидов — издатели теперь могут настраивать частоту проверок. Оптимизировали синхронизацию iCloud (но работы ещё хватает). Разобрались с устаревшими API — например, перешли на NWPathMonitor. И, что важно, добавили в интерфейс диагностику и отчёты об ошибках: уже вышли iCloud Storage Stats и Error Log, а в бете — Dinosaurs, Current Activity, Activity Log и Account Stats.
Этот последний пункт — ключевой. Он даёт пользователям видеть, что творится внутри, когда приложение ведёт себя неожиданно. Даже если они не могут починить проблему сами, то хотя бы скопируют лог и расскажут мне, что случилось. Так я трачу меньше времени на поддержку и больше — на код и новые фичи.
Фундаментальная работа почти закончена. Работать над приложением стало гораздо приятнее, чем год назад. Я говорю «мы» не просто так — мой основной вклад, но есть и другие контрибьюторы. Самый активный из них, Stuart Breckenridge, сделал Liquid Glass и запустил новый браузерный RSS-ридер Gobbler (зацените!). И да, за год мы переехали из Slack на Discourse — теперь поддержка и обсуждения открыты в вебе, а не спрятаны за закрытыми дверями.