docs(desktop): document Umbriel package and layout updates

This commit is contained in:
Prad Nukala committed 2026-10-18 13:29:47 -04:00
1 parent 229753f7ba
commit 7a51f522e4
6 files changed
+47 -19

No files matched your search

+3 -4
View File
@@ -6,7 +6,7 @@ sidebar:
---
:::note[Role gating]
`.chezmoiignore.tmpl` skips the Linux desktop layer unless the machine runs Linux **and** its role is `desktop` or `laptop`. The gated targets are `~/.config/niri`, `~/.config/hypr`, `~/.config/umbriel`, `~/.config/uwsm`, `~/.config/noctalia`, `~/.config/vicinae`, `~/.config/niri-dynamic-workspaces`, `~/.config/fontconfig`, `~/.config/mimeapps.list`, `~/.config/xdg-terminals.list`, `~/.config/systemd`, `~/.local/bin/kitty-day-save`, `~/.local/bin/niri-launch`, `~/.local/bin/umbriel-launch`, `~/.local/bin/umbriel-smart-move`, `~/.local/bin/cp-appid`, `~/.local/bin/projects-sync`, and `~/.config/fish/auto-Niri.fish`. On `mac` and `server` roles these are not applied.
`.chezmoiignore.tmpl` skips the Linux desktop layer unless the machine runs Linux **and** its role is `desktop` or `laptop`. The gated targets are `~/.config/niri`, `~/.config/hypr`, `~/.config/umbriel`, `~/.config/uwsm`, `~/.config/noctalia`, `~/.config/vicinae`, `~/.config/niri-dynamic-workspaces`, `~/.config/fontconfig`, `~/.config/mimeapps.list`, `~/.config/xdg-terminals.list`, `~/.config/systemd`, `~/.local/bin/kitty-day-save`, `~/.local/bin/niri-launch`, `~/.local/bin/umbriel-launch`, `~/.local/bin/umbriel-smart-move`, `~/.local/bin/umbriel-float-square`, `~/.local/bin/cp-appid`, `~/.local/bin/projects-sync`, and `~/.config/fish/auto-Niri.fish`. On `mac` and `server` roles these are not applied.
`~/.config/waybar`, the `omarchy-*` scripts, the `niri-launch-ai` / `-browser` / `-terminal` / `-webapp` wrappers, and `~/.local/bin/tmux-niri-title` are **not** listed there, so chezmoi applies them on every role and OS. Only the exact path `.local/bin/niri-launch` is ignored, not the wrappers that call it.
:::
@@ -16,7 +16,7 @@ Three Wayland compositors are configured side by side. niri is the original setu
| Page | Covers |
| --- | --- |
| [niri](/desktop/niri) | `~/.config/niri` (base config, Noctalia colors, the `config.d/` fragments, per-display profiles), niri helper scripts, the `niri-launch*` launchers, `cp-appid`, the `nirinit` user service |
| [Umbriel](/desktop/umbriel) | `~/.config/umbriel` (session, layout, outputs, rules, scratchpads, binds), `umbriel-launch`, and `umbriel-smart-move` |
| [Umbriel](/desktop/umbriel) | `~/.config/umbriel` (session, layout, outputs, rules, scratchpads, binds), `umbriel-launch`, `umbriel-smart-move`, and `umbriel-float-square` |
| [Hyprland](/desktop/hyprland) | `~/.config/hypr` Lua config on Omarchy: bindings, input, look and feel, monitors, hyprsunset, the portal; every `omarchy-*` script in `~/.local/bin`. `~/.config/omarchy` (shell, hooks, menus, themes) is the [prdlk/omarchy](https://github.com/prdlk/omarchy) external, see [externals](/chezmoi/externals-and-ignore#app-externals) |
| [Waybar](/desktop/waybar) | `~/.config/waybar`: module layout, stylesheet, the `window_pill.py` title module |
| [Fonts and default apps](/desktop/fonts-and-apps) | `~/.config/fontconfig/fonts.conf`, `~/.config/mimeapps.list`, the Victor Mono Nerd Font packages |
@@ -29,9 +29,8 @@ Three Wayland compositors are configured side by side. niri is the original setu
| Source | Packages |
| --- | --- |
| pacman | `niri`, `noctalia` (the CachyOS build where that repo is configured, else `extra`), `xwayland-satellite`, `polkit`, `polkit-gnome`, `uwsm`, `xdg-user-dirs`, Wayland utilities (`wl-clipboard`, `cliphist`, `wtype`, `ydotool`, `grim`, `slurp`, `hyprpicker`, `pamixer`, `brightnessctl`, `libnotify`), the bound apps (`nautilus`, `imv`, `mpv`, `evince`, `chromium`, `obsidian`), and strata's runtime deps |
| AUR via `yay`/`paru` (a sync repo wins when it has the name) | `vicinae-bin`, `tldraw-offline-bin`, `bibata-cursor-translucent`, and the desktop apps `beeper-bin`, `fastmail`, `1password`, `brave-origin-bin`, `claude-desktop`, `spotify` |
| AUR via `yay`/`paru` (a sync repo wins when it has the name) | `vicinae-bin`, `tldraw-offline-bin`, `bibata-cursor-translucent`, `umbriel-git` (with `xdg-desktop-portal-umbriel-git`), and the desktop apps `beeper-bin`, `fastmail`, `1password`, `brave-origin-bin`, `claude-desktop`, `spotify` |
| `[omarchy]` repo, when configured | `herdr`, `flea`, `voxtype-bin`, `xdg-terminal-exec`, `hyprland-preview-share-picker` |
| `[cachyos]` repo, when configured | `umbriel`, `xdg-desktop-portal-umbriel` |
AUR names that an installed package already provides are skipped; with no `yay` or `paru` the script bootstraps `yay` first. strata, the default file manager, comes from its own installer in [15-tools](/chezmoi/scripts#15-tools). Hyprland, Waybar, and the `omarchy-*` commands that the scripts call (`omarchy-menu`, `omarchy-launch-or-focus`, and others) come from an Omarchy install. This repo does not install them. See [chezmoi scripts](/chezmoi/scripts) for the full install flow and [packages.yaml](/chezmoi/data#packagesyaml) for the complete lists.
+20 -11
View File
@@ -8,7 +8,7 @@ description: Umbriel scrolling compositor config — Noctalia-only session, niri
Noctalia's polkit agent is off by default. `~/.config/noctalia/config.toml` (the [prdlk/noctalia](https://github.com/prdlk/noctalia) external, see [externals](/chezmoi/externals-and-ignore#app-externals); merged under the GUI's unmanaged `~/.local/state/noctalia/settings.toml`) sets `[shell] polkit_agent = true`, so `pkexec` and other privileged actions prompt in a Noctalia panel. `polkitd` itself is D-Bus activated (`polkit.service` is static; nothing to enable). The setting also applies under niri, which still starts polkit-gnome: only one agent registers per session, whichever starts first.
:::note
Linux `desktop` and `laptop` roles only (`.chezmoiignore.tmpl`). `umbriel` and its portal backend `xdg-desktop-portal-umbriel` (screenshots and screen sharing for portal clients) come from the `[cachyos]` repo (`packages.arch.desktop.cachyos`); the AUR `umbriel` is a placeholder and `umbriel-git` conflicts with the repo build, so other Arch machines install them by hand.
Linux `desktop` and `laptop` roles only (`.chezmoiignore.tmpl`). `umbriel-git` comes from the AUR (`packages.arch.desktop.aur`) and pulls in its portal backend `xdg-desktop-portal-umbriel-git` (screenshots and screen sharing for portal clients). The `[cachyos]` `umbriel` build (`0.1.0.r1213`) lacks `window-move-by`, which `binds.toml` uses, and rejects the config. `umbriel-git` conflicts with it, so on a machine that already has the repo build, swap them by hand once (`yay -S umbriel-git`, accepting the removal); the package script runs `--noconfirm`, which declines that removal.
:::
## Files
@@ -21,6 +21,7 @@ Linux `desktop` and `laptop` roles only (`.chezmoiignore.tmpl`). `umbriel` and i
| `dot_config/umbriel/binds.toml` | `~/.config/umbriel/binds.toml` |
| `dot_local/bin/executable_umbriel-launch` | `~/.local/bin/umbriel-launch` |
| `dot_local/bin/executable_umbriel-smart-move` | `~/.local/bin/umbriel-smart-move` |
| `dot_local/bin/executable_umbriel-float-square` | `~/.local/bin/umbriel-float-square` |
Umbriel watches these files and applies a valid save immediately; `umbriel config validate` checks them without a session. Include paths resolve against the symlinks in `~/.config/umbriel`, not the chezmoi source. Defining `[keybinds]` replaces Umbriel's built-in binds, so `binds.toml` is the complete set.
@@ -36,7 +37,7 @@ Umbriel watches these files and applies a valid save immediately; `umbriel confi
| Touchpad | natural scroll, tap, left-right-middle, sensitivity 1.0 | niri |
| Tablet, touch | mapped to `eDP-1` | niri |
| Cursor | `Bibata_Ghost` (dark translucent Bibata, AUR `bibata-cursor-translucent`) 28, hidden while typing, follows keyboard focus (so scratchpads open on the output focus moved to). Umbriel exports it as `XCURSOR_THEME` and over XSETTINGS; GTK apps on Wayland read the GNOME settings instead, set once with `gsettings set org.gnome.desktop.interface cursor-theme Bibata_Ghost` and `… cursor-size 28` (dconf, not managed) | Umbriel |
| Layout | gap 8, presets 0.333 / 0.5 / 0.667, new columns 1/3 on every output, focus never centers, a lone column centers | niri |
| Layout | gap 8, presets 0.333 / 0.5 / 0.667, new columns 1/3 (0.8 on the laptop panel, see [Outputs](#outputs)), focus never centers, a lone column centers | niri |
| Appearance | corner radius 10, no shadows, wallpaper-only blur on every window, tab bar hidden for one tab | niri |
| Activation | apps may focus and reveal their windows (`focus_on_activate`), e.g. Noctalia notification actions | niri `honor-xdg-activation-with-invalid-serial` |
| Overview | zoom 0.4; no hot corner | niri |
@@ -47,21 +48,23 @@ Umbriel owns `XDG_CURRENT_DESKTOP`, so niri's override is not carried over. niri
## Outputs
Matched by monitor identity (`umbriel outputs` → `Config name`). The external scales bring each display to about 110 logical pixels per inch (the ultrawide's native density), so windows keep their size across them; the Studio Display and ultrawide match Hyprland. The laptop panel runs at 1.5 (149 logical ppi), denser than the externals, because scale 2 left too little room. It sits at the origin and every external sits directly to its left at negative x, bottoms aligned. The externals are used one at a time and share that slot.
Matched by monitor identity (`umbriel outputs` → `Config name`). The external scales bring each display to about 110 logical pixels per inch (the ultrawide's native density), so windows keep their size across them; the Studio Display and ultrawide match Hyprland. The laptop panel runs at 2 (112 logical ppi, 1280x800). It sits at the origin and every external sits directly to its left at negative x, bottoms aligned. The externals are used one at a time and share that slot.
| Display | Physical | Scale | Logical | Position | Other |
| --- | --- | --- | --- | --- | --- |
| Laptop (Tianma TL134ADXP03, `eDP-1`) | 2560x1600, 224 ppi | 1.5 | 1706x1066 | `0, 0` | VRR in fullscreen, cursor starts here |
| Apple Studio Display | 5120x2880, 218 ppi | 2 | 2560x1440 | `-2560, -374` | |
| Samsung S34CG50 ultrawide | 3440x1440@100, 110 ppi | 1 | 3440x1440 | `-3440, -374` | VRR in fullscreen |
| Portable HDMI (AOP 16PM1QB) | 1920x1080, 141 ppi, rotated 90° | 1.25 | 864x1536 | `-864, -470` | |
| Portable USB-C (ASUS MB16AC) | 1920x1080, 141 ppi | 1.25 | 1536x864 | `-1536, 202` | |
| Laptop (Tianma TL134ADXP03, `eDP-1`) | 2560x1600, 224 ppi | 2 | 1280x800 | `0, 0` | VRR in fullscreen, cursor starts here, new scrolling columns 0.8 wide |
| Apple Studio Display | 5120x2880, 218 ppi | 2 | 2560x1440 | `-2560, -640` | |
| Samsung S34CG50 ultrawide | 3440x1440@100, 110 ppi | 1 | 3440x1440 | `-3440, -640` | VRR in fullscreen, workspaces 1–9 start in dwindle |
| Portable HDMI (AOP 16PM1QB) | 1920x1080, 141 ppi, rotated 90° | 1.25 | 864x1536 | `-864, -736` | |
| Portable USB-C (ASUS MB16AC) | 1920x1080, 141 ppi | 1.25 | 1536x864 | `-1536, -64` | |
Umbriel sets the layout mode per workspace, not per output, so the ultrawide's dwindle default is nine `[[workspace]]` rules in `outputs.toml`, one for each index 1–9 on that monitor. A workspace past 9 starts in scrolling. `Mod+W` still toggles any workspace between scrolling and dwindle.
The Studio Display's phantom 640x480 connector, which niri switched off as `DP-5`, needs no rule: Umbriel leaves connectors without a preferred mode or identity disabled.
## Scratchpads
Named scratchpads replace Hyprland's `special:*` workspaces and `omarchy-toggle-scratch`. A window rule sends each app into its scratchpad when it opens; toggling an empty scratchpad runs `spawn_when_empty`. A shown scratchpad window floats centered on the output under the pointer at 48% × 77% of its usable area (`default_floating_size`, the last window rule in `rules.toml`: 1638×1109 on the ultrawide, 819×799 on the laptop panel, 1229×1109 on the Studio Display) over a desktop dimmed to 0.6. `animation.scratchpad.maximize` is off. The size is a default: a resident that was already open before the rule changed keeps its old geometry until it is reopened.
Named scratchpads replace Hyprland's `special:*` workspaces and `omarchy-toggle-scratch`. A window rule sends each app into its scratchpad when it opens; toggling an empty scratchpad runs `spawn_when_empty`. A shown scratchpad window floats centered on the output under the pointer at 48% × 77% of its usable area (`default_floating_size`, the last window rule in `rules.toml`: 1638×1109 on the ultrawide, 614×594 on the laptop panel, 1229×1109 on the Studio Display) over a desktop dimmed to 0.6. `animation.scratchpad.maximize` is off. The size is a default: a resident that was already open before the rule changed keeps its old geometry until it is reopened.
| Scratchpad | App id | Launch | Keys |
| --- | --- | --- | --- |
@@ -103,6 +106,7 @@ Noctalia's bar, panels, notifications, dock, OSD, and desktop widgets get blur t
| `Mod+P` | Noctalia clipboard history |
| `Mod+Period` / `Mod+Comma` | Noctalia control center / settings |
| `Super+Alt+Ctrl+N` | Noctalia notes panel |
| `Mod+Shift+B` | Noctalia bookmarks panel (`dunarand/bookmarks` plugin) |
| `Mod+Ctrl+R` | ostt recorder plugin |
| `Mod+Tab` | overview |
| `Mod+Shift+Q` | Noctalia session menu |
@@ -121,7 +125,7 @@ Noctalia's bar, panels, notifications, dock, OSD, and desktop widgets get blur t
| Keys | Cycles | Launches |
| --- | --- | --- |
| `Super+Alt+Ctrl+J` | Ghostty, kitty, alacritty | `ghostty` |
| `Super+Alt+Ctrl+K` | Brave Origin | `brave-origin` |
| `Super+Alt+Ctrl+K` | browsers: Brave Origin, Chromium, Firefox (not web apps) | `brave-origin` |
| `Super+Alt+Ctrl+G` | Ghostty | `ghostty` |
| `Super+Alt+Ctrl+O` | Obsidian | `obsidian` |
| `Super+Alt+Ctrl+F` | strata | `gtk-launch io.github.lgse.Strata` |
@@ -150,10 +154,11 @@ Noctalia's bar, panels, notifications, dock, OSD, and desktop widgets get blur t
| `Mod+R` / `Mod+Shift+R` | cycle width / height presets |
| `Alt+Shift+H` / `Alt+Shift+L` | width −10% / +10% |
| `Alt+Shift+J` / `Alt+Shift+K` | height −10% / +10% |
| `Alt+H` / `Alt+J` / `Alt+K` / `Alt+L` | move the focused floating window 50 px left / down / up / right (`window-move-by`, held keys repeat; kept inside the usable area) |
| `Mod+F` | full-width column |
| `Mod+Shift+F` | maximize to the output edges |
| `Mod+Ctrl+F` | fullscreen |
| `Mod+C` | center column |
| `Mod+C` | floating window: [square it](#float-square) at the usable height minus 4 px top and bottom, centered; tiled: center column |
| `Mod+T` | toggle floating |
| `Mod+W` | toggle the workspace between the scrolling and dwindle layouts |
| `Mod+G` | tab the focused window with the windows stacked in its column, or stack a tab group again (scrolling layout; dwindle has no columns). Windows join a group by dragging onto its tab bar |
@@ -174,3 +179,7 @@ Workspaces are dynamic per output. Not carried over: niri's named `w`/`h`/`x` wo
| alone, at the strip's end | move it to the output on that side (nothing at the outermost output) |
Two presses step a window past its neighbour: the first stacks it into the neighbour's column, the second expels it on the far side. On dwindle and master workspaces it runs `window-move-or-output-left/right`. Floating and scratchpad windows stay put.
### Float square [#float-square]
`umbriel-float-square` (`Mod+C`) acts on the window with keyboard focus (`.active` in `umbriel windows --json`). A floating window becomes a square whose side is the output's usable height (below Noctalia's bar) minus 4 px above and below (`PAD`): `window-set-secondary-extent` and `window-set-primary-extent` get that side as a fraction of the usable height and width. The script then waits up to 1 s for the client to commit the new width, because `window-center` centers the committed size, and centers it. On the laptop panel that is 764×764 at y 32; on the ultrawide 1404×1404. A tiled window gets `column-center`, the previous `Mod+C`.