Skip to content

Rift nearly unusable on multiple monitors #284

@ChristinWhite

Description

@ChristinWhite

I'm absolutely loving Rift, it's so much more flexible than any other of the other macOS dynamic window managers with few tradeoffs.

However, one of the tradeoffs I just discovered when connecting a second display is that its multi-display support seems to be in a really rough place right now.

Unpredictable UX

When I start Rift with multiple displays it feels clunky and unpredictable. Every time I switch workspaces I don't know which display it will switch to, whether or not the windows assigned to that workspace will be visible or not or whether the unfocused display will also switch workspaces. I really miss Aerospace's single display spaces that can be assigned to one display or another.

Uncontrollable Window Flickering

The bigger problem, is that within a few workspace switches, or especially if I try to use rift-cli execute display move-window, Rift freaks out completely and has to be killed and restarted.

Config

[settings]
animate = false
animation_duration = 0.3
animation_fps = 100.3

# Space activation behavior
default_disable = false

# Mouse/Focus behavior
focus_follows_mouse = false
mouse_follows_focus = true
mouse_hides_on_focus = true

# Prevent certain apps from stealing focus/causing workspace switches
auto_focus_blacklist = []

# Run commands on start
run_on_start = []

# Hot Reloading
hot_reload = true

[settings.layout]
mode = "traditional"

# these settings only apply when layout mode == "master_stack"
[settings.layout.master_stack]
master_ratio = 0.7
master_count = 1
master_side = "left"
new_window_placement = "master"

# these settings only apply when layout mode == "scrolling"
[settings.layout.scrolling]
column_width_ratio = 0.6
min_column_width_ratio = 0.3
max_column_width_ratio = 1
alignment = "center"
focus_navigation_style = "niri"
animate = false

[settings.layout.scrolling.gestures]
enabled = false
invert_horizontal = false
fingers = 3
propagate_to_workspace_swipe = false

[settings.layout.stack]
stack_offset = 20.0

# Default stacking orientation when creating a new stack.
default_orientation = "perpendicular"

# Gap configuration
[settings.layout.gaps]

[settings.layout.gaps.outer]
top = 8
left = 8
bottom = 8
right = 8

[settings.layout.gaps.inner]
horizontal = 8
vertical = 8

[settings.ui.menu_bar]
enabled = true
show_empty = false
mode = "active"
active_label = "name"
display_style = "label"

[settings.ui.stack_line]
enabled = false
horiz_placement = "top"
vert_placement = "left"
thickness = 20.0
spacing = 1.0

# experimental mission control
[settings.ui.mission_control]
enabled = true
fade_enabled = false
fade_duration_ms = 180.0

# Trackpad gestures
[settings.gestures]
enabled = false
invert_horizontal_swipe = false
swipe_vertical_tolerance = 0.4
skip_empty = true
fingers = 3
distance_pct = 0.08
haptics_enabled = true
haptic_pattern = "level_change"

# Window snapping / drag-swap behavior
[settings.window_snapping]
drag_swap_fraction = 0.3

# Virtual workspaces
[virtual_workspaces]
enabled = true
default_workspace_count = 26
auto_assign_windows = true
preserve_focus_per_workspace = true
workspace_auto_back_and_forth = false
reapply_app_rules_on_title_change = false

# Workspace-specific rules
workspace_rules = [
	{ workspace = "󰭹 Chat", layout = "scrolling" },
	{ workspace = " Social", layout = "scrolling" },
]

# Default workspace to activate on startup (0-based index).
default_workspace = 0

# Workspace names (indexed order). If fewer than default_workspace_count are provided,
workspace_names = [
	"󰹑 Workspace 1", # 0
	"󰹑 Workspace 2", # 1 
	"󰹑 Workspace 3", # 2 
	"󰹑 Workspace 4", # 3 
	"󰹑 Workspace 5", # 4 
	"󰹑 Workspace 6", # 5 
	"󰹑 Workspace 7", # 6 
	"󰹑 Workspace 8", # 7 
	"󰹑 Workspace 9", # 8 
	" AI",          # 9 
	"󰀹 Browser",     # 10 
	"󰭹 Chat",        # 11 
	" Development", # 12 
	"󱧶 Files",       # 13 
	" Gaming",      # 14 
	" Inboxes",     # 15
	" Library",     # 16
	" Media",       # 17
	" Office",      # 18
	"󱞏 PKM",         # 19
	" Read",        # 20
	" Social",      # 21
	" Terminal",    # 22
	" Utility",     # 23
	" VM",          # 24
	"󰖟 Web",         # 25
]

# App rules (automatic assignment)
app_rules = [
	# Unmanaged
	{ app_id = "com.IdeaPunch.ColorSlurp", manage = false },
	{ app_id = "io.github.keycastr", manage = false },
	{ app_id = "com.chabomakers.Antinote", manage = false },

	# Floating
	{ app_id = "com.apple.systempreferences", floating = true },

	# AI
	{ app_id = "com.wearedevx.alter", workspace = " AI" },
	{ app_id = "com.wlly.janome.transcribex-setapp", workspace = " AI" },

	# Browser
	{ app_id = "cc.anybox.Anybox", workspace = "󰀹 Browser" },
	{ app_id = "net.imput.helium", title_substring = "QuicKey", floating = true },
	{ app_id = "net.imput.helium", workspace = "󰀹 Browser" },

	# Chat
	{ app_id = "org.equicord.equibop", workspace = "󰭹 Chat" },
	{ app_id = "com.apple.MobileSMS", workspace = "󰭹 Chat" },

	# Development

	# Files
	{ app_id = "com.jinghaoshe.qspace.pro", workspace = "󱧶 Files" },

	# Gaming
	{ app_id = "com.steam.steam", workspace = "󰓩 Gaming" },

	# Inboxes
	{ app_id = "com.apple.mail", workspace = "󰙯 Inboxes" },
	{ app_id = "com.fastmail.mac.Fastmail", workspace = "󰙯 Inboxes" },

	# Library
	{ app_id = "tw.ogdesign.eagle", workspace = " Library" },

	# Media
	{ app_id = "com.demusapp.app", workspace = " Media" },
	{ app_id = "com.microsoft.edgemac", workspace = " Media" },

	# Office

	# PKM
	{ app_id = "com.agiletortoise.Drafts-OSX", workspace = "󱞏 PKM" },
	{ app_id = "md.obsidian", workspace = "󱞏 PKM" },

	# Read
	{ app_id = "io.readwise.read", workspace = " Read" },
	{ app_id = "com.pentlandFirth.Unwatched", workspace = " Read" },

	# Social

	# Terminal
	{ app_id = "com.mitchellh.ghostty", workspace = " Terminal" },
	{ app_id = "com.github.wez.wezterm", workspace = " Terminal" },

	# Utility
	{ app_id = "com.peterborgapps.LingonX9", workspace = " Utility" },

	# VM

	# Web

]

[modifier_combinations]

[keys]

Note that I'm controlling Rift entirely via the CLI with Kanata and Hammerspoon bindings.

I'm not sure if it makes any difference but this is using Sidecar with my iPad as a second display, I can try second normal display later this week when back to my normal setup.

System

macOS Tahoe 26.3 (25D125)
Rift 0.4.0-alpha.3
Installed via: acsandmann/tap/rift

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions