Niri Plus / Desktop guide

Notifications and an on-demand panel

Mod+N opens notification history and system information through SwayNC. The desktop has no permanent bar. Volume and brightness feedback appear briefly when their keys are used; those helpers are covered by the hardware-feedback recipe.

Build the selected Arch package

The Arch reference uses the existing swaync-bryan fork because its unified information panel and notification activation behavior are part of the selected profile. Upstream SwayNC remains a smaller alternative, but it does not provide these widgets.

Input Pin
Fork release niri-plus-1
Arch recipe revision 8998ab49dc71e2c1353d5518cd8cd30191f41d18
Recipe archive SHA-256 577103af2aa99d158416008430f54eb761f578e9c0401395528224c690e1494a
SwayNC source revision 7e0ea67572a5c98412572c1ef3eb6920354fa1d6
Source archive SHA-256 aa54161e698a434f8b1b624b1cdbdc214d2516e56a708e31217dce4ccb413408
Runtime package swaync-bryan 0.12.6-18

Fetch and verify the immutable Arch recipe archive before extracting it:

SWAYNC_BUILD=$(mktemp -d)
curl --fail --location --output "$SWAYNC_BUILD/recipe.tar.gz" \
  https://codeload.github.com/byebyebryan/SwayNotificationCenter/tar.gz/8998ab49dc71e2c1353d5518cd8cd30191f41d18
printf '%s  %s\n' \
  577103af2aa99d158416008430f54eb761f578e9c0401395528224c690e1494a \
  "$SWAYNC_BUILD/recipe.tar.gz" | sha256sum --check
mkdir "$SWAYNC_BUILD/source"
tar -xzf "$SWAYNC_BUILD/recipe.tar.gz" --strip-components=1 -C "$SWAYNC_BUILD/source"
cd "$SWAYNC_BUILD/source/packaging/arch"
less PKGBUILD

The recipe pins the SwayNC source archive and its checksum. Preinstall the runtime libraries before allowing makepkg to remove temporary build dependencies:

sudo pacman -S --needed \
  base-devel gtk4 gtk4-layer-shell libadwaita glib2 libgee \
  json-glib libpulse granite7 libnotify
makepkg --verifysource
makepkg --syncdeps --rmdeps

Build as your ordinary user. Inspect the resulting runtime package with pacman -Qip, then install that exact package with sudo pacman -U. Review the transaction: the fork replaces upstream swaync.

Install the reference config and rendered stylesheet

The reference.json is the authored profile for the current 0.4.3/SwayNC 0.12.6-18 Arch install target. Its SHA-256 is c40e8a0cbf1327c87b5b713b6c68ba3d0462dff654d7b51d1bd58333bdf79543. It selects the unified information, title and notifications widgets, width 448, full-height fit, zero margins, ungrouped notifications, bold local time, plain date and inline Do Not Disturb control. The profile remains a reviewed checkout input, separate from both the published bundle and pinned public-example snapshot. The old profile bytes are retained at tools/reference/history/notifications-0.4.1.json with their original SHA-256 da55b379747d5ac0208730354ebfd8901dc268ac8e5b5b717e81ee9243d15577.

Keep using the NIRI_PLUS_CHECKOUT path exported by the main guide, since the build above changes the current directory. If running this recipe in a separate shell, export that variable from the reviewed checkout before building.

With the verified stager output from the Arch walkthrough, set STAGE to that directory and install only after backing up any existing SwayNC files:

printf '%s  %s\n' \
  c40e8a0cbf1327c87b5b713b6c68ba3d0462dff654d7b51d1bd58333bdf79543 \
  "$NIRI_PLUS_CHECKOUT/examples/notifications/reference.json" | sha256sum --check
install -Dm644 "$NIRI_PLUS_CHECKOUT/examples/notifications/reference.json" \
  "$HOME/.config/swaync/config.json"
install -Dm644 "$STAGE/appearance/swaync.css" \
  "$HOME/.config/swaync/style.css"

The stylesheet is rendered from the separately pinned 0.4.3 Neutral Slate identity. It imports the fork's packaged base stylesheet. The config requires the fork; the older examples/notifications/config.json remains a historical portable specimen, not the selected Arch dashboard config.

When the optional shared.swaync_sidebar identity block is present, the rendered style gives the sidebar, information surface, and notification cards 75% charcoal backgrounds. Its opacity, border_color, and card_border_color values set the surface alpha and outlines. The sidebar has one left border; internal information dividers retain their separator color. Notification text and controls remain opaque and focus and critical outlines remain active. Omitting the block keeps the legacy stylesheet output.

The style is available in the 0.4.3 maintenance backport, which changes only the two appearance implementation files from 0.4.2 and retains all 42 other runtime payloads. The current numbered reference selects this sidebar appearance.

The authored reference profile uses this edge-attached layout with individual notification cards. Merge the same values into another SwayNC config when selecting that layout:

{
  "fit-to-screen": true,
  "notification-grouping": false,
  "control-center-width": 448,
  "control-center-margin-top": 0,
  "control-center-margin-bottom": 0,
  "control-center-margin-left": 0,
  "control-center-margin-right": 0
}

Unified information panel

The current Arch install target selects the unified information panel in fork release 1, with the matching components 0.4.3 appearance. The selected profile is:

{
  "widgets": ["information", "title", "notifications"],
  "widget-config": {
    "clock": {"time-format": "%H:%M", "date-format": "%a, %b %-d"},
    "title": {"show-dnd": true},
    "system-stats": {"interval": 1},
    "gpu": {"interval": 2},
    "battery": {"interval": 5}
  }
}

For other configurations, merge these widget entries while retaining any separately selected controls, including a volume widget. The opening row has bold local time and a plain date in equal columns, without captions. System uses read-only CPU/RAM and active GPU/VRAM meters. Connections keeps the active connection identity and labelled Signal/IP detail in the left column, with upload/download rates in the right. Long IPv6 values ellipsize with a complete tooltip. Bluetooth uses device metadata for icons and distinguishes 0% from an unreported battery. Battery uses a 0–100 gauge and marks only an actual reported charge limit. Missing sections disappear with their dividers, while their readers continue to observe changes whenever the panel is open.

Networking uses two equal columns. The left has the active SSID or Ethernet identity above a Signal/IP label and right-aligned value. Signal uses the same percentage formatting as CPU/RAM. The right has labelled upload and download rates from that primary interface, sampled once per second while the panel is open. Reopening or changing interfaces starts a fresh baseline; unavailable values stay distinct from measured zero. The current components 0.4.3 appearance selection supplies the translucent sidebar and matching information/notification cards. The fork maintenance guide records its upstream baseline, downstream contracts and native regression checks.

Legacy dashboard and standalone widgets remain available. The current components 0.4.3/SwayNC 0.12.6-18 reference is covered by the dated qualification, which records the fresh replay, supplemental checks, evidence limits and the explicit VM suspend/resume waiver. Physical-device acceptance remains separate.

The earlier scoped package 0.12.6-17 staging, installation, password/cold login, sidebar/DND, clipboard and direct-controls checks and their native media retain their dates in the sync receipt. Native widget and private-bus checks retain their own scope, separate from that replay and physical hardware acceptance. The fork widget documentation covers formats, suffixes, lifecycle and stylesheet hooks.

This SwayNC profile does not select the separate components 0.5.0 Away companion, 0.9.2 session screen or 0.10.0 Close All helper.

Start one session owner

The package supplies swaync.service. Inspect it, confirm the selected Niri session targets are active, then add exactly one Niri dependency and start the unit in the current session:

systemctl --user cat swaync.service
systemctl --user is-active niri.service graphical-session.target
systemctl --user add-wants niri.service swaync.service
systemctl --user daemon-reload
systemctl --user start swaync.service

Add this binding to the existing Niri binds block and validate the complete configuration:

Mod+N repeat=false { spawn "swaync-client" "-t" "-sw"; }

Do not also start a separate spawn-at-startup SwayNC process. To undo the new session dependency, stop the unit and remove only the exact ~/.config/systemd/user/niri.service.wants/swaync.service link you created.

Verify the panel

Open and close the panel with Mod+N. Send a disposable notification with notify-send; test application focus separately with an action-bearing notification from a real application. Check the System, Connections, Bluetooth, and Battery sections against available devices. Missing hardware should remain hidden rather than be represented with fixture values.

CPU and RAM refresh every second, active GPU information every two seconds, and battery information every five seconds while open. Network and Bluetooth use D-Bus snapshots and signals. Closing the panel cancels reads, timers, and subscriptions. NetworkManager and BlueZ keep their native service ownership; GPU metrics require supported NVIDIA hardware and nvidia-utils.

When replacing a running upstream SwayNC process, restart only its service after reviewing the new package/config. A restart clears in-memory notification history. Keep the previous daemon's configuration and startup path until the fork works through logout and login.

Setup overview →Read on GitHub ↗