Plumix: фреймворк, который переносит архитектуру Flutter в мир .NET
Нашел интересную на Хабре, в которой мобильный разработчик Егор рассказывает о своем проекте - фреймворке, который переносит архитектуру Flutter в мир .NET. Автор честно делится, почему затеял эту авантюру, как работает с ИИ-агентами и что умеет Plumix сейчас. В статье рассказано про боль десктопной разработки на Flutter, про полученное удовольствие от Avalonia и про неожиданный подарок от Google в виде Impeller.
Почему Flutter на десктопе - боль:
С мобильной разработкой на Flutter все отлично. Hot reload, декларативная верстка, нативные ощущения - автор получает удовольствие. А вот десктоп - другая история. Контролы под десктоп не заточены. Попробуйте собрать таблицу на десятки тысяч строк, контекстные меню, drag-and-drop - все это либо пишется руками, либо собирается из сторонних пакетов разной степени заброшенности. Десктоп на Flutter часто ощущается как мобилка, растянутая на весь монитор.
С Avalonia ровно наоборот. Десктопы на ней пишутся с кайфом: DataGrid, меню, хоткеи, работа с мышью - все родное. А мобилка - боль. Нет физики скролла, нет жестов, нет pull-to-refresh. Технически запускается, но пользователь чувствует: что-то не так.
И вот на этой развилке автор и застрял: для мобилки хочется Flutter, для десктопа - Avalonia. Так появилась идея Plumix: перенести флаттеровскую модель поверх Avalonia. От Flutter - архитектура, контролы, жесты, анимации. От Avalonia - зрелая платформенная инфраструктура, окна, жизненный цикл, графический бэкенд.
Фреймворк, который пишут агенты:
Самое интересное - работа с ИИ. Автор признается: в одиночку переписать рендер-пайплайн Flutter, систему жестов и Sliver-протокол - неподъемная задача. Но на дворе 2026 год и работа идет не в одиночку.
Plumix строился как репозиторий, оптимизированный под ИИ-агентов. Не «иногда прошу чат-бота написать функцию», а полноценный конвейер. Агент получает задачу «портируй Material-контрол X», сам находит контекст, пишет код, тесты и документацию. Автор выступает архитектором, ревьюером и ОТК.
Чтобы это работало, выстроена система документов:
AGENTS.md - правила игры: архитектурные границы, что можно, что нельзя.
docs/FRAMEWORK_PLAN.md - единый источник правды о статусе проекта с YAML-блоком «AI Semantic Snapshot» для агентов.
docs/ai/PORTING_MODE.md - ключевое правило: строгий порт 1:1, а не «примерно похоже».
docs/ai/DIVERGENCES.md - реестр осознанных отклонений от Flutter.
docs/ai/MODULE_INDEX.md и TEST_MATRIX.md - карта модулей и тестов.
Отдельный прием - эталонное приложение. В репозитории живут два одинаковых сэмпла: на C# и на Dart. Автор запускает их рядом и сравнивает визуальное поведение. Это дешевый детектор халтуры: если агент «примерно нарисовал» вместо честного порта, расхождение видно сразу.
Правило единицы поставки: один контрол за одну итерацию, целиком. API, состояния, layout, отрисовка, тесты - все в одном заходе. Если разрешить агенту дробить работу, получается вечный недострой.
Результат: портирование контрола перестало быть исследовательской задачей и стало конвейерной. Changelog разросся до такой степени, что пришлось ввести правило ротации - когда файл переваливает за 100 КБ, старая половина уезжает в архив. Объем изменений, который агенты выдают за короткое время, автор руками генерировал бы годы.
Что умеет Plumix:
Пример кода:
using Plumix.Widgets;
public sealed class MyApp : StatelessWidget
{
public override Widget Build(BuildContext context)
{
return new Scaffold(
body: new Center(
child: new Column(
mainAxisAlignment: MainAxisAlignment.Center,
children: [
new Text("Hello, Plumix!", style: new TextStyle(fontSize: 32)),
new SizedBox(height: 16),
new ElevatedButton(
onPressed: () => { /* handle tap */ },
child: new Text("Get Started")
)
]
)
)
);
}
}
Если вы писали на Flutter - вы уже умеете писать на Plumix. Это цель проекта.
Под капотом - честный порт архитектуры Flutter. Ядро уже закрыто полностью: виджетное дерево и жизненный цикл, рендер-пайплайн с фазами layout/paint, система жестов с ареной распознавателей, навигация с Hero-анимациями, скролл на Sliver-протоколе, фокус и клавиатура, MediaQuery и SafeArea, Hot Reload.
Поверх ядра - Material-библиотека. Портировано уже несколько десятков контролов: кнопки, Scaffold, AppBar, SnackBar, диалоги, DropdownButton, DataTable с пагинацией, слайдеры, прогресс-индикаторы, NavigationBar и многое другое. Начало Cupertino-пакета тоже есть.
Все лежит на NuGet тремя пакетами - Plumix, Plumix.Material, Plumix.Cupertino - и покрыто тестами.
Impeller в Avalonia - подарок для Plumix:
В ноябре 2025 команда Avalonia объявила о партнерстве с командой Flutter: в .NET приходит Impeller - GPU-first рендер, который Google написала для Flutter вместо Skia. Инициатива исходила от самого создателя Impeller - Chinmay Garde.
Для Plumix это важно. Потому что архитектура такая: Plumix владеет layout’ом и логикой отрисовки, но пиксели на экран выводит графический бэкенд Avalonia. Сейчас это Skia. Когда Avalonia доведет Impeller до стабильности, Plumix получит его автоматически, без единой строчки изменений.
Автор отмечает: «фреймворк, который копирует архитектуру Flutter, будет рисоваться рендером, написанным для Flutter, - но при этом весь код останется на C#».
Вывод:
Автор признается: три года назад такой проект в одиночку был бы авантюрой. Сегодня, с ИИ-агентами и правильно выстроенным процессом, это рабочие будни. Plumix - это не просто фреймворк. Это эксперимент, который показывает, насколько далеко можно уехать на связке «человек-архитектор + ИИ-исполнители» в сложном системном проекте. И, по словам автора, ответ: значительно дальше, чем он думал.