/nixpkgs-wayland

Automated, pre-built packages for Wayland (sway/wlroots) tools for NixOS. [maintainer=@colemickens]

Primary LanguageNix

nixpkgs-wayland

Build Update       Gitpod ready-to-code       Experimental EGLStreams Build

overview

Automated, pre-built packages for Wayland (sway/wlroots) tools for NixOS (nixos-unstable channel).

Community chat is on Matrix: #nixpkgs-wayland:matrix.org. We are not on Libera.

Usage

Binary Cache

The Cachix landing page for nixpkgs-wayland shows how to utilize the binary cache.

Packages from this overlay are regularly built against nixos-unstable and pushed to this cache.

Flake Usage

  • Build and run the Wayland-fixed up version of OBS-Studio:
    nix shell "github:nix-community/nixpkgs-wayland#obs-studio" --command obs
    
  • Build and run waybar:
    nix run "github:nix-community/nixpkgs-wayland#waybar"
    
  • Use as an overlay or package set via flakes:

    {
      # ...
      inputs = {
        # ...
        nixpkgs-wayland  = { url = "github:nix-community/nixpkgs-wayland"; };
    
        # only needed if you use as a package set:
        nixpkgs-wayland.inputs.nixpkgs.follows = "cmpkgs";
        nixpkgs-wayland.inputs.master.follows = "master";
      };
    
      outputs = inputs: {
        nixosConfigurations."my-laptop-hostname" =
        let system = "x86_64-linux";
        in nixpkgs.lib.nixosSystem {
          inherit system;
          modules = [({pkgs, config, ... }: {
            config = {
              nix = {
                # add binary caches
                binaryCachePublicKeys = [
                  "cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY="
                  "nixpkgs-wayland.cachix.org-1:3lwxaILxMRkVhehr5StQprHdEo4IrE8sRho9R9HOLYA="
                  # ...
                ];
                binaryCaches = [
                  "https://cache.nixos.org"
                  "https://nixpkgs-wayland.cachix.org"
                  # ...
                ];
              };
    
              # use it as an overlay
              nixpkgs.overlays = [ inputs.nixpkgs-wayland.overlay ];
    
              # pull specific packages (built against inputs.nixpkgs, usually `nixos-unstable`)
              environment.systemPackages = with pkgs; [
                inputs.nixpkgs-wayland.packages.${system}.waybar
              ];
            };
          })];
        };
      };
    }

Install for NixOS (non-flakes, manual import)

If you are not using Flakes, then consult the NixOS Wiki page on Overlays. Also, you can expand this section for a more literal, direct example. If you do pin, use a tool like niv to do the pinning so that you don't forget and wind up stuck on an old version.

{ config, lib, pkgs, ... }:
let
  rev = "master"; # 'rev' could be a git rev, to pin the overlay.
  url = "https://github.com/nix-community/nixpkgs-wayland/archive/${rev}.tar.gz";
  waylandOverlay = (import "${builtins.fetchTarball url}/overlay.nix");
in
  {
    nixpkgs.overlays = [ waylandOverlay ];
    environment.systemPackages = with pkgs; [ wayvnc ];
    # ...
  }

You could write that to a file ./wayland.nix next to your configuration.nix and then use it like so:

{ config, lib, pkgs, ... }:
  {
    # ...
    imports = [
      # ...
      ./wayland.nix
    ];
  }

Install for non-NixOS users

