Skip to content

lx7/monotile

Repository files navigation

monotile

A small and light tiling Wayland compositor in Rust.

Note

monotile is under active development. Usable as a daily driver, but some features are still missing (multi-monitor, screen sharing etc).

Features

Window management:

  • Dynamic tiling layout (main/stack)
  • Floating windows (auto-detected from hints, rules, or toggled)
  • Tag system with per-tag layout and window order
  • Keyboard-driven (mouse optional)
  • Rule-based runtime configuration
  • Autostart (shell script)
  • Smart borders and smart gaps
  • Focus-follows-mouse
  • Screen lock and idle protocols

Rendering and backend:

  • DRM/KMS backend with session handling
  • Hardware accelerated (EGL/GBM render path, GLSL shaders)
  • Server-side decorations (rounded corners, shadows, borders)
  • Damage tracking and direct scanout
  • Layer shell (panels, bars, overlays)
  • Clipboard protocols (wl-copy/wl-paste)
  • IPC for status bars (monotile-ipc-v1, dwl-ipc-v2)
  • Screen sharing

Not yet implemented:

  • Multi-monitor support
  • Output management
  • Gamma control
  • HiDPI / multi-DPI support
  • Hide cursor when typing
  • Monocle layout

Building monotile

Requires Rust 1.85 or later.

NixOS

Add the flake to your system config and rebuild, or install to your user profile:

nix profile add github:lx7/monotile

For development:

nix develop
cargo build --release

Arch Linux

sudo pacman -S rust pkgconf wayland libxkbcommon libdrm libinput seatd mesa libdisplay-info
cargo build --release

Debian / Ubuntu

# rust toolchain (1.85+)
# Debian 13+ / Ubuntu 25.04+:
sudo apt-get install -y cargo
# older distros:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

# build dependencies
sudo apt-get install -y libwayland-dev libxkbcommon-dev libgbm-dev libdrm-dev libudev-dev libinput-dev libseat-dev libegl1-mesa-dev libdisplay-info-dev

# runtime dependencies
sudo apt-get install -y libwayland-server0 libxkbcommon0 libgbm1 libudev1 libinput10 libseat1 libegl1 libdisplay-info2

cargo build --release

Configuration

Configuration files are in $XDG_CONFIG_HOME/monotile/:

  • config.ron: Rule-based configuration
  • autostart.sh: Commands to run on startup

On first run, monotile creates a default config if none exists. Edit it to customize keybindings, layout, appearance, and input devices.

Custom paths can be specified: monotile [-c <config>] [-s <autostart>]

monotile is not a desktop environment. You need a terminal emulator and an application launcher. The defaults use foot and fuzzel - adjust the config to match your setup.

Essential keybindings

Key Action
Super+Return Open terminal (foot)
Super+D Open launcher (fuzzel)
Super+Shift+Q Close window
Super+Space Toggle fullscreen
Super+Shift+Space Toggle floating
Super+ Focus previous window
Super+ Focus next window
Super+Shift+ Swap window with previous in stack
Super+Shift+ Swap window with next in stack
Super+1..9 Switch to tag
Super+Shift+1..9 Move window to tag
Ctrl+Alt+Backspace Quit
Super+LMB Drag to move floating windows
Super+RMB Drag to resize floating windows

Worth checking out

  • Cosmic: Wayland desktop with tiling compositor by System76.
  • niri: Continuous side-scrolling-tiling wayland compositor.
  • dwl: dwm for wayland.
  • bspwm: bsp-tree based tiling window manager for X11.

Acknowledgements

  • smithay - monotile is based on the Smithay Wayland library, and the smallvil example.
  • niri - Clipping and decoration shader technique. Also, the idea for the integration test fixture.

About

A small and light tiling Wayland compositor in Rust.

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages