2
5
Fork
You've already forked IonWL
0
Manual tiling Wayland compositor.
  • Rust 91.3%
  • Python 8.4%
  • Makefile 0.3%
Campbell Barton 94d39548a0 Feature: exclude the tab bar from the tab-drag drop highlight
The highlight covered the whole target frame including its tab bar,
though a dropped tab only fills the window region below it.
Mark that region so the highlight matches where the window lands.
This also prevents a highlighted tab from overlapping the window
highlighted window contents.
2026年07月12日 14:05:12 +10:00
.cargo Build: pin PYO3_PYTHON to keep the pre-commit hook warm 2026年07月11日 21:32:42 +10:00
_misc Build: parallelize the format and integration-test steps 2026年07月11日 19:33:49 +10:00
config Cleanup: wrap long lines 2026年07月11日 18:07:29 +10:00
doc Build: skip the release compile in the test and commit paths 2026年07月11日 20:12:07 +10:00
scripts Cleanup: option-ify Window.title 2026年06月05日 11:14:08 +10:00
share/ionwl Feature: exclude the tab bar from the tab-drag drop highlight 2026年07月12日 14:05:12 +10:00
src Fix: ionwl-cmd empty --import= still imports the subcommand default 2026年07月12日 11:45:25 +10:00
tests Fix: layer-shell client hangs creating a surface with no output 2026年07月11日 22:14:39 +10:00
.gitignore Initial commit 2026年05月13日 13:23:13 +10:00
Cargo.toml Build: move clippy lints into Cargo.toml [lints.clippy] 2026年07月11日 21:16:20 +10:00
LICENSE Initial commit 2026年05月13日 13:23:13 +10:00
Makefile Build: move clippy lints into Cargo.toml [lints.clippy] 2026年07月11日 21:16:20 +10:00
pyproject.toml Initial commit 2026年05月13日 13:23:13 +10:00
readme.rst Docs: link the documentation site from the readme 2026年07月11日 22:22:37 +10:00

IonWL

A Wayland compositor inspired by Ion3, built on Smithay.

See the documentation for a full overview, including the Python API reference.

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/b2b13046-d8c0-444e-ace6-f4467f49cd20
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.

See the supported features documentation for a comprehensive list.

Requirements

  • Rust 1.94+.
  • Python 3.
  • libseat, libinput & udev.
  • 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/default/ion_init.py ~/.config/ionwl/

Usage

See the documentation for more details as well as the Python API.

Running

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

Customizing

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.