Chuyển đến nội dung chính

Denial: a Wayland compositor with Flutter at the foundation

Denial is a Flutter-native Wayland compositor — Flutter is not running on the desktop, it is part of the compositor’s foundation. 501★, GPLv3, last pushed 2026-08-27.

What is Denial?

A normal Flutter desktop app asks an existing compositor for a window. Denial goes one layer down. deniald embeds the Flutter Engine directly through its native Embedder API, and the Dart shell runs AOT-compiled inside the compositor process. There is no Hyprland or Mutter underneath.

The responsibilities split cleanly along a Rust/Dart line:

  • Rust, built on Smithay, owns Wayland protocol state, client buffers, input devices, focus and grabs, output configuration, DRM/KMS presentation and native resource lifetimes.
  • Flutter owns desktop policy: shell layout, windows, system surfaces, settings, motion, gestures, and which regions participate in shell interaction.

Wayland clients never hand pixels to Dart. Their buffers stay native; Denial imports the contents as external textures and drops them into the same Flutter scene as the shell UI:

Wayland clients ──> Rust / Smithay ──> external textures ──> Flutter scene
       input <──── native routing <──── shell hit regions <──────┘

Displays <────────────── DRM / KMS <────────────── shared GBM atlas

Why this is technically interesting

The Impeller story is the part worth reading twice. Impeller was designed to render an application inside a window. Denial asks it to render an entire desktop into compositor-owned, rotating GBM framebuffers. Their locked Flutter fork wires Impeller’s GLES path directly into the shared KMS atlas — embedder FBO presentation, no-target frame handling, preserved partial damage, native fences, external-texture lifetimes. Each display scans out its own region of that atlas directly. There is no second compositor pass over a finished frame.

Skia/Ganesh stays in the same engine generation as a fallback, selectable with --flutter-renderer skia or DENIA_FLUTTER_RENDERER=skia.

The bridge between Rust and Dart is also deliberately narrow. It carries immutable scene state and bounded commands; Dart never owns file descriptors, Wayland objects, EGL images or KMS buffers. The Settings app is a separate ordinary Wayland process talking to deniald over a versioned Unix control socket, so its rendering workload cannot stall the compositor’s engine. That bundle boundary is also the intended path to third-party shells: once the compatibility contract stabilises, a compatible bundle should be able to replace the reference shell without replacing the compositor.

Getting started

Denial ships signed first-party x86-64 repositories. Review the setup script first — it verifies the release-key fingerprint and adds the repo, but installs nothing:

curl -fsSL https://install.denialwm.org | sh

Then, for your distribution:

sudo pacman -Syu denial
sudo apt update && sudo apt install denial
sudo dnf install denial

Signed x86-64 packages cover Arch and CachyOS, Debian 13, Ubuntu 24.04 LTS, Fedora 44, and Alpine 3.24 via GitHub Releases. NixOS and Void are tested but unpackaged; ARM64 is fully supported from source only.

For shell hacking on Arch there is a separate package:

sudo pacman -S denial-ui-development
denialctl ui setup

That creates a source checkout and starts a JIT shell — open dart_shell/ in your editor and you get hot reload on save while Wayland applications keep running. denialctl ui restore puts the packaged optimized shell back if your edits leave you without a usable window.

When should you look at Denial?

  • you write Flutter and have wondered how far below the application layer it can go
  • you want a Linux desktop whose shell you can hot reload
  • you are interested in the Embedder API, external textures, or Impeller outside the app-in-a-window case
  • you are on Arch, Debian 13, Ubuntu 24.04 or Fedora 44 on x86-64 and enjoy running beta desktops

Where it falls short

It is a public beta, and the README says so plainly: native APIs, the Flutter bundle contract, configuration and the wire protocol may all still change before 1.0. This is a compositor — when it breaks, it does not break in a window.

It depends on a locked Flutter fork with a pinned engine generation. That is unavoidable given what it does to Impeller’s presentation path, but it means Denial’s engine moves on Denial’s schedule, not Flutter’s.

Coverage is narrower than the distro table first suggests: ARM64 works but has no published binaries, NixOS and Void have no first-party packages, and Alpine gets signed release downloads rather than a repository. The debug story is intentionally limited too — the editor debug adapter cannot pause, break or evaluate, because pausing the root isolate would freeze the desktop you are sitting in front of.

And the licence is GPLv3, which is the right choice for a compositor but worth knowing before you plan anything derivative.

Alternatives worth comparing

Frequently asked questions

Is Denial a Flutter app running on a Wayland compositor?

No, and that is the whole point. deniald embeds the Flutter Engine through its native Embedder API and runs the Dart shell AOT-compiled inside the compositor process. It is not a Wayland client and does not need another compositor beneath it.

How do Wayland applications get drawn?

