#wm #x11 #terminal

bin+lib umberwm

minimalist X11 window manager

33 releases

0.0.34 Feb 28, 2022
0.0.33 Nov 22, 2021
0.0.31 Aug 22, 2021
0.0.28 Jul 30, 2021
0.0.13 Jul 31, 2020

#242 in GUI

Download history 17/week @ 2023-02-02 61/week @ 2023-02-09 176/week @ 2023-02-16 6/week @ 2023-02-23 6/week @ 2023-03-02 11/week @ 2023-03-09 6/week @ 2023-03-16 5/week @ 2023-03-23 7/week @ 2023-03-30 44/week @ 2023-04-06 3/week @ 2023-04-13 35/week @ 2023-04-20 11/week @ 2023-04-27 69/week @ 2023-05-04 9/week @ 2023-05-11 5/week @ 2023-05-18

95 downloads per month
Used in 2 crates

MIT license

1.5K SLoC

Rust 1.5K SLoC // 0.0% comments Rusty Object Notation 117 SLoC Shell 51 SLoC Python 30 SLoC // 0.1% comments

umberwm 🐏


Minimalistic X window manager based on tinywm, inspired by qtile.

UmberWM Screenshot

Video introduction on LBRY or on youtube.

Tutorial and demo with x11docker

  1. install x11docker
  2. clone this repo
  3. cd umbertutor
  4. make

Design goals and features

  • Kiss: only window management (no taskbar, system tray, ...), complex stuff should be done using other programs (rofi, ...)
  • Configuration can be as code (like qtile, dwm, xmonad), as RON, or both.
  • Tiled by default (Binary space partitioning)
  • Supports workspaces
  • Supports multiple displays


You will need XCB bindings with the randr extension.

Ubuntu: sudo apt install libxcb-randr0-dev.

Using it (binary)

  1. Install rust and cargo
  2. cargo install umberwm
  3. run it once umberwm
  4. it will generate ~/.config/umberwm.ron(using RON file format)
  5. modify umberwm.ron as you see fit (more details on each field in src/main.rs)
  6. next time you run umberwm, it will take into account your configuration

Using it by modifying the source code

UmberWM is used/configured in rust, here is how to use it:

  1. Install rust and cargo

  2. Clone this project: git clone https://github.com/yazgoo/umberwm

    • Note: if you don't want to modify the source code, you can instead add umberwm as a dependency to your own project. See using it as a dependency.
  3. Edit src/main.rs.

  4. Edit umberwm-start if desired. Here you can launch any programs you need to before launching umberwm.

  5. Run cargo build --release. The binary will be available in target/release/umberwm.

  6. Optionally, run ./install.py. This will do three things:

    1. Symlink target/release/umberwm to /usr/bin.
    2. Symlink umberwm-start to /usr/bin.
    3. Copy umberwm.desktop to /usr/share/xsessions. This will allow display managers such as GDM to find umberwm and allow you to launch it.
  7. If you do not use a display manager, you will need to add the following to your .xinitrc:

    exec umberwm-start

Using it as a dependency

If you don't want to modify the source code, you can create your own rust project and add umberwm as a cargo dependency.


# ...
umberwm = "0.0.21"

You can then supply your own main.rs rather than editing the existing one. It is advised that you use main.rs from this repository as your starting point.

See examples:

Note that you will have to manually set up umberwm-start and umberwm.desktop if you wish to use them.

Hot reloading

Hot reloading allows to restart umberwm while keeping its state (i.e. keeping track of windows and their relative workspaces). This is quite useful when you want to update your configuration.

In wm_actions:, the action Actions::SerializeAndQuit will serialize all of its windows and then quit with exit code 123. The umberwm-start script checks for the exit code 123 and reruns umberwm, thereby facilitating a smooth restart.


~81K SLoC