Rebuild of #3388 on current master: the previous branch was cut from an older base and reverted unrelated fixes in the gamma stack and the display settings UI. ICC profiles: - core/internal/icc: ICC v2/v4 parser (TRC, LUT8/16 and parametric curves, vcgt, description/version/color space) plus gamma ramp generation, with synthetic coverage and optional vendor-profile tests (ICC_TEST_DIR). - wayland manager: load iccProfiles from the compositor's DMS config dir, build the ramp from the profile when one is set (falling back to the temperature ramp when it is missing or unparsable), and re-apply on output hotplug and after resume. - ICC ramps apply while the night light schedule is disabled; outputs without a profile keep an identity ramp. - desc/mluc offsets are validated before slicing, so a malformed profile returns an error instead of panicking the daemon. Per-output temperature: - outputTemps in the same config; SetOutputTemp accepts 1000-10000K and the Display Config slider exposes 3000-10000K, which matters for displays calibrated at a higher white point (e.g. a 7000K profile). Gamma control lifecycle: - needsControls() now keeps the controls alive for configured ICC profiles and per-output temperatures, so toggling the night light off no longer destroys the controls and drops the ramps. - Re-apply paths clear the per-output dedup state instead of adding a manager-level guard, which would have suppressed contrast-only writes and the post-resume forced resend (#1235), and left a recreated control without a ramp. - Monitor sleep/disconnect still re-establishes controls when an output comes back. IPC / CLI / UI: - wayland.icc.{getStatus,apply,remove,listOutputs,setTemp,getTemps} - dms icc list | info <file> | apply <output> <file> | remove <output> | status - Display Config output card gains a Color Profile row (browse/apply/remove with description, version, color space and active state) and a per-output color temperature slider, backed by Services/ICCService.qml. Config path: - DMSConfigDir() follows the compositor layout (niri/dms, hypr/dms, mango/dms) via the shared compositor detection and utils.XDGConfigHome(), replacing the hardcoded niri path in both the manager and `dms icc`. Tests: TZ=UTC go test ./... (60 packages ok), including red/green coverage for the icc parser bounds checks and needsControls().
DankMaterialShell
DankMaterialShell is a complete desktop shell for niri, Hyprland, MangoWC, Sway, labwc, Scroll, Miracle WM, and other Wayland compositors. It replaces waybar, swaylock, swayidle, mako, fuzzel, polkit, and everything else you'd normally stitch together to make a desktop.
Repository Structure
This is a monorepo containing both the shell interface and the core backend services:
DankMaterialShell/
├── quickshell/ # QML-based shell interface
│ ├── Modules/ # UI components (panels, widgets, overlays)
│ ├── Services/ # System integration (audio, network, bluetooth)
│ ├── Widgets/ # Reusable UI controls
│ └── Common/ # Shared resources and themes
├── core/ # Go backend and CLI
│ ├── cmd/ # dms CLI and dankinstall binaries
│ ├── internal/ # System integration, IPC, distro support
│ └── pkg/ # Shared packages
├── distro/ # Distribution packaging
│ ├── fedora/ # Fedora RPM specs
│ ├── debian/ # Debian packaging
│ └── nix/ # NixOS/home-manager modules
└── flake.nix # Nix flake for declarative installation
See it in Action
Installation
curl -fsSL https://install.danklinux.com | sh
One command installs DMS and all dependencies on Arch, Fedora, Debian, Ubuntu, openSUSE, or Gentoo.
Features
Dynamic Theming Wallpaper-based color schemes that automatically theme GTK, Qt, terminals, editors (vscode, vscodium), and more using matugen and dank16.
System Monitoring Real-time CPU, RAM, GPU metrics and temperatures built into the dms daemon (powered by dgop). Process list with search and management.
Powerful Launcher Spotlight-style search for applications, files (dsearch), emojis, running windows, calculator, and commands. Extensible with plugins.
Control Center Unified interface for network, Bluetooth, audio devices, display settings, and night mode.
Smart Notifications Notification center with grouping, rich text support, and keyboard navigation.
Media Integration MPRIS player controls, calendar sync, weather widgets, and clipboard history with image previews.
Session Management Lock screen, idle detection, auto-lock/suspend with separate AC/battery settings, and a settings front-end for dank-greeter.
Plugin System
Extend functionality with the plugin registry. DMS keeps
~/.config/DankMaterialShell/plugins.lock.json synchronized with managed plugin installs and
their exact Git commits, so the same plugins can be reproduced on another machine.
Supported Compositors
Works best with niri, Hyprland, Sway, MangoWC, labwc, Scroll, and Miracle WM with full workspace switching, overview integration, and monitor management. Other Wayland compositors work with reduced features.
Compositor configuration guide
Command Line Interface
Control the shell from the command line or keybinds:
dms run # Start the shell
dms ipc call spotlight toggle
dms ipc call audio setvolume 50
dms ipc call wallpaper set /path/to/image.jpg
dms brightness list # List available displays
dms plugins search # Browse plugin registry
dms plugins lock # Refresh the portable plugin lockfile
dms plugins restore ~/plugins.lock.json
Full CLI and IPC documentation
Documentation
- Website: danklinux.com
- Docs: danklinux.com/docs
- Theming: Application themes | Custom themes
- Plugins: Development guide
- Support: Ko-fi
Dank Projects
DMS is one piece of the suite. The rest lives in its own repos:
- dank-greeter - greetd login screen with the Dank Material aesthetic. The Greeter tab in DMS settings is the front-end for it.
- dankcalendar - Local, Google, Microsoft, and CalDAV calendars for the dank desktop.
- dgop - System monitoring TUI and Go library; its library powers the process list and dashboard widgets inside the dms daemon.
- dsearch - Fast file search that powers file results in the launcher.
- dank-qml-common - Shared QML widgets and components used by DMS, dank-greeter, and dankcalendar.
- dankgo - Common Go modules behind the single binary apps.
Development
See component-specific documentation:
- quickshell/ - QML shell development, widgets, and modules
- core/ - Go backend, CLI tools, and system integration
- distro/ - Distribution packaging (Fedora, Debian, NixOS)
Building from Source
Core + Dankinstall:
cd core
make # Build dms CLI
make dankinstall # Build installer
Shell:
quickshell -p quickshell/
NixOS:
{
inputs.dms.url = "github:AvengeMedia/DankMaterialShell";
# Use in home-manager or NixOS configuration
imports = [ inputs.dms.homeModules.dank-material-shell ];
}
Contributing
Contributions welcome. Bug fixes, widgets, features, documentation, and plugins all help.
- Fork the repository
- Make your changes
- Test thoroughly
- Open a pull request
For documentation contributions, see DankLinux-Docs.
Credits
- quickshell - Shell framework
- niri - Scrolling window manager
- Ly-sec - Wallpaper effects from Noctalia
- soramanew - Caelestia inspiration
- end-4 - dots-hyprland inspiration
Star History
License
MIT License - See LICENSE for details.