Skip to content

Repository files navigation

English | 简体中文

NyxNiri

A Material You desktop experience for Arch / CachyOS
Built on Niri and Noctalia V5 — and stays out of your way.

Stars   Arch Linux   GPL-3.0

NyxNiri Preview

Website · Watch demo on Bilibili · Join discussion on Reddit

Features

  • Wallpaper Picker (Super+W) — static + live, search and categories.
  • Color Sync — Noctalia V5 extracts palettes from wallpaper; mpvpaper + ffmpeg for 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.

Install

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.

Standalone (online)

curl -fsSL --connect-timeout 10 https://raw.githubusercontent.com/ech678/NyxNiri/main/install.sh | bash

Tip

Without an AUR helper, nyxniri install full can bootstrap paru for you.

From a git checkout (recommended)

# 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.sh

System package (AUR)

Coming 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.sh

For repository downloads, install.sh tries GitHub first, then gh-proxy.

Included Configs

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.kdl is 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 under conf.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.kdl are preserved automatically; edit them directly.

Post-deploy hooks

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.

Presets

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% opacity
    • transparent: 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/.

Keybindings

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 + /.

Extensions

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 (light) NyxMellow skin (dark)
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

Tooling

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 update cannot 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

Troubleshooting

Noctalia hangs on startupddcutil can time out scanning the I2C bus (common on NVIDIA).

Disable ddcutil in ~/.config/noctalia/noctalia-config.toml:

[brightness]
enable_ddcutil = false

Brightness 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 HEAD
Greeter 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.css
Brave 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.

Credits

Contact & Community:

Special Thanks & Contributors:

Thanks to:

Recommended:


About

❄️ My Niri desktop with taste. Material You, zero bloat, all snapshot-safe.

Topics

Resources

Stars

472 stars

Watchers

0 watching

Forks

Releases

Sponsor this project

Packages

Contributors

Languages