A lightweight, highly configurable Wayland compositor inspired by Fluxbox.
About | Screenshots | Quick Start | Features | Dependencies | Building | Configuration | Migration from Fluxbox | IPC | Man Pages | Contributing | License
fluxland brings the Fluxbox experience to the Wayland display protocol. For years, Fluxbox has been the window manager of choice for users who value simplicity, speed, and deep configurability. As the Linux desktop ecosystem transitions from X11 to Wayland, fluxland provides a familiar home for Fluxbox users while embracing modern display server capabilities.
This project was 100% vibe coded using Claude Code with Claude Code Teams orchestration. Read about how it was built — agentic development, team orchestration, and what I learned building a 35,000-line compositor without writing a single line of code.
Built on wlroots 0.18, fluxland implements 30+ Wayland protocols and delivers first-class support for server-side decorations with Fluxbox style compatibility, key chains and modal keybindings, window tabbing, a configurable toolbar with icon bar, the slit (dockapp container), and per-window rules. It reads Fluxbox configuration files directly, making migration straightforward.
fluxland targets users who want a fast, keyboard-driven stacking compositor with the depth of configuration that Fluxbox is known for, without sacrificing the benefits of a modern Wayland session.
Great Wave style with ocean blue decorations.
![]() |
![]() |
| Desktop with wallpaper | Single window with gkrellm in slit (XWayland) |
![]() |
![]() |
| Root menu | Grid arrangement (4 windows) |
See examples/ for styles and complete configuration examples, and the style gallery for Fluxbox style compatibility screenshots.
-
Install dependencies (see Dependencies below) and build:
meson setup build && ninja -C build sudo ninja -C build installFor distro-specific instructions, see
docs/QUICKSTART.md. -
Copy the example configuration:
mkdir -p ~/.config/fluxland cp /path/to/fluxland/data/* ~/.config/fluxland/ chmod +x ~/.config/fluxland/startup
Or start from a themed example (see
examples/):cp /path/to/fluxland/data/* ~/.config/fluxland/ cp /path/to/fluxland/examples/wave-desktop/* ~/.config/fluxland/ chmod +x ~/.config/fluxland/startup
-
Start the compositor from a TTY or from within another compositor:
fluxland
-
Essential keybindings:
Key Action Mod4+ReturnOpen terminal (foot) Mod4+dApplication launcher (wofi) Mod4+Shift+qClose focused window Mod4+fToggle fullscreen Mod4+mToggle maximize Mod4+1..9Switch to workspace Mod4+Shift+1..9Send window to workspace Alt+TabCycle windows Mod4+rReload configuration Mod4+Shift+eExit compositor Mod4is the Super/Windows key.
- Server-side decorations with full Fluxbox style support (gradients, textures, fonts, colors)
- Key chains -- multi-key sequences (e.g.
Mod4+x Mod4+tto launch a terminal) - Keymodes -- modal keybinding sets (e.g. a resize mode with vim-style movement keys)
- Window tabbing -- group windows into tabbed containers, drag-to-tab from titlebars
- Toolbar with workspace switcher, icon bar, and clock; configurable placement and auto-hide
- Slit -- dock area for Window Maker dockapps and other dockable applications (e.g. gkrellm via XWayland)
- Root menu and window menu -- Fluxbox-compatible menu definitions with submenus, separators, and built-in entries
- Per-window rules -- match by app_id, title, or class with regex; set workspace, dimensions, position, decorations, layer, transparency, and more
- Auto-grouping -- automatically tab windows matching specified patterns
- MacroCmd / ToggleCmd -- combine multiple actions in a single binding or cycle between them
- Mouse bindings -- per-context (titlebar, desktop, border, grip) with click, drag, and double-click support
- Multiple focus policies -- click-to-focus, sloppy (mouse focus), strict mouse focus
- Smart window placement -- row-smart, column-smart, cascade, and under-mouse placement policies
- Workspace management -- up to 32 named virtual desktops with edge warping
- XKB keyboard layout -- full XKB configuration with multi-layout support and runtime switching
- IPC via Unix socket with JSON protocol; includes
fluxland-ctlcommand-line client - Event subscriptions -- subscribe to window, workspace, and output events for scripting
- XWayland support -- run X11 applications alongside native Wayland clients
- Live reconfiguration -- reload all config files at runtime (keys, apps, menu, style, init) via
Mod4+rorSIGHUP - Lightweight and efficient -- runs comfortably on a Raspberry Pi 3 or 2010-era Intel Atom. The compositor uses ~16-32 MB of RAM, with an optimized rendering pipeline that caches text measurement contexts, pre-allocates buffers, and skips redundant scene graph updates. The only real hardware requirement is a GPU with OpenGL ES 2.0 and DRM/KMS kernel driver support.
- 30+ Wayland protocols including:
- xdg-shell, xdg-decoration, layer-shell, session-lock
- fractional-scale, tearing-control, content-type, presentation-time
- pointer-constraints, relative-pointer, pointer-gestures
- virtual-keyboard, virtual-pointer, text-input, input-method
- gamma-control, output-management, output-power, screencopy
- data-control, xdg-activation, xdg-foreign, tablet-v2
- cursor-shape, viewporter, single-pixel-buffer, alpha-modifier
- security-context, linux-dmabuf, idle-notify, idle-inhibit
| Dependency | Debian/Ubuntu | Arch |
|---|---|---|
| meson (>= 0.60) | meson |
meson |
| ninja | ninja-build |
ninja |
| C17 compiler | gcc or clang |
gcc or clang |
| wlroots 0.18 | libwlroots-0.18-dev |
wlroots0.18 |
| wayland | libwayland-dev |
wayland |
| wayland-protocols (>= 1.32) | wayland-protocols |
wayland-protocols |
| xkbcommon | libxkbcommon-dev |
libxkbcommon |
| libinput (>= 1.14) | libinput-dev |
libinput |
| pixman | libpixman-1-dev |
pixman |
| pangocairo | libpango1.0-dev |
pango |
| libdrm | libdrm-dev |
libdrm |
| Dependency | Debian/Ubuntu | Arch | Purpose |
|---|---|---|---|
| XWayland | xwayland |
xorg-xwayland |
X11 application support |
| xcb, xcb-ewmh, xcb-icccm | libxcb1-dev libxcb-ewmh-dev libxcb-icccm4-dev |
libxcb xcb-util-wm |
XWayland EWMH/ICCCM |
- foot or another Wayland terminal emulator
- wofi, bemenu, or fuzzel for application launching
- swaybg for wallpaper
- waybar for a status bar
- mako or dunst for notifications
- swayidle + swaylock for idle/lock management
- grim + slurp for screenshots
meson setup build
ninja -C buildTo install system-wide:
sudo ninja -C build install| Option | Type | Default | Description |
|---|---|---|---|
xwayland |
feature | auto | Enable XWayland support |
asan |
boolean | false | Enable address sanitizer |
ubsan |
boolean | false | Enable undefined behavior sanitizer |
Example with options:
meson setup build -Dxwayland=enabled -Dasan=true
ninja -C buildfluxland reads configuration from the first directory found:
$FLUXLAND_CONFIG_DIR/$XDG_CONFIG_HOME/fluxland/~/.config/fluxland/~/.fluxbox/(Fluxbox compatibility fallback)
| File | Format | Description |
|---|---|---|
init |
X resource (key: value) | Compositor settings: workspaces, focus policy, toolbar, placement, XKB layout |
keys |
Fluxbox keys format | Keyboard and mouse bindings, key chains, keymodes, macro/toggle commands |
apps |
Fluxbox apps format | Per-window rules: workspace, dimensions, position, decorations, layer, transparency, auto-grouping |
menu |
Fluxbox menu format | Root menu definition with exec entries, submenus, separators, styles directory, and built-in items |
style |
Fluxbox style format | Window decoration style: titlebar, buttons, handle, grip, frame, menu, and toolbar colors/textures/fonts |
startup |
Shell script | Autostart script executed once at launch; use for wallpaper, bars, daemons |
All configuration can be reloaded at runtime with Mod4+r (Reconfigure action)
or by sending SIGHUP to the compositor process. Example configuration files
are provided in the data/ directory.
See the man pages below for detailed format documentation.
- Config file formats --
init,keys,apps,menu, andstylefiles use the same syntax as Fluxbox. - Key binding format -- modifier and key names, action names, key chains, and keymodes are compatible.
- Mouse bindings -- same context names (OnTitlebar, OnDesktop, OnWindowBorder, etc.) and button syntax.
- Per-window rules -- same
[app]/[end]block syntax with property matching and settings. - Styles -- Fluxbox style files work directly; texture syntax (Raised, Flat, Gradient, etc.) is preserved.
- Menu format --
[exec],[submenu],[separator],[stylesdir],[reconfig],[exit]entries. - Config directory -- fluxland falls back to
~/.fluxbox/if no fluxland config directory exists.
- Wayland-only -- no X11 root window, no
xprop/xdotool; usefluxland-ctlfor IPC and scripting. - app_id replaces WM_CLASS -- in
appsrules, theclassproperty matches the Waylandapp_id(e.g. "firefox", "foot") rather than the X11 WM_CLASS. - No
screen0at runtime -- whileinitstill usessession.screen0.*keys for compatibility, Wayland outputs are managed per-monitor viawlr-output-management. - Slit uses layer-shell -- dockable applications use the Wayland layer-shell protocol instead of X11 docking.
- Session lock -- uses
ext-session-lock-v1protocol; pair withswaylockinstead of X11 lock programs. - XWayland is optional -- X11 apps work through XWayland when enabled at build time, but native Wayland clients are preferred.
fluxland provides a Unix socket IPC interface with JSON messages. The
fluxland-ctl command-line tool handles socket discovery and message
formatting.
# Execute compositor actions
fluxland-ctl action Close
fluxland-ctl action Workspace 3
fluxland-ctl action Exec foot
# Query state
fluxland-ctl get_windows
fluxland-ctl get_workspaces
fluxland-ctl get_outputs
fluxland-ctl get_config
# Subscribe to events (streams JSON to stdout)
fluxland-ctl subscribe window workspace
# List all available actions
fluxland-ctl list-actions
# Test connectivity
fluxland-ctl pingThe socket path is auto-detected from $FLUXLAND_SOCK or
$XDG_RUNTIME_DIR/fluxland.$WAYLAND_DISPLAY.sock. Override with -s <path>.
| Page | Section | Description |
|---|---|---|
| fluxland(1) | 1 | Compositor usage and command-line options |
| fluxland-ctl(1) | 1 | IPC client usage |
| fluxland-keys(5) | 5 | Key and mouse binding configuration |
| fluxland-apps(5) | 5 | Per-window rules and auto-grouping |
| fluxland-init(5) | 5 | Init file reference |
| fluxland-style(5) | 5 | Style file format |
| fluxland-menu(5) | 5 | Menu definition format |
| fluxland-startup(5) | 5 | Startup script reference |
After installation, access with man fluxland, man fluxland-keys, etc.
Contributions are welcome. See CONTRIBUTING.md for guidelines on code style, commit messages, and the development workflow.
fluxland is released under the MIT License.



