diff --git a/nixos/doc/manual/release-notes/rl-2611.section.md b/nixos/doc/manual/release-notes/rl-2611.section.md index 09593bc37dca..49b0a51331e9 100644 --- a/nixos/doc/manual/release-notes/rl-2611.section.md +++ b/nixos/doc/manual/release-notes/rl-2611.section.md @@ -106,6 +106,8 @@ - [kvrocks_exporter](https://github.com/RocksLabs/kvrocks_exporter), a Prometheus exporter for Kvrocks metrics. Available as [services.prometheus.exporters.kvrocks](#opt-services.prometheus.exporters.kvrocks.enable). +- [Umbriel](https://docs.noctalia.dev/umbriel/), a Wayland compositor built on wlroots and SceneFX. Available as [programs.umbriel](#opt-programs.umbriel.enable). + ## Backward Incompatibilities {#sec-release-26.11-incompatibilities} diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix index 3edb228a793a..a7a07eff0c22 100644 --- a/nixos/modules/module-list.nix +++ b/nixos/modules/module-list.nix @@ -372,6 +372,7 @@ ./programs/wayland/pinnacle.nix ./programs/wayland/river.nix ./programs/wayland/sway.nix + ./programs/wayland/umbriel.nix ./programs/wayland/uwsm.nix ./programs/wayland/waybar.nix ./programs/wayland/wayfire.nix diff --git a/nixos/modules/programs/wayland/umbriel.nix b/nixos/modules/programs/wayland/umbriel.nix new file mode 100644 index 000000000000..3d1662f64894 --- /dev/null +++ b/nixos/modules/programs/wayland/umbriel.nix @@ -0,0 +1,48 @@ +{ + config, + lib, + pkgs, + ... +}: +let + cfg = config.programs.umbriel; +in +{ + options.programs.umbriel = { + enable = lib.mkEnableOption "Umbriel, a Wayland compositor built on wlroots and SceneFX"; + package = lib.mkPackageOption pkgs "umbriel" { }; + portalPackage = lib.mkPackageOption pkgs "xdg-desktop-portal-umbriel" { }; + }; + + config = lib.mkIf cfg.enable ( + lib.mkMerge [ + { + environment.systemPackages = [ cfg.package ]; + services.displayManager.sessionPackages = [ cfg.package ]; + systemd.packages = [ cfg.package ]; + + systemd.user.services.umbriel = { + restartIfChanged = false; + enableDefaultPath = false; + }; + + xdg.portal = { + enable = lib.mkDefault true; + extraPortals = [ cfg.portalPackage ]; + configPackages = [ cfg.portalPackage ]; + }; + } + + (import ./wayland-session.nix { + inherit lib pkgs; + enableXWayland = false; + enableWlrPortal = false; + }) + ] + ); + + meta.maintainers = with lib.maintainers; [ + samiser + pyrox0 + ]; +} diff --git a/pkgs/by-name/um/umbriel/package.nix b/pkgs/by-name/um/umbriel/package.nix new file mode 100644 index 000000000000..a3ed1b57eb24 --- /dev/null +++ b/pkgs/by-name/um/umbriel/package.nix @@ -0,0 +1,116 @@ +{ + lib, + stdenv, + fetchFromGitHub, + meson, + ninja, + pkg-config, + wayland-scanner, + wayland, + wayland-protocols, + wlroots_0_20, + libxkbcommon, + libinput, + pixman, + cairo, + pango, + libGL, + libdrm, + libgbm, + libxcb, + libxcb-wm, + lcms2, + jemalloc, + tomlplusplus, + nlohmann_json, + xwayland-satellite, + makeBinaryWrapper, + versionCheckHook, + unstableGitUpdater, +}: +stdenv.mkDerivation { + pname = "umbriel"; + version = "0-unstable-2026-08-23"; + + strictDeps = true; + __structuredAttrs = true; + + src = fetchFromGitHub { + owner = "noctalia-dev"; + repo = "umbriel"; + # No tagged releases yet + rev = "8650637f6fdb3cb78022a4560f5f34861439dbad"; + fetchSubmodules = true; + hash = "sha256-WSTWPuF6KkSaO+zudERJCuga4BQzIH/RJdpvpkLVH4Q="; + }; + + nativeBuildInputs = [ + makeBinaryWrapper + meson + ninja + pkg-config + wayland-scanner + ]; + + buildInputs = [ + wayland + wayland-protocols + wayland-scanner + wlroots_0_20 + libxkbcommon + libinput + pixman + tomlplusplus + libGL + nlohmann_json + libdrm + libgbm + libxcb + libxcb-wm + lcms2 + jemalloc + cairo + pango + ]; + + mesonBuildType = "release"; + + mesonInstallFlags = [ "--skip-subprojects" ]; + + postInstall = '' + if [ -f "$out/share/wayland-sessions/umbriel.desktop" ]; then + substituteInPlace "$out/share/wayland-sessions/umbriel.desktop" \ + --replace-fail 'Exec=start-umbriel' "Exec=$out/bin/start-umbriel" + fi + wrapProgram $out/bin/umbriel \ + --prefix PATH : ${lib.makeBinPath [ xwayland-satellite ]} + ''; + + doCheck = true; + + # Set up to version check below, but currently it's untagged so the version doesn't match. + # On first release, set this to true make the version check run. + doInstallCheck = false; + + nativeInstallCheckInputs = [ + versionCheckHook + ]; + versionCheckProgramArg = "--version"; + + passthru = { + providedSessions = [ "umbriel" ]; + updateScript = unstableGitUpdater { }; + }; + + meta = { + description = "Wayland compositor built on wlroots and SceneFX"; + homepage = "https://docs.noctalia.dev/umbriel/"; + license = lib.licenses.mit; + platforms = lib.platforms.linux; + mainProgram = "umbriel"; + maintainers = with lib.maintainers; [ + pyrox0 + samiser + ]; + }; +} diff --git a/pkgs/by-name/xd/xdg-desktop-portal-umbriel/package.nix b/pkgs/by-name/xd/xdg-desktop-portal-umbriel/package.nix new file mode 100644 index 000000000000..a4b1fe2404a5 --- /dev/null +++ b/pkgs/by-name/xd/xdg-desktop-portal-umbriel/package.nix @@ -0,0 +1,72 @@ +{ + lib, + stdenv, + fetchFromGitHub, + meson, + ninja, + pkg-config, + wayland-scanner, + wayland, + wayland-protocols, + sdbus-cpp_2, + systemd, + pipewire, + libdrm, + libgbm, + cairo, + tomlplusplus, + nlohmann_json, + gtk4, + unstableGitUpdater, +}: +stdenv.mkDerivation { + pname = "xdg-desktop-portal-umbriel"; + version = "0-unstable-2026-08-23"; + + strictDeps = true; + __structuredAttrs = true; + + src = fetchFromGitHub { + owner = "noctalia-dev"; + repo = "xdg-desktop-portal-umbriel"; + # No tagged releases yet + rev = "c8a9a223d48e6c62652f3f3cfaaa0f50aca39146"; + hash = "sha256-jQFZRDnoaa0EvB9b55J1eYyfwCfD9LO2bwT1NVNbUME="; + }; + + nativeBuildInputs = [ + meson + ninja + pkg-config + wayland-scanner + ]; + + buildInputs = [ + wayland + wayland-protocols + sdbus-cpp_2 + systemd + pipewire + libdrm + libgbm + cairo + tomlplusplus + nlohmann_json + gtk4 + ]; + + mesonBuildType = "release"; + + passthru.updateScript = unstableGitUpdater { }; + + meta = { + homepage = "https://github.com/noctalia-dev/xdg-desktop-portal-umbriel"; + description = "xdg-desktop-portal backend for the Umbriel compositor"; + license = lib.licenses.mit; + platforms = lib.platforms.linux; + maintainers = with lib.maintainers; [ + pyrox0 + samiser + ]; + }; +}