JigsawWM is a free and open-source productivity toolkit for Windows that brings advanced automation and tiling window management to your desktop.
It combines:
- JMK Module β a programmable keyboard/mouse automation system inspired by QMK and an alternative to AutoHotkey.
- Tiling Window Manager β automatically arranges your windows, freeing you from tedious manual window placement.
- Daemon Framework β enables background services and daily workflow automation, all easily customizable.
2023-01-01_18-56-36.mp4
Tested on:
- Windows 11 (Build 22000)
- Python 3.11.1
Also compatible with:
- Windows 10
- Python 3.8+
pip install jigsawwm
pip install git+https://github.com/klesh/JigsawWM.git
Download the example config file: example/full.pyw
and adjust it to your needs.
JMK is a programmable input automation engine. Here are some useful examples:
daemon.jmk.core.register_layers([
{
Vk.CAPITAL: JmkTapHold(tap=Vk.ESCAPE, hold=Vk.LCONTROL),
},
])
π‘ Tip: Tap it and hold within quick_tap_term
(default: 120ms) to send multiple Esc
.
daemon.jmk.core.register_layers([
{ Vk.T: JmkTapHold(tap=Vk.T, hold=3) }, # Layer switch
{}, {}, {},
{ Vk.Z: JmkKey(Vk.F1) }, # Layer 3
])
daemon.jmk.hotkeys.register_triggers([
("Win+q", "LAlt+F4"),
([Vk.WIN, Vk.N], minimize_active_window),
])
JigsawWM follows the suckless philosophy and mimics dwm, organizing windows in a strict order and layout for automatic tiling.
daemon.wm.hotkeys = [
([Vk.WIN, Vk.CTRL, Vk.J], daemon.wm.manager.next_window),
([Vk.WIN, Vk.CTRL, Vk.K], daemon.wm.manager.prev_window),
([Vk.WIN, Vk.SHIFT, Vk.J], daemon.wm.manager.swap_next),
([Vk.WIN, Vk.SHIFT, Vk.K], daemon.wm.manager.swap_prev),
("Win+Ctrl+/", daemon.wm.manager.set_master),
("Win+Ctrl+.", daemon.wm.manager.roll_next),
("Win+Ctrl+,", daemon.wm.manager.roll_prev),
([Vk.WIN, Vk.CONTROL, Vk.M], daemon.wm.manager.toggle_mono),
("Win+Shift+Space", daemon.wm.manager.toggle_tilable),
]
# Switch workspace
("Win+Ctrl+a", partial(daemon.wm.manager.switch_to_workspace, 0)),
("Win+Ctrl+s", partial(daemon.wm.manager.switch_to_workspace, 1)),
# Move window to workspace
("Win+Shift+a", partial(daemon.wm.manager.move_to_workspace, 0)),
("Win+Shift+s", partial(daemon.wm.manager.move_to_workspace, 1)),
([Vk.WIN, Vk.U], daemon.wm.manager.prev_monitor),
([Vk.WIN, Vk.I], daemon.wm.manager.next_monitor),
([Vk.WIN, Vk.SHIFT, Vk.U], daemon.wm.manager.move_to_prev_monitor),
([Vk.WIN, Vk.SHIFT, Vk.I], daemon.wm.manager.move_to_next_monitor),
daemon.wm.manager.config = WmConfig(
rules=[
WmRule(exe="Flow.Launcher.exe", manageable=False),
WmRule(exe="7zFM.exe", tilable=False),
]
)
JigsawWM can manage external processes via tray menu:
daemon.register(
ProcessService(
name="syncthing",
args=["syncthing.exe", "-no-browser", "-no-restart", "-no-upgrade"],
log_path=os.path.join(os.getenv("LOCALAPPDATA"), "syncthing.log"),
)
)
daemon.register(
DailyWebsites(
browser_name="thorium",
fav_folder="daily",
test_url="https://google.com",
proxy_url="http://localhost:7890",
)
)
daemon.register(
WorkdayAutoStart(
country_code="CN",
apps=[
r"C:\Users\Klesh\AppData\Local\Feishu\Feishu.exe",
r"C:\Program Files\Betterbird\betterbird.exe",
r"C:\Users\Klesh\AppData\Local\Programs\obsidian\Obsidian.exe",
],
)
)
Double-click your .pyw
file.
A tray icon will appear β right-click it to manage services.
- Press
Win + R
β typeshell:startup
β hit Enter - Add a shortcut to your
.pyw
script in the folder
π Read the Docs