Notes for distribution packagers. End-user install docs live in the README and at docs.noctalia.dev.
Use this exact short description for package metadata (pkgdesc, Summary,
AppStream, etc.):
A sleek, customizable desktop shell crafted for Wayland.
Do not substitute shorter or alternate blurbs (“lightweight Wayland bar”, “status bar”, ...). Noctalia is a full desktop shell (bars, dock, launcher, notifications, lock screen, wallpaper, settings, ...), not a bar-only tool.
v5 is already packaged for:
- Arch Linux
- NixOS
- Fedora
- openSUSE
- KaOS
- Gentoo
- Void Linux
- GNU Guix
- Debian (including Ubuntu)
Repology is a useful at-a-glance
check, but it only covers repositories it indexes (and may still list v4 as
noctalia-shell). It is not a complete inventory of community packaging.
| Name | noctalia |
| Homepage | https://github.com/noctalia-dev/noctalia |
| Docs | https://docs.noctalia.dev |
| License | MIT (LICENSE); also see vendored licenses under third_party/ for SPDX completeness |
| Version | Meson project(... version: ...) in meson.build |
| Binary | noctalia |
| Desktop entry | dev.noctalia.Noctalia.desktop |
| Icon | noctalia (share/icons/hicolor/scalable/apps/noctalia.svg) |
Releases strive to follow semantic versioning. The latest version is the only actively maintained version. No attempts are made to achieve overlapping lifecycles of major or minor versions. Bug reports are required to be reproducible on the latest version.
First-class targets:
x86_64(amd64)aarch64(arm64)
Linux only. There is no intentional arch-specific code path; other little-endian Linux arches may build if dependencies are available, but they are not first-class supported.
musl: known to build (e.g. Alpine / Void musl). Not first-class tested.
jemalloc is glibc-only, on musl leave -Djemalloc=disabled (or auto, which
skips it).
C++23 is required.
| Toolchain | Minimum | Notes |
|---|---|---|
| GCC + libstdc++ | GCC 13+ | Default on most distros |
| Clang + libstdc++ or libc++ | Clang 16+ | libc++ needs Meson’s experimental-library flags (already wired in meson.build) |
Debian 12 “bookworm” needs a newer toolchain than the default g++ (e.g.
g++-13 with CXX=g++-13).
No special linker is required. The default linker from the compiler driver is
fine (GNU ld / gold, lld, mold via -fuse-ld= all work). Release
builds pass -Wl,--gc-sections and -Wl,--as-needed, which those linkers
support.
- Build system: Meson + Ninja. The repo’s
justfileis convenience only; packaging can call Meson directly. - Language / toolchain: see Compilers / linkers.
- Recommended:
meson setup build --buildtype=release, then compile/install. - Do not enable
-Dnative_optimizations=truefor distro packages (CPU-local codegen; not portable). - Tests:
-Dtests=disabled(or leaveauto, which skips tests for release). jemalloc: recommended on glibc; Meson feature option-Djemalloc=auto|enabled|disabled. Only used on glibc builds.
Prefix/datadir are baked into the binary via NOCTALIA_INSTALL_PREFIX /
NOCTALIA_INSTALL_DATADIR. Install with the same prefix you configured.
<prefix>/bin/noctalia
<prefix>/share/noctalia/assets/...
<prefix>/share/applications/dev.noctalia.Noctalia.desktop
<prefix>/share/icons/hicolor/scalable/apps/noctalia.svg
The shipped assets/ tree is required at runtime. Shipping only the binary
breaks fonts, translations, templates, glyphs, and sounds. See
CONTRIBUTING.md for lookup order (including
NOCTALIA_ASSETS_DIR overrides for unusual layouts).
Not shipped (don’t look for them in the install): AppStream / metainfo XML, man pages, systemd units.
No Qt or GTK. UI is Wayland + OpenGL ES (EGL/GLES, or libepoxy as a fallback
when separate EGL/GLES packages are missing).
Canonical list is the dependency(...) / header checks in
meson.build. Distro package names differ; the README
has copy-paste install lines for common distros.
Notes packagers hit often:
- stb must provide
stb/stb_image_resize2.h(andstb/stb_image_write.h). Older packages that only shipstb_image_resizeare not enough. Meson fails the configure check ifstb_image_resize2is missing. - Meson requires WirePlumber 0.5 (
wireplumber-0.5pkg-config). 0.4 is not enough.
Shipped under third_party/: Wuffs, Luau, fzy, Material Color Utilities.
Each carries its own license file beside the code.
| Dependency | Role |
|---|---|
| PipeWire daemon (+ WirePlumber 0.5) | Audio, volume OSD, privacy indicators, spectrum. Libraries alone are not enough; without a running daemon those features stay off. |
PAM (login service by default) |
Lock screen authentication |
| Fontconfig / fonts | Text rendering (users still need usable fonts installed) |
git |
Plugin git sources / auto-update invoke git on PATH |
upower |
Optional: battery / power devices |
ddcutil |
Optional: external monitor brightness |
| Secret Service provider | Optional but recommended for credential / encrypted-state persistence (GNOME Keyring, KWallet, KeePassXC, ...). libsecret is only the client library; without a session provider those features cannot persist secrets. |
No systemd user unit is shipped. Typical startup is compositor autostart or the
desktop entry (noctalia --daemon). Control a running instance with
noctalia msg ... (Unix socket under XDG_RUNTIME_DIR).
Keep the .desktop daemon Exec unless you intentionally package a different
session integration. Prefer the canonical description above for Comment= /
AppStream summary as well.
On non-Plasma sessions Noctalia provides and registers:
org.freedesktop.Notificationsorg.kde.StatusNotifierWatcher(system tray host)
Do not run it alongside another notification daemon or StatusNotifier host (mako, dunst, swaync, waybar-as-host, ...) unless those are disabled. On Plasma, Noctalia integrates with Plasma's notification / tray paths instead of claiming the freedesktop Notifications name.
| Kind | Default |
|---|---|
| Config | $XDG_CONFIG_HOME/noctalia (~/.config/noctalia), e.g. config.toml |
| State | $XDG_STATE_HOME/noctalia (~/.local/state/noctalia), e.g. settings.toml, caches |
| Data | $XDG_DATA_HOME/noctalia (~/.local/share/noctalia) |
| Logs | $XDG_CACHE_HOME/noctalia (~/.cache/noctalia) |
Override bases with NOCTALIA_CONFIG_HOME, NOCTALIA_STATE_HOME,
NOCTALIA_DATA_HOME (each still appends /noctalia).
- Not a compositor, display manager, or greeter. Greeter support is noctalia-greeter.
- Not a replacement for file managers, screen casting, or drive mounting.
- Compositor support varies (protocols / IPC). See compositor docs.
v5 is currently beta. Prefer packaging tagged releases rather than random
main snapshots unless you maintain a -git / nightly package on purpose.