Rethinking window management for GNOME Shell
JavaScript
432
545 commits
updated Sep 14, 2026
📣 Development journal on Mastodon: floss.social/@CleoMenezesJr
📣 Testers room on Matrix: #mosaicwm:matrix.org
A GNOME Shell extension that tiles windows automatically in a mosaic layout.
It is also a testbed. The point is not to maintain an extension indefinitely, but to work out what mosaic tiling should actually do in daily use, in enough detail that the model can be proposed to Mutter and GNOME Shell. An extension is the fastest way to put the idea in front of real users and find out where it falls apart.
Early, and moving fast. Behaviour changes between commits, and something that worked last week may not work today.
The starting point is Tobias Bernard's Rethinking Window Management. That post is the premise, not the specification. It describes the shape of the idea; this project is where the idea meets actual use, and where usability testing gets to overrule the original sketch.
Two places the design has already been pushed further than the post:
The consistent principle behind both: nothing should require the user to think about window management. If a behaviour needs explaining before it makes sense, that is a defect in the behaviour, not a gap in the documentation.
gsettings. Quick Settings covers the mosaic toggles and nothing else. This is deliberate for now, see below.Roughly in priority order.
git clone https://github.com/CleoMenezesJr/MosaicWM.git
cd MosaicWM
./scripts/build.sh -i
Then log out, log back in, and enable it:
gnome-extensions enable mosaicwm@cleomenezesjr.github.io
For everyday use rather than development, set const DEBUG = false; in extension/logger.js before installing. It defaults to true, which logs verbosely and costs CPU.
There is nothing to configure. Once enabled:
npm install # the pre-commit hook shells out to npx eslint
./scripts/setup-hooks # symlinks .git/hooks/pre-commit, per clone
setup-hooks has to be run by hand after cloning: git hooks live outside the working tree and are not cloned. The hook only runs ESLint over staged files, while CI runs ESLint over all of extension/, plus shexli and a build. Passing the hook does not mean CI will pass; CI is the real gate.
./scripts/build.sh -b # build only
./scripts/build.sh -i # build and install
./scripts/run-gnome-shell.sh # nested GNOME Shell session for testing
npm run lint
Keep DEBUG = true in extension/logger.js while developing. Logs go to the journal:
journalctl -f -o cat /usr/bin/gnome-shell | grep -i mosaic
Looking Glass (Alt+F2 → lg) shows extension errors under its Extensions tab. The GJS debugging guide covers the rest.
Most pull requests will be turned down right now. The internals get rewritten often enough that a patch can collide with a refactor before anyone reviews it, and declining good work for that reason wastes your time and mine. Something small and self-contained can still land, so open an issue and ask before writing it. This gets easier once the architecture settles.
What genuinely helps in the meantime:
Anything that does eventually land must satisfy the GNOME Shell Extensions Review Guidelines.
This is unfunded work on a problem that will take a long time to finish properly. If you would like it to keep going, sponsorship is what makes the time available:
GNU General Public License v2.0 or later, the same license as Mutter and GNOME Shell. See LICENSE.
JavaScript
98.7%
Shell
1.3%
Rethinking window management for GNOME Shell
JavaScript
432
545 commits
updated Sep 14, 2026
📣 Development journal on Mastodon: floss.social/@CleoMenezesJr
📣 Testers room on Matrix: #mosaicwm:matrix.org
A GNOME Shell extension that tiles windows automatically in a mosaic layout.
It is also a testbed. The point is not to maintain an extension indefinitely, but to work out what mosaic tiling should actually do in daily use, in enough detail that the model can be proposed to Mutter and GNOME Shell. An extension is the fastest way to put the idea in front of real users and find out where it falls apart.
Early, and moving fast. Behaviour changes between commits, and something that worked last week may not work today.
The starting point is Tobias Bernard's Rethinking Window Management. That post is the premise, not the specification. It describes the shape of the idea; this project is where the idea meets actual use, and where usability testing gets to overrule the original sketch.
Two places the design has already been pushed further than the post:
The consistent principle behind both: nothing should require the user to think about window management. If a behaviour needs explaining before it makes sense, that is a defect in the behaviour, not a gap in the documentation.
gsettings. Quick Settings covers the mosaic toggles and nothing else. This is deliberate for now, see below.Roughly in priority order.
git clone https://github.com/CleoMenezesJr/MosaicWM.git
cd MosaicWM
./scripts/build.sh -i
Then log out, log back in, and enable it:
gnome-extensions enable mosaicwm@cleomenezesjr.github.io
For everyday use rather than development, set const DEBUG = false; in extension/logger.js before installing. It defaults to true, which logs verbosely and costs CPU.
There is nothing to configure. Once enabled:
npm install # the pre-commit hook shells out to npx eslint
./scripts/setup-hooks # symlinks .git/hooks/pre-commit, per clone
setup-hooks has to be run by hand after cloning: git hooks live outside the working tree and are not cloned. The hook only runs ESLint over staged files, while CI runs ESLint over all of extension/, plus shexli and a build. Passing the hook does not mean CI will pass; CI is the real gate.
./scripts/build.sh -b # build only
./scripts/build.sh -i # build and install
./scripts/run-gnome-shell.sh # nested GNOME Shell session for testing
npm run lint
Keep DEBUG = true in extension/logger.js while developing. Logs go to the journal:
journalctl -f -o cat /usr/bin/gnome-shell | grep -i mosaic
Looking Glass (Alt+F2 → lg) shows extension errors under its Extensions tab. The GJS debugging guide covers the rest.
Most pull requests will be turned down right now. The internals get rewritten often enough that a patch can collide with a refactor before anyone reviews it, and declining good work for that reason wastes your time and mine. Something small and self-contained can still land, so open an issue and ask before writing it. This gets easier once the architecture settles.
What genuinely helps in the meantime:
Anything that does eventually land must satisfy the GNOME Shell Extensions Review Guidelines.
This is unfunded work on a problem that will take a long time to finish properly. If you would like it to keep going, sponsorship is what makes the time available:
GNU General Public License v2.0 or later, the same license as Mutter and GNOME Shell. See LICENSE.
JavaScript
98.7%
Shell
1.3%