Skip to content

Aqueous rules.toml Reference

~/.config/aqueous/rules.toml
# =============================================================================
# Aqueous window-rules configuration reference
# =============================================================================
#
# Discovery order (first path wins):
# 1. $AQUEOUS_RULES (~ is expanded)
# 2. [rules].path from wm.toml
# 3. $XDG_CONFIG_HOME/aqueous/rules.toml
# 4. ~/.config/aqueous/rules.toml
#
# Rules are hot-reloaded with the rest of the configuration. The unbound
# builtin action `reload_rules` can also reload only this file.
# -----------------------------------------------------------------------------
# Game Mode policy
# -----------------------------------------------------------------------------
[game_mode]
# Layout used for non-anchor companion windows. Each surviving side column gets
# an independent instance of this layout.
remainder_layout = "grid" # tile | monocle | grid | rows | dwindle | reverse-dwindle | scrolling | float
# Layout used on an output/workspace where Game Mode has no matching anchor.
fallback_layout = "grid" # same accepted values as remainder_layout
# Gap between the anchor and companion columns.
gaps_inner = 8 # integer >= 0
# [layout.options.game-mode] is not a substitute for this section: only common
# layout geometry/border keys are accepted there.
# -----------------------------------------------------------------------------
# Rule fields
# -----------------------------------------------------------------------------
# Rules use first-match-wins order. At least one matcher is required; a block
# without app_id, class, or title is silently discarded. Every matcher present
# in a block must match. app_id is used by native Wayland clients, class is
# useful for XWayland clients, and title matches the current window title.
# Matchers support `*` and `?` globs.
#
# Accepted fields inside [[window]]:
#
# Matchers:
# app_id, class, title
#
# Layout/state:
# layout tile | monocle | grid | rows | dwindle | reverse-dwindle |
# reverse_dwindle | scrolling | float | floating |
# game-mode | game_mode | composable
# workspace 1-based workspace number
# floating true/false; enables floating placement independently of
# layout (layout="float" also sets floating=true)
# fullscreen true/false
# ignore_struts true/false; use the full output instead of panel struts
#
# Floating placement:
# width, height positive pixel sizes; 0/invalid means automatic
# x, y offsets from the usable area's origin; 0 means centered
#
# Game Mode placement:
# anchor center | top | bottom | left | right
# size native, pixels ("2560x1080"), or output fractions
# ("0.7x0.8", each component > 0 and <= 1)
# scale positive multiplier applied to the resolved anchor size
#
# Visuals:
# blur true/false per-window preference; false is useful for
# games/video.
# opacity 0.0 through 1.0
#
# Stateful rule properties have lifecycle ownership. A manual workspace move,
# fullscreen toggle, or floating toggle overrides that property until a new
# matcher becomes active; the rule is not blindly enforced every manage cycle.
# -----------------------------------------------------------------------------
# Complete Game Mode example
# -----------------------------------------------------------------------------
# [[window]]
# app_id = "steam_app_*"
# title = "*"
# layout = "game-mode"
# workspace = 9
# anchor = "center"
# size = "0.70x0.80"
# scale = 1.0
# fullscreen = false
# ignore_struts = false
# blur = false
# opacity = 1.0
# -----------------------------------------------------------------------------
# Complete floating placement example
# -----------------------------------------------------------------------------
# [[window]]
# app_id = "org.example.Dialog"
# class = "ExampleDialog"
# title = "Preferences*"
# layout = "float"
# floating = true
# workspace = 2
# width = 900
# height = 640
# x = 120
# y = 80
# fullscreen = false
# ignore_struts = false
# blur = true
# opacity = 0.95
# -----------------------------------------------------------------------------
# Layer-shell blur examples
# -----------------------------------------------------------------------------
# Layer rules match the namespace advertised by panels, launchers, notification
# surfaces, and other layer-shell clients. blur covers the main surface;
# blur_popups also covers its XDG popups and nested popups. Global blur must be
# enabled in wm.toml, and blur_popups only takes effect when blur is also true.
#
# Run `aqueousctl scene` to discover a mapped surface's namespace.
#
# Blur a panel and its menus/popups:
# [[layer]]
# namespace = "waybar"
# blur = true
# blur_popups = true
#
# Blur only the main surface, leaving its popups unblurred:
# [[layer]]
# namespace = "launcher"
# blur = true
# blur_popups = false
#
# Namespace matchers support `*` and `?` globs:
# [[layer]]
# namespace = "notifications-*"
# blur = true
# blur_popups = true
#
# Explicitly keep a matching layer surface and its popups unblurred:
# [[layer]]
# namespace = "screen-locker"
# blur = false
# blur_popups = false
#
# Layer rules are first-match-wins. Put exact exceptions before broader glob
# rules when their namespace patterns overlap.
# -----------------------------------------------------------------------------
# Other valid size forms
# -----------------------------------------------------------------------------
# [[window]]
# app_id = "cs2"
# layout = "game-mode"
# anchor = "left"
# size = "2560x1080"
# scale = 1.0
#
# [[window]]
# app_id = "dota2"
# layout = "game-mode"
# anchor = "center"
# size = "native"
# scale = 1.0
# Note: the current rule snapshot defaults an omitted layout to game-mode.
# Specify layout explicitly in every rule so visual-only or placement-only
# rules cannot unexpectedly select Game Mode for their output/workspace.
© 2026 Seafoam LabsShelly Chel