Starling — новое рабочее окружение для Linux с собственным композитным сервером Wayland на C, встроенным X11-сервером и оболочкой на Swift. Код написан преимущественно с помощью Claude; работу направлял один человек, и от первого коммита до сеанса, в который можно войти, прошло около полугода. Версия 0.2 распространяется как .deb-пакет размером 52,6 МБ и рассчитана только на Ubuntu 26.04 LTS. Работоспособность проверена на встроенной графике AMD Radeon 780M и на virtio-gpu/virgl в виртуальной машине; на Intel и NVIDIA проверок не было. Проект представлен 2026 года.

Сеанс запускается через GDM и работает без прав root

Starling занимает место всего графического сеанса, а не отдельной программы внутри чужого. Обращение к видеокарте идёт напрямую через DRM/KMS, устройства ввода читаются на низком уровне, вывод на экран принадлежит самой оболочке. На экране входа Starling выбирается в меню сеансов наравне с GNOME или KDE Plasma и остаётся рабочим окружением до выхода из системы.
DRM/KMS — подсистемы ядра Linux, через которые программа получает прямой доступ к видеокарте и к настройке режимов вывода, минуя X-сервер и любой промежуточный сервер отображения.
Цепочка запуска повторяет обычный путь Wayland-сеанса в Ubuntu:
gdm3 -> gdm-wayland-session -> /usr/libexec/starling-session -> DesktopShellApp --drm
Права DRM master и доступ к устройствам ввода сеанс получает от logind через libseat, поэтому запуск от root не нужен. На стороне вывода задействованы установка режима DRM/KMS, связка GBM и EGL, аппаратный курсор, привязка темпа кадров к переключению буферов и раскладка на несколько выводов.
Композитный сервер на C и встроенный X11-сервер

Слой, отвечающий за протокол Wayland, занимает около 5700 строк на C. В нём реализованы xdg-shell, linux-dmabuf с импортом буферов без копирования, viewporter, fractional-scale-v1, pointer-constraints, relative-pointer, text-input-v3, presentation-time, primary-selection, idle-inhibit, cursor-shape-v1, xdg-decoration, xdg-activation, xdg-output и wlr-data-control.
Композитный сервер — программа, которая управляет окнами и одновременно собирает их изображения в единый кадр. В терминологии Wayland такую программу называют композитором, и она же выполняет роль сервера отображения.
Оба пути передачи буферов задействованы одновременно: изображение от клиентов, рисующих на видеокарте, передаётся через linux-dmabuf, от программ с отрисовкой на процессоре — через wl_shm. Для программ, оставшихся на X11, в дереве исходников лежит отдельный X-сервер с поддержкой DRI3 и Present.
Порт фреймворка Flutter на Swift вместо Dart VM

В основе проекта лежит наблюдение, что рабочее окружение и обычный фреймворк для построения интерфейсов делают почти одну и ту же работу. Оба держат сцену всего, что выведено на экран, считают раскладку, направляют события ввода нужному адресату, собирают кадр на видеокарте и анимируют его с частотой обновления дисплея. Отсюда решение поставить фреймворк не внутрь сеанса, а в его основание.
Окно чужой программы при таком устройстве становится обычным виджетом — узлом того же дерева, что панель Dock и строка меню. Мозаичная раскладка сводится к виджету раскладки, обзор рабочих пространств — к анимированной сетке уменьшенных копий, переключение между пространствами — к постраничному горизонтальному переключению. Перемещение и анимация виджетов заложены во фреймворк изначально, поэтому отдельно для окон их писать не пришлось.
Отрисовка идёт через C-ядро движка Flutter, подключённое через собственный embedder для DRM/KMS.
Embedder API — документированный интерфейс на C, через который внешняя программа передаёт движку Flutter поверхность для рисования, события ввода и сигнал вертикальной синхронизации. Тем же способом работают flutter-pi и embedder для встраиваемых систем, который публикует Sony.
Слой фреймворка над движком — виджеты, раскладка, объекты рендеринга — переписан с Dart на Swift целиком, без виртуальной машины Dart. Мотив выбора языка утилитарный: пропущенный кадр в композитном сервере теряется не для одной программы, а сразу для всего экрана, и пауза сборщика мусора превращается в заметный рывок при перетаскивании окна. Swift компилируется в машинный код заранее, а память освобождается автоматическим подсчётом ссылок (ARC), который расставляется на этапе компиляции и не сканирует кучу во время работы.
Компилятор Swift содержит внутри Clang, поэтому заголовки движка подключаются напрямую через module map — без прослойки FFI и без генерации привязок. Оболочка связана только со стабильным C-интерфейсом движка, так что правки в C++-части не требуют её перекомпоновки. На порт фреймворка приходится 137 файлов тестов.
| Показатель | Значение |
|---|---|
| Строк собственного кода (Swift, C, C++) | 335 000 |
| Порт фреймворка Flutter на Swift | около 273 000 |
| Оболочка, серверы Wayland и X11, приложения | около 62 000 |
| Композитный сервер на C | около 5700 |
| Файлов тестов порта фреймворка | 137 |
| Размер пакета .deb | 52,6 МБ |
| Зависимостей, устанавливаемых вместе с пакетом | 26 |
| Коммитов, заявленных на сайте проекта | около 2000 |
Подсчёт строк не включает сторонние зависимости, лежащие в дереве исходников. Число коммитов по публичному журналу не проверяется: репозиторий рабочего окружения начат с чистого снимка, до этого разработка велась в двух закрытых репозиториях, и предыдущая история недоступна. C++-часть вынесена в отдельный репозиторий — это ответвление движка Flutter, поверх которого лежат изменения Starling.
Собственный код распространяется по лицензии Apache 2.0. Два поддерева сохраняют исходные лицензии, поскольку представляют собой порт и ответвление. Каталог sdk остаётся под BSD-3-Clause как производная от Flutter, а сгенерированные из wayland-protocols файлы протоколов — под MIT.
На сайте Starling назван первым настоящим рабочим окружением, написанным ИИ, в противопоставление вкладкам браузера и макетам, до которых доходили прежние попытки. Phoronix формулирует сдержаннее: ещё один вариант открытого рабочего стола в череде проектов, написанных преимущественно языковыми моделями.
Сама идея построить оболочку поверх готового фреймворка тоже не нова. В Qt есть модуль для написания композитного сервера, и на нём построен Lipstick — QML-оболочка домашнего экрана Sailfish OS. В Enlightenment сеанс Wayland поверх собственных библиотек EFL существует давно, хотя разработчики до сих пор называют эту поддержку экспериментальной. Отличие Starling в том, что под сеансом не остаётся ни виртуальной машины, ни интерпретатора: фреймворк скомпилирован в машинный код и сам же выступает композитным сервером.
Мозаичный режим, рабочие пространства и стекло на шейдерах
По умолчанию окна перекрываются и перемещаются свободно. После переключателя в Settings -> Appearance -> Tiling Windows экран перестраивается по схеме «главное окно и стопка»: активное окно занимает основную область, остальные выстраиваются рядом. Обратное переключение возвращает каждое окно на прежнее место в свободной раскладке; отдельного расширения или второго сеанса для этого не требуется.
Мозаичное размещение — режим, при котором окна занимают экран без наложения друг на друга. В схеме «главное окно и стопка» одно окно удерживает основную область, а прочие выстраиваются вдоль края.
Виртуальные рабочие столы в Starling называются spaces, общий обзор — Mission Control; названия совпадают с принятыми в macOS. Обзор открывается сочетанием Ctrl и стрелки вверх, переключение между пространствами — Ctrl и стрелки влево или вправо. Окно можно перетащить в другое пространство прямо из обзора или увести за собой при переключении, а любое приложение, развёрнутое на весь экран, получает отдельное пространство. В панели Dock показаны индикаторы запущенных программ, значки перетаскиваются для смены порядка; отдельно предусмотрен экран запуска приложений Launchpad.
Каждый монитор получает свою строку меню, свои обои и свой набор пространств, но экраны остаются частями одного рабочего стола, а не двумя независимыми. Окно, поставленное на стык двух экранов, рисуется половинами на обоих, причём каждая половина — в масштабе своего дисплея. При отключении монитора его окна возвращаются на оставшийся экран, при обратном подключении раскладка восстанавливается.
Эффект стекла у панелей и Dock построен не на размытии. Фрагментный шейдер задаёт панели толщину, выводит из неё нормаль к поверхности и преломляет луч взгляда по закону Снеллиуса, добавляя рассчитанную по Френелю подсветку края и зеркальный блик на той же поверхности. Текст, проходящий за панелью, не просто размывается, а изгибается и сжимается к скруглённым краям. HTML, CSS и JavaScript в оболочке не используются вовсе — эффекты считаются шейдерами, а не фильтрами.
Что запускается в сеансе: от Chrome до Blender

