gluewc is a compact, animated Wayland compositor built around automatic BSP tiling. It combines a dwl-sized C codebase with workspaces, a GNOME-style overview, touchpad gestures, runtime configuration and SceneFX visuals.
It is a fork of dwl 0.8, using wlroots 0.20 and SceneFX 0.5.

The overview, then a cycle through the scroll and drift layouts.

Automatic BSP tiling. The bar is glueqs.

The overview: the workspace scaled down with its neighbours either side, and the shell's dash along the bottom.
There is a longer clip in docs/media/glue-demo.mp4; GitHub hands mp4 files over as downloads instead of playing them in the page.
One script covers all four cases. It detects the distribution, installs the
build dependencies and audio, builds a compatible wlroots/SceneFX pair when
the distribution does not package one, and installs the session entry. It asks
for administrator privileges for the packages and the system install, and it
never writes to ~/.config/gluewc/config.conf.
Just the compositor:
curl -fsSL https://raw.githubusercontent.com/vladbiber/gluewc/main/install.sh | sh
With the bar — glueqs, a quickshell
bar built for gluewc. Installs Quickshell from the distribution, or builds it
where there is no package (Chimera, Alpine, openSUSE), adds the tools its
panels use, clones the bar into ~/.config/quickshell/glueqs and starts it
from the session:
curl -fsSL https://raw.githubusercontent.com/vladbiber/gluewc/main/install.sh | sh -s -- --with-bar
Update an existing checkout — pulls the newest source, rebuilds, installs, and finishes by listing what the defaults gained that your own config does not have. Your config is left alone; you copy across whatever you want:
cd gluewc && ./install.sh --update # add --with-bar to update that too
./install.sh --check-config # only the list, no rebuild
By hand, to read the script first or to build without it:
git clone https://github.com/vladbiber/gluewc.git
cd gluewc
less install.sh
./install.sh # or: make && sudo make install
The dependency resolver covers current releases of:
| Family | Target |
|---|---|
| Arch | Arch Linux, EndeavourOS, Manjaro, CachyOS, Garuda, Artix, ArcoLinux |
| Debian | Debian 13+, Devuan |
| Ubuntu | Ubuntu 25.10+, Mint, Pop!_OS, elementary, Zorin, Kali, Raspberry Pi OS |
| Fedora | Fedora 43+, Nobara, RHEL, CentOS Stream, Rocky, AlmaLinux |
| SUSE | openSUSE Tumbleweed and Leap |
| Gentoo | Gentoo Linux |
| Alpine | Alpine Edge, postmarketOS |
| Chimera | Chimera Linux (clang, musl, dinit; doas is used when there is no sudo) |
| Void | Void Linux rolling |
| NixOS | through the flake in this repository, finix included |
A distribution outside the list still works: the installer falls back to
whichever package manager it finds on PATH and uses that family's package
set. Gentoo is hardware-tested and the Arch path is exercised by CI. The
remaining resolvers target their current package sets. Older distributions may
not have the Wayland, libdrm and Pixman versions required by wlroots 0.20; see
the installation guide for manual and troubleshooting
instructions.
Sound is set up along the way: PipeWire, WirePlumber and the ALSA and
PulseAudio bridges are installed and, where there are systemd user units,
enabled. Pass --no-audio to keep your own audio stack.
nix run github:vladbiber/gluewc # try it without installing
Permanently, add the flake as an input and enable the module, which registers the session and sets up PipeWire, the portals and Xwayland:
imports = [ inputs.gluewc.nixosModules.default ];
programs.gluewc.enable = true;
programs.gluewc.bar.enable = true; # the glueqs bar, with Quickshell from nixpkgs
git clone https://github.com/vladbiber/gluewc.git
cd gluewc
./install.sh --deps-only # or install the dependencies yourself
make
sudo make install
The installation guide covers PREFIX, DESTDIR,
config.h, building against a private wlroots and staying up to date.
After installation, log out and select gluewc in the display manager. From a TTY, run:
gluewc-session
The default bindings expect alacritty, rofi, grim and slurp for
screenshots, wl-clipboard to put one on the clipboard, playerctl for the
media keys, and for volume and backlight either wpctl/pactl and
brightnessctl/light. The installer brings them in; they stay optional and
every command can be replaced in the runtime config.
The session wrapper creates ~/.config/gluewc/config.conf on first login.
Saving it applies it: the file is watched and reloaded on the spot, and
anything the parser rejects raises a red strip across the top of the screen
and a notification naming the line. Super+Shift+R still reloads by hand.
| Binding | Action |
|---|---|
Super tap | Toggle overview |
Super+Return or Super+Q | Open terminal |
Super+Space | Open Rofi |
Super+1 … Super+9 | Change workspace |
Super+Ctrl+1 … Super+Ctrl+9 | Move window and follow |
Super+Arrow or Super+H/J/K/L | Directional focus |
Super+Shift+Arrow | Swap windows (nudge them in the drift layout) |
Super+N | Cycle BSP, scroll and drift layouts |
Super+Ctrl+Arrow | Move the window that way: swap with the neighbour, or on to the next workspace when there is none |
Super+Alt+Arrow | Pan the drift canvas |
Print / Shift+Print | Screenshot the screen / a selected area |
Ctrl+Print / Super+Shift+S | The same, onto the clipboard |
Super+drag | Swap the window with the tile it is dropped on |
Super+right-drag | Resize the window against its neighbours |
Super+Shift+drag | Drag the drift canvas around with the mouse |
Super+W, Super+±, Super+0 | Drift: fit, zoom, 1:1 |
Super+wheel / Super+Ctrl+wheel | Change workspace / take the window along |
Super+Shift+wheel | Zoom the drift camera |
Super+F | Workspace-area fullscreen |
Super+Shift+F | Real fullscreen |
Super+V | Toggle centered floating |
Super+C | Close window |
Super+O | Toggle configured transparency |
Super+Escape | Enter normal mode; I returns to insert mode |
Super+Shift+R | Reload config in place (it also reloads itself when saved) |
Super+M or Super+Shift+Q | Quit gluewc |
Media, volume and backlight sit on the function row, so they work on keyboards
without media keys or with them behind Fn. The media keys themselves keep
doing the same thing, and in normal mode the same keys need no Super.
| Binding | Action |
|---|---|
Super+F1 | Play / pause |
Super+F2 / Super+F3 | Previous / next track |
Super+Shift+F2 / Super+Shift+F3 | Seek 10s back / forward |
Super+F4 / Super+Shift+F4 | Mute output / microphone |
Super+F5 / Super+F6 | Volume down / up |
Super+F7 / Super+F8 | Backlight down / up |
Playback needs playerctl. Volume goes through wpctl (part of WirePlumber,
so it is there on any PipeWire system) and falls back to pactl; the backlight
goes through gluewc-backlight, which drives brightnessctl (or light) in
5% steps down to 10% and 1% steps below that, so it reaches 0 and turns the
panel off. Every one of these is a plain spawn: line in the config, so they
can be pointed at anything else.
In the overview, use arrows, workspace numbers, the mouse wheel or a two-finger
horizontal swipe to navigate. Click a window to focus it, or drag it onto the
left, center or right workspace. Every Super binding still works while it is
up — open a terminal, close a window, switch layouts — and the cards follow;
Super+1…9 and the workspace bindings move the overview instead of switching
underneath it. start_in_overview = true opens the session on it.
A three-finger horizontal swipe changes the
workspace from the desktop; a three-finger vertical swipe opens or closes the
overview. Super+wheel also changes workspace. In the drift layout three
fingers pan the canvas and a pinch zooms it, so four fingers take over
workspaces and the overview there.
gluewc deliberately does not bundle a bar, launcher or wallpaper daemon. Layer-shell clients reserve their own space, and wallpaper layers are included in the overview.
Examples for ~/.config/gluewc/config.conf:
autostart = swaybg -i ~/Pictures/wallpaper.jpg -m fill
autostart = waybar
With no wallpaper program, root_color = 000000 keeps the background black.
Waybar can use its dwl workspaces module; desktop shells can also consume the
foreign-toplevel protocol. For shells without a dwl-ipc module gluewc keeps
$XDG_STATE_HOME/gluewc/workspaces up to date (one line per output: name,
active, workspace, window counts, layout) and installs gluewc-msg, which
speaks the same protocol from the command line:
gluewc-msg status # one line per output
gluewc-msg outputs # geometry, modes, mirror of each monitor
gluewc-msg -o eDP-1 workspace 3 # view workspace 3 there
gluewc-msg move 2 # send the focused window to 2
gluewc-msg layout scroll
glueqs is a Quickshell desktop shell
written alongside gluewc: a dot-matrix bar with workspaces, tray, media,
network, weather and notifications, plus OSDs, a launcher, the wallpaper (it
paints it itself, with a picker on Super+W) and a dash that appears over the
overview. It is the shell in the video above. It runs on upstream Quickshell,
so it works with whatever quickshell your distribution packages.
It is entirely optional — gluewc runs with waybar, any other layer-shell bar, or none at all — but it is the combination the compositor is developed against:
autostart = qs -c glueqs
Manual build, once dependencies are installed:
make
sudo make install
Compiled defaults remain in config.def.h; normal users only need the runtime
config. Run man gluewc for command-line and environment details.
gluewc is GPL-3.0-or-later. It is derived from dwl, which grew from the wlroots
TinyWL example and carries code influenced by dwm and sway. See LICENSE* and
the Git history for the complete notices.
C
82.7%
Shell
11.0%
Nix
2.7%
Makefile
2.0%
Roff
1.6%
gluewc is a compact, animated Wayland compositor built around automatic BSP tiling. It combines a dwl-sized C codebase with workspaces, a GNOME-style overview, touchpad gestures, runtime configuration and SceneFX visuals.
It is a fork of dwl 0.8, using wlroots 0.20 and SceneFX 0.5.

The overview, then a cycle through the scroll and drift layouts.

Automatic BSP tiling. The bar is glueqs.

The overview: the workspace scaled down with its neighbours either side, and the shell's dash along the bottom.
There is a longer clip in docs/media/glue-demo.mp4; GitHub hands mp4 files over as downloads instead of playing them in the page.
One script covers all four cases. It detects the distribution, installs the
build dependencies and audio, builds a compatible wlroots/SceneFX pair when
the distribution does not package one, and installs the session entry. It asks
for administrator privileges for the packages and the system install, and it
never writes to ~/.config/gluewc/config.conf.
Just the compositor:
curl -fsSL https://raw.githubusercontent.com/vladbiber/gluewc/main/install.sh | sh
With the bar — glueqs, a quickshell
bar built for gluewc. Installs Quickshell from the distribution, or builds it
where there is no package (Chimera, Alpine, openSUSE), adds the tools its
panels use, clones the bar into ~/.config/quickshell/glueqs and starts it
from the session:
curl -fsSL https://raw.githubusercontent.com/vladbiber/gluewc/main/install.sh | sh -s -- --with-bar
Update an existing checkout — pulls the newest source, rebuilds, installs, and finishes by listing what the defaults gained that your own config does not have. Your config is left alone; you copy across whatever you want:
cd gluewc && ./install.sh --update # add --with-bar to update that too
./install.sh --check-config # only the list, no rebuild
By hand, to read the script first or to build without it:
git clone https://github.com/vladbiber/gluewc.git
cd gluewc
less install.sh
./install.sh # or: make && sudo make install
The dependency resolver covers current releases of:
| Family | Target |
|---|---|
| Arch | Arch Linux, EndeavourOS, Manjaro, CachyOS, Garuda, Artix, ArcoLinux |
| Debian | Debian 13+, Devuan |
| Ubuntu | Ubuntu 25.10+, Mint, Pop!_OS, elementary, Zorin, Kali, Raspberry Pi OS |
| Fedora | Fedora 43+, Nobara, RHEL, CentOS Stream, Rocky, AlmaLinux |
| SUSE | openSUSE Tumbleweed and Leap |
| Gentoo | Gentoo Linux |
| Alpine | Alpine Edge, postmarketOS |
| Chimera | Chimera Linux (clang, musl, dinit; doas is used when there is no sudo) |
| Void | Void Linux rolling |
| NixOS | through the flake in this repository, finix included |
A distribution outside the list still works: the installer falls back to
whichever package manager it finds on PATH and uses that family's package
set. Gentoo is hardware-tested and the Arch path is exercised by CI. The
remaining resolvers target their current package sets. Older distributions may
not have the Wayland, libdrm and Pixman versions required by wlroots 0.20; see
the installation guide for manual and troubleshooting
instructions.
Sound is set up along the way: PipeWire, WirePlumber and the ALSA and
PulseAudio bridges are installed and, where there are systemd user units,
enabled. Pass --no-audio to keep your own audio stack.
nix run github:vladbiber/gluewc # try it without installing
Permanently, add the flake as an input and enable the module, which registers the session and sets up PipeWire, the portals and Xwayland:
imports = [ inputs.gluewc.nixosModules.default ];
programs.gluewc.enable = true;
programs.gluewc.bar.enable = true; # the glueqs bar, with Quickshell from nixpkgs
git clone https://github.com/vladbiber/gluewc.git
cd gluewc
./install.sh --deps-only # or install the dependencies yourself
make
sudo make install
The installation guide covers PREFIX, DESTDIR,
config.h, building against a private wlroots and staying up to date.
After installation, log out and select gluewc in the display manager. From a TTY, run:
gluewc-session
The default bindings expect alacritty, rofi, grim and slurp for
screenshots, wl-clipboard to put one on the clipboard, playerctl for the
media keys, and for volume and backlight either wpctl/pactl and
brightnessctl/light. The installer brings them in; they stay optional and
every command can be replaced in the runtime config.
The session wrapper creates ~/.config/gluewc/config.conf on first login.
Saving it applies it: the file is watched and reloaded on the spot, and
anything the parser rejects raises a red strip across the top of the screen
and a notification naming the line. Super+Shift+R still reloads by hand.
| Binding | Action |
|---|---|
Super tap | Toggle overview |
Super+Return or Super+Q | Open terminal |
Super+Space | Open Rofi |
Super+1 … Super+9 | Change workspace |
Super+Ctrl+1 … Super+Ctrl+9 | Move window and follow |
Super+Arrow or Super+H/J/K/L | Directional focus |
Super+Shift+Arrow | Swap windows (nudge them in the drift layout) |
Super+N | Cycle BSP, scroll and drift layouts |
Super+Ctrl+Arrow | Move the window that way: swap with the neighbour, or on to the next workspace when there is none |
Super+Alt+Arrow | Pan the drift canvas |
Print / Shift+Print | Screenshot the screen / a selected area |
Ctrl+Print / Super+Shift+S | The same, onto the clipboard |
Super+drag | Swap the window with the tile it is dropped on |
Super+right-drag | Resize the window against its neighbours |
Super+Shift+drag | Drag the drift canvas around with the mouse |
Super+W, Super+±, Super+0 | Drift: fit, zoom, 1:1 |
Super+wheel / Super+Ctrl+wheel | Change workspace / take the window along |
Super+Shift+wheel | Zoom the drift camera |
Super+F | Workspace-area fullscreen |
Super+Shift+F | Real fullscreen |
Super+V | Toggle centered floating |
Super+C | Close window |
Super+O | Toggle configured transparency |
Super+Escape | Enter normal mode; I returns to insert mode |
Super+Shift+R | Reload config in place (it also reloads itself when saved) |
Super+M or Super+Shift+Q | Quit gluewc |
Media, volume and backlight sit on the function row, so they work on keyboards
without media keys or with them behind Fn. The media keys themselves keep
doing the same thing, and in normal mode the same keys need no Super.
| Binding | Action |
|---|---|
Super+F1 | Play / pause |
Super+F2 / Super+F3 | Previous / next track |
Super+Shift+F2 / Super+Shift+F3 | Seek 10s back / forward |
Super+F4 / Super+Shift+F4 | Mute output / microphone |
Super+F5 / Super+F6 | Volume down / up |
Super+F7 / Super+F8 | Backlight down / up |
Playback needs playerctl. Volume goes through wpctl (part of WirePlumber,
so it is there on any PipeWire system) and falls back to pactl; the backlight
goes through gluewc-backlight, which drives brightnessctl (or light) in
5% steps down to 10% and 1% steps below that, so it reaches 0 and turns the
panel off. Every one of these is a plain spawn: line in the config, so they
can be pointed at anything else.
In the overview, use arrows, workspace numbers, the mouse wheel or a two-finger
horizontal swipe to navigate. Click a window to focus it, or drag it onto the
left, center or right workspace. Every Super binding still works while it is
up — open a terminal, close a window, switch layouts — and the cards follow;
Super+1…9 and the workspace bindings move the overview instead of switching
underneath it. start_in_overview = true opens the session on it.
A three-finger horizontal swipe changes the
workspace from the desktop; a three-finger vertical swipe opens or closes the
overview. Super+wheel also changes workspace. In the drift layout three
fingers pan the canvas and a pinch zooms it, so four fingers take over
workspaces and the overview there.
gluewc deliberately does not bundle a bar, launcher or wallpaper daemon. Layer-shell clients reserve their own space, and wallpaper layers are included in the overview.
Examples for ~/.config/gluewc/config.conf:
autostart = swaybg -i ~/Pictures/wallpaper.jpg -m fill
autostart = waybar
With no wallpaper program, root_color = 000000 keeps the background black.
Waybar can use its dwl workspaces module; desktop shells can also consume the
foreign-toplevel protocol. For shells without a dwl-ipc module gluewc keeps
$XDG_STATE_HOME/gluewc/workspaces up to date (one line per output: name,
active, workspace, window counts, layout) and installs gluewc-msg, which
speaks the same protocol from the command line:
gluewc-msg status # one line per output
gluewc-msg outputs # geometry, modes, mirror of each monitor
gluewc-msg -o eDP-1 workspace 3 # view workspace 3 there
gluewc-msg move 2 # send the focused window to 2
gluewc-msg layout scroll
glueqs is a Quickshell desktop shell
written alongside gluewc: a dot-matrix bar with workspaces, tray, media,
network, weather and notifications, plus OSDs, a launcher, the wallpaper (it
paints it itself, with a picker on Super+W) and a dash that appears over the
overview. It is the shell in the video above. It runs on upstream Quickshell,
so it works with whatever quickshell your distribution packages.
It is entirely optional — gluewc runs with waybar, any other layer-shell bar, or none at all — but it is the combination the compositor is developed against:
autostart = qs -c glueqs
Manual build, once dependencies are installed:
make
sudo make install
Compiled defaults remain in config.def.h; normal users only need the runtime
config. Run man gluewc for command-line and environment details.
gluewc is GPL-3.0-or-later. It is derived from dwl, which grew from the wlroots
TinyWL example and carries code influenced by dwm and sway. See LICENSE* and
the Git history for the complete notices.
C
82.7%
Shell
11.0%
Nix
2.7%
Makefile
2.0%
Roff
1.6%