Their client buffers stay native resources. Denial imports the contents as external textures and places them in the same Flutter scene as the shell UI, which renders into a desktop-wide GBM atlas that each display scans out through KMS.

Can I hot reload the desktop shell?

On Arch, yes. The denial-ui-development package plus denialctl ui setup gives you a JIT shell with hot reload on save. Debugging is deliberately non-pausing — pausing the root isolate would pause the interactive desktop.

Is Denial ready to use as my daily desktop?

It is a public beta. It already runs as a full Wayland session with Xwayland, multi-output presentation and portal-based screen sharing, but the native APIs, Flutter bundle contract, configuration and wire protocol may still change before 1.0.


Part of FlutterCook — hands-on guides to the best open-source Flutter libraries, UI kits, and apps. Explore the live GitHub trends or browse YouTube guides.


Originally published on FlutterCook. Read the latest version there — that copy is the one kept up to date.

Nhận xét

Bài đăng phổ biến từ blog này

5 concepts every Flutter dev should know

  Phụ lục: State management architecture Testing IDE Shortcuts Platform channel Maintaining a project Tôi đã làm việc với Flagship trong một thời gian dài, và đây là những điều mà tôi phát hiện ra là điều cần phải có đối với bất kỳ nhà phát triển Flagship nào, về tổng thể nó sẽ khiến bạn trở thành một nhà phát triển Flagship giỏi trong thời gian dài. 1. State management architecture Đây là một trong những chủ đề quan trọng nhất trong cộng đồng thiết bị rung, nó khá quan trọng nếu bạn muốn duy trì một dự án rung kích thước trung bình hoặc lớn. Nó sẽ giúp tạo một dự án suôn sẻ và thêm các tính năng mới một cách hoàn hảo.  2. Testing Đây là một chủ đề duy nhất mà tôi không hiểu tại sao nó lại quan trọng trước đó trong sự nghiệp của tôi, nhưng khi tôi tiến lên trong sự nghiệp của mình và có kinh nghiệm với nhiều dự án và vấn đề xảy ra trong môi trường sản xuất. Tôi đã nhận ra một cách khó khăn, tại sao điều này lại quan trọng như vậy. Nếu bạn vẫn muốn có thêm lý do để cân nhắc thử...

Thiết kế giao diện với DotNetBar (Phần 1)

Đây là phiên bản DotNetBar hỗ trợ C# và Visual Basic https://www.dropbox.com/s/wx80jpvgnlrmtux/DotNetBar.rar  , phiên bản này hỗ trợ giao diện Metro cực kỳ “dễ thương” Các bạn load về và cài đặt, khi cài đặt xong sẽ có source code mẫu của tất cả các control. Để sử dụng được các control của DotNetBar các bạn nhớ add item vào controls box. Thiết kế giao diện với DotNetBar, giao diện sẽ rất đẹp. Link các video hướng dẫn chi tiết cách sử dụng và coding: http://www.devcomponents.com/dotnetbar/movies.aspx Hiện tại DotNetBar có rất nhiều công cụ cực mạnh, trong đó có 3 công cụ dưới đây: DotNetBar for Windows Forms Requires with Visual Studio 2003, 2005, 2008, 2010 or 2012.   DotNetBar for WPF Requires with Visual Studio 2010 or 2012 and Windows Presentation Foundation.   DotNetBar for Silverlight Requires with Visual Studio 2010 or 2012 and Silverlight. Dưới đây là một số hình ảnh về các control trong DotnetBar.   Metro User Interface  controls with Metro Tiles, toolba...

Announcing Flutter 2

  Phụ lục: Flutter on the web Flutter 2 on desktops, foldables, and embedded devices The growing Flutter ecosystem Dart: The secret sauce behind Flutter Flutter 2: Available now Hôm nay, chúng tôi sẽ công bố Flutter 2: một bản nâng cấp lớn cho Flutter cho phép các nhà phát triển tạo các ứng dụng đẹp, nhanh chóng và di động cho bất kỳ nền tảng nào. Với Flutter 2, bạn có thể sử dụng cùng một cơ sở mã để gửi các ứng dụng gốc cho năm hệ điều hành: IOS, Android, Windows, macOS và Linux; cũng như trải nghiệm web nhắm mục tiêu các trình duyệt như Chrome, Firefox, Safari hoặc Edge. Flutter thậm chí có thể được nhúng vào ô tô, TV và thiết bị gia dụng thông minh, mang đến trải nghiệm di động và lan tỏa nhất cho thế giới điện toán xung quanh. Mục tiêu của chúng tôi là thay đổi cơ bản cách các nhà phát triển nghĩ về việc xây dựng ứng dụng, bắt đầu không phải với nền tảng bạn đang nhắm mục tiêu mà là với trải nghiệm bạn muốn tạo. Flutter cho phép bạn tạo ra những trải nghiệm tuyệt đẹp trong đó ...