В сеансе как обычные клиенты Wayland работают Chrome, VS Code, Slack, Discord, Teams, Telegram, IntelliJ IDEA, GIMP, Blender, GNOME Web и текстовый редактор GNOME. Список перекрывает основные наборы инструментов: Chromium и Electron, Qt6, GTK3 и GTK4, Wayland-часть JetBrains Runtime, а также GHOST в Blender. Через linux-dmabuf работает и окно просмотра Blender с движком EEVEE. Программы X11 подключаются к встроенному X-серверу.
Одно исключение оговорено отдельно. Zoom стартует, но при запуске появляется сообщение об отсутствии pactl и pacmd: звуковая подсистема вместе с пакетом не устанавливается, поскольку ни одному из штатных приложений она пока не нужна.
Из порталов xdg-desktop-portal реализованы Settings, FileChooser с открытием и сохранением файлов через вспомогательное окно и Request. Через них в GTK4 попадают настройки оформления org.freedesktop.appearance.
Штатных приложений в пакете пять: Settings, Files, Terminal с настоящим PTY, Calculator и магазин приложений, через который программы ставятся из репозитория Ubuntu. Текстовый редактор и просмотрщик изображений собираются, но в пакет не попали, а видеопроигрыватель убран из-за GPL-компонентов в сборке FFmpeg для Ubuntu. Каталог магазина насчитывает десять позиций; вместо логотипов производителей в плитках нарисованы обобщённые значки категорий, так как чужие товарные знаки в состав не включены.
Ограничения версии 0.2
Список известных недоработок опубликован в описании репозитория без смягчений:
- масштабирование фактически зафиксировано на значении 2,0 — дробные значения дают размытый текст и к работе не пригодны;
- состояние xdg_output отправляется клиенту один раз и больше не обновляется, поэтому после смены режима, масштаба или горячего подключения монитора долго работающая программа остаётся со старой геометрией;
- портал неполный: Settings и FileChooser работают, а Inhibit, ScreenCast, Camera и Print отсутствуют, при этом штатный xdg-desktop-portal замаскирован на шине сеанса;
- блокировки экрана и хранителя экрана нет;
- переключатель уведомлений в Settings ни на что не влияет — службы уведомлений за ним пока нет;
- выбор режима вывода недоступен, берётся предпочтительный режим разъёма, изменить его можно только правкой запускающего сеанс сценария;
- непрерывной интеграции нет, проверка сводится к модульным тестам фреймворка и ручному прогону в виртуальной машине;
- Intel и NVIDIA не проверялись, как и дистрибутивы, кроме Ubuntu 26.04.
Планы описаны как направление, а не как обязательство. В список входят расширение перечня работающих программ, запуск Android-приложений через Waydroid и программ Windows через Wine или Proton. Дальше идут поддержка Intel и NVIDIA, ноутбучные сценарии с крышкой, подсветкой и горячим подключением монитора, HiDPI, дистрибутивы помимо Ubuntu и архитектура ARM. Отдельным пунктом — уведомления, блокировка экрана и настройки дисплея.
Пока поддерживается только Ubuntu 26.04 LTS
Других дистрибутивов в списке совместимости нет, архитектура тоже одна — amd64. Остальные системы и сборка под ARM значатся в планах, но не в текущей версии.
Установка укладывается в три шага. Сначала нужен менеджер входа в систему с поддержкой Wayland: в Ubuntu Desktop это GDM, на серверной или минимальной установке его ставят отдельно. Затем загружается и устанавливается .deb-пакет вместе с зависимостями — их 26, список вычислен по бинарным файлам утилитой dpkg-shlibdeps, поэтому пакет разворачивается даже на минимальном образе. Остаётся выйти из системы, открыть на экране входа меню сеансов и выбрать Starling.
Файлы попадают в /usr/lib/starling и /usr/share/starling, в список сеансов добавляется отдельная запись. Точные команды и ссылка на актуальную сборку собраны в разделе установки на сайте проекта — там они обновляются вместе с релизами; там же лежит руководство пользователя.
Заключение
В Starling на практике проверена давняя мысль. Рабочее окружение и фреймворк для построения интерфейсов устроены одинаково, а значит, второй можно поставить в основание первого, а не рядом с ним. Проверка доведена до устанавливаемого пакета, который поднимает полноценный сеанс с двумя протоколами и чужими программами. Дальше версии 0.2 дело пока не ушло: масштаб зафиксирован, блокировки экрана нет, проверка ограничена одной моделью встроенной графики.
Интерес версия представляет для тех, кто следит за архитектурными экспериментами вокруг Wayland и за тем, во что обходится рабочее окружение в строках кода. Как повседневная система она пока не рассматривается — об этом прямо сказано в описании самого проекта.