Plan workspaces across a laptop and an external monitor
Keep task roles stable while connecting and disconnecting displays, distinguish window moves from workspace moves, and recover hidden work without restarting apps.
Based on public documentation; not hardware-tested. Match the instructions to your version and hardware.
On the laptop, workspace 1 holds code and workspace 2 holds reference material. At a desk, you want code on the larger screen and reference on the laptop. After unplugging, both tasks should remain accessible. This requires a workspace plan, not just the right display resolution.
The examples follow the pinned 4.0.0.alpha source and Lua dispatchers. Discover your own output names and bindings. eDP-1, DP-1 and workspace numbers below are teaching labels, not facts about your hardware. First make both displays usable with display geometry and scaling.
1. Four identities explain most confusion
Section titled “1. Four identities explain most confusion”application → one or more windowswindow → belongs to a workspaceworkspace → assigned to a monitormonitor → has a position and scale in the desktop coordinate space| Operation | What moves | What stays together |
|---|---|---|
| Focus another monitor | Keyboard focus | Windows and workspaces stay placed |
| Move a window to workspace 2 | One selected window | Other windows in its former workspace stay |
| Move workspace 1 to another monitor | Its whole task surface | Windows belonging to that workspace |
| Switch workspace layout | Arrangement inside a workspace | Its number and task role |
Workspace 1 is not “workspace 1 on each monitor.” Ordinary numeric IDs identify workspaces across the session. Each monitor can show an active workspace, but the same ordinary workspace is not simultaneously duplicated on both displays.
A special scratchpad and a pinned floating window are separate cases. The scratchpad can cover the ordinary workspace; a pinned floating window can follow workspace changes on its monitor. Do not use these exceptions as the model for all windows.
2. Start with a plan that works on one screen
Section titled “2. Start with a plan that works on one screen”| Workspace | Role | Laptop alone | At the desk |
|---|---|---|---|
| 1 | Editor and working terminal | Laptop | External display |
| 2 | Browser and documentation | Laptop | Laptop |
| 3 | Chat or occasional tools | Laptop, when needed | Whichever screen you choose |
Keep the numbers tied to tasks rather than connector names. The same shortcuts then remain useful when the dock is unavailable. Do not initially reserve ten workspaces per monitor: first learn whether your actual work needs those groups.
Record the current state before moving test windows:
hyprctl monitors -jhyprctl workspaces -jhyprctl clients -jomarchy menu keybindings --printIn the output, relate monitor name and position, workspace ID and monitor, then each window’s class/title and workspace. A shortened teaching inventory might be:
eDP-1: workspace 2, position 0x0DP-1: workspace 1, position 1440x0editor window: workspace 1browser window: workspace 2Keep this inventory local; titles can contain personal filenames or messages. An empty workspace may disappear when inactive unless configured persistent. A missing empty workspace in the query is not evidence of lost data.
3. Connect the external screen and move the task
Section titled “3. Connect the external screen and move the task”Connect with the lid open. Query monitors again and confirm both are enabled and arranged as intended. Physical “right” and configured “right” can differ; directional monitor actions use the configured desktop geometry.
Focus workspace 1 with its verified workspace shortcut. In the pinned defaults, Super + Shift + Alt + Right moves the active workspace to the monitor on the right. If your external screen is on the left, use the matching direction instead. This keeps the editor and its terminal together.
If you prefer an explicit command and the actual external name is DP-1, on the intended active workspace:
hyprctl dispatch 'hl.dsp.workspace.move({ monitor = "DP-1" })'This targets the current workspace, not every workspace and not an inactive workspace guessed by title. Immediately inspect hyprctl activeworkspace and hyprctl workspaces -j; confirm the intended ID now names the external monitor. Do not repeatedly issue the move while unsure what is active. Shipped move bindings
Now use the verified Ctrl + Alt + Tab monitor-focus action to reach the laptop, then select workspace 2. Check that code remains visible on the external screen and docs remain visible on the laptop. If selecting a workspace focuses the other display, inspect where that workspace lives; switching does not mean cloning it onto the focused display.
4. Move one window without moving the whole task
Section titled “4. Move one window without moving the whole task”Suppose a browser window belongs with the coding task. Focus only that window, then move it to workspace 1. The pinned Super + Shift + 1 moves and follows; Super + Shift + Alt + 1 moves silently.
-- These are existing-action equivalents, not lines to add as duplicate bindings.hl.dsp.window.move({ workspace = "1" })hl.dsp.window.move({ workspace = "1", follow = false })The silent action avoids leaving the current task, but it can look like a disappearance. Check the destination workspace. It does not move all browser windows, and it does not mean “send to monitor 1.”
Window startup rules such as workspace = "3 silent" control newly created matching windows. They do not continuously enforce an entire monitor policy, and single-instance apps may reuse old windows. Use window-rule diagnostics before adding automatic placement.
5. Disconnect and recover by identity
Section titled “5. Disconnect and recover by identity”Save work, unplug with the laptop lid open, then query the three inventories again. In the normal compositor flow, workspaces on a removed output are reassigned to remaining outputs. Confirm the result rather than assuming the desktop arrangement is restored exactly. Omarchy’s monitor watcher also reconciles clamshell and output state; it is not a promise to recreate your custom workspace plan. Monitor watcher
Try workspace 1, then workspace 2. You should be able to access code and docs sequentially on the laptop. If one seems missing:
- Check
hyprctl clientsfor its title/class and workspace. - Switch to that ordinary workspace with its verified shortcut.
- If it is in the scratchpad, reveal the scratchpad instead.
- If the workspace is scrolling, navigate to the window outside the viewport.
- If the window is grouped, select its group member.
Do not reopen the app until you know whether the old window exists. Another instance can obscure the real issue and risk confusing unsaved work.
If the output itself is missing or disabled, that is a display problem. Use display troubleshooting. If the monitor exists but your chosen workspace was moved, use the appropriate workspace move. Restarting the entire graphical session is a much broader action than either repair.
Reconnect and repeat the manual task move. A predictable manual plan is a useful baseline before adding automated docking scripts.
6. Add fixed assignment only when its scope matches your setup
Section titled “6. Add fixed assignment only when its scope matches your setup”For an external monitor that is routinely present on a desktop, you may want workspace 1 bound to it. Back up the personal file you will use; if placing the rule in monitors.lua, confirm the main entry loads it. With the verified monitor name:
hl.workspace_rule({ workspace = "1", monitor = "DP-1" })This is an assignment rule, not the same as the one-time move. Test it with a new test workspace/session after saving work; do not assume a reload rearranges every open workspace exactly as expected. Existing rules and output availability matter. Hyprland workspace rules
For a laptop that is often undocked, start with manual moves instead of unconditional pinning to an absent connector. “Persistent” keeps an empty workspace alive; it does not make an absent monitor exist or store application contents. Avoid adding persistent, default and monitor bindings together without a separate reason for each.
Connector names can change when using another port or dock. A desc: monitor selector can help when the description uniquely identifies the screen, but identical displays or changing EDID descriptions can still be ambiguous. Discover both names and descriptions through hyprctl monitors all; never copy a manufacturer’s description from someone else’s setup.
Automatic profiles should account for output presence, startup versus hotplug, open/closed lid and a reachable fallback. That is a separate extension, not something this simple fixed rule guarantees. Do not run another monitor daemon alongside Omarchy’s watcher without understanding which process owns each change.
7. Distinguish saved layout from saved location
Section titled “7. Distinguish saved layout from saved location”Per-workspace layout is saved separately by Omarchy. Moving workspace 1 between screens can preserve its layout choice without restoring your old monitor assignment after the next hotplug. A stable number, a stable layout, and a stable physical screen are three different preferences.
Also compare logical space: a scrolling column sized usefully on the external display may feel narrow on the laptop. First inspect scale and window layout; do not compensate by rewriting every app’s font size each time you unplug. See layout selection and text size.
8. Restore and check the whole connection cycle
Section titled “8. Restore and check the whole connection cycle”Remove only your added assignment rule, compare later edits before restoring a backup, and reload through the menu. Move the test windows or task workspaces back to the recorded screens. Removing a future assignment rule is not itself a command to return every current workspace to its old monitor.
Verify laptop alone → both screens → laptop alone again. Check the same code, browser and terminal windows rather than just the top bar’s workspace marks. For clamshell work, first verify the open-lid cycle, then read lid and sleep behaviour; a lid event changes both security and display handling.
Your success criterion is that each task remains reachable with a known action and no duplicate app launch. This guide is source-reviewed; unplug, dock and lid behaviour still require testing on your actual hardware.