Non-NixOS users have many options, but here are two explicitly:

  1. Activate flakes mode, then just run them outright like the first example in this README.

  2. See the following details block for an example of how to add nixpkgs-wayland as a user-level overlay and then install a package with nix-env.

  1. There are two ways to activate an overlay for just your user:

    1. Add a new entry in ``~/.config/nixpkgs/overlays.nix`:
    let
      url = "https://github.com/nix-community/nixpkgs-wayland/archive/master.tar.gz";
    in
    [
      (import "${builtins.fetchTarball url}/overlay.nix")
    ]
    1. Add a new file under a dir, ~/.config/nixpkgs/overlays/nixpkgs-wayland.nix:
    let
      url = "https://github.com/nix-community/nixpkgs-wayland/archive/master.tar.gz";
    in
      (import "${builtins.fetchTarball url}/overlay.nix")

Note, this method does not pin nixpkgs-wayland. That's left to the reader. (Just use flakes...)

  1. Then, nix-env will have access to the packages:
nix-env -iA neatvnc

Packages

These packages were mostly recently built (and cached) against:

Package Description
aml liberally licensed VNC server library that's intended to be fast and neat
cage A Wayland kiosk
clipman A basic clipboard manager for Wayland, with support for persisting copy buffers after an application exits
drm_info Small utility to dump info about DRM devices.
dunst Lightweight and customizable notification daemon
gebaar-libinput Gebaar, A Super Simple WM Independent Touchpad Gesture Daemon for libinput
glpaper GLPaper is a wallpaper program for wlroots based wayland compositors such as sway that allows you to render glsl shaders as your wallpaper
grim Grab images from a Wayland compositor
gtk-layer-shell A library to create panels and other desktop components for Wayland using the Layer Shell protocol
i3status-rust Very resource-friendly and feature-rich replacement for i3status
imv A command line image viewer for tiling window managers
kanshi Dynamic display configuration
lavalauncher A simple launcher for Wayland.
libvncserver_master VNC server library
mako A lightweight Wayland notification daemon
neatvnc liberally licensed VNC server library that's intended to be fast and neat
nwg-launchers GTK-based launchers: application grid, button bar, dmenu for sway and other window managers
nwg-panel GTK3-based panel for Sway window manager
obs-studio Free and open source software for video recording and live streaming
obs-wlrobs wlrobs is an obs-studio plugin that allows you to screen capture on wlroots based wayland compositors
oguri A very nice animated wallpaper tool for Wayland compositors
rootbar Root Bar is a bar for wlroots based wayland compositors such as sway and was designed to address the lack of good bars for wayland
sirula Sirula (simple rust launcher) is an app launcher for wayland
slurp Select a region in a Wayland compositor
swaybg Wallpaper tool for Wayland compositors
swayidle Sway's idle management daemon
swaylock Screen locker for Wayland
sway-unwrapped An i3-compatible tiling Wayland compositor
waybar Highly customizable Wayland bar for Sway and Wlroots based compositors
wayfire 3D wayland compositor
wayland-protocols-master Wayland protocol extensions
waypipe Network transparency with Wayland
wayvnc A VNC server for wlroots based Wayland compositors
wdisplays GUI display configurator for wlroots compositors
wev A tool for debugging events on a Wayland window, analagous to the X11 tool xev.
wf-recorder Utility program for screen recording of wlroots-based compositors
wlay Graphical output management for Wayland
wldash Wayland launcher/dashboard
wlfreerdp A Remote Desktop Protocol Client
wlogout A wayland based logout menu
wlroots A modular Wayland compositor library
wlr-randr An xrandr clone for wlroots compositors
wlsunset Day/night gamma adjustments for Wayland
wlvncc A Wayland Native VNC Client
wl-clipboard Select a region in a Wayland compositor
wl-gammactl Small GTK GUI application to set contrast, brightness and gamma for wayland compositors which support the wlr-gamma-control protocol extension.
wofi Wofi is a launcher/menu program for wlroots based wayland compositors such as sway
wshowkeys Displays keypresses on screen on supported Wayland compositors
wtype xdotool type for wayland
xdg-desktop-portal-wlr xdg-desktop-portal backend for wlroots

Tips

General

  • I recommend using home-manager!
  • It has modules and options for:
    • sway
    • waybar
    • obs and plugins!
    • more!

sway

  • You will likely want a default config file to place at $HOME/.config/sway/config. You can use the upstream default as a starting point: https://github.com/swaywm/sway/blob/master/config.in
  • If you start sway from a raw TTY, make sure you use exec sway so that if sway crashes, an unlocked TTY is not exposed.

NVIDIA Users

Nvidia users may wish to use outputs.overlay-egl instead of outputs.ovelay to get tools that are built against wlroots-eglstream. This enables Sway on, for example, an RTX 3080.

Non-flakes users will need to update their import statement, so that it looks more like this:

let
  rev = "master";
  url = "https://github.com/nix-community/nixpkgs-wayland/archive/${rev}.tar.gz";
  waylandOverlay = (import "${builtins.fetchTarball url}/overlay.nix");
  waylandOverlayEgl = (import "${builtins.fetchTarball url}/overlay-egl.nix");
in
  {
    nixpkgs.overlays = [ waylandOverlayEgl ];
    environment.systemPackages = with pkgs; [ wayvnc ];
    # ...
  }

Development Guide

  • Use direnv + nix-direnv (or if you can't, nix develop, (or if you can't, nix-shell)).
  • ./update.sh:
    • updates flake inputs
    • updates pkgs/<pkg>/metadata.nix with the latest commit+hash for each package
    • calls nix-build-uncached ... packages.nix to build uncached packages (see: nix-build-uncached)
    • pushes to "nixpkgs-wayland" on cachix

If for some reason the overlay isn't progressing and you want to help, just clone the repo, run nix-shell --command ./update.sh and start fixing issues in the package definitions. Sometimes you might need to edit default.nix to change the version of wlroots a certain package uses.

GitPod

This project can be opened and contributed to, within minutes, by using GitPod:

https://gitpod.io#https://github.com/nix-community/nixpkgs-wayland

(Note the Nix sandbox is disabled in GitPod. Some users choose not to push artifacts from this environment to production caches.)