Skip to content

Repository files navigation

Denial

A Flutter-native Wayland compositor.

Denial begins with a belief: origin does not have to dictate purpose.

Flutter was created to build application interfaces. Here, it is given a different life. It owns the desktop scene itself: the shell, its motion, and the composition of Wayland applications. Flutter is not an overlay placed on top of another compositor. It is part of the compositor's foundation.

That is the architecture. It is also the meaning of the name.

The Denial desktop with its settings, system bar, terminal, clock, and audio visualizer

Flutter at the compositor layer

A conventional Flutter desktop application receives a window from an existing compositor. Denial goes one layer deeper: deniald embeds the Flutter Engine directly through its native Embedder API, and the Dart shell runs AOT-compiled inside the compositor process. It is not a Wayland client and does not need another compositor beneath it.

Rust and Flutter have separate responsibilities:

  • 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 the visible desktop policy: shell layout, windows, system surfaces, settings, motion, gestures, and the regions that participate in shell interaction.

Wayland client buffers remain native resources. Denial imports their contents as external textures and places them in the same Flutter scene as the shell UI. Flutter renders that scene into a desktop-wide GBM atlas; each connected display scans its own region directly through KMS, without a second compositor pass over the completed frame.

Wayland clients ──> Rust / Smithay ──> external textures ──> Flutter scene
       input <──── native routing <──── shell hit regions <──────┘
                                                               │
Displays <────────────── DRM / KMS <────────────── shared GBM atlas

Impeller at desktop scale

Denial renders with Flutter's Impeller backend by default. That sentence hides the interesting part: Impeller was designed to render an application inside a window, while Denial asks it to render the entire desktop into compositor-owned, rotating GBM framebuffers. Denial's locked Flutter fork integrates Impeller's GLES path directly with the shared KMS atlas, including exact embedder FBO presentation, no-target frame handling, preserved partial damage, native fences, and external-texture lifetime.

This is not a Flutter app using Impeller inside another compositor. Impeller is part of the compositor's own frame path, from the Dart scene to scanout. Skia/Ganesh remains in the same engine generation as a compatibility fallback and can be selected explicitly with --flutter-renderer skia or the packaged DENIA_FLUTTER_RENDERER=skia session override.

The native compositor and the Flutter shell are built as two versioned parts. The current shell lives in dart_shell/ and is loaded with its AOT library, assets, ICU data, and pinned engine generation as one runtime bundle. Their platform bridge carries immutable scene state and bounded commands without giving Dart ownership of file descriptors, Wayland objects, EGL images, or KMS buffers.

This bundle boundary is also the path toward alternative Flutter shells. As the compatibility contract stabilizes, a compatible user-provided bundle will be able to replace Denial's reference shell without replacing the native compositor beneath it.

Why Denial

Denial is an English word. The name contains Denia, followed by one last letter.

It is a quiet reference to Denia from Wuthering Waves. Her story never gives a simple answer to what she originally was, and that uncertainty is important. What is clear is that others treated her as an asset: something selected, shaped, and assigned a purpose that was not her own. She was meant to remain a vessel. Instead, by observing people and learning to live among them, she grew a heart and gained the ability to choose what she would become.

Her story reflects Denial's central idea: what something was made to be does not have to determine what it can become.

Project status

Denial is a public beta in active development. The supported PC architectures are x86-64 and ARM64 (AArch64), and the native APIs, Flutter bundle contract, configuration, and wire protocol may still change before 1.0. The compositor already runs as a complete Wayland session with Xwayland, multi-output presentation, native input routing, direct screenshots, and portal-based screen sharing.

Supported architectures

Architecture Working Binaries available
x86-64
ARM64 (AArch64)

ARM64 is fully supported, but first-party ARM64 binaries are not published yet. Build Denial from source with an architecture-matched Flutter engine and shell bundle; see the build guide.

Supported distros

Distro Working Binaries available
Arch Linux
CachyOS
Debian 13 (trixie)
Ubuntu 24.04 LTS (noble)
Fedora 44
NixOS
Void Linux

The binary column refers to the current first-party x86-64 package set. NixOS and Void Linux have been tested successfully, but do not have first-party binary packages yet.

Live Flutter shell development

The optional denial-ui-development binary package is currently available only through the Pacman repository. It turns the reference shell into an editable Flutter workspace. denialctl ui setup creates the matching source checkout and starts a JIT shell; opening its dart_shell directory in VSCodium enables hot reload on save and the packaged browser DevTools for Flutter Inspector and performance profiling while Wayland applications keep running.

Install it separately when this workflow is wanted:

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

The supported editor debug-adapter connection is deliberately non-pausing. It does not grant breakpoint, pause, stepping, or expression-evaluation control over the desktop isolate. Browser DevTools connects through the broader VM service and should be used carefully because pausing the root isolate pauses the interactive desktop. A native denialctl ui restore command returns to the packaged optimized shell even when edited Flutter code cannot present a usable Settings window.

Install

Denial provides signed first-party x86-64 repositories for Arch Linux and CachyOS, Debian 13, Ubuntu 24.04 LTS, and Fedora 44. Review the repository setup script, then run:

sh -c 'if ! command -v curl >/dev/null 2>&1; then echo "Error: curl is not available." >&2; exit 1; fi; curl -fsSL https://install.denialwm.org | sh'

It verifies the complete release-key fingerprint, rejects conflicting package manager configuration, and adds the matching signed repository. It does not install packages. When setup completes, use only the command for the current distribution.

Arch Linux or CachyOS

sudo pacman -Syu denial

Debian 13 or Ubuntu 24.04

sudo apt update && sudo apt install denial

Fedora 44

sudo dnf install denial

The package manager pulls in the matching denial-flutter-engine package. The setup script shows its complete plan and asks for confirmation before using sudo.

ARM64 is fully supported from source, but the first-party repositories do not publish ARM64 packages yet. See Build Denial.

Impeller is the default renderer. If a driver-specific issue requires the Skia/Ganesh fallback, set DENIA_FLUTTER_RENDERER=skia in /etc/denial/session.conf and restart the Denial session.

See the complete installation guide for per-distribution trust paths, updates, removal, and manual Pacman setup.

Documentation

Made through dialogue

Denial was conceived, architected, directed, and tested by its human creator, Doctor Logix, and developed in continuous collaboration with OpenAI Codex. Its initial implementation was generated through that collaboration rather than written manually by its creator.

The project's purpose, architecture, design principles, and final technical decisions came from the human side. Codex investigated the codebase, proposed solutions, implemented features, analyzed failures, and refined the system through an ongoing dialogue. Every result was evaluated against real hardware and redirected whenever it failed to match the intended design or performance expectations.

This is part of Denial’s origin, not a disclaimer hidden in a footnote.

Authorship is more than typing source code. Denial exists because a person decided what should exist, defined how it should work, recognized when the implementation was wrong, and kept directing the process until the idea became a functioning system.

License

Denial's original source code is licensed under GPL-3.0-or-later. Bundled third-party components and media retain their own licenses and attribution notices.

About

Denial is a Flutter-native Wayland compositor that puts Flutter at the foundation of the desktop, unifying the shell, motion, and application composition into one fluid experience.

Topics

Resources

Contributing

Security policy

Stars

302 stars

Watchers

4 watching

Forks

Releases

Sponsor this project

Packages

Contributors

Languages