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.
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.
We have multiple CI jobs:
- Update - this tries to advance nixpkgs and upgrade all packages. If it can successfully build them, the updates are push to master.
- Advance - this tries to advance nixpkgs without touching the packages. This can help show when nixpkgs upgrades via
nixos-unstable
has advanced into a state where we are broken building against it. - Build - this just proves that
master
was working againstnixos-unstable
at the point in time captured by whatever is inflake.lock
onmaster
.
We don't have CI on Pull Requests, but I keep an eye on it after merging external contributions.
- 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 ]; }; })]; }; }; }
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
];
}
Non-NixOS users have many options, but here are two explicitly:
-
Activate flakes mode, then just run them outright like the first example in this README.
-
See the following details block for an example of how to add
nixpkgs-wayland
as a user-level overlay and then install a package withnix-env
.
-
There are two ways to activate an overlay for just your user:
- 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") ]
- 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...)
- Then,
nix-env
will have access to the packages:
nix-env -iA neatvnc
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 that runs a single, maximized application |
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 |
foot | A fast, lightweight and minimalistic Wayland terminal emulator |
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 |
- I recommend using
home-manager
! - It has modules and options for:
sway
waybar
obs
and plugins!- more!
- 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 useexec sway
so that if sway crashes, an unlocked TTY is not exposed.
- Everything should just work now (aka, wlroots/sway don't need patching).
- This is a known-good working config, at least at one point in time: mixins/nvidia.nix@ccd992
- 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.
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.)