Window management for Linux - Snap windows to predefined zones using keyboard modifiers and visual overlays. Inspired by Windows PowerToys FancyZones.
This entire application was vibe-coded with Claude. I take no responsibility for it breaking your system. I developed it for myself, I use it regularly, and I applied best practices while developing it with Claude and tested it thoroughly. It works for me - your mileage may vary. Use at your own risk.
- 🎯 Zone-based window snapping - Hold Alt + drag to snap windows to custom zones
- 🔀 Overlapping zones support - Not limited to grids - zones can overlap and be positioned freely
- 🎨 Visual zone editor - Create and edit layouts with live preview on your desktop
- 📐 Preset layouts - Quick layouts: halves, thirds, quarters, and 3x3 grid
- 🗂️ Multiple layouts - Different layouts for different workspaces
- ⚡ Fast & lightweight - Minimal resource usage, runs silently in background
- Linux with X11 (Wayland not currently supported)
- Python 3.10+
- GNOME Desktop Environment (for keyboard shortcuts)
Verify your system:
echo "X11: $XDG_SESSION_TYPE" && gnome-shell --version 2>/dev/nullFirst, install the required system packages:
sudo apt install python3 python3-pip python3-venv python3-gi python3-gi-cairo gir1.2-gtk-3.0 gir1.2-wnck-3.0 python3-xlibIf you use snap-confined applications (like Slack, Discord, Spotify) and want to snap them to zones, install the Window Calls GNOME extension before installing SnapZones:
- Visit https://extensions.gnome.org/extension/4724/window-calls/
- Click "Install"
If you install Window Calls after installing SnapZones, run:
systemctl --user restart snapzonesgit clone https://github.com/Mahrkeenerh/SnapZones.git
cd SnapZones
./install.shThe installer will:
- ✅ Set up Python virtual environment
- ✅ Symlink SnapZones to
~/.local/bin/ - ✅ Configure keyboard shortcut (Super+Shift+Tab)
- ✅ Install systemd user service for autostart
- ✅ Start the daemon
That's it! SnapZones is ready to use.
- Press Alt + Drag a window - Zone overlay appears
- Drag to a zone - Zone highlights
- Release mouse - Window snaps to zone
That's it! No clicking, no extra keys.
Press Super + Shift + Tab to open the zone editor
- H - Show/hide help
Creating Zones:
- Click & Drag empty space to draw a new zone
Precise Movement (1px accuracy):
- Arrow Keys - Move selected zone by 1 pixel
- Alt + Arrow Keys - Resize selected zone by 1 pixel
- 🖱️ System tray icon - Quick access to settings and controls
- ⚙️ Settings and configurations - Customizable behavior and preferences
- 🧲 Multi-zone proximity snapping - Combined area detection when zones are close together
- 📏 Magnetic edge snapping in editor - Toggle-able snap-to-grid for precise zone alignment
systemctl --user status snapzonessystemctl --user restart snapzonesRestart is needed after:
- Installing/updating Window Calls extension
- Configuration changes
- Troubleshooting issues
systemctl --user stop snapzonesjournalctl --user -u snapzonessystemctl --user enable snapzones # Start on login
systemctl --user disable snapzones # Don't start on logincd SnapZones
./uninstall.shConfiguration files are stored in ~/.config/snapzones/:
layouts/- Your custom zone layoutsworkspace_layouts.json- Workspace-to-layout mappings
Note: Zones are automatically constrained to your usable screen area, excluding panels and docks. Windows won't be placed under your top panel.
Install the Window Calls extension (see installation section above). SnapZones will automatically detect and use it.
Check if Super+Shift+Tab is already used by another application:
gsettings get org.gnome.desktop.wm.keybindings switch-group-backwardCheck logs for error messages:
journalctl --user -u snapzonesMake sure the daemon is running:
systemctl --user status snapzonesIf stopped, restart it:
systemctl --user restart snapzonesThis project is licensed under the MIT License - see the LICENSE file for details.
Inspired by Microsoft PowerToys FancyZones.
Built with Python, GTK3, Cairo, and python-xlib.
Optional integration with Window Calls GNOME extension.
