A Material You desktop experience for Arch / CachyOS
Built on Niri and Noctalia V5 — and stays out of your way.
Website · Watch demo on Bilibili · Join discussion on Reddit
- Wallpaper Picker (
Super+W) — static + live, search and categories. - Color Sync — Noctalia V5 extracts palettes from wallpaper;
mpvpaper+ffmpegfor video frames. - Light/Dark Sync — GTK 3/4, XDG portal, Kitty, and browsers switch together.
- Eye Care (
Super+N) — warmer color temperature, no blur, opaque windows. - Scratchpad (
Super+~) — persistent Kitty floating terminal. - Orbit Launcher (
Super+A/Super+MouseForward) — vector radial; apps, tools, links, AI/search dial (TOML-configurable). - Shell & Terminal — Fish aliases for proxy/cache, Kitty cursor trails, Windows-style shortcuts.
- NyxMellow — dynamic fcitx5 skin: mellow geometry + Noctalia Material You palette.
- Presets — per-app flavor variants (e.g. kitty transparent); switch with one command, save your setup as a private preset, or edit it in
$EDITOR.
Important
Upgrading from the legacy Bash release (lib/ + v2/): its nyxniri update cannot switch to the current Python layout. Run the current bootstrap once before updating. Configs, ~/.config/NyxNiri/backups/, and legacy ~/.config/dotfiles_backup_* snapshots are preserved.
curl -fsSL --connect-timeout 10 https://raw.githubusercontent.com/ech678/NyxNiri/main/install.sh | bashTip
Without an AUR helper, nyxniri install full can bootstrap paru for you.
# shallow clone: latest snapshot only; drop --depth 1 for full history
git clone --depth 1 https://github.com/ech678/NyxNiri.git ~/NyxNiri
cd ~/NyxNiri && ./install.shComing soon —
paru -S nyxniri-git, with updates handled by pacman.
Mirrors for China (gh-proxy / CDN)
# Standalone via gh-proxy.org
curl -fsSL --connect-timeout 10 https://gh-proxy.org/https://raw.githubusercontent.com/ech678/NyxNiri/main/install.sh | bash
# git clone via gh-proxy.org
git clone --depth 1 https://gh-proxy.org/https://github.com/ech678/NyxNiri.git ~/NyxNiri
cd ~/NyxNiri && ./install.shFor repository downloads, install.sh tries GitHub first, then gh-proxy.
NyxNiri
├── install.sh # lightweight bootstrap entrypoint
├── nyxniri/ # Python core engine (zero pip dependencies)
├── assets/ # static assets (wallpapers, fcitx5 skin templates)
└── configs/
├── niri/ # window manager (.kdl, .toml)
│ └── scripts/ # Orbit launcher, wallpaper picker & scratchpad scripts
├── noctalia/ # shell + theme sync
├── xdg-desktop-portal/ # portal routing (Settings / screencast)
├── kitty/ # terminal
├── fish/ # aliases + functions
├── fastfetch/ # system info
├── zed/ # editor
└── starship.toml # prompt
Note
Configs deploy atomically. Personal tweaks survive updates via the Dunder protocol:
- Any file (e.g.
__custom__.kdl,__custom__.conf) or folder containing__custom__is preserved. ~/.config/niri/monitor.kdlis kept across deployments.
How to customize (Dunder Protocol)
Any file or folder containing __custom__ survives updates and preset switches:
- Loaded per-app: each app uses its native include mechanism — Niri includes
__custom__.kdl, Kitty includes__custom__.conf, while Fish autoloads files underconf.d/. - Modular & composable: to split tweaks across multiple files, simply include them from your main custom file (e.g. put
include "my_rules__custom__.kdl"inside__custom__.kdl— all files containing__custom__remain preserved). - Dedicated files: files referenced by name like
~/.config/niri/monitor.kdlare preserved automatically; edit them directly.
Put shell scripts in ~/.config/NyxNiri/hooks/ to run your own finishing work after every normal config deploy. Scripts ending in .sh run in filename order with a 30-second limit; a failed or timed-out script is reported without blocking the rest. nyxniri test skips these hooks, and ordinary uninstall keeps them.
Some apps ship flavor variants — presets layer between defaults and your __custom__ files, so switching never touches your own tweaks.
Built-in official presets:
kitty:default: standard 90% opacitytransparent: 75% higher translucency flavor
niri:default: minimalist frameless look (default)glow: enables 2px outline and 28px soft diffused ambient glow (improves focus visibility across tiled windows)glow-material-you: focus glow follows Noctalia's current Material You palette
| Command | Description |
|---|---|
nyxniri preset <app> list |
List presets (* marks the active one) |
nyxniri preset <app> apply <name> |
Switch preset (apply default resets) |
nyxniri preset <app> save <name> |
Save the current config as a private preset |
nyxniri preset <app> edit <name> |
Edit a private preset in $EDITOR |
nyxniri preset <app> delete <name> |
Delete a private preset (official ones are read-only) |
Official presets update with nyxniri update; private ones live in ~/.config/NyxNiri/presets/.
Window management
| Shortcut | Action |
|---|---|
| Super + Enter | Open terminal |
| Super + Q | Close window |
| Super + T | Toggle floating/tiling |
| Super + Shift + T | Switch focus between floating and tiling |
| Super + G | Toggle tabbed column display (Tabbed Group) |
| Super + F | Maximize current column |
| Super + Shift + F | Fullscreen |
| Super + Tab | Workspace overview |
| Super + Z / C | Focus left / right column |
| Super + Arrows | Smart focus (column/monitor/workspace) |
| Super + Ctrl + Arrows | Smart move (column/monitor/workspace) |
| Super + Shift + Arrows | Precision local move (incl. within column) |
| Super + D / U | Workspace down/up |
| Super + Space | Switch preset column widths |
| Super + - / = | Decrease/increase column width |
System & components
| Shortcut | Action |
|---|---|
| Super + R | App launcher |
| Super + E | File manager |
| Super + X | Power menu |
| Super + I | Control center |
| Super + V | Clipboard history |
| Super + W | Wallpaper picker (static & live) |
| Super + Ctrl + W | Switch to random wallpaper |
| Super + N | Toggle Eye Care Mode |
| Super + ~ | Toggle Kitty scratchpad terminal |
| Super + A / Super + Mouse Forward | Orbit vector radial launcher |
| Super + L | Lock screen |
| Super + Shift + S | Screenshot |
| Super + Shift + R | Reload Niri |
| Super + Shift + Q | Quit Niri |
Tip
Quick reference: nyxhelp keys. For Niri's full overlay, press Super + /.
The GTK theme and fisher plugin manager deploy automatically with a full install; the items below are opt-in.
NyxMellow fcitx5 skin: mellow rounded shape matching Noctalia color palette (auto light/dark switch). nyxniri fcitx install registers it as a template and re-renders on wallpaper/theme changes. Opt-in only.
NyxMellow skin in light and dark mode
Wallpaper & video pack: high-res wallpapers and live videos (~100MB) live in wallpaper-collection. Opt-in during install or download anytime via nyxniri wallpapers.
Noctalia Greeter: greetd login screen matching Noctalia style, nyxniri greeter install installs greetd + noctalia-greeter (AUR), backs up existing configuration, configures Polkit rules, then switches the next boot to greetd without ending the current session, a failed switch or nyxniri greeter uninstall restores the previous display manager
nyxniri manages install, snapshots and diagnostics. Interactive deployments create a snapshot in ~/.config/NyxNiri/backups/ by default.
Legacy Bash users must run the current bootstrap shown above before using these commands. The old
nyxniri updatecannot perform the directory migration.
Top-level
| Command | Description |
|---|---|
nyxniri |
Interactive menu |
nyxniri test |
Developer test deploy (no backup, keep monitor.kdl) |
Deploy
| Command | Description |
|---|---|
nyxniri install [full|config] |
Deploy everything, or sync configs only |
nyxniri update [--force|--no-deploy] |
Update source; force config deployment or skip it |
Snapshots
| Command | Description |
|---|---|
nyxniri snapshot [note] |
Save current config state |
nyxniri snapshot delete [idx] |
Delete snapshots (multi-select if no index) |
nyxniri rollback [index] |
Restore a snapshot |
nyxniri list |
List snapshots |
System
| Command | Description |
|---|---|
nyxniri doctor |
Dependency + system health check |
nyxniri deps |
Open dependency check & install menu |
nyxniri apps |
Category-grouped recommended apps installer (Brave, Steam, WeChat, ...) |
nyxniri wallpapers |
Download the full wallpaper & video pack from the external repo |
nyxniri theme [toggle|dark|light|sync|status] |
Switch or sync system dark/light theme |
nyxniri bug / nyxniri report |
Generate diagnostic bug report |
Uninstall
| Command | Description |
|---|---|
nyxniri uninstall [--all|standard|restore|purge] |
Checkbox uninstall — pick what to remove (configs, CLI, modules, snapshots, wallpapers); defaults to the standard range |
nyxniri purge |
Shorthand for uninstall --all |
Extensions
| Command | Description |
|---|---|
nyxniri fcitx [install|status|uninstall] |
NyxMellow fcitx5 skin |
nyxniri greeter [install|status|uninstall] |
Noctalia Greeter (login screen) |
nyxniri gtk [install|status|uninstall] |
Material You GTK3/4 theme |
nyxniri fisher [install|status|uninstall] |
fisher plugin manager for Fish |
nyxhelp is a compact fzf-based reference for the CLI, shell helpers, and core keybindings:
| Command | Description |
|---|---|
nyxhelp |
Interactive dual-panel cheatsheet |
nyxhelp keys |
Niri keybindings |
nyxhelp proxy |
Proxy controls (proxy_on [port], proxy_off, proxy_status) |
nyxhelp pkg |
Package shortcuts (up, in, se, un, clean) |
nyxhelp all |
Full cheatsheet |
Noctalia hangs on startup — ddcutil can time out scanning the I2C bus (common on NVIDIA).
Disable ddcutil in ~/.config/noctalia/noctalia-config.toml:
[brightness]
enable_ddcutil = falseBrightness keys still work: internal panels go through Noctalia backlight, external monitors keep the ddcutil fallback. Leave this setting off unless you want Noctalia itself to own DDC.
Browser video looks stacked, black, or see-through — hybrid GPU (AMD/Intel iGPU + NVIDIA dGPU) used to force NVIDIA video decode for every app.
NyxNiri used to uncomment GBM_BACKEND=nvidia-drm and LIBVA_DRIVER_NAME=nvidia whenever lspci mentioned NVIDIA. On hybrid laptops the compositor stays on the iGPU, so Chromium/Brave can decode on NVIDIA and present on AMD/Intel — a few videos then corrupt the window.
Update and redeploy NyxNiri. The default configuration no longer selects a GPU driver, and deployment no longer rewrites environment variables based on PCI devices. A PCI listing cannot identify the active rendering GPU. Put any driver settings you need in ~/.config/niri/__custom__.kdl.
The old ELECTRON_OZONE_PLATFORM_HINT "auto" setting has also been removed; some older Electron apps may use XWayland instead. Normal deployment updates the main configuration but leaves personal overrides, personal presets, historical snapshots, and the current session environment alone. Log out and back in before checking the result.
Plugin repo corrupted — Noctalia hangs while checking out plugins.
Run the following commands to reset the plugin repos:
git -C ~/.local/state/noctalia/plugins/sources/community/repo reset --hard HEAD
git -C ~/.local/state/noctalia/plugins/sources/official/repo reset --hard HEADGreeter sync asks for a password — add a Polkit rule (nyxniri greeter install does this for you).
Install the Polkit rule manually if needed:
sudo bash -c 'cat > /etc/polkit-1/rules.d/50-noctalia-greeter.rules << EOF
polkit.addRule(function(action, subject) {
if (action.id == "org.noctalia.greeter.sync-appearance" &&
subject.isInGroup("wheel")) {
return polkit.Result.YES;
}
});
EOF'Nautilus or Libadwaita apps stuck in light mode — leftover user CSS overrides dark mode.
If Noctalia's built-in GTK templates or old tools generated noctalia.css or gtk.css in ~/.config/gtk-4.0/, GTK4 forces those CSS color definitions over system dark mode.
Run theme sync or remove the stale override files:
nyxniri theme sync
# Or manually:
rm -f ~/.config/gtk-4.0/gtk.css ~/.config/gtk-4.0/noctalia.css ~/.config/gtk-3.0/gtk.css ~/.config/gtk-3.0/noctalia.cssBrave doesn't follow theme toggle — Brave cold-start bug (not a NyxNiri issue).
On non-GNOME Wayland compositors, Brave's portal theme-signal subscription fails to initialize on cold start, so nyxniri theme toggle doesn't recolor it. Open brave://settings/appearance and switch theme mode once (e.g. Classic → GTK → Classic) to wake it up; it follows live afterwards without restarting Brave. Needs re-waking after each Brave restart.
Contact & Community:
- Telegram Channel: @linux_ricing
- QQ:
2040244628· Linux Ricing Group:631425889 - Sponsor: Afdian · Bug reports: GitHub Issues
Special Thanks & Contributors:
- @zhuhuaian, @Krits03, @Yulljie — community management & support
- @TyhLxxxhLrqTq — companion wallpaper site (in development)
Thanks to:
- RanXOM/glassy-niri — blur effects reference
- SHORiN-KiWATA/shorin-niri — heavily referenced
- sanweiya/fcitx5-mellow-themes — mellow shape source for NyxMellow skin
- StarWhiteIsBusy/Round-Simple-Fcitx5-Skin — Noctalia color-sync pattern reference
- doctorlogix — website design inspiration
Recommended:
- h465855hgg/noctalia-lyrics — status bar lyrics widget
- Ocfeather/chrome-niri-opacity — browser opacity script