Manual tiling Wayland compositor.
  • Rust 90.5%
  • Python 9.3%
  • Makefile 0.2%
Find a file
Campbell Barton 9f1433662b Cleanup: remove the unused frame_removal_epoch counter
The frame decoration texture cache was its only consumer, where it gated a
removal-only prune walk. That prune now retains entries by frame/output rect
overlap, which subsumes the removal check (a removed frame's rect is gone) and
also catches cross-output moves the epoch could never signal -- so the counter
has no remaining purpose.

- Drops the LayoutManager field, its bump in frame_slot_remove, and its tests.
2026-06-08 17:09:01 +10:00
.cargo Build: raise rustc stack via .cargo/config.toml to stop macro-expansion SIGSEGV 2026-06-05 11:14:11 +10:00
_misc Checks: make check_all pass on doc generators 2026-06-05 11:14:09 +10:00
config Refactor: gather startup preferences under preferences.startup 2026-06-05 11:14:10 +10:00
doc Fix #5: skip font init during doc generation to avoid fontconfig crash 2026-06-05 11:14:12 +10:00
scripts Cleanup: option-ify Window.title 2026-06-05 11:14:08 +10:00
share/ionwl Fix: keep window-overview thumbnails on their current monitor 2026-06-05 11:14:12 +10:00
src Cleanup: remove the unused frame_removal_epoch counter 2026-06-08 17:09:01 +10:00
tests Fix: follow focus to promoted window when exiting fullscreen 2026-06-05 11:14:12 +10:00
.gitignore Initial commit 2026-05-13 13:23:13 +10:00
Cargo.toml Update: bump Smithay to track upstream pointer-constraints API 2026-06-05 11:14:11 +10:00
LICENSE Initial commit 2026-05-13 13:23:13 +10:00
Makefile Makefile: load .env for convenience 2026-06-05 11:14:11 +10:00
pyproject.toml Initial commit 2026-05-13 13:23:13 +10:00
readme.rst readme: rename Ion/WL -> IonWL 2026-06-05 11:14:12 +10:00

IonWL

A Wayland compositor inspired by Ion3, built on Smithay.

Why IonWL?

Most tiling compositors on Wayland use automatic layouts that rearrange windows when you open or close them. Ion3 took a different approach: you manually split the screen into frames, and windows open inside those frames as tabs. This gives you full control over your layout - it stays exactly how you set it up.

At the time of writing, nothing on Wayland offers this model. IonWL brings it to Wayland with a Python scripting API for configuration and key-bindings.

https://codeberg.org/attachments/a04a4249-f5e5-447a-ada2-096fcd48ce97
Screenshot.

Features

  • Manual tiling: Split the screen into frames and manage windows as tabs. Layouts stay fixed - opening or closing windows doesn't rearrange anything.
  • Floating windows: Full floating layer with z-ordering.
  • Scratch workspaces: Workspaces can float as overlays, acting as toggle-able scratch-pads.
  • Shared desktops: All outputs belong to one desktop. Switching desktops switches all outputs at once.
  • Python API: Key-bindings and configuration written in Python, with direct access to windows, frames, workspaces, and outputs. The Python API may also be invoked from external commands to run custom scripts.
  • Flexible key-bindings: Separate bindings for press, release, and click for both mouse and keyboard. Modifier keys can be bound as tap actions. Key-bindings can optionally consume events and/or pass them through to the client.
  • IPC: Unix socket interface with ionwl-cmd for scripting and external tools.

Support For

  • XWayland: Optional X11 application support with clipboard sync.
  • Multi-GPU: Automatic GPU detection.
  • VRR: Variable refresh rate for supported displays.
  • Direct scanout: Zero-copy rendering for full-screen applications.

Limitations

  • Output scale is global (no support for mixed output scaling).

In Development

These areas are likely to change.

  • Python defined operator callbacks.

Requirements

  • Rust 1.87+.
  • Python 3.
  • libseat, libinput, udev, freetype.
  • GPU with DRM/KMS support.
  • Sphinx (for building Python API docs).

Building

cargo build --release

To disable XWayland support:

cargo build --release --no-default-features

Installation

Arch Linux

Install ionwl-git from the AUR.

From Source

Build and install with make:

make
make install PREFIX=/opt/ionwl

mkdir -p ~/.config/ionwl
cp config/ion_init.py ~/.config/ionwl/

Type Checking

Validate your configuration with mypy using the installed stubs:

MYPYPATH=/opt/ionwl/share/ionwl/python mypy --strict ~/.config/ionwl/ion_init.py

Running

# From a TTY (not inside another compositor).
./target/release/ionwl

Attribution

  • Tuomo Valkonen Original author of the Ion3 (window-manager)
  • Pinnacle (protocol implementations, backend initialization, cursor management, input handling, XWayland integration).
  • Niri (window creation logic, DMABUF allocation, foreign toplevel protocol).
  • Cosmic (layer shell deferred mapping, window mapping gate, interactive resize, output management).
Note

This was written with the assistance of an LLM, in some cases using existing open-source code as a reference, full credit goes to those projects on which this is based.

License

GPL 3 or later, See LICENSE file for details.