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.

We're going to be installing a lot of things, many with dnf, some from git, and some using rpmfind.net to get srpms and building the rpm from srpms. I decided to add this section for the impatient who want to know everything that should be gotten first. Each item will be covered again in the appropriate section, but here's a concise summary of what we'll need. It doesn't cover what will be installed when you run dnf builddep on various srpm spec files. I more or less added them by section, trying to remove any dupes, but if some remain, please excuse me.

It's best to get these in order, for example, you will have to have installed git to use git clone.

To be installed with dnf

(or sudo dnf -y, if you prefer)

git repos to be cloned

(If you did a minimal install, you'll have to have installed git)

rpms from rpm find

(For these, you only need the rpms, they should install with a simple rpm -ivh. Get the ones for F42 if available, otherwise, get the ones from F43. If F43 ones aren't available either try F44, etc.)

srpms from rpmfind

(We'll use these to build rpms. See my page on building rpms for instructions. A quick summary is also put later in this article).

tarballs to be downloaded and built

Step by step guide

We're going to install labwc, an openbox like window manager. Then, sfwbar, a bar that is handy to use with labwc. Then, alacritty, a terminal emulator.

Next, we'll install swaybg which enables you to have a background image on your desktop, then, for those who like tiling window managers, dwl, a Wayland version of dwm, and lastly, dwlb, a bar that works with with dwl, and will be useful to anyone who uses dwm and expects dwm's builtin bar.

The reader can, of course, skip any of these that don't interest them.

Once the system is 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 usually
sudo /usr/bin/crb --enable

On a minimal install you might have to do
sudo dnf config-manager --set-enabled crb

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).

To get the rpmfusion repos you can find the command at rpmfusion's page. I'll put it here but if your browser breaks it so it's not usable, go to the rpmfusion config page and copy and paste it from there.
sudo dnf install --nogpgcheck https://mirrors.rpmfusion.org/free/el/rpmfusion-free-release-$(rpm -E %rhel).noarch.rpm
https://mirrors.rpmfusion.org/nonfree/el/rpmfusion-nonfree-release-$(rpm -E %rhel).noarch.rpm

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 done with an F42 rpm from rpmfind.net.

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 F42 wmenu rpm installs without having to build the srpm.

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.

We'll be using F42 rpms and srpms. At time of writing, July 2025, these were usually available on rpmfind, however rpmfind does sometimes drop older rpms as they become dated. If you can't find an F42, then just use the lowest number available.

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 42 from rpmfind.net. Before running dnf builddep, also get libmpdclient srpm. Lastly get the rpms--not the srpms, for fc42 gtk-layer-shell and gtk-layer-shell-devel.

Then, first install gtk3-devel Now you can just run rpm -ivh on gtk-layer-shell and gtk-layer-shell-devel from the fc42 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 sfwbar.

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; also I'm adding cargo here, which we'll need in the building)
sudo dnf -y install cmake freetype-devel fontconfig-devel libxcb-devel libxkbcommon-devel cargo
Most, if not all, of these are already installed.

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. Choose the FC42 rpm.

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
sudo 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 used. 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.