Одного Dock мне было мало: как я написал свой док для macOS с магнитами и виджетами

У меня два монитора и десятки программ, и один системный Dock с этим не справлялся. Хотелось мессенджеры — слева на втором мониторе, рабочие инструменты — внизу основного, а свободное место на диске и погоду видеть, ничего не открывая. Готовые замены либо платные, либо умели что-то одно. Так появился PejavaDock — бесплатный нативный док на Swift без сторонних зависимостей. Ниже — что он умеет и как устроен внутри.
Что получилось
Сколько угодно доков у любого края любого монитора. Док помнит свой монитор и возвращается на него, когда монитор снова подключают.
Магнит: док прилипает к углу или к соседнему доку, доки на одном краю расталкивают друг друга, а с Shift ставятся свободно.
Док может занять всё свободное место на краю; то, что не влезло, уходит под кнопку «Ещё».
Виджеты в конце дока: место на диске, часы, погода и свои на HTML.
Группы как в iOS: до четырёх программ делят один значок, и каждая четверть запускает своё.
Веб-ссылки со значками сайтов, открытие сайта отдельным окном (Chrome, Edge, Brave), режим без фона, отдельные значки для окон одной программы — например, для рабочего и домашнего профилей Chrome.
Всё привычное: увеличение, стопки папок, Корзина, свёрнутые окна, автоскрытие, импорт из системного Dock.
Синхронизация доков между Mac через аккаунт GitHub или Google.
Как устроен док
Каждый док — это панель без рамки на уровне окна Dock, растянутая вдоль всего края экрана. Значки рисуются слоями Core Animation, а таймер на 60 кадров считает увеличение по косинусоиде вокруг указателя. Вне подложки окно игнорирует мышь, чтобы не перехватывать чужие щелчки. Фон — Liquid Glass на macOS 26 (NSGlassEffectView) или матовое стекло с настраиваемым радиусом размытия.
Магнит и расталкивание
Самая интересная часть — раскладка доков на одном краю. Каждый док хранит не координаты, а намерение: «центр в 40 % длины края», «прижат к правому углу» или «стоит сразу после дока X». На каждом кадре небольшой решатель переводит намерения в отрезки: сначала ставит доки туда, куда они хотят, затем проходом вперёд расталкивает наложения с зазором 3 pt, а проходом назад возвращает в границы экрана тех, кого вытолкнули за край. Поэтому док, прижатый к правому углу, растёт влево, когда в него добавляют значки, и отталкивает соседей, а примагниченные доки едут вслед за тем, к кому прилипли. Режим «всё свободное место» — тот же решатель: остальные доки упаковываются к краям, а гибкий получает промежуток.

Системный Dock не выключить
macOS не даёт сторонней программе убрать системный Dock. PejavaDock включает ему автоскрытие с задержкой 1000 секунд и возвращает прежние настройки при выходе. Чтобы настройки вернулись и после аварийного завершения, запускается отдельный shell-процесс, который следит за PID и всё восстанавливает, если программа упала. Второе честное ограничение: сторонний док не может зарезервировать место на экране, поэтому есть опция, которая через Accessibility сдвигает развёрнутые окна, чтобы они не заходили под док.
Виджеты на HTML
Встроенные виджеты (диск и часы) рисуются сразу в картинку через Core Graphics. Сторонний виджет — это папка с manifest.json и HTML-страницами, которая показывается в прозрачном WKWebView. Ориентация, размер, тёмная тема, язык и настройки приходят в строке запроса, а форма настроек строится по манифесту. Первый такой виджет — погода с open-meteo.com: геокодинг города и прогноз на 7 дней без ключа. Устанавливается он кнопкой на сайте через ссылку pejavadock://, после подтверждения в программе.
Синхронизация и сервер за 0 долларов
Вся серверная часть — один Cloudflare Worker на бесплатном тарифе: сайт на Astro как статика, база D1 для аккаунтов и статистики, R2 для сборок. Вход идёт через системный браузер по OAuth с PKCE: программа слушает одноразовый порт на 127.0.0.1 и получает туда код, а токен хранится в связке ключей. Изменения с двух Mac сливаются трёхсторонним слиянием по каждому доку относительно последнего синхронизированного снимка, так что ничего не перезаписывается молча.
Установить
PejavaDock бесплатен, весит около 3 МБ, работает на macOS 14 и новее на Apple Silicon и Intel, подписан и проверен Apple, есть на 12 языках, включая русский. Скачать можно на dock.pejava.com или через Homebrew: brew install --cask voy22/tap/pejava-dock. Ошибки и идеи — в github.com/voy22/pejava-dock или в комментариях: самое ценное сейчас — узнать, чего вам не хватает в доке.
KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.