Single-script builder (nosignal.sh) that turns a stock Arch Linux ISO into a fully-offline installer for a themed Hyprland + caelestia (Quickshell) desktop: matching SDDM greeter, Btrfs/Limine bootable snapshots, chwd-style GPU detection, and a curated "os updates" layer (keybind cheatsheet, settings panels, system polish, on-box management skill). See README.md. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
128 lines
7.2 KiB
Markdown
128 lines
7.2 KiB
Markdown
# NoSignal — notes for an AI agent working on this machine
|
|
|
|
You are on **NoSignal**: Arch Linux + Hyprland + the Caelestia shell (Quickshell)
|
|
+ SDDM (themed greeter). A "NoSignal layer" of config and tooling sits ON TOP of
|
|
stock Caelestia. Read this before changing desktop/system config — your job is to
|
|
help the user manage their machine safely.
|
|
|
|
## Config layout — what is safe to edit
|
|
|
|
- `~/.config/caelestia/` — **the NoSignal override layer** (edit here):
|
|
- `hypr-user.conf` — user binds/rules/exec-once; sourced LAST, so it wins.
|
|
This is the right place for new keybinds. `unbind =` works here.
|
|
- `hypr-vars.conf` — `$variables` ($terminal, $kb*, gaps, blur…); sourced
|
|
BEFORE keybinds.conf consumes them.
|
|
- `shell.json`, `shell-tokens.json` — Caelestia shell appearance/behaviour.
|
|
- Deleting any of these files restores stock Caelestia behaviour.
|
|
- `~/.config/hypr` is a **SYMLINK** into `~/.local/share/caelestia` (the
|
|
dotfiles clone). Several other `~/.config` entries (foot, fish, fastfetch,
|
|
uwsm) are symlinks into it too. **Never replace these symlinks with copies**
|
|
and never edit the clone's hyprland.conf directly — use hypr-user.conf.
|
|
- `~/.config/hypr/scripts/wsaction.fish` and `configs.fish` are **bash** ports
|
|
kept under their original .fish names (the stock config calls those paths).
|
|
Keep the names and the bash shebang.
|
|
|
|
## Updates
|
|
|
|
- `~/.local/share/nosignal/` — the on-system layer: component sources, the
|
|
keybindings doc, and `nosignal-update/` (the update command + its migrations).
|
|
- **`nosignal-update`** = the system update command: snapper snapshot →
|
|
`yay -Syu` → run any NEW migrations. Applied migrations are tracked in
|
|
`~/.local/state/nosignal/applied` — do not re-run or edit by hand.
|
|
|
|
## Keybindings
|
|
|
|
- `Super+K` (aliases `Super+/`, `Super+F1`) = searchable fuzzel cheatsheet.
|
|
- **Source of truth: `~/.local/share/nosignal/NoSignal-keybindings.md`** — the
|
|
cheatsheet is GENERATED from it (`nosignal-keybinds-gen`). If you add a bind
|
|
in hypr-user.conf, document it in that file too.
|
|
- Layout follows **Omarchy defaults**: Super+Return terminal (kitty, bash),
|
|
Super+W close, Super+Space launcher, Super+Tab next workspace,
|
|
**Super+Grave = workspace overview**, Super+I Shelly store,
|
|
Super+Ctrl+H monitor editor, Super+Shift+number move-to-workspace
|
|
(bound by KEYCODE — GB layout).
|
|
- **Super+C / Super+V = universal copy/paste** (class-aware sendshortcut;
|
|
clipboard HISTORY is Super+Ctrl+V). **Print = region screenshot** →
|
|
clipboard + ~/Pictures/Screenshots (Shift+Print full). **Super+D =
|
|
dashboard/calendar** (communication workspace → Super+Shift+D).
|
|
**Super+M = CLIAmp**, the default music player (floating TUI; audio files
|
|
open in it via `~/.config/mimeapps.list`). The shell's music/MPRIS panel
|
|
is **Super+Shift+M**.
|
|
|
|
## Shell / desktop architecture gotchas
|
|
|
|
- The Caelestia shell runs from `/etc/xdg/quickshell/caelestia`. NoSignal
|
|
patches THREE things there, each re-applied by its own pacman hook after
|
|
every caelestia-shell upgrade: the Settings → System → **Updates** page
|
|
(`PageCompRegistry.qml` + `pages/UpdatesPage.qml`), the Settings →
|
|
**Additions** page (same registry + `pages/AdditionsPage.qml` +
|
|
Plugins→Additions relabel in `PageRegistry.qml`; backend =
|
|
`nosignal-additions` + `additions.json` in the layer tree), and the Wi-Fi
|
|
wrong-password recovery in `utils/NetworkConnection.qml`.
|
|
**Do NOT create `~/.config/quickshell/caelestia`** — a user copy shadows
|
|
/etc/xdg and silently drops the patches (and future ones).
|
|
If the shell ever fails at login (background but no bar): reproduce with
|
|
`qs -c caelestia -n` from a TTY (`WAYLAND_DISPLAY=wayland-1`) to get the QML
|
|
error chain; suspect the page patches first.
|
|
- The workspace **overview is a separate Quickshell instance**
|
|
(`~/.config/quickshell/overview`, `qs -c overview -d`, IPC-toggled by
|
|
Super+Grave). It is independent of the main shell.
|
|
- The update-status timer (`nosignal-update-check.timer`, user),
|
|
`hyprmoncfgd` (monitor hotplug profiles, user) and
|
|
`hyprmoncfgd-rescan.path` (watches `~/.config/hyprmoncfg/profiles/` and
|
|
bounces the daemon so plain profile saves apply live) are enabled systemd
|
|
USER units. Status: `systemctl --user status <unit>`.
|
|
|
|
## Monitors
|
|
|
|
- Use **hyprmoncfg** (`Super+Ctrl+H`, TUI) — it writes
|
|
`~/.config/hypr/monitors.conf` (+ workspaces.conf), which hypr-user.conf
|
|
sources. Keep those `source =` lines; hyprmoncfg refuses to write otherwise.
|
|
- Both the TUI bind and the `hyprmoncfgd` daemon run with
|
|
`--hypr-config ~/.config/caelestia/hypr-user.conf --monitors-conf
|
|
~/.config/hypr/monitors.conf` (hyprmoncfg doesn't follow nested `source =`
|
|
includes). Keep the flags; the daemon's drop-in lives at
|
|
`~/.config/systemd/user/hyprmoncfgd.service.d/override.conf`.
|
|
|
|
## Login / display manager / gaming
|
|
|
|
- **SDDM** is the display manager. Config drop-ins in `/etc/sddm.conf.d/`:
|
|
`10-nosignal.conf` (X11 greeter, uwsm session notes) + `20-sddm-theme.conf`
|
|
(themed greeter). The desktop session MUST stay `hyprland-uwsm.desktop`
|
|
(uwsm-managed) — plain hyprland.desktop loses caelestia's session env.
|
|
- The greeter theme (`/usr/share/sddm/themes/caelestia`) mirrors the desktop
|
|
scheme. After changing wallpaper, run **`sudo sddm-theme-sync`** to update
|
|
the login screen (it does not auto-follow).
|
|
- **Gaming Mode is OPT-IN**: run `sh ~/deckshift/deckshift.sh`, then
|
|
`sh ~/.local/share/nosignal/deckshift-login/install-deckshift-login.sh`
|
|
(re-run the fix after any deckshift.sh re-run). Then Super+Shift+S enters
|
|
the full gamescope/Steam session; Super+Shift+R (inside it) returns. Cold
|
|
boots always show the password greeter (one-shot autologin). `[multilib]`
|
|
is enabled and `omarchy-pkg-add` & friends are shims in `~/.local/bin`.
|
|
|
|
## Packages / system
|
|
|
|
- `yay` for AUR; **Shelly** (`shelly-ui`, Super+I) is the GUI store
|
|
(repos + AUR + Flathub). Flathub remote is preconfigured. Settings →
|
|
**Additions** installs curated optional software (DeckShift, Spotify,
|
|
Once, Obsidian, OBS, Claude Code, Codex, opencode) from official sources
|
|
only — extend via `additions.json` in the layer tree, no code changes.
|
|
- The firewall is **ufw**, enabled with Omarchy-style defaults — it is easy
|
|
to miss because nothing advertises it: `sudo ufw status`.
|
|
- The `fish` package is REQUIRED by caelestia-meta — do not remove it, even
|
|
though bash is the login/terminal shell.
|
|
- Btrfs + snapper: every pacman transaction snapshots (snap-pac); snapshots
|
|
are BOOTABLE from the Limine menu (limine-snapper-sync, UKI at
|
|
/boot/EFI/Linux/nosignal_linux.efi). Worst case: reboot → pick a snapshot.
|
|
- `[omarchy]` repo in pacman.conf provides prebuilt limine-snapper tools.
|
|
- omarchy-send is installed (LAN file transfer; receive dir `~/Omarchy-Send`,
|
|
TUI in launcher, CLI: `omarchy-send -to <alias> <files>`). Its config
|
|
contains a private key — never copy/share `~/.config/omarchy-send/`.
|
|
|
|
## Theme
|
|
|
|
- Wallpapers: `~/Pictures/Wallpapers/nosignal/` (the OS art set; default
|
|
foam-sea.png). The colour scheme is Caelestia's **dynamic** Material scheme,
|
|
generated FROM the current wallpaper — change wallpaper via the Caelestia
|
|
UI or `caelestia wallpaper -f <file>` and the palette follows. The SDDM
|
|
greeter does NOT auto-follow: run `sudo sddm-theme-sync` after.
|