* fix(bar): keep widget content on whole pixels Bar widgets centre their content inside a box of widgetThickness - horizontalPadding * 2, and Qt rounds the offset of a centred anchor to whole pixels. When the content and that box have different parity the exact offset falls on a half pixel, Qt rounds it away from zero and the content renders half a pixel above the centre. Widgets drawn from rectangles, such as the workspace switcher, compute their own snapped height and stay exactly centred, which is why they look right next to everything else in #3074. With the stock configuration this is the normal case: the bar is 40 px, the box is 14 px and barIconSize returns round((40 / 48) * 18) = 15. Two sizes now round to whole pairs of pixels. The icon size, so that it matches the parity of the box, and widgetThickness, because the box inherits its parity from there (the padding is doubled, so it never changes it). Going through every innerPadding from 0 to 16, nine of the seventeen configurations currently put the icon on a half pixel and none of them do afterwards. The 48 px default bar is untouched, the sizes that change do so by one pixel. Measured in a nested Hyprland at scale 1, ink centroid of the widget content relative to the centre of its pill, before and after: launcher -0.50 +0.00 weather -0.81 -0.52 clipboard -1.49 -0.93 notifications +0.03 +0.46 battery -0.63 -0.49 bluetooth -0.53 -0.03 Every icon moves down by half a pixel. What remains matches the ink asymmetry of the individual glyphs, measured separately at an exact position, and is not a placement error. Two things this does not cover. On a fractional or HiDPI scale horizontalPadding can land on a half pixel, which puts the box back between the grid lines, and a text only widget such as the clock has a line box of 15 px at the default font size, which cannot sit exactly on the centre of a 28 px pill no matter how it is rounded. Closes #3074 * fix(bar): give bar text a line box that can be centred A widget without an icon is centred as one line box, and the same parity rule applies to it as to the icon in the commit before this one. At fontSizeSmall the line box of the bar font is 15 px tall, so on a 28 px pill it cannot sit on the centre no matter which way the offset is rounded, and the clock reads about half a pixel high next to everything else. One step up the box is 16 px and it lands on the grid. Only the branch the standard bar uses changes. The 0.9 branch below a scale of 0.75 already comes out at 14 px, and the fontSizeMedium branch above 1.25 is left alone because there the next even box is two steps away, which would be a bigger change than this is worth. Same session and same measurement as the previous commit, ink centroid of the widget content relative to the centre of its pill: clock and date -0.58 +0.05 battery -0.63 -0.05 weather -0.82 -0.28 The bar font goes from 12 px to 13 px, which is the visible part of this and the reason it is a separate commit. It can be dropped without touching the icon fix. * bar: snap widget thickness to even device pixels and pick text sizes by line box parity * bar: snap bar thickness to even so the pill centres on whole pixels * bar: share the bar thickness formula so dock, osd and popouts stay in step * dock: read the bar clearance at the compositor screen scale --------- Co-authored-by: bbedward <[email protected]>
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.