Skip to content

Configuration

Aqueous keeps its configuration in four small TOML files. wm.toml is the entry point; the other files are optional overlays that keep layout, input, and window policy easy to navigate.

  • Directory~/.config/aqueous/
    • wm.toml outputs, keybindings, commands, struts, and global policy
    • layout.toml layout engines, slots, and workspace/output defaults
    • input.toml keyboard, mouse, touchpad, and trackpoint policy
    • rules.toml per-window behavior and game-mode policy

Aqueous accepts a deliberately small TOML-compatible subset: sections, repeated tables, key/value assignments, arrays used by bindings and positions, inline maps used by exec.env, and # comments. Unknown keys and malformed values are ignored individually, while valid recognized values elsewhere in the file still apply.

The compositor checks the resolved files once per second. A changed file is loaded into a complete replacement snapshot and then applied in one manage cycle. This includes keybindings, input settings, layouts, rules, effects, and output configuration. Press Super+R to run the same reload immediately.

[keybinds]
reload_config = "Super+R"
# reload_rules = "Super+Shift+R" # optional: reload only rules.toml

For the standard setup, put all four files in ~/.config/aqueous/. Advanced setups can select alternate paths with environment variables or sidecar selectors:

File Search order (first match wins)
wm.toml $AQUEOUS_CONFIG, $XDG_CONFIG_HOME/aqueous/wm.toml, ~/.config/aqueous/wm.toml, /etc/xdg/aqueous/wm.toml
layout.toml existing ~/.config/aqueous/layout.toml, $AQUEOUS_LAYOUT, [layout].path, $XDG_CONFIG_HOME/aqueous/layout.toml, /etc/xdg/aqueous/layout.toml
input.toml $AQUEOUS_INPUT, [input].path, $XDG_CONFIG_HOME/aqueous/input.toml, ~/.config/aqueous/input.toml, /etc/xdg/aqueous/input.toml
rules.toml $AQUEOUS_RULES, [rules].path, $XDG_CONFIG_HOME/aqueous/rules.toml, ~/.config/aqueous/rules.toml

~ is expanded in explicit paths. A relative [layout].path is resolved next to wm.toml; use an absolute or ~-prefixed path for [input].path and [rules].path.

This example is intentionally compact. It configures two outputs, reserves no extra panel space, defines the commands used by built-in bindings, and points to the three sidecars.

[display]
apply_on_start = true
apply_on_reload = true
[[output]]
name = "eDP-1"
enabled = true
mode = "1920x1200@60"
scale = 1.25
position = [0, 0]
primary = true
layout = "scrolling"
[[output]]
name = "DP-1"
enabled = true
mode = "2560x1440@144"
scale = 1.0
position = [1536, 0] # logical coordinates after eDP-1's scale
adaptive_sync = true
layout = "tile"
[struts]
top = 0
bottom = 0
left = 0
right = 0
[actions]
toggle_start_menu = "noctalia msg panel-toggle launcher"
spawn_terminal = "foot"
lock_screen = "swaylock -f"
[layout]
path = "~/.config/aqueous/layout.toml"
force_ssd = false
[input]
path = "~/.config/aqueous/input.toml"
[rules]
path = "~/.config/aqueous/rules.toml"

Output positions use logical coordinates. If you omit position, Aqueous places otherwise unconfigured outputs in a non-overlapping horizontal row. Display fields accept connector-name globs such as DP-*; layout-only output matching uses an exact connector name. An edid selector is also accepted when connector names are not stable.

transform accepts normal, 90, 180, 270, and the four flipped-* variants. scale must be between 0.5 and 3.0.

Named profiles use the same display fields as [[output]] and can be selected through Aqueous’s output-service API. A fallback profile can provide a safe configuration when a normal output transaction is rejected.

[display]
fallback_profile = "internal-only"
[[display.profile]]
name = "internal-only"
[[display.profile.output]]
name = "eDP-1"
enabled = true
position = [0, 0]
primary = true
[[display.profile.output]]
name = "DP-*"
enabled = false

Use repeated [[exec]] blocks for processes Aqueous should start or supervise. Both name and command are required.

[[exec]]
name = "wallpaper"
command = "swaybg -i ~/.config/aqueous/wallpaper.png -m fill"
when = "startup" # startup | reload | always
once = true
restart = false
log = "/tmp/aqueous-wallpaper.log"
env = { XDG_CURRENT_DESKTOP = "Aqueous" }
  • startup runs during compositor startup.
  • reload runs after a configuration reload.
  • always is eligible in both cases.
  • once = true prevents the same named command from being started twice.
  • restart = true retries a child that exits unsuccessfully.

The packaged Noctalia shell is managed by a systemd user service, so it does not need a second [[exec]] entry.

[state]
fullscreen_hides_bar = true
maximize_full_output = false

maximize_full_output = false keeps maximized windows inside the output’s usable area. The fullscreen_hides_bar compatibility key is parsed, but hiding upper layer-shell surfaces is not currently implemented.

© 2026 Seafoam LabsShelly Chel