Jump to content

Hyprland: Difference between revisions

From Official NixOS Wiki
Normalcea (talk | contribs)
Troubleshooting: Add section for electron applications to use a wayland backend instead of x11.
Phobos (talk | contribs)
m Updates
 
(17 intermediate revisions by 8 users not shown)
Line 1: Line 1:
[https://hyprland.org/ Hyprland] is an independent, extensible, bleeding-edge [[Wayland]] compositor written in modern C++ with an emphasis on looks. In addition, Hyprland also offers a number of first-party tools as well as a custom plugin system. The most up-to-date and complete documentation can be found in the project's own [https://wiki.hyprland.org/ wiki].  
[https://hyprland.org/ Hyprland] is an independent, extensible, bleeding-edge [[Wayland]] compositor written in modern C++ with an emphasis on looks. In addition, Hyprland also offers a number of first-party tools as well as a custom plugin system. The most up-to-date and complete documentation may be found on the project's own [https://wiki.hyprland.org/ wiki].  


Some of the most notable features of Hyprland are:
Some of the most notable features of Hyprland are:
* '''Independent Wayland implementation''': does not rely on wlroots or other external libraries and provides in-house alternatives to common components (screen locking, idle daemon, etc).
* '''Independent Wayland implementation''': Does not rely on wlroots or other external libraries, and provides an in-house alternatives to common components (screen locking, idle daemon, etc).
* '''Easy to configure''': uses a live reloading config file in plain-text with useful defaults.
* '''Easy to configure''': Uses a live reloading config file in plain-text with useful defaults.
* '''Dynamic tiling support''': supports both automatic tiling and floating mode with multiple layouts.
* '''Dynamic tiling support''': Supports both automatic tiling and floating mode with multiple layouts.
* '''Socket-based IPC''': allows controlling the compositor at runtime via UNIX socket.
* '''Socket-based IPC''': Allows controlling the compositor at runtime via UNIX socket.
* '''Global shortcuts''': permits setting global keybinds for any application (for apps such as [[OBS Studio]]).
* '''Global shortcuts''': Permits setting global keybinds for any application (for apps such as [[OBS Studio]]).
* '''Window/Workspace Rules''': set special behaviors for certain windows and workspaces.
* '''Window/Workspace Rules''': Set special behaviors for certain windows and workspaces.


== Installation ==
== Installation ==
=== NixOS 24.11 and Onwards ===
NixOS 24.11 added support for launching Hyprland with [https://github.com/Vladimir-csp/uwsm Universal Wayland Session Manager] (UWSM) and is the recommended way to launch Hyprland as it neatly integrates with [[Systemd]]. [[UWSM|Options for configuring UWSM may be found here]]. Also see the Hyprland wiki [https://wiki.hypr.land/Useful-Utilities/Systemd-start/#uwsm page for UWSM here].
NixOS 24.11 added support for launching Hyprland with [https://github.com/Vladimir-csp/uwsm Universal Wayland Session Manager] and is the recommended way to launch Hyprland as it neatly integrates with [[Systemd]].


{{file|configuration.nix|nix|<nowiki>
{{file|||<nowiki>
{
{
   programs.hyprland = {
   programs.hyprland = {
Line 21: Line 20:
   };
   };
}
}
</nowiki>}}
</nowiki>|name=/etc/nixos/configuration.nix|lang=nix}}{{Warning|If you use the Home Manager module, make sure to disable systemd integration, as it conflicts with UWSM.
 
</br>
=== NixOS 24.05 and Below ===
{{File|3=wayland.windowManager.hyprland.systemd.enable = false;
 
|name=/etc/nixos/home.nix|lang=nix}}}}
{{file|configuration.nix|nix|<nowiki>
{
  programs.hyprland = {
    enable = true;
    xwayland.enable = true; # Xwayland can be disabled.
  };
}
</nowiki>}}


=== Nix on Non-NixOS Systems ===
=== Nix on Non-NixOS Systems ===
Line 59: Line 50:
* '''hyprlock''': Hyprland's GPU-accelerated screen locking utility.
* '''hyprlock''': Hyprland's GPU-accelerated screen locking utility.
* '''hypridle''': Hyprland's idle daemon.
* '''hypridle''': Hyprland's idle daemon.
* '''hyprpaper''': Hyprland's wallpaper utility.
* [[hyprpaper]]: Hyprland's wallpaper utility.
* '''hyprsunset''': Application to enable a blue-light filter on Hyprland.
* '''hyprsunset''': Application to enable a blue-light filter on Hyprland.
* '''hyprpicker''': Wayland color picker that does not suck.
* '''hyprpicker''': Wayland color picker that does not suck.
Line 102: Line 93:
If you experience performance drops in video games or graphics tools like Blender on stable NixOS, then it's likely a [[Mesa]] version mismatch with Hyprland and the rest of your system. This can be fixed by substituting the system's mesa package with Hyprland's own.
If you experience performance drops in video games or graphics tools like Blender on stable NixOS, then it's likely a [[Mesa]] version mismatch with Hyprland and the rest of your system. This can be fixed by substituting the system's mesa package with Hyprland's own.


{{file|configuration.nix|nix|<nowiki>
{{file|3=<nowiki>
{pkgs, inputs, ...}: let
{pkgs, inputs, ...}: let
   pkgs-unstable = inputs.hyprland.inputs.nixpkgs.legacyPackages.${pkgs.stdenv.hostPlatform.system};
   pkgs-unstable = inputs.hyprland.inputs.nixpkgs.legacyPackages.${pkgs.stdenv.hostPlatform.system};
in {
in {
   hardware.opengl = {
   hardware.graphics = {
     package = pkgs-unstable.mesa.drivers;
     package = pkgs-unstable.mesa;


     # if you also want 32-bit support (e.g for Steam)
     # if you also want 32-bit support (e.g for Steam)
     driSupport32Bit = true;
     enable32Bit = true;
     package32 = pkgs-unstable.pkgsi686Linux.mesa.drivers;
     package32 = pkgs-unstable.pkgsi686Linux.mesa;
   };
   };
}
}
</nowiki>}}
</nowiki>|name=configuration.nix|lang=nix}}


==== Cachix ====
==== Cachix ====
Line 127: Line 118:
}
}
</nowiki>}}
</nowiki>}}
=== Screensharing ===
{{file|configuration.nix|nix|<nowiki>
{
  xdg.portal = {
    enable = true;
    extraPortals = with pkgs; [ xdg-desktop-portal-hyprland ];
  };
}
</nowiki>}}


=== Display Manager Support ===
=== Display Manager Support ===
By default, Hyprland does not come with a [https://wiki.nixos.org/wiki/Wayland#Display_Managers display manager] and does not advertise support for one. Though one can start hyprland directly from tty with <code>Hyprland</code> or with <code>uwsm start select</code>, some display managers packaged in NixOS are compatible including but may not be limited to:
By default, Hyprland does not come with a [https://wiki.nixos.org/wiki/Wayland#Display_Managers display manager] and does not advertise support for one. Though one can start hyprland directly from tty with <code>Hyprland</code> or with <code>uwsm start select</code>, some display managers packaged in NixOS are compatible including but may not be limited to:
* SDDM
* [[SDDM]]
* GDM (works but crashes Hyprland on first launch)
* [[GDM]] (works but crashes Hyprland on first launch)
* greetd (especially with ReGreet)
* [[Greetd]] (especially with ReGreet)
* ly (not recommended but works)
* [[Ly]] (not recommended but works)


== Configuration ==
== Configuration ==
Line 139: Line 141:


=== Using [[Home Manager]] ===
=== Using [[Home Manager]] ===
Home Manager allows for declarative configuration of Hyprland using Nix syntax.
Home Manager allows for declarative configuration of Hyprland using Nix syntax. Entries with the same key should be written as lists. Variables’ and colors’ names should be quoted.
 
Find additional options under [https://home-manager.dev/manual/23.11/options.xhtml#opt-wayland.windowManager.hyprland.enable Home Manager - wayland.windowManager.hyprland]. Also, see the [https://wiki.hypr.land/Nix/Hyprland-on-Home-Manager/ Hyprland Page for Home Manager] for more examples.


{{file|/etc/nixos/home.nix or ~/.config/home-manager/home.nix|nix|<nowiki>
{{File|3=wayland.windowManager.hyprland = {
{
   systemd.enable = false;
   wayland.windowManager.hyprland.settings = {
  settings = {
     decoration = {
     decoration = {
       shadow_offset = "0 5";
       shadow_offset = "0 5";
Line 150: Line 154:


     "$mod" = "SUPER";
     "$mod" = "SUPER";
    bind = [
      # Execute Rofi with only the SUPER key
      "$mod, Super_L, exec, pkill rofi {{!}}{{!}} rofi -show drun"
      "$mod, F, exec, librewolf"
      "CONTROL ALT, T, exec, wezterm"
    ];
    # Startup Apps
    exec-once = [
      "hyprpanel"
    ];


     bindm = [
     bindm = [
Line 158: Line 176:
     ];
     ];
   };
   };
  # ...
};|name=/etc/nixos/home.nix|lang=nix}}
}
</nowiki>}}


== Plugin Support ==
== Plugin Support ==
Line 167: Line 183:
The [[Home Manager]] module for Hyprland should be used instead:
The [[Home Manager]] module for Hyprland should be used instead:


{{file|/etc/nixos/home.nix or ~/.config/home-manager/home.nix|nix|<nowiki>
{{File|3={
{
   wayland.windowManager.hyprland.plugins = [
   wayland.windowManager.hyprland.plugins = [
     pkgs.hyprlandPlugins.PLUGIN_NAME
     pkgs.hyprlandPlugins.PLUGIN_NAME
   ];
   ];
}
}|name=/etc/nixos/home.nix|lang=nix}}
</nowiki>}}


=== hyprland-plugins ===
[https://github.com/hyprwm/hyprland-plugins hyprland-plugins] is a repository of first-party plugins. If you wish to use these plugins it is recommended to use the Hyprland flake instead of the Nixpkgs version, and to use the [[Home Manager]] module for configuration.
[https://github.com/hyprwm/hyprland-plugins hyprland-plugins] is a repository of first-party plugins. If you wish to use these plugins then it's recommended to use the Hyprland flake instead of the Nixpkgs version as well as using the [[Home Manager]] module.


Add the flake to your flake inputs:
Add the flake into your flake inputs:
{{file|flake.nix|nix|<nowiki>
{{file|flake.nix|nix|<nowiki>
{
{
Line 194: Line 207:
</nowiki>}}
</nowiki>}}


And then add the plugin using the hyprland-plugins input:
Then, add the plugin using the hyprland-plugins input:


{{file|/etc/nixos/home.nix or ~/.config/home-manager/home.nix|nix|<nowiki>
{{file|/etc/nixos/home.nix or ~/.config/home-manager/home.nix|nix|<nowiki>
Line 209: Line 222:


[https://github.com/hyprland-community/awesome-hyprland#plugins List of plugins]
[https://github.com/hyprland-community/awesome-hyprland#plugins List of plugins]
== Troubleshooting ==
== Troubleshooting ==
=== Swaylock ===
=== Swaylock ===
Line 226: Line 236:
}
}
</nowiki>}}
</nowiki>}}
=== Theme Support ===
To make themes consistent in Hyprland, you can either use Home Manager like this:
{{file|/etc/nixos/home.nix or ~/.config/home-manager/home.nix|nix|<nowiki>
{
  home.pointerCursor = {
    gtk.enable = true;
    # x11.enable = true;
    package = pkgs.bibata-cursors;
    name = "Bibata-Modern-Classic";
    size = 16;
  };
  gtk = {
    enable = true;
    theme = {
      package = pkgs.flat-remix-gtk;
      name = "Flat-Remix-GTK-Grey-Darkest";
    };
    iconTheme = {
      package = pkgs.adwaita-icon-theme;
      name = "Adwaita";
    };
    font = {
      name = "Sans";
      size = 11;
    };
  };
}
</nowiki>}}
or set themes using dconf in your Hyprland configuration file:
{{file|hyprland.conf|conf|<nowiki>
exec-once = dconf write /org/gnome/desktop/interface/gtk-theme "'Adwaita'"
exec-once = dconf write /org/gnome/desktop/interface/icon-theme "'Flat-Remix-Red-Dark'"
exec-once = dconf write /org/gnome/desktop/interface/document-font-name "'Noto Sans Medium 11'"
exec-once = dconf write /org/gnome/desktop/interface/font-name "'Noto Sans Medium 11'"
exec-once = dconf write /org/gnome/desktop/interface/monospace-font-name "'Noto Sans Mono Medium 11'"
</nowiki>}}You may also install graphical tools such as gnome tweaks or nwg-look to set the themes manually.


== See also ==
== See also ==

Latest revision as of 04:23, 13 December 2025

Hyprland is an independent, extensible, bleeding-edge Wayland compositor written in modern C++ with an emphasis on looks. In addition, Hyprland also offers a number of first-party tools as well as a custom plugin system. The most up-to-date and complete documentation may be found on the project's own wiki.

Some of the most notable features of Hyprland are:

  • Independent Wayland implementation: Does not rely on wlroots or other external libraries, and provides an in-house alternatives to common components (screen locking, idle daemon, etc).
  • Easy to configure: Uses a live reloading config file in plain-text with useful defaults.
  • Dynamic tiling support: Supports both automatic tiling and floating mode with multiple layouts.
  • Socket-based IPC: Allows controlling the compositor at runtime via UNIX socket.
  • Global shortcuts: Permits setting global keybinds for any application (for apps such as OBS Studio).
  • Window/Workspace Rules: Set special behaviors for certain windows and workspaces.

Installation

NixOS 24.11 added support for launching Hyprland with Universal Wayland Session Manager (UWSM) and is the recommended way to launch Hyprland as it neatly integrates with Systemd. Options for configuring UWSM may be found here. Also see the Hyprland wiki page for UWSM here.

❄︎ /etc/nixos/configuration.nix
{
  programs.hyprland = {
    enable = true;
    withUWSM = true; # recommended for most users
    xwayland.enable = true; # Xwayland can be disabled.
  };
}
⚠︎
Warning: If you use the Home Manager module, make sure to disable systemd integration, as it conflicts with UWSM.


❄︎ /etc/nixos/home.nix
wayland.windowManager.hyprland.systemd.enable = false;

Nix on Non-NixOS Systems

If you use the Nix package manager on-top of a non-NixOS distribution then Hyprland can still be installed (albeit with less support than the NixOS module).

Firstly, enable flakes in your Nix installation. Then install Hyprland through nix profile:

nix profile install nixpkgs#hyprland

In order for Hyprland to find graphics drivers on a non-NixOS system, you will need to install nixGL:

nix profile install github:guibou/nixGL --impure

Now you can run Hyprland by invoking it with NixGL:

nixGL Hyprland

Hypr Ecosystem

You may also be interested in the Hypr project's collection of tools:

  • hyprlock: Hyprland's GPU-accelerated screen locking utility.
  • hypridle: Hyprland's idle daemon.
  • hyprpaper: Hyprland's wallpaper utility.
  • hyprsunset: Application to enable a blue-light filter on Hyprland.
  • hyprpicker: Wayland color picker that does not suck.
  • hyprpolkitagent: Polkit authentication agent written in QT/QML.

All official Hypr* programs are listed in the project's wiki page along with documentation.

Hyprland Flake

⚠︎
Warning: Installing Hyprland through a Nix flake will require the system to recompile Hyprland and all of its dependencies each time it updates. To avoid this, setup Hyprland's Cachix settings before adding Hyprland as a flake input.

If you wish to run a development version of Hyprland, you can easily do so by adding its flake to your flake inputs as demonstrated below:

❄︎ flake.nix
{
  inputs.hyprland.url = "github:hyprwm/Hyprland";
  # ...

  outputs = {nixpkgs, ...} @ inputs: {
    nixosConfigurations.YOUR_HOSTNAME = nixpkgs.lib.nixosSystem {
      specialArgs = { inherit inputs; }; # this is the important part
      modules = [
        ./configuration.nix
        # ...
      ];
    };
  };
}
❄︎ configuration.nix
{inputs, pkgs, ...}: {
  programs.hyprland = {
    enable = true;
    # set the flake package
    package = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.hyprland;
    # make sure to also set the portal package, so that they are in sync
    portalPackage = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.xdg-desktop-portal-hyprland;
  };
}

If you experience performance drops in video games or graphics tools like Blender on stable NixOS, then it's likely a Mesa version mismatch with Hyprland and the rest of your system. This can be fixed by substituting the system's mesa package with Hyprland's own.

❄︎ configuration.nix
{pkgs, inputs, ...}: let
  pkgs-unstable = inputs.hyprland.inputs.nixpkgs.legacyPackages.${pkgs.stdenv.hostPlatform.system};
in {
  hardware.graphics = {
    package = pkgs-unstable.mesa;

    # if you also want 32-bit support (e.g for Steam)
    enable32Bit = true;
    package32 = pkgs-unstable.pkgsi686Linux.mesa;
  };
}

Cachix

If you use the Hyprland flake, you'll have to rebuild Hyprland as well as any of its dependencies (mesa, ffmpeg, etc). To avoid this, use the Cachix cache provided by Hyprland to supplement any dependency not supplied by Hydra. Note that the setting has to be enabled before using the Hyprland flake package (meaning you should rebuild at least once before adding the flake input).

❄︎ configuration.nix
{
  nix.settings = {
    substituters = ["https://hyprland.cachix.org"];
    trusted-public-keys = ["hyprland.cachix.org-1:a7pgxzMz7+chwVL3/pzj6jIBMioiJM7ypFP8PwtkuGc="];
  };
}

Screensharing

❄︎ configuration.nix
{
  xdg.portal = {
    enable = true;
    extraPortals = with pkgs; [ xdg-desktop-portal-hyprland ];
  };
}


Display Manager Support

By default, Hyprland does not come with a display manager and does not advertise support for one. Though one can start hyprland directly from tty with Hyprland or with uwsm start select, some display managers packaged in NixOS are compatible including but may not be limited to:

  • SDDM
  • GDM (works but crashes Hyprland on first launch)
  • Greetd (especially with ReGreet)
  • Ly (not recommended but works)

Configuration

On first run, Hyprland will create a configuration file with autogenerated defauts in $XDG_CONFIG_HOME/hypr/hyprland.conf if it does not exist. An example configuration can be found in the project's git repository.

Home Manager allows for declarative configuration of Hyprland using Nix syntax. Entries with the same key should be written as lists. Variables’ and colors’ names should be quoted.

Find additional options under Home Manager - wayland.windowManager.hyprland. Also, see the Hyprland Page for Home Manager for more examples.

❄︎ /etc/nixos/home.nix
wayland.windowManager.hyprland = {
  systemd.enable = false;
  settings = {
    decoration = {
      shadow_offset = "0 5";
      "col.shadow" = "rgba(00000099)";
    };

    "$mod" = "SUPER";

    bind = [
      # Execute Rofi with only the SUPER key
      "$mod, Super_L, exec, pkill rofi || rofi -show drun"

      "$mod, F, exec, librewolf"

      "CONTROL ALT, T, exec, wezterm"
    ];

    # Startup Apps
    exec-once = [
      "hyprpanel"
    ];

    bindm = [
      # mouse movements
      "$mod, mouse:272, movewindow"
      "$mod, mouse:273, resizewindow"
      "$mod ALT, mouse:272, resizewindow"
    ];
  };
};

Plugin Support

Hyprland boasts a growing plugin ecosystem that extends the functionality of the compositor such as adding support for window decorations or a GNOME-like workspaces design. However, hyprpm is unsupported on NixOS due to the way Hyprland is built.

The Home Manager module for Hyprland should be used instead:

❄︎ /etc/nixos/home.nix
{
  wayland.windowManager.hyprland.plugins = [
    pkgs.hyprlandPlugins.PLUGIN_NAME
  ];
}

hyprland-plugins is a repository of first-party plugins. If you wish to use these plugins it is recommended to use the Hyprland flake instead of the Nixpkgs version, and to use the Home Manager module for configuration.

Add the flake into your flake inputs:

❄︎ flake.nix
{
  inputs = {
    hyprland.url = "github:hyprwm/Hyprland";

    hyprland-plugins = {
      url = "github:hyprwm/hyprland-plugins";
      inputs.hyprland.follows = "hyprland"; # Prevents version mismatch.
    };

    # ...
  }
}

Then, add the plugin using the hyprland-plugins input:

❄︎ /etc/nixos/home.nix or ~/.config/home-manager/home.nix
{inputs, pkgs, ...}: {
  wayland.windowManager.hyprland = {
    enable = true;

    plugins = [
      inputs.hyprland-plugins.packages.${pkgs.stdenv.hostPlatform.system}.PLUGIN_NAME
    ];
  };
}

List of plugins

Troubleshooting

Swaylock

If swaylock cannot be unlocked with the correct password: security.pam.services.swaylock = {};

Electron applications defaulting to X11 rather than Wayland

Set the environment variable NIXOS_OZONE_WL to "1" in your NixOS configuration:

❄︎ configuration.nix
{
  environment.sessionVariables.NIXOS_OZONE_WL = "1";
}

Theme Support

To make themes consistent in Hyprland, you can either use Home Manager like this:

❄︎ /etc/nixos/home.nix or ~/.config/home-manager/home.nix
{
  home.pointerCursor = {
    gtk.enable = true;
    # x11.enable = true;
    package = pkgs.bibata-cursors;
    name = "Bibata-Modern-Classic";
    size = 16;
  };

  gtk = {
    enable = true;

    theme = {
      package = pkgs.flat-remix-gtk;
      name = "Flat-Remix-GTK-Grey-Darkest";
    };

    iconTheme = {
      package = pkgs.adwaita-icon-theme;
      name = "Adwaita";
    };

    font = {
      name = "Sans";
      size = 11;
    };
  };
}

or set themes using dconf in your Hyprland configuration file:

≡︎ hyprland.conf
exec-once = dconf write /org/gnome/desktop/interface/gtk-theme "'Adwaita'"
exec-once = dconf write /org/gnome/desktop/interface/icon-theme "'Flat-Remix-Red-Dark'"
exec-once = dconf write /org/gnome/desktop/interface/document-font-name "'Noto Sans Medium 11'"
exec-once = dconf write /org/gnome/desktop/interface/font-name "'Noto Sans Medium 11'"
exec-once = dconf write /org/gnome/desktop/interface/monospace-font-name "'Noto Sans Mono Medium 11'"

You may also install graphical tools such as gnome tweaks or nwg-look to set the themes manually.

See also