MONitor Integrated QUick Editor — graphical monitor configurator for Hyprland and Sway with drag-and-drop and auto-profile daemon
Project description
Monique
MONitor Integrated QUick Editor
Graphical monitor configurator for Hyprland, Sway and Niri
Screenshots
|
Layout editor |
Workspace rules |
|
Quick setup |
SDDM integration |
Features
- Drag-and-drop layout — arrange monitors visually on an interactive canvas
- Multi-backend — auto-detects Hyprland, Sway, or Niri from the environment
- Cross-write — save a profile in any compositor and automatically generate config files for the others (e.g. configure in Hyprland → get Sway and Niri configs for free)
- Profile system — save, load, and switch between monitor configurations
- Hotplug daemon (
moniqued) — automatically applies the best matching profile when monitors are connected or disconnected - Display manager integration — syncs your layout to the login screen for SDDM (xrandr) and greetd (sway), with polkit rule for passwordless writes
- Workspace rules — configure workspace-to-monitor assignments (Hyprland/Sway)
- Live preview — OSD overlay to identify monitors (double-click)
- Workspace migration — automatically moves workspaces to the primary monitor when their monitor is disabled or unplugged (reverted if you click "Revert")
- Clamshell mode — disable the internal laptop display when external monitors are connected (manual toggle in the toolbar or automatic via daemon preferences); the daemon also monitors the lid state via UPower D-Bus
- Confirm-or-revert — 10-second countdown after applying, auto-reverts if display is unusable
- CLI interface — list, query, and switch profiles from the terminal (
--list-profiles,--current-profile,--switch-profile), perfect for hotkey bindings - Custom config directory — write generated monitor config files to a custom path instead of the compositor default (via Preferences or
--config-dir) - Active profile tracking — the last applied profile is persisted across GUI, CLI, and daemon, queryable via
--current-profile
Installation
AUR (Arch Linux / CachyOS)
yay -S monique
Or manually:
git clone https://aur.archlinux.org/monique.git
cd monique
makepkg -si
NixOS / Nix
Con flake (raccomandato) — aggiungilo come input e usa il modulo NixOS:
# flake.nix
inputs.monique.url = "github:ToRvaLDz/monique";
# configuration.nix (tramite module)
{ inputs, ... }: {
imports = [ inputs.monique.nixosModules.default ];
programs.monique.enable = true;
}
Run senza installare:
nix run github:ToRvaLDz/monique
Installazione nello user profile:
nix profile install github:ToRvaLDz/monique
Con overlay:
nixpkgs.overlays = [ inputs.monique.overlays.default ];
environment.systemPackages = [ pkgs.monique ];
Nota polkit: il modulo NixOS installa automaticamente la regola polkit per le scritture su SDDM/greetd senza password. Disabilitabile con
programs.monique.enablePolkit = false.
PyPI
pip install monique
From source
git clone https://github.com/ToRvaLDz/monique.git
cd monique
pip install .
Runtime dependencies:
| Distro | Packages |
|---|---|
| Arch / CachyOS | python python-gobject gtk4 libadwaita |
| Fedora | python3 python3-gobject gtk4 libadwaita |
| openSUSE | python3 python3-gobject gtk4 libadwaita typelib-1_0-Adw-1 typelib-1_0-Gtk-4_0 |
| Ubuntu / Debian | python3 python3-gi gir1.2-gtk-4.0 gir1.2-adw-1 libadwaita-1-0 |
| NixOS | gestito automaticamente dal flake |
Optional: python-pyudev (hardware hotplug detection for Niri)
Usage
GUI
monique
Open the graphical editor to arrange monitors, set resolutions, scale, rotation, and manage profiles.
CLI
# List all saved profiles (JSON array)
monique --list-profiles
# Get the currently active profile
monique --current-profile
# Switch to a profile
monique --switch-profile "Office"
# Switch with a custom config output directory
monique --config-dir ~/my-hypr-config --switch-profile "Office"
Bind monique --switch-profile <name> to any compositor hotkey for quick profile switching.
Daemon
moniqued
Or enable the systemd user service:
systemctl --user enable --now moniqued
The daemon auto-detects the active compositor and listens for monitor hotplug events. When a monitor is connected or disconnected, it waits 500ms (debounce) then applies the best matching profile. On Niri, the daemon uses udev DRM events (via pyudev) for reliable hardware hotplug detection. Orphaned workspaces are automatically migrated to the primary monitor on Hyprland/Sway (configurable via Preferences > Migrate workspaces).
Clamshell mode
On laptops, the daemon can automatically disable the internal display when external monitors are connected. Enable it from the GUI: Menu > Preferences > Clamshell Mode.
The daemon also monitors the laptop lid state via UPower D-Bus: closing the lid disables the internal display, opening it re-enables it. On desktop PCs (no lid detected), clamshell mode simply disables any internal-type output (eDP, LVDS) whenever external monitors are present.
Note: if your system suspends on lid close, set
HandleLidSwitch=ignorein/etc/systemd/logind.confso the daemon can handle it instead.
Behavior per environment
| Environment | Detection | Events |
|---|---|---|
| Hyprland | $HYPRLAND_INSTANCE_SIGNATURE |
monitoradded / monitorremoved via socket2 |
| Sway | $SWAYSOCK |
output events via i3-ipc subscribe |
| Niri | $NIRI_SOCKET |
udev DRM subsystem (with pyudev), IPC fallback |
| Neither | Warning, retry every 5s | — |
Display manager integration
Monique can sync your monitor layout to the login screen for supported display managers.
| Display Manager | Method | Config path |
|---|---|---|
| SDDM | xrandr via Xsetup script |
/usr/share/sddm/scripts/Xsetup |
| greetd (sway) | sway output commands |
/etc/greetd/monique-monitors.conf |
A polkit rule is included to allow passwordless writes:
# Installed automatically by the PKGBUILD to:
# /usr/share/polkit-1/rules.d/60-com.github.monique.rules
Toggle from the GUI: Menu > Preferences > Update SDDM Xsetup or Update greetd config.
Configuration
All configuration is stored in ~/.config/monique/:
~/.config/monique/
├── profiles/
│ ├── Home.json
│ └── Office.json
└── settings.json
Monitor config files are written to the compositor's config directory:
- Hyprland:
~/.config/hypr/monitors.confand~/.config/hypr/monitors.lua - Sway:
~/.config/sway/monitors.conf - Niri:
~/.config/niri/monitors.kdl
For Hyprland's legacy hyprlang config, add source = ~/.config/hypr/monitors.conf to hyprland.conf.
For Hyprland 0.55+ Lua config, add require("monitors") to hyprland.lua.
To use a custom output directory, set it in Preferences → Config Output or pass --config-dir on the command line.
Project structure
src/monique/
├── app.py # Application entry point
├── window.py # Main GTK4/Adwaita window
├── canvas.py # Monitor layout canvas
├── properties_panel.py # Monitor properties sidebar
├── workspace_panel.py # Workspace rules dialog
├── models.py # MonitorConfig, Profile, WorkspaceRule
├── hyprland.py # Hyprland IPC client
├── sway.py # Sway IPC client (binary i3-ipc)
├── niri.py # Niri IPC client (JSON socket)
├── daemon.py # Hotplug daemon (moniqued)
├── profile_manager.py # Profile save/load/match
└── utils.py # Paths, file I/O, helpers
Contributors
Thanks to everyone who has contributed to Monique!
License
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file monique-0.6.6.tar.gz.
File metadata
- Download URL: monique-0.6.6.tar.gz
- Upload date:
- Size: 75.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
34d8ac94dbbd2fec1ff5d05af25ebc45034654e3d3df9a0848ff13e37a203f4e
|
|
| MD5 |
40e4ee3115fc5e9f148d4c295bd77c2c
|
|
| BLAKE2b-256 |
83be0482c7100881d5ebad7764462e30bb41f7ef3e77d849f12ae4695bfeb246
|
Provenance
The following attestation bundles were made for monique-0.6.6.tar.gz:
Publisher:
release.yml on ToRvaLDz/monique
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
monique-0.6.6.tar.gz -
Subject digest:
34d8ac94dbbd2fec1ff5d05af25ebc45034654e3d3df9a0848ff13e37a203f4e - Sigstore transparency entry: 1764740409
- Sigstore integration time:
-
Permalink:
ToRvaLDz/monique@f2b2e16ea756ac537ad4938a964c897455e173ab -
Branch / Tag:
refs/tags/v0.6.6 - Owner: https://github.com/ToRvaLDz
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@f2b2e16ea756ac537ad4938a964c897455e173ab -
Trigger Event:
push
-
Statement type:
File details
Details for the file monique-0.6.6-py3-none-any.whl.
File metadata
- Download URL: monique-0.6.6-py3-none-any.whl
- Upload date:
- Size: 77.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
87d7936be2972ebc6af54d35c8c1254a1baee97924a6f87dc53fd54c9323ec06
|
|
| MD5 |
9297792868ef9394912efd3de821bfbd
|
|
| BLAKE2b-256 |
5c04a19b1d0b141287cba9f14f7ea4a9be2ce320d0ae1d264dbde1eb629ee677
|
Provenance
The following attestation bundles were made for monique-0.6.6-py3-none-any.whl:
Publisher:
release.yml on ToRvaLDz/monique
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
monique-0.6.6-py3-none-any.whl -
Subject digest:
87d7936be2972ebc6af54d35c8c1254a1baee97924a6f87dc53fd54c9323ec06 - Sigstore transparency entry: 1764740685
- Sigstore integration time:
-
Permalink:
ToRvaLDz/monique@f2b2e16ea756ac537ad4938a964c897455e173ab -
Branch / Tag:
refs/tags/v0.6.6 - Owner: https://github.com/ToRvaLDz
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@f2b2e16ea756ac537ad4938a964c897455e173ab -
Trigger Event:
push
-
Statement type: