A complete, themed niri Wayland desktop for Ubuntu 22.04 LTS (jammy) — where niri isn't packaged and half the stack is too old to run it.
niri is a scrollable-tiling Wayland compositor. On Ubuntu 24.04+ you just install it. On 22.04 LTS you can't — and it's not only missing from the repos, the surrounding stack is too old to even build/run it cleanly:
- libinput < 1.27 has no
dwtpconfig symbol niri expects → niri won't link. - libwayland 1.20 lacks high-resolution scroll (
axis_value120) → Firefox aborts under niri with "wl_pointer has no event 9". - libdisplay-info isn't packaged at all → niri has no EDID parsing.
- Xwayland is too old for the protocol versions niri speaks.
- swaylock 1.5 relies on the deprecated input-inhibitor protocol → no lock.
- bluez 5.64 with
Experimental=true(needed for battery % in the bar) never re-enables passive scanning → bonded Bluetooth devices don't auto-reconnect.
This repo is the result of backporting the whole thing: the compositor and its toolchain compiled from source with the needed patches, plus a full ricing ("Cosmoduck") on top — theme, waybar bar + macOS-style dock, swaync, and a conky widget bridged onto niri's background layer.
jammy is supported until 2027 and is everywhere (labs, locked-down hardware, machines that can't move off an LTS). This is for people stuck there who still want a modern Wayland desktop.
Everything compiled, themed and ready. You get the desktop exactly as in the screenshots.
Grab the .deb from the latest release, then:
sudo apt install ./cosmoduck-niri_1.6.0_amd64.deb # pulls all runtime deps
cosmoduck-niri-setup # run as your user, NOT sudoLog out, pick the niri session at the login screen. Done.
For people who want to read every patch and build it themselves. See
build/README.md.
./build/00-deps.sh # toolchain + -dev packages (sudo, once)
./build/build-all.sh # compile + install the whole stack into /usr/local
./rice/setup.sh # install the rice for your userYou can rebuild the .deb yourself afterwards with
packaging/build-deb.sh.
| Compositor | niri v26.04 + jammy patches |
| Bar & dock | waybar top bar with a macOS-style close-window button, plus a macOS-style pinned dock with running indicators that split into one segment per open window, per-app notification badges, a right-click context menu (New Window / focus each instance / Keep in Dock / Remove from Dock / Close / Force Quit), and adjustable height (slider in the dock manager); unpinned running apps are auto-pinned into pre-allocated slots by a small daemon — icon, running indicator and the full context menu, with no dock restarts (windows never re-layout); every shell context menu (dock, tray, desktop) shares one framework with monochrome symbolic icons and flyout submenus |
| OSD | macOS-style volume / brightness / mic HUD: translucent card bottom-center on the overlay layer, click-through, visible on the lock screen too, with the freedesktop feedback tick on volume keys — played only when no other audio stream is live; media-key cards too (play/pause/stop/next/prev/seek, AVRCP keys from BT headphones included) with a now-playing title/artist readout, and auto-pause when the headphones disconnect |
| Audio | click the volume icon for a macOS-style output/input/profile switcher (flyout per device, pactl defaults); battery of connected bluetooth devices in the bar (org.bluez.Battery1, instant updates via D-Bus signals) |
| Bluetooth | bluez 5.86 backported (systemd drop-in, jammy's package untouched): on jammy's 5.64 the battery reporting above (Experimental=true) silently kills passive scanning, so paired mice/headphones never auto-reconnect — with 5.86 both work at once |
| Clipboard | clipboard history (text + images) collected by wl-paste --watch cliphist store, browsed from a menu on Mod+Ctrl+V or the bar icon |
| Desktop | real desktop icons on niri (layer-shell surface between wallpaper and tiles): ~/Desktop grid aligned top-right macOS-style, double-click to open, click / Ctrl-click / rubber-band marquee selection, keyboard (Delete → trash, Shift+Delete → permanent, Ctrl+A, Enter, Esc), full drag & drop (reposition, drag files onto other apps and onto dock icons — drop on the bin trashes in batch, drop on an app opens the files with it — plus drop external files in), right-click menu — New › submenu (text/markdown/shell/python/Word/Excel/PowerPoint/GanttProject + your ~/Templates), Cut/Copy/Paste, Rename, Trash, Properties, Open with…, sort, free/grid arrangement with nearest-cell Snap to Grid, icon-size submenu, hide icons — and an animated Mod+Shift+D show-desktop toggle |
| App grid | Launchpad-style application grid on the Ubuntu button in the top bar (non-fullscreen, search-as-you-type, arrow navigation), dressed like ulauncher's macos theme; ulauncher itself stays on Ctrl+Space / Mod+D |
| Notifications | SwayNotificationCenter (swaync); clicking a notification focuses the source app's window |
| Lock | swaylock-effects over a blurred wallpaper, with the Cosmoduck duck composited in the lock ring |
| Boot splash | Plymouth "cosmoduck" theme — duck + loading bar over a scrolling kernel/systemd log (set up automatically; reverts on uninstall) |
| Widget | conky "Cosmoduck" bridged onto niri's background layer |
| Cheatsheet | custom 3-column keyboard cheatsheet (F1), auto-built from your keybinds, shown at first login |
| Theme | cosmoduck-* GTK theme (WhiteSur fork, blue window buttons), Bibata cursor, CaskaydiaCove Nerd Font |
| Extras | lid keep-awake toggle, GNOME wallpaper sync, nwg-displays monitor config |
Scrollable tiling — columns scroll horizontally instead of cramming onto one screen:
macOS-style dock (pinned apps + running indicators + trash) and the top bar (workspaces, the blue close-window button, window title, tray, custom modules — ☕ lid keep-awake, 👁 conky toggle, clipboard history, volume, bluetooth battery):
Dock manager — pin/unpin apps and tune the dock height with a slider:
Desktop icons — ~/Desktop rendered on niri's bottom layer (top-right macOS-style), with the right-click context menu and its icon-size submenu open:
App grid launcher (Mod+A or the Ubuntu button) — Launchpad-style, non-fullscreen, search-as-you-type, with the same focus-ring bezel niri draws around windows:
Volume / brightness OSD — macOS-style HUD on the volume, brightness and mic-mute keys, floating above the dock (click-through, auto-hides):
Audio switcher — click the volume icon to change output/input device or card profile (the bar also shows the bluetooth battery of headphones and mouse):
Clipboard history (Mod+Ctrl+V or the bar icon) — collected by cliphist, text and images:
Keyboard cheatsheet (F1) — auto-built from your keybinds, shown at first login:
| Notifications (swaync) | Calendar popup | conky widget |
|---|---|---|
![]() |
![]() |
![]() |
Lock screen (swaylock-effects, duck in the ring over the blurred wallpaper) and the Plymouth boot splash (duck + loading bar over the scrolling kernel log):
Light theme (cosmoduck-Light) and the theme's blue macOS-style window buttons:
build/ from-source build scripts (pinned versions + niri patches)
rice/ de-personalized config (skel/) + themes + setup.sh
packaging/ build-deb.sh + the .deb static tree (DEBIAN/, setup, presets)
(the prebuilt .deb is attached to GitHub Releases, not committed)
docs/ backport notes + screenshots
The .deb declares its runtime deps and pulls them automatically. If you go the
clone-and-setup.sh route, install these third-party assets for full fidelity:
- CaskaydiaCove Nerd Font — https://www.nerdfonts.com/ (bar glyphs)
- Bibata-Modern-Classic cursor — https://github.com/ful1e5/Bibata_Cursor
conky-all,waybar,swaybg,jq,python3-gi,gnome-control-center,network-manager-gnome,brightnessctl,playerctl,ulauncher… (full list inpackaging/static/DEBIAN/control).
- jammy-only by design. On 24.04+ install niri from apt instead.
- The compiled
libwayland-clientis installed under/usr/local/liband shadows the system one machine-wide (newer upstream, ABI-compatible). It's the fix for the Firefox scroll crash; if you don't want it, drop step 01. - The from-source scripts for components 02–07 are reconstructed from the build
provenance and may need a missing
-devpackage on a fresh box — seebuild/README.mdfor what's battle-tested vs reconstructed. - The
.debsets the Plymouth boot splash to "cosmoduck" (viaupdate-alternatives) and rebuilds the initramfs on install — so the first install takes a little longer. Uninstalling reverts the splash and rebuilds the initramfs again. The kernel log is read from/dev/kmsg, so GRUB'squietis left untouched.
This repo's own code (build scripts, packaging, configs, theme tweaks) is MIT —
see LICENSE. The bundled/compiled upstream projects keep their own
licenses — see NOTICE.md.
















