Window Managers for RHEL10 and Clones

RedHat recently (Spring 2025), released its RHEL10 release. I suspect I am not alone in wanting to use it, but not wanting a full blown desktop like Gnome or KDE. So this is for people who prefer smaller window managers.

I like to start with a minimal install. If one does this, even if you configured wireless during installation, upon reboot, there will be no wireless. The easiest way that I've found to fix this is to connect it by ethernet, and then install NetworkMananger-wifi. Actually, I've usually had to mount the install USB, and first add dhcpcd from BaseOS/pkgs, before I could even get the ethernet connection working. (Which means that I have to use the full install DVD rather than the boot only one). One can, I suppose, check off the "Standard" package group during install, after choosing minimal install, which would probably include the network tools, but I've gotten so used to doing it my way, that I've never tested it with the Standard group added.

Once installed and connected to the network, the next thing I like to do is install the epel repo, with sudo dnf -y install epel-release and then the rpmfusion repos. This will give me much of what I need to build the packages I want. Follow the instructions on rpmfusion to enable the crb repo. With a clone like Rocky or Alma it's just sudo /usr/bin/crb enable, if it's RedHat it's a little bit more involved.
sudo subscription-manager repos --enable "codeready-builder-for-rhel-$(rpm -E %{rhel})-$(uname -m)-rpms"

(If your browser broke that, it should be on one line).

So, first, we'll install some packages to make building our various packages easier. I would also suggest that someone wanting to build packages take a quick look at my rpm building page as we'll make use of getting some SRPMS to build a few additional packages.

sudo dnf -y install  gcc gcc-c++ make automake cmake kernel-devel tar bzip2 rpm-build rpmdevtools dnf-plugins-core git wget
To give a very quick review of building from an srpm, the usual steps are:

labwc

Let's first install labwc. Its current git won't build in RHEL10, I think it needs a newer version of wlroots, but at any rate, we're going to use version 0.8.4. It gives a list of needed dependencies on its main page. Look in the build and installation section. I install the devel version of what it asks for because this often keeps me from getting file not found messages. The names of the RH packages don't always exactly match, e.g., labwc's page asks for xkbcommon and the RH package is libxkbcommon. So for run dependencies
sudo dnf -y install wlroots-devel wayland-devel libinput-devel libxkbcommon-devel libxml2-devel cairo-devel pango-devel
glib2-devel libpng-devel librsvg2-devel

In case you may want to use some xorg apps, you can also install xorg-x11-server-Xwayland.
sudo dnf -y install xorg-x11-server-Xwayland 

Now the build deps.
sudo dnf -y install meson ninja-build wayland-protocols-devel

Now, get the 0.8.4 tarball linked above.
wget https://github.com/labwc/labwc/archive/refs/tags/0.8.4.tar.gz
tar xvzf 0.8.4.tar.gz
cd labwc-0.8.4
meson setup build/
meson compile -C build/
cp build/labwc $HOME/bin

This is assuming the reader uses $HOME/bin for local applications. $HOME/bin is in the default RH $PATH, though the directory does have to be manually created with mkdir ~/bin before being used.

If you're not familiar with labwc you can then go to its getting started page or my own wayland page which has some information.

