From 7a51f522e4411664b381a5652de3099245181314 Mon Sep 17 00:00:00 2001 From: Prad Nukala Date: Sun, 18 Oct 2026 13:29:47 -0400 Subject: [PATCH] docs(desktop): document Umbriel package and layout updates --- docs/chezmoi/data.mdx | 3 +-- docs/chezmoi/externals-and-ignore.mdx | 3 ++- docs/chezmoi/scripts.mdx | 2 +- docs/desktop/index.mdx | 7 +++--- docs/desktop/umbriel.mdx | 31 +++++++++++++++++---------- docs/shell/scripts.mdx | 20 +++++++++++++++++ 6 files changed, 47 insertions(+), 19 deletions(-) diff --git a/docs/chezmoi/data.mdx b/docs/chezmoi/data.mdx index 438b177..b826bfc 100644 --- a/docs/chezmoi/data.mdx +++ b/docs/chezmoi/data.mdx @@ -39,9 +39,8 @@ One manifest per platform, plus a `shared` block. Any edit to the file changes t | Source | Packages | | --- | --- | | pacman | `niri`, `noctalia`, `xwayland-satellite`, `polkit`, `polkit-gnome`, `uwsm`, `xdg-user-dirs`; Wayland utilities `wl-clipboard`, `cliphist`, `wtype`, `ydotool`, `grim`, `slurp`, `hyprpicker`, `pamixer`, `brightnessctl`, `libnotify`; apps `nautilus`, `imv`, `mpv`, `evince`, `chromium`, `obsidian`; strata runtime deps `bubblewrap`, `desktop-file-utils`, `fontconfig`, `gstreamer`, `gst-libav`, `gst-plugins-base`, `gst-plugins-good`, `gtk4`, `gtksourceview5`, `gvfs`, `poppler-glib`, `xdg-utils` | -| AUR (or a sync repo with the same name) | `vicinae-bin`, `tldraw-offline-bin`, `bibata-cursor-translucent` (the `Bibata_Ghost` cursor); desktop apps `beeper-bin`, `fastmail`, `1password`, `brave-origin-bin`, `claude-desktop`, `spotify` | +| AUR (or a sync repo with the same name) | `vicinae-bin`, `tldraw-offline-bin`, `bibata-cursor-translucent` (the `Bibata_Ghost` cursor), `umbriel-git` (pulls in `xdg-desktop-portal-umbriel-git`; the `[cachyos]` `umbriel` lacks `window-move-by`); desktop apps `beeper-bin`, `fastmail`, `1password`, `brave-origin-bin`, `claude-desktop`, `spotify` | | `[omarchy]` repo (`packages.arch.desktop.omarchy`, only when `pacman-conf -l` lists that repo) | `herdr`, `flea`, `voxtype-bin`, `xdg-terminal-exec`, `hyprland-preview-share-picker` | -| `[cachyos]` repo (`packages.arch.desktop.cachyos`, only when `pacman-conf -l` lists that repo) | `umbriel`, `xdg-desktop-portal-umbriel` (the AUR `umbriel` is a placeholder and `umbriel-git` conflicts with the repo build) | Hyprland, Waybar and the `omarchy-*` commands come with the Omarchy install and are not declared. `niri-dynamic-workspaces` (niri startup) has no package; install it by hand. strata (the folder handler) has no package either; [15-tools](/chezmoi/scripts#15-tools) runs its installer. diff --git a/docs/chezmoi/externals-and-ignore.mdx b/docs/chezmoi/externals-and-ignore.mdx index 81aef04..b212592 100644 --- a/docs/chezmoi/externals-and-ignore.mdx +++ b/docs/chezmoi/externals-and-ignore.mdx @@ -165,13 +165,14 @@ mise tool versions stay local to each machine and are not managed. .local/bin/niri-launch .local/bin/umbriel-launch .local/bin/umbriel-smart-move +.local/bin/umbriel-float-square .config/fish/auto-Niri.fish .local/bin/cp-appid .local/bin/projects-sync {{ end }} ``` -The block is emitted, and these paths skipped, unless the OS is `linux` and the role is `desktop` or `laptop`. `mac` and `server` machines, and any non-Linux machine regardless of role, never receive the niri, Umbriel, and Hyprland configs (`dot_config/niri/`, `dot_config/umbriel/`, `dot_config/hypr/`), the Noctalia external (`~/.config/noctalia`, never cloned there), fontconfig (`dot_config/fontconfig/fonts.conf`), default-app associations (`dot_config/mimeapps.list`), the fish auto-start hook (`dot_config/fish/auto-Niri.fish`), the systemd user units (`dot_config/systemd/user/kitty-day-save.service`, `projects-sync.service`, `projects-sync.timer`), or the `niri-launch`, `umbriel-launch`, `umbriel-smart-move`, `cp-appid`, `kitty-day-save` and `projects-sync` scripts. The `niri-dynamic-workspaces` rule matches nothing in the current source tree; it only takes effect if that config is added later. +The block is emitted, and these paths skipped, unless the OS is `linux` and the role is `desktop` or `laptop`. `mac` and `server` machines, and any non-Linux machine regardless of role, never receive the niri, Umbriel, and Hyprland configs (`dot_config/niri/`, `dot_config/umbriel/`, `dot_config/hypr/`), the Noctalia external (`~/.config/noctalia`, never cloned there), fontconfig (`dot_config/fontconfig/fonts.conf`), default-app associations (`dot_config/mimeapps.list`), the fish auto-start hook (`dot_config/fish/auto-Niri.fish`), the systemd user units (`dot_config/systemd/user/kitty-day-save.service`, `projects-sync.service`, `projects-sync.timer`), or the `niri-launch`, `umbriel-launch`, `umbriel-smart-move`, `umbriel-float-square`, `cp-appid`, `kitty-day-save` and `projects-sync` scripts. The `niri-dynamic-workspaces` rule matches nothing in the current source tree; it only takes effect if that config is added later. | Machine | Desktop layer | | --- | --- | diff --git a/docs/chezmoi/scripts.mdx b/docs/chezmoi/scripts.mdx index 77ebb12..f164631 100644 --- a/docs/chezmoi/scripts.mdx +++ b/docs/chezmoi/scripts.mdx @@ -49,7 +49,7 @@ Seven scripts run during `chezmoi apply`. Five live in `.chezmoiscripts/`, a dir 1. Uses `pacman` directly when running as root, otherwise `sudo pacman`. 2. `pacman -T` filters each list down to names no installed package provides (so `mise-bin` satisfies `mise`, `yazi-git` satisfies `yazi`), then `pacman -S --needed --noconfirm` installs the rest of `packages.arch.pacman`. -3. For roles `desktop` and `laptop`, the same for `packages.arch.desktop.pacman`, and for `packages.arch.desktop.omarchy` / `packages.arch.desktop.cachyos` when `pacman-conf -l` lists an `omarchy` / `cachyos` repo. +3. For roles `desktop` and `laptop`, the same for `packages.arch.desktop.pacman`, and for `packages.arch.desktop.omarchy` when `pacman-conf -l` lists an `omarchy` repo. 4. Builds the AUR list: `packages.arch.desktop.aur` plus `packages.arch.aur` for `desktop`/`laptop`, only `packages.arch.aur` for other roles, then drops every name `pacman -T` says is already provided. Desktop apps already installed from a sync repo (CachyOS, `[omarchy]`) are therefore neither rebuilt nor replaced. 5. If anything is left and neither `yay` nor `paru` is installed, bootstraps `yay`: from a sync repo when `pacman -Si yay` finds one (CachyOS, chaotic-aur), otherwise by building `yay-bin` from the AUR with `makepkg -si` (installs `git` and `base-devel` first; skipped as root, since makepkg refuses root). 6. Runs `yay -S --needed --noconfirm` on the remaining names, falling back to `paru`. yay prefers a sync repo over the AUR when both have the name. If no helper could be bootstrapped it prints `warning: no yay/paru and none could be bootstrapped — skipping AUR packages: …` and continues. diff --git a/docs/desktop/index.mdx b/docs/desktop/index.mdx index 99510fe..6c52e7e 100644 --- a/docs/desktop/index.mdx +++ b/docs/desktop/index.mdx @@ -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. diff --git a/docs/desktop/umbriel.mdx b/docs/desktop/umbriel.mdx index cb5726c..39c6420 100644 --- a/docs/desktop/umbriel.mdx +++ b/docs/desktop/umbriel.mdx @@ -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`. diff --git a/docs/shell/scripts.mdx b/docs/shell/scripts.mdx index a88badf..555f87b 100644 --- a/docs/shell/scripts.mdx +++ b/docs/shell/scripts.mdx @@ -32,6 +32,7 @@ Several scripts below also exist as fish functions of the same name (`ai`, `c2p` | --- | --- | --- | | [`ai`](#ai) | sh | Pick an AI CLI with gum and launch it | | [`atuin-pick`](#atuin-pick) | python3 | atuin history picker for a kitty or tmux split | +| [`brave-new-tab`](#brave-new-tab) | sh | Open a URL in a new Brave Origin tab | | [`c2p`](#c2p) | sh | code2prompt with an fzf-picked template | | [`extract_agents`](#extract_agents) | sh | Copy all `AGENTS.md` files into a directory tree | | [`fab`](#fab) | sh | fzf picker for Fabric patterns | @@ -79,6 +80,25 @@ It is written for launch contexts where atuin's shell init never ran. It runs `a **Needs:** `python3`, `atuin`, `fish`. +## brave-new-tab + +```sh +brave-new-tab +``` + +Runs `brave-origin --new-tab ` detached with `setsid -f`. With Brave Origin running, the URL opens as a tab in its last active window; otherwise Brave Origin starts with it. Exits 2 unless given exactly one argument. + +A URL without a scheme gets one from its host (port and path ignored): `localhost`, `*.localhost`, `*.local`, and `127.*` get `http://`, everything else `https://`. URLs containing `://`, and `about:` URLs, pass through unchanged. + +| Argument | Opens | +| --- | --- | +| `example.com/path` | `https://example.com/path` | +| `localhost:3000` | `http://localhost:3000` | +| `printer.local` | `http://printer.local` | +| `http://example.com` | `http://example.com` | + +**Needs:** `brave-origin` (`brave-origin-bin`), `setsid` (util-linux). + ## c2p ```sh