In the docs directory there is a sample rc.xml as well as rc.xml.all, which the reader can adapt to their needs. I have a custom rc.xml that I've been using for a long time, and I put it in $HOME/.config/labwc/. (That directory will also have to be created by the reader.) Note that labwc's default terminal is foot. That can be installed from SRPMs, but I always use alacritty, which we'll cover below. I also like to install wmenu. This can be installed from an F40 rpm from rpmfind.net. Grab the rpm from rpmfind and install with sudo rpm -ivh. Note that with rpmfind.net, at the main page, you put the package you're seeking. Then it goes to a page where you can specify the system and the arch. Use Fedora for the system and x86_64 (assuming you're on an x86_64 machine) for the arch. This cuts down the list of available rpms to a more manageable number.

The Fedora F40 wmenu rpm installs without having to build the srpm. The rpmfind site has two fc40 wmenu rpms, use the one I linked, the 0.1.9-1. The other one, 0.1.7-1 doesn't include the needed wmenu-run.

I like to set it to open with a keyboard shortcut in ~/.config/labwc/rc.xml but that's beyond the scope of this article.

sfwbar

If using labwc most people want a bar. The sfwbar program can be installed with a little work.

First get the sfwbar srpm for Fedora 40 from rpmfind.net. Before running dnf builddep, also get libmpdclient srpm. Lastly get the rpms--not the srpms, for fc40 gtk-layer-shell and gtk-layer-shell-devel. ALso, install with dnf -y install gtk3-devel. Now you can just run rpm -ivh on gtk-layer-shell and gtk-layer-shell-devel from the fc40 rpm, no building of the srpm is needed.

Once you've installed the gtk-layer-shell and its devel rpm, build the libmpdclient from its srpm. When you've built it, you'll see that you have in rpmbbuild/RPMS/x86_64 a libmpdclient and libmpdclient-devel rpm. Install both of them. Now you can run dnf builddep on sfwwbar.

Once that's done, run rpmbuild -ba sfwbar.spec and an rpm will show up in RPMS/x86_64. That can be installed with rpm -ivh. Now, you can add sfwbar to your $HOME/.config/labwc/autostart and the bar will show whenever you start labwc. It has reasonable defaults, but can also be configured by copying /usr/share/sfwbar/sfwbar.config in .config/sfwbar (you'll have to create the $HOME/.config/sfwbar directory). In /usr/share/sfwbar there's also a t2config that is more similar to tint which can be used if the user prefers.

I prefer to start the bar with an entry in ~/.config/labwc/autostart. My autostart file just reads
swaybg -i ~/backgrounds/background.jpg
sfwbar 2>&1 &

(We'll be covering install swaybg later in this article.)

You can, if you prefer, start the sfwbar by running labwc -s sfwbar but it's probably more convenient to have it in the autostart file.

alacritty

I like the alacritty terminal. Again, we'll go to the github page, and this time, we should be able to use the most recent version, at least as of early June, 2025. For installation instructions, go to the install page. That has a link to needed dependencies, so we'll do that first. They suggest installing the Development Tools group, but I've not had to, as long as I install the *-devel versions of what they suggest. The most recent RH that they mention is RHEL8 and following their instructions, we install (some of these we already have, but it's easiest to just copy from their page and paste)
sudo dnf -y install cmake freetype-devel fontconfig-devel libxcb-devel libxkbcommon-devel
Most, if not all, of these are already installed. You'll also need to run sudo dnf -y install cargo.

Building should be simple, get the code, cd in, and run cargo.
git clone https://github.com/alacritty/alacritty.git
cd alacritty
cargo install alacritty

You should find a binary at $HOME/.cargo/bin/alacritty. One can put that in their path or copy it to $HOME/bin.

cp $HOME/.cargo/bin/alacritty $HOME/bin/

You probably want to configure alacritty. I have a page with information on doing so. There's information on their github site as well. The defaults are actually pretty reasonable.

swaybg

Swaybg will enable you to have a background image on your screen. It will have to be built from srpms. I get it from rpmfind.net. If available, choose the FC40 rpm, otherwise the FC41.

As mentioned, I go into building rpms on my rpmbuild page, so I'll just go over the basics here. Hopefully, you've run your rpmdev-setuptree command already. Put the SRPM in rpmbuild/SRPMS. Install it with rpm -ivh. (You get the srpm by clicking the link on the left, which opens a page giving a link to the srpm).

Once you've done that, cd ../SPECS and run sudo dnf -y builddep swaybg.spec, and assuming it's been able to download all deps, then run rpmbuild -ba swaybg.spec. When that finishes, you should have a swaybg rpm in the rpmbuild/RPMS/x86_64 directory which can be installed with sudo rpm ivh.

dwl

For those who like tiling window managers, dwl is very similar to the dwm window manager. Again, we'll get it directly from dwl's site but like labwc, we have to use a slightly older version, 0.7.

The main page, the first link above, lists dependencies. We've probably installed most of these already, but for the sake of completeness, let's include all of them. (And if you didn't want to use labwc many of these might not have gotten installed).
sudo dnf -y install libinput-devel wayland-devel wlroots-devel libxkbcommon-devel wayland-protocols-devel pkg-config

Now download the tarball, decompress it, and cd into the new directory.
wget https://codeberg.org/dwl/dwl/releases/download/v0.7/dwl-v0.7.tar.gz
tar xvf dwl-v0.7.tar.gz
cd dwl-v0.7

I'm assuming that someone installing this is familiar with dwl or dwm. It has fairly sane defaults, but one can customize it bye copying the config.def.h file to config.h and making changes there. The default terminal is foot, so one should at least create a config.h and change foot to alacritty. Even if one doesn't know C the file is pretty self-explanatory, and there are only slight differfences between its config.h and dwm's.

Once done, while in the dwl directory run
make
sudo make install

dwlb

The dwm window manager has a built in bar, but dwl doesn't. Someone else created the dwlb bar which does pretty much the same thing. For more information about using it, you can see my wayland page.

We can build the bar from its github page but we will need a few more packages.

We've installed all the dependencies mentioned, save one. In case you haven't, first run
sudo dnf -y install libwayland-client libwayland-cursor pixman-devel

We'll also need a few things from rpmfind. First, get the tllist-devel srpm. After running rpmbuild -ba on the spec file, install the tllist-devel rpm. You probably don't even need to run dnf builddep on the tlist spec file.

With that installed, get the fcft srpm, and build and install that. (The tllist-devel was needed for dnf builddep on fcft).

Also, install the fcft-devel rpm that will also have been created. Once this is done
git clone https://github.com/kolunmi/dwlb
cd dwlb
make
make install

Now you can start dwl with dwlb. They suggest a font size of 16, one can adjust to taste.
dwl -s 'dwlb -font "monospace:size=16"'

As mentioned on my wayland page, I get the date to show in the bar by, once dwl is running, I open wmenu and type
(while true; do date +"%R %F";sleep 60;done &)|dwlb -status-stdin all

Which will give me a date showing 24 hour time and a YYYY-MM-DD format.

If you do want to use foot as your terminal, I wasn't able to build it from srpms, but was able to install it from its codeberg page, using git to clone the source and then following the installation instructions. I already had all needed dependencies from the things we built above. However, as mentioned, I changed both labwc's and dwl's configs to use alacritty, rather than the window managers's defaults of foot.

Odds and ends

Although RHEL10 doesn't have firefox, it is in EPEL and can be installed that way. As of late June, 2025, it's version 128-ESR. Even with rpmfusion's ffmpeg and mpv installed, the EPEL firefox for RHEL10 had a bit of trouble on mp4 videos that were encoded with libx265. It's kind of an edge case, as libx265 is still far less commonly used than libx264. If one downloads the mp4 and tries to play it with mpv the video will play. The other solution is to get the firefox tarball from mozilla's site and download their version. It's a tarball that when decompressed has a firefox directory with a firefox binary in it. So the path, assuming you downloaded it to $HOME, would be $HOME/firefox/firefox.

This latest version has no trouble with libx265 encoded mp4 videos.

RHEL10 also doesn't include libreoffice. This can just be installed from libreoffice's site.

As of June, 2025, rpmfusion has packages for RHEL10. It's probably best to use it for multimedia rpms, but, you can build a per user ffmpeg by following the instructions at ffmpeg's trac site and then you should be able to play any media files you run into. This still won't work with x255.mp4 videos on firefox, but will work if you download the video and use mpv to play it..

On a different note, I had one system that had been running RHEL9, which I moved to RHEL10. Using leapp broke things so I reinstalled. (My fault, not leapp's as far as I can tell). This is a headless machine that just serves a small home website and also runs postfix, mostly for internal stuff. I found that both my old apache httpd.conf and postfix main.conf needed a few adjustments.

For apache, I had had a section DocumentRoot, that included
AllowOverride ALL
	Require all granted

This caused an error, preventing apache from running. On RHEL10, I had to put the AllowOveride and Require all lines inside <Directory> </Directory> tags. So I had my DocumentRoot stuff and then the Directory stuff.
DocumentRoot "/var/www/html"
<Directory "/var/www/html">
AllowOveride All
	Require all granted
</Directory>
</VirtualHost>

I use VirtualHosts as the reader can figure out from that snippet, even though I've only put the end part of the stanza.

With both apache and postfix, once I figured out the solution, I didn't look into when it changed, in both cases these are just little conveniences for me, so once it worked, I was happy.

With postfix it turned out that they've changed a database that use. I'd had alias_maps as hash:/etc/aliases and alias_database as dbm. Apparently this has changed and to make it work I had to change alias_database to lmdb and alias_maps to lmdb:/etc/aliases.

The apache issue was quickly solved by a web search and the postfix one by comparing the file I was using to the default, so neither was terribly hard to solve.


To give a very quick review, the usual steps are:

  • Run rpmdev-setuptree which creates a $HOME/rpmbuild directory with 3 subdiretories, SRPMS, SPECS, and RPMS.
  • Get the desired srpm file, put it in rpmbuild/SRPMS and install it with rpm -ivh <whatever.srpm>
  • Now cd to the rpmbuild/SPECS directory where you will now have a <whatever>.spec file. Run sudo dnf -y builddep <whatever>spec.
  • Once this is complete, now run rpmbuild -ba <whatever>.spec.
  • Assuming this completes without errors, cd to RPMS/x86_64. You should have a <whatever>.rpm and often a <whatever>-dev.rpm.
  • Install the newly created rpm and devel rpm if desired, with sudo rpm -ivh <whatever>.rpm (and sudo rpm -ivh <whatever>-devel.rpm if desired).

labwc

Let's first install labwc. Its current git won't build in RHEL10, I think it needs a newer version of wlroots, but at any rate, we're going to use version 0.8.4. It gives a list of needed dependencies on its main page. Look in the build and installation section. I install the devel version of what it asks for because this often keeps me from getting file not found messages. The names of the RH packages don't always exactly match, e.g., labwc's page asks for xkbcommon and the RH package is libxkbcommon. So for run dependencies
sudo dnf -y install wlroots-devel wayland-devel libinput-devel libxkbcommon-devel libxml2-devel cairo-devel pango-devel
glib2-devel libpng-devel librsvg2-devel

In case you may want to use some xorg apps, you can also install xorg-x11-server-Xwayland.
sudo dnf -y install xorg-x11-server-Xwayland 

Now the build deps.
sudo dnf -y install meson ninja-build wayland-protocols-devel

Now, get the 0.8.4 tarball linked above.
wget https://github.com/labwc/labwc/archive/refs/tags/0.8.4.tar.gz
tar xvzf 0.8.4.tar.gz
cd labwc-0.8.4
meson setup build/
meson compile -C build/
cp build/labwc $HOME/bin

This is assuming the reader uses $HOME/bin for local applications. $HOME/bin is in the default RH $PATH, though the directory does have to be manually created with mkdir ~/bin before being used.

If you're not familiar with labwc you can then go to its getting started page or my own wayland page which has some information.

In the docs directory there is a sample rc.xml as well as rc.xml.all, which the reader can adapt to their needs. I have a custom rc.xml that I've been using for a long time, and I put it in $HOME/.config/labwc/. (That directory will also have to be created by the reader.) Note that labwc's default terminal is foot. That can be installed from SRPMs, but I always use alacritty, which we'll cover below. I also like to install wmenu. This can be installed from an F40 rpm from rpmfind.net. Grab the rpm from rpmfind and install with sudo rpm -ivh. Note that with rpmfind.net, at the main page, you put the package you're seeking. Then it goes to a page where you can specify the system and the arch. Use Fedora for the system and x86_64 (assuming you're on an x86_64 machine) for the arch. This cuts down the list of available rpms to a more manageable number.

The Fedora F40 wmenu rpm installs without having to build the srpm. The rpmfind site has two fc40 wmenu rpms, use the one I linked, the 0.1.9-1. The other one, 0.1.7-1 doesn't include the needed wmenu-run.

I like to set it to open with a keyboard shortcut in ~/.config/labwc/rc.xml but that's beyond the scope of this article.

sfwbar

If using labwc most people want a bar. The sfwbar program can be installed with a little work.

First get the sfwbar srpm for Fedora 40 from rpmfind.net. Before running dnf builddep, also get libmpdclient srpm. Lastly get the rpms--not the srpms, for fc40 gtk-layer-shell and gtk-layer-shell-devel. ALso, install with dnf -y install gtk3-devel. Now you can just run rpm -ivh on gtk-layer-shell and gtk-layer-shell-devel from the fc40 rpm, no building of the srpm is needed.

Once you've installed the gtk-layer-shell and its devel rpm, build the libmpdclient from its srpm. When you've built it, you'll see that you have in rpmbbuild/RPMS/x86_64 a libmpdclient and libmpdclient-devel rpm. Install both of them. Now you can run dnf builddep on sfwwbar.

Once that's done, run rpmbuild -ba sfwbar.spec and an rpm will show up in RPMS/x86_64. That can be installed with rpm -ivh. Now, you can add sfwbar to your $HOME/.config/labwc/autostart and the bar will show whenever you start labwc. It has reasonable defaults, but can also be configured by copying /usr/share/sfwbar/sfwbar.config in .config/sfwbar (you'll have to create the $HOME/.config/sfwbar directory). In /usr/share/sfwbar there's also a t2config that is more similar to tint which can be used if the user prefers.

I prefer to start the bar with an entry in ~/.config/labwc/autostart. My autostart file just reads
swaybg -i ~/backgrounds/background.jpg
sfwbar 2>&1 &

(We'll be covering install swaybg later in this article.)

You can, if you prefer, start the sfwbar by running labwc -s sfwbar but it's probably more convenient to have it in the autostart file.

alacritty

I like the alacritty terminal. Again, we'll go to the github page, and this time, we should be able to use the most recent version, at least as of early June, 2025. For installation instructions, go to the install page. That has a link to needed dependencies, so we'll do that first. They suggest installing the Development Tools group, but I've not had to, as long as I install the *-devel versions of what they suggest. The most recent RH that they mention is RHEL8 and following their instructions, we install (some of these we already have, but it's easiest to just copy from their page and paste)
sudo dnf -y install cmake freetype-devel fontconfig-devel libxcb-devel libxkbcommon-devel
Most, if not all, of these are already installed. You'll also need to run sudo dnf -y install cargo.

Building should be simple, get the code, cd in, and run cargo.
git clone https://github.com/alacritty/alacritty.git
cd alacritty
cargo install alacritty

You should find a binary at $HOME/.cargo/bin/alacritty. One can put that in their path or copy it to $HOME/bin.

cp $HOME/.cargo/bin/alacritty $HOME/bin/

You probably want to configure alacritty. I have a page with information on doing so. There's information on their github site as well. The defaults are actually pretty reasonable.

swaybg

Swaybg will enable you to have a background image on your screen. It will have to be built from srpms. I get it from rpmfind.net. If available, choose the FC40 rpm, otherwise the FC41.

As mentioned, I go into building rpms on my rpmbuild page, so I'll just go over the basics here. Hopefully, you've run your rpmdev-setuptree command already. Put the SRPM in rpmbuild/SRPMS. Install it with rpm -ivh. (You get the srpm by clicking the link on the left, which opens a page giving a link to the srpm).

Once you've done that, cd ../SPECS and run sudo dnf -y builddep swaybg.spec, and assuming it's been able to download all deps, then run rpmbuild -ba swaybg.spec. When that finishes, you should have a swaybg rpm in the rpmbuild/RPMS/x86_64 directory which can be installed with sudo rpm ivh.

dwl

For those who like tiling window managers, dwl is very similar to the dwm window manager. Again, we'll get it directly from dwl's site but like labwc, we have to use a slightly older version, 0.7.

The main page, the first link above, lists dependencies. We've probably installed most of these already, but for the sake of completeness, let's include all of them. (And if you didn't want to use labwc many of these might not have gotten installed).
sudo dnf -y install libinput-devel wayland-devel wlroots-devel libxkbcommon-devel wayland-protocols-devel pkg-config

Now download the tarball, decompress it, and cd into the new directory.
wget https://codeberg.org/dwl/dwl/releases/download/v0.7/dwl-v0.7.tar.gz
tar xvf dwl-v0.7.tar.gz
cd dwl-v0.7

I'm assuming that someone installing this is familiar with dwl or dwm. It has fairly sane defaults, but one can customize it bye copying the config.def.h file to config.h and making changes there. The default terminal is foot, so one should at least create a config.h and change foot to alacritty. Even if one doesn't know C the file is pretty self-explanatory, and there are only slight differfences between its config.h and dwm's.

Once done, while in the dwl directory run
make
sudo make install

dwlb

The dwm window manager has a built in bar, but dwl doesn't. Someone else created the dwlb bar which does pretty much the same thing. For more information about using it, you can see my wayland page.

We can build the bar from its github page but we will need a few more packages.

We've installed all the dependencies mentioned, save one. In case you haven't, first run
sudo dnf -y install libwayland-client libwayland-cursor pixman-devel

We'll also need a few things from rpmfind. First, get the tllist-devel srpm. After running rpmbuild -ba on the spec file, install the tllist-devel rpm. You probably don't even need to run dnf builddep on the tlist spec file.

With that installed, get the fcft srpm, and build and install that. (The tllist-devel was needed for dnf builddep on fcft).

Also, install the fcft-devel rpm that will also have been created. Once this is done
git clone https://github.com/kolunmi/dwlb
cd dwlb
make
make install

Now you can start dwl with dwlb. They suggest a font size of 16, one can adjust to taste.
dwl -s 'dwlb -font "monospace:size=16"'

As mentioned on my wayland page, I get the date to show in the bar by, once dwl is running, I open wmenu and type
(while true; do date +"%R %F";sleep 60;done &)|dwlb -status-stdin all

Which will give me a date showing 24 hour time and a YYYY-MM-DD format.

If you do want to use foot as your terminal, I wasn't able to build it from srpms, but was able to install it from its codeberg page, using git to clone the source and then following the installation instructions. I already had all needed dependencies from the things we built above. However, as mentioned, I changed both labwc's and dwl's configs to use alacritty, rather than the window managers's defaults of foot.

Odds and ends

Although RHEL10 doesn't have firefox, it is in EPEL and can be installed that way. As of late June, 2025, it's version 128-ESR. Even with rpmfusion's ffmpeg and mpv installed, the EPEL firefox for RHEL10 had a bit of trouble on mp4 videos that were encoded with libx265. It's kind of an edge case, as libx265 is still far less commonly used than libx264. If one downloads the mp4 and tries to play it with mpv the video will play. The other solution is to get the firefox tarball from mozilla's site and download their version. It's a tarball that when decompressed has a firefox directory with a firefox binary in it. So the path, assuming you downloaded it to $HOME, would be $HOME/firefox/firefox.

This latest version has no trouble with libx265 encoded mp4 videos.

RHEL10 also doesn't include libreoffice. This can just be installed from libreoffice's site.

As of June, 2025, rpmfusion has packages for RHEL10. It's probably best to use it for multimedia rpms, but, you can build a per user ffmpeg by following the instructions at ffmpeg's trac site and then you should be able to play any media files you run into. This still won't work with x255.mp4 videos on firefox, but will work if you download the video and use mpv to play it..

On a different note, I had one system that had been running RHEL9, which I moved to RHEL10. Using leapp broke things so I reinstalled. (My fault, not leapp's as far as I can tell). This is a headless machine that just serves a small home website and also runs postfix, mostly for internal stuff. I found that both my old apache httpd.conf and postfix main.conf needed a few adjustments.

For apache, I had had a section DocumentRoot, that included
AllowOverride ALL
	Require all granted

This caused an error, preventing apache from running. On RHEL10, I had to put the AllowOveride and Require all lines inside <Directory> </Directory> tags. So I had my DocumentRoot stuff and then the Directory stuff.
DocumentRoot "/var/www/html"
<Directory "/var/www/html">
AllowOveride All
	Require all granted
</Directory>
</VirtualHost>

I use VirtualHosts as the reader can figure out from that snippet, even though I've only put the end part of the stanza.

With both apache and postfix, once I figured out the solution, I didn't look into when it changed, in both cases these are just little conveniences for me, so once it worked, I was happy.

With postfix it turned out that they've changed a database that use. I'd had alias_maps as hash:/etc/aliases and alias_database as dbm. Apparently this has changed and to make it work I had to change alias_database to lmdb and alias_maps to lmdb:/etc/aliases.

The apache issue was quickly solved by a web search and the postfix one by comparing the file I was using to the default, so neither was terribly hard to solve.