<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Dux Blog</title>
        <link>https://duxlabs.dev/blog</link>
        <description>Dux Blog</description>
        <lastBuildDate>Mon, 21 Sep 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <copyright>Copyright © 2026 Dux Labs</copyright>
        <item>
            <title><![CDATA[DMS 2.0: DankMaterialShell is now Dux Shell]]></title>
            <link>https://duxlabs.dev/blog/v2-0-release</link>
            <guid>https://duxlabs.dev/blog/v2-0-release</guid>
            <pubDate>Mon, 21 Sep 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[DMS 2.0 "Heisenberg" brings a new name, a new design, plugins for Dash and OmegaDock, Dux Dot, deeper compositor support, a customizable lock screen, the Dux Lyrical Engine, and Dux Files, a new standalone file manager.]]></description>
            <content:encoded><![CDATA[<div class="blogHero_AHVQ"><svg viewBox="0 0 1 1" class="shape_qok3 shapeCookie_F0gV" aria-hidden="true" focusable="false"><path d="M0.5 0.00515C0.52561 0.00515 0.55123 0.01546 0.57001 0.03608C0.59493 0.06343 0.6335 0.07376 0.66875 0.06254C0.7219 0.04561 0.7781 0.07805 0.79001 0.13255C0.79792 0.16869 0.82615 0.19693 0.8623 0.20483C0.91679 0.21675 0.94923 0.27294 0.93231 0.32609C0.92108 0.36135 0.93142 0.39992 0.95877 0.42484C1 0.4624 1 0.52729 0.95877 0.56485C0.93142 0.58978 0.92108 0.62834 0.93231 0.6636C0.94923 0.71675 0.91679 0.77294 0.8623 0.78486C0.82615 0.79277 0.79792 0.821 0.79001 0.85715C0.7781 0.91164 0.7219 0.94408 0.66875 0.92716C0.6335 0.91593 0.59493 0.92626 0.57001 0.95361C0.53244 0.99485 0.46756 0.99485 0.42999 0.95361C0.40507 0.92626 0.3665 0.91593 0.33125 0.92716C0.2781 0.94408 0.2219 0.91164 0.20999 0.85715C0.20208 0.821 0.17385 0.79277 0.1377 0.78486C0.08321 0.77294 0.05077 0.71675 0.06769 0.6636C0.07892 0.62834 0.06858 0.58978 0.04123 0.56485C0 0.52729 0 0.4624 0.04123 0.42484C0.06858 0.39992 0.07892 0.36135 0.06769 0.32609C0.05077 0.27294 0.08321 0.21675 0.1377 0.20483C0.17385 0.19693 0.20208 0.16869 0.20999 0.13255C0.2219 0.07805 0.2781 0.04561 0.33125 0.06254C0.3665 0.07376 0.40507 0.06343 0.42999 0.03608C0.44877 0.01546 0.47439 0.00515 0.5 0.00515Z" fill="currentColor"></path></svg><svg viewBox="0 0 1 1" class="shape_qok3 shapeBurst_RrxZ" aria-hidden="true" focusable="false"><path d="M0.18664 0.27242C0.19362 0.26276 0.19729 0.2507 0.19633 0.23807C0.19403 0.20813 0.19174 0.1782 0.18945 0.14826C0.18651 0.10985 0.22501 0.08176 0.26069 0.09629C0.28866 0.10767 0.31662 0.11905 0.34459 0.13043C0.36806 0.13999 0.395 0.13118 0.40828 0.1096C0.42402 0.08403 0.43976 0.05847 0.4555 0.0329C0.4757 0.0001 0.52336 0 0.54369 0.03273C0.55963 0.05837 0.57556 0.08402 0.59149 0.10967C0.60487 0.13119 0.63184 0.1399 0.65527 0.13025C0.68303 0.11882 0.71079 0.10739 0.73855 0.09596C0.77418 0.08129 0.81279 0.10922 0.81001 0.14765C0.80782 0.17776 0.80564 0.20788 0.80345 0.23799C0.80162 0.26327 0.81833 0.28616 0.84295 0.29213C0.87213 0.2992 0.90131 0.30627 0.93049 0.31334C0.96793 0.32241 0.98275 0.36771 0.95791 0.39716C0.93844 0.42024 0.91897 0.44332 0.8995 0.4664C0.88316 0.48577 0.88322 0.51411 0.89964 0.53341C0.91909 0.55628 0.93854 0.57915 0.95799 0.60202C0.98295 0.63137 0.96831 0.67673 0.9309 0.68595C0.90159 0.69318 0.87227 0.70041 0.84296 0.70764C0.81835 0.7137 0.80174 0.73667 0.80367 0.76193C0.80597 0.79187 0.80826 0.8218 0.81055 0.85174C0.81349 0.89015 0.77499 0.91824 0.73931 0.90371C0.71134 0.89233 0.68338 0.88095 0.65541 0.86957C0.63194 0.86001 0.605 0.86882 0.59172 0.8904C0.57598 0.91597 0.56024 0.94153 0.5445 0.9671C0.5243 0.9999 0.47664 1 0.45631 0.96727C0.44037 0.94163 0.42444 0.91598 0.40851 0.89033C0.39513 0.86881 0.36816 0.8601 0.34473 0.86975C0.31697 0.88118 0.28921 0.89261 0.26145 0.90404C0.22582 0.91871 0.18721 0.89078 0.18999 0.85235C0.19218 0.82224 0.19436 0.79212 0.19655 0.76201C0.19838 0.73673 0.18167 0.71384 0.15705 0.70787C0.12787 0.7008 0.09869 0.69373 0.06951 0.68666C0.03207 0.67759 0.01725 0.63229 0.04209 0.60284C0.06156 0.57976 0.08103 0.55668 0.1005 0.5336C0.11684 0.51423 0.11678 0.48589 0.10036 0.46659C0.08091 0.44372 0.06146 0.42085 0.04201 0.39798C0.01705 0.36863 0.03169 0.32327 0.0691 0.31405C0.09841 0.30682 0.12773 0.29959 0.15704 0.29236C0.16934 0.28933 0.17965 0.28207 0.18664 0.27242Z" fill="currentColor"></path></svg><svg viewBox="0 0 1 1" class="shape_qok3 shapeFlower_9oAH" aria-hidden="true" focusable="false"><path d="M0.36975 0.18639C0.37854 0.16002 0.38733 0.13365 0.39612 0.10728C0.40897 0.06874 0.43312 0.03496 0.46544 0.01034C0.47421 0.00365 0.48493 0.00003 0.49596 0.00002C0.49833 0.00002 0.50071 0.00001 0.50308 0.00001C0.51411 0 0.52484 0.0036 0.53363 0.01027C0.56599 0.03483 0.59021 0.06857 0.60313 0.10708C0.61197 0.13344 0.62081 0.15979 0.62965 0.18615C0.65451 0.17371 0.67938 0.16128 0.70424 0.14885C0.74058 0.13068 0.78154 0.12388 0.8218 0.12932C0.83273 0.13079 0.84288 0.13581 0.85068 0.1436C0.85236 0.14528 0.85405 0.14696 0.85573 0.14863C0.86353 0.15643 0.86857 0.16656 0.87007 0.17749C0.87559 0.21774 0.86886 0.25872 0.85076 0.29509C0.83837 0.31998 0.82599 0.34486 0.81361 0.36975C0.83998 0.37854 0.86635 0.38733 0.89272 0.39612C0.93126 0.40897 0.96504 0.43312 0.98966 0.46544C0.99635 0.47421 0.99997 0.48493 0.99998 0.49596C0.99998 0.49833 0.99999 0.50071 0.99999 0.50308C1 0.51411 0.9964 0.52484 0.98973 0.53363C0.96517 0.56599 0.93143 0.59021 0.89292 0.60313C0.86656 0.61197 0.84021 0.62081 0.81385 0.62965C0.82629 0.65451 0.83872 0.67938 0.85115 0.70424C0.86932 0.74058 0.87612 0.78154 0.87068 0.8218C0.86921 0.83273 0.86419 0.84288 0.8564 0.85068C0.85472 0.85236 0.85304 0.85405 0.85137 0.85573C0.84357 0.86353 0.83344 0.86857 0.82251 0.87007C0.78226 0.87559 0.74128 0.86886 0.70491 0.85076C0.68002 0.83837 0.65514 0.82599 0.63025 0.81361C0.62146 0.83998 0.61267 0.86635 0.60388 0.89272C0.59103 0.93126 0.56688 0.96504 0.53456 0.98966C0.52579 0.99635 0.51507 0.99997 0.50404 0.99998C0.50167 0.99998 0.49929 0.99999 0.49692 0.99999C0.48589 1 0.47516 0.9964 0.46637 0.98973C0.43401 0.96517 0.40979 0.93143 0.39687 0.89292C0.38803 0.86656 0.37919 0.84021 0.37035 0.81385C0.34549 0.82629 0.32062 0.83872 0.29576 0.85115C0.25942 0.86932 0.21846 0.87612 0.1782 0.87068C0.16727 0.86921 0.15712 0.86419 0.14932 0.8564C0.14764 0.85472 0.14595 0.85304 0.14427 0.85137C0.13647 0.84357 0.13143 0.83344 0.12993 0.82251C0.12441 0.78226 0.13114 0.74128 0.14924 0.70491C0.16163 0.68002 0.17401 0.65514 0.18639 0.63025C0.16002 0.62146 0.13365 0.61267 0.10728 0.60388C0.06874 0.59103 0.03496 0.56688 0.01034 0.53456C0.00365 0.52579 0.00003 0.51507 0.00002 0.50404C0.00002 0.50167 0.00001 0.49929 0.00001 0.49692C0 0.48589 0.0036 0.47516 0.01027 0.46637C0.03483 0.43401 0.06857 0.40979 0.10708 0.39687C0.13344 0.38803 0.15979 0.37919 0.18615 0.37035C0.17371 0.34549 0.16128 0.32062 0.14885 0.29576C0.13068 0.25942 0.12388 0.21846 0.12932 0.1782C0.13079 0.16727 0.13581 0.15712 0.1436 0.14932C0.14528 0.14764 0.14696 0.14595 0.14863 0.14427C0.15643 0.13647 0.16656 0.13143 0.17749 0.12993C0.21774 0.12441 0.25872 0.13114 0.29509 0.14924C0.31998 0.16163 0.34486 0.17401 0.36975 0.18639Z" fill="currentColor"></path></svg><svg viewBox="0 0 1 1" class="shape_qok3 shapePill_h2S1" aria-hidden="true" focusable="false"><path d="M0.87316 0.12684C0.9404 0.19407 0.98515 0.28377 0.99546 0.38397C0.99697 0.3987 0.99849 0.41342 1 0.42814C0.99936 0.54387 0.9531 0.65468 0.87127 0.73652C0.82635 0.78143 0.78143 0.82635 0.73652 0.87127C0.65468 0.9531 0.54387 0.99936 0.42814 1C0.41342 0.99849 0.3987 0.99697 0.38397 0.99546C0.18357 0.97485 0.02515 0.81643 0.00454 0.61603C0.00303 0.6013 0.00151 0.58658 0 0.57186C0.00064 0.45613 0.0469 0.34532 0.12873 0.26348C0.17365 0.21857 0.21857 0.17365 0.26348 0.12873C0.34532 0.0469 0.45613 0.00064 0.57186 0C0.58658 0.00151 0.6013 0.00303 0.61603 0.00454C0.71623 0.01485 0.80593 0.0596 0.87316 0.12684Z" fill="currentColor"></path></svg><div class="heroContent_tO9u"><p class="heroTitle_bL3n">DMS <span class="accentText_i18k">2.0</span></p><p class="lockup_bMVF" role="img" aria-label="Heisenberg"><span class="element_XqEm"><span class="elementNumber_GSmt">2</span><span class="elementSymbol_vwIY">He</span><span class="elementMass_TYbM">4.0026</span></span><span>isenberg</span></p></div></div>
<p><strong>DankMaterialShell is now Dux Shell</strong>, and Dank Linux is now <strong>Dux Labs</strong>.</p>
<p>DMS 2.0 "Heisenberg" is here with a new design across the shell, plugins for Dash and OmegaDock, the new Dux Dot, and much deeper compositor support for Hyprland, MangoWC, and newly added, Aqueous. There's a customizable lock screen, the Dux Lyrical Engine, and <strong>Dux Files</strong>, a new standalone file manager.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="dankmaterialshell-is-now-dux-shell">DankMaterialShell is now Dux Shell<a href="https://duxlabs.dev/blog/v2-0-release#dankmaterialshell-is-now-dux-shell" class="hash-link" aria-label="Direct link to DankMaterialShell is now Dux Shell" title="Direct link to DankMaterialShell is now Dux Shell" translate="no">​</a></h2>
<p>DMS started as one shell. Since then it has picked up a greeter, a system monitor, a search service, a calendar, a package repository, and a plugin community, and 2.0 adds a file manager. That's a lot to keep calling DankMaterialShell, so the whole suite is moving under one name: <strong>Dux Labs</strong>.</p>
<table><thead><tr><th>Before</th><th>Now</th></tr></thead><tbody><tr><td>Dank Linux</td><td>Dux Labs</td></tr><tr><td>DankMaterialShell</td><td>Dux Shell</td></tr><tr><td>DankGreeter</td><td>Dux Greeter</td></tr><tr><td>DankSearch</td><td>Dux Search</td></tr><tr><td>DankGOP</td><td>Dux GOP</td></tr><tr><td>DankCalendar</td><td>Dux Calendar</td></tr><tr><td>DankLinux repository</td><td>Dux Labs repository</td></tr><tr><td>new</td><td>Dux Files</td></tr></tbody></table>
<p>It's the same team and the same projects. The shell is still DMS, and the command is still <code>dms</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-dux">Why "Dux"?<a href="https://duxlabs.dev/blog/v2-0-release#why-dux" class="hash-link" aria-label="Direct link to Why &quot;Dux&quot;?" title="Direct link to Why &quot;Dux&quot;?" translate="no">​</a></h3>
<p><strong>Dux</strong> is our mascot, and the name is a nod to <strong>Tux</strong>, the Linux penguin. It's short, it's not taken by any major software projects, it starts with a D so we don't have to rename the binaries (<code>dms</code>, <code>dcal</code>, <code>dgop</code>), and it gives a friendlier vibe than "Dank" did.</p>
<p>The new GitHub org is <a href="https://github.com/duxlabs-dev" target="_blank" rel="noopener noreferrer" class="">duxlabs-dev</a>. The package repositories move shortly after launch. Details are in <a href="https://duxlabs.dev/blog/v2-0-release#the-repositories" class="">the repositories</a> section at the end.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-new-design">A new design<a href="https://duxlabs.dev/blog/v2-0-release#a-new-design" class="hash-link" aria-label="Direct link to A new design" title="Direct link to A new design" translate="no">​</a></h2>
<p>2.0 brings Material 3 Expressive to Settings, Control Center, Dash, and the shared widgets, with new controls, grouped settings, new navigation, colors, and motion.</p>
<p>Settings is reorganized so things live where you'd look for them. Bar widgets have their own options, Dash has its own page, and related settings open in subpages.</p>
<figure class="screenshot_ZRMh"><img src="https://duxlabs.dev/img/blog/v2.0/settings-light.png" alt="The redesigned Settings window with wallpaper and color controls in the purple theme" class="themedComponent_mlkZ themedComponent--light_NVdE"><img src="https://duxlabs.dev/img/blog/v2.0/settings-dark.png" alt="The redesigned Settings window with wallpaper and color controls in the purple theme" class="themedComponent_mlkZ themedComponent--dark_xIcU"><figcaption>The new Settings.</figcaption></figure>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="dash-plugins">Dash plugins<a href="https://duxlabs.dev/blog/v2-0-release#dash-plugins" class="hash-link" aria-label="Direct link to Dash plugins" title="Direct link to Dash plugins" translate="no">​</a></h2>
<p>Dash is now customizable beyond the built-in tabs. Plugins can add a full tab, a card in the overview, or both. Reorder and resize cards, choose what belongs in your overview, and configure each entry.</p>
<p>The built-in pages have been rebuilt too: the overview, media player, weather, and wallpapers all use the new design.</p>
<figure class="screenshot_ZRMh"><img src="https://duxlabs.dev/img/blog/v2.0/dash-light.png" alt="Dash overview with the purple theme, calendar, weather, media, and notifications" class="themedComponent_mlkZ themedComponent--light_NVdE"><img src="https://duxlabs.dev/img/blog/v2.0/dash-dark.png" alt="Dash overview with the purple theme, calendar, weather, media, and notifications" class="themedComponent_mlkZ themedComponent--dark_xIcU"><figcaption>The new Dash overview.</figcaption></figure>
<figure class="screenshot_ZRMh"><img src="https://duxlabs.dev/img/blog/v2.0/media-light.png" alt="The redesigned media player tab in Dash" class="themedComponent_mlkZ themedComponent--light_NVdE"><img src="https://duxlabs.dev/img/blog/v2.0/media-dark.png" alt="The redesigned media player tab in Dash" class="themedComponent_mlkZ themedComponent--dark_xIcU"><figcaption>The new default media player, named Bento.</figcaption></figure>
<p>For plugin authors, the new surfaces are <code>dash</code> and <code>dashCard</code>. A composite plugin can provide both. See the <a class="" href="https://duxlabs.dev/docs/dms/plugin-development#dash-plugins">Dash plugin docs</a> for manifests, options, sizing, and examples.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="build-your-own-lock-screen">Build your own lock screen<a href="https://duxlabs.dev/blog/v2-0-release#build-your-own-lock-screen" class="hash-link" aria-label="Direct link to Build your own lock screen" title="Direct link to Build your own lock screen" translate="no">​</a></h2>
<p>The lock screen now uses widgets. Add, move, resize, and configure the clock, date, notifications, status, and power controls. Choose a clock style, change its colors and font, and put things where you want them.</p>
<p>The editor gives you a preview while you make changes. Open <strong>Settings → Security → Lock screen</strong> to get started.</p>
<figure class="screenshot_ZRMh"><img src="https://duxlabs.dev/img/blog/v2.0/lock-light.png" alt="Purple lock screen preview with the widget browser open" class="themedComponent_mlkZ themedComponent--light_NVdE"><img src="https://duxlabs.dev/img/blog/v2.0/lock-dark.png" alt="Purple lock screen preview with the widget browser open" class="themedComponent_mlkZ themedComponent--dark_xIcU"><figcaption>Adding widgets in the lock screen editor.</figcaption></figure>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="dux-lyrical-engine">Dux Lyrical Engine<a href="https://duxlabs.dev/blog/v2-0-release#dux-lyrical-engine" class="hash-link" aria-label="Direct link to Dux Lyrical Engine" title="Direct link to Dux Lyrical Engine" translate="no">​</a></h2>
<p>The media player now has synced lyrics with word-level and even syllable-level precision when the source provides timing.</p>
<p>Choose your providers and drag them into priority order in <strong>Settings → Sound &amp; media → Media player</strong>. The built-in sources include Better Lyrics, Unison, LyricsPlus, KuGou, LRCLIB, and YouTube Music. Local lyrics are supported too. Turn all providers off to use local lyrics only.</p>
<figure class="screenshot_ZRMh"><img src="https://duxlabs.dev/img/blog/v2.0/lyrics-light.png" alt="The Dash media player with synced lyrics during playback" class="themedComponent_mlkZ themedComponent--light_NVdE"><img src="https://duxlabs.dev/img/blog/v2.0/lyrics-dark.png" alt="The Dash media player with synced lyrics during playback" class="themedComponent_mlkZ themedComponent--dark_xIcU"><figcaption>Synced lyrics in the media player.</figcaption></figure>
<p>Plugins can add lyrics providers without needing a QML interface. Widgets can also use the lyrics service for their own displays. See <a class="" href="https://duxlabs.dev/docs/dms/plugin-development#lyrics-providers">lyrics providers</a> and the <a class="" href="https://duxlabs.dev/docs/dms/plugin-development#lyrics">lyrics API</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="dux-files">Dux Files<a href="https://duxlabs.dev/blog/v2-0-release#dux-files" class="hash-link" aria-label="Direct link to Dux Files" title="Direct link to Dux Files" translate="no">​</a></h2>
<p><strong>Dux Files</strong> is a new file manager from Dux Labs, shipping alongside 2.0. It's a standalone app: a small Go daemon does the file work and a Quickshell window sits on top. It shares the look of the shell and follows your DMS theme when both run, but it doesn't need DMS.</p>
<figure class="screenshot_ZRMh"><img src="https://duxlabs.dev/img/dfileslight.png" alt="Dux Files in grid view with the preview drawer open on a picture" class="themedComponent_mlkZ themedComponent--light_NVdE"><img src="https://duxlabs.dev/img/dfiles.png" alt="Dux Files in grid view with the preview drawer open on a picture" class="themedComponent_mlkZ themedComponent--dark_xIcU"><figcaption>Dux Files in grid view with the preview drawer.</figcaption></figure>
<ul>
<li class=""><strong>Tabs and split view:</strong> open folders in tabs, or show two folders side by side and drag files between them.</li>
<li class=""><strong>List, grid, and column views:</strong> each folder remembers its sort order and list or grid view. Column view stays on as you browse.</li>
<li class=""><strong>Preview:</strong> press Space to see a preview and details of the selected file next to the list.</li>
<li class=""><strong>File operations:</strong> copy, move, rename, and delete with progress and undo. If you don't have permission, retry as administrator.</li>
<li class=""><strong>Archives:</strong> open zip, tar, 7z, and rar files, and compress files into zip or tar, without installing extra tools.</li>
<li class=""><strong>Search:</strong> search the current folder or your whole home, filtered by type, date, or size.</li>
<li class=""><strong>Drives and network shares:</strong> mount USB drives, unlock encrypted ones, and connect to SFTP, SMB, and WebDAV servers.</li>
<li class=""><strong>Works with your apps:</strong> "Show in folder" from your browser opens Dux Files. It can also replace the open and save dialogs in other apps.</li>
<li class=""><strong>Keyboard navigation:</strong> drive the entire interface with the keyboard only.</li>
</ul>
<p>Get it from the <a class="" href="https://duxlabs.dev/docs/dfiles/installation">installation guide</a>, and read the rest in the <a class="" href="https://duxlabs.dev/docs/dfiles">Dux Files docs</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="wallpaper-generator">Wallpaper Generator<a href="https://duxlabs.dev/blog/v2-0-release#wallpaper-generator" class="hash-link" aria-label="Direct link to Wallpaper Generator" title="Direct link to Wallpaper Generator" translate="no">​</a></h2>
<p>Make your own Material 3 wallpaper at <a href="https://wallpaper.duxlabs.dev/" target="_blank" rel="noopener noreferrer" class="">wallpaper.duxlabs.dev</a>. Pick shapes, patterns, and a palette. Wallpapers can be exported as a PNG, or as a DMS format which automatically follows your theme colors.</p>
<figure class="screenshot_ZRMh"><img src="https://duxlabs.dev/img/blog/v2.0/wallpaper-light.png" alt="The Wallpaper Generator with purple shapes on a contour pattern" class="themedComponent_mlkZ themedComponent--light_NVdE"><img src="https://duxlabs.dev/img/blog/v2.0/wallpaper-dark.png" alt="The Wallpaper Generator with purple shapes on a contour pattern" class="themedComponent_mlkZ themedComponent--dark_xIcU"><figcaption>The Wallpaper Generator.</figcaption></figure>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="operation-freedom-dux-dot">Operation Freedom: Dux Dot<a href="https://duxlabs.dev/blog/v2-0-release#operation-freedom-dux-dot" class="hash-link" aria-label="Direct link to Operation Freedom: Dux Dot" title="Direct link to Operation Freedom: Dux Dot" translate="no">​</a></h2>
<p>Dux Dot is a new dynamic island-style hub built around one persistent dot. It morphs into your launcher, dashboard, control center, media, weather, wallpaper, and notifications. Keep your existing IPCs and keybinds, or route them through the new bar settings.</p>
<p>It is a super minimal way to run DMS, and it stays out of your way. Clean, fast, fullscreen, and gamer-mode ready. Place it, or fling it, anywhere on the screen.</p>
<figure class="screenshot_ZRMh"><img src="https://duxlabs.dev/img/blog/v2.0/dot-light.png" alt="Dux Dot resting as a small circle on the desktop wallpaper" class="themedComponent_mlkZ themedComponent--light_NVdE"><img src="https://duxlabs.dev/img/blog/v2.0/dot-dark.png" alt="Dux Dot resting as a small circle on the desktop wallpaper" class="themedComponent_mlkZ themedComponent--dark_xIcU"><figcaption>Dux Dot, one dot for the whole shell.</figcaption></figure>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-island-anywhere">The island, anywhere<a href="https://duxlabs.dev/blog/v2-0-release#the-island-anywhere" class="hash-link" aria-label="Direct link to The island, anywhere" title="Direct link to The island, anywhere" translate="no">​</a></h2>
<p>The island can now go in any bar as a widget, float anywhere on screen, run vertically, or tuck into the top of the display in notch mode.</p>
<p>The compact face holds more widgets, including media, weather, a workspace switcher, a privacy indicator, and a system tray. Volume, brightness, and other changes can show in the island instead of the usual on-screen display.</p>
<figure class="screenshot_ZRMh"><img src="https://duxlabs.dev/img/blog/v2.0/island-light.png" alt="The island as a horizontal pill and the same face run vertically, with the clock, weather, and a notification count" class="themedComponent_mlkZ themedComponent--light_NVdE"><img src="https://duxlabs.dev/img/blog/v2.0/island-dark.png" alt="The island as a horizontal pill and the same face run vertically, with the clock, weather, and a notification count" class="themedComponent_mlkZ themedComponent--dark_xIcU"><figcaption>The island horizontal and vertical.</figcaption></figure>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bars-that-move-like-the-island">Bars that move like the island<a href="https://duxlabs.dev/blog/v2-0-release#bars-that-move-like-the-island" class="hash-link" aria-label="Direct link to Bars that move like the island" title="Direct link to Bars that move like the island" translate="no">​</a></h2>
<p>Bars now use the same spring motion as the island, so size and corner changes ease into place instead of jumping.</p>
<p>Thickness can be fractional or fit to the widgets, and middle or right clicking empty bar space can run an action you pick.</p>
<p>Each section can turn on auto overflow. Flexible widgets shrink first, and whatever still doesn't fit moves into an overflow menu. Per widget, set <strong>Placement</strong> to Auto, Keep in Bar, or Always in overflow.</p>
<figure class="screenshot_ZRMh"><img src="https://duxlabs.dev/img/blog/v2.0/bars-light.png" alt="Bar settings with Main Bar on the top edge, a second bar on the left, and Frame selected as the layout" class="themedComponent_mlkZ themedComponent--light_NVdE"><img src="https://duxlabs.dev/img/blog/v2.0/bars-dark.png" alt="Bar settings with Main Bar on the top edge, a second bar on the left, and Frame selected as the layout" class="themedComponent_mlkZ themedComponent--dark_xIcU"><figcaption>Updated bar settings with easy target placement.</figcaption></figure>
<figure class="screenshot_ZRMh"><img src="https://duxlabs.dev/img/blog/v2.0/overflow-light.png" alt="Bar widget settings with auto overflow on for the center section and the overflow button placed after Weather" class="themedComponent_mlkZ themedComponent--light_NVdE"><img src="https://duxlabs.dev/img/blog/v2.0/overflow-dark.png" alt="Bar widget settings with auto overflow on for the center section and the overflow button placed after Weather" class="themedComponent_mlkZ themedComponent--dark_xIcU"><figcaption>Auto overflow for a bar section, with the button placed after a widget.</figcaption></figure>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="dock">Dock<a href="https://duxlabs.dev/blog/v2-0-release#dock" class="hash-link" aria-label="Direct link to Dock" title="Direct link to Dock" translate="no">​</a></h2>
<p>The dock can be used as an OmegaDock now. Add more than one, put each on any edge, and choose a compact icon row or a taskbar.</p>
<p>Taskbar mode is new. The dock spans the whole edge, end to end. Compact mode is still a strip of icons.</p>
<p>The dock runs the same widgets as the bar, including plugins, so a clock, tray, media, workspaces, or anything a plugin provides can sit next to your apps. A widget can open as a popout or inline, where the dock grows and the panel sits beside the icons. Plugin authors provide that panel with <code>attachedContent</code>. See <a class="" href="https://duxlabs.dev/docs/dms/plugin-development#widgets-in-a-dock">widgets in a dock</a>.</p>
<p>Hover magnification scales the icon under the pointer and can push its neighbors aside, and the focused app can expand into a pill. The dock animates on the same spring as the island and the bars.</p>
<figure class="screenshot_ZRMh"><img src="https://duxlabs.dev/img/blog/v2.0/dock-light.png" alt="A dock mixing app icons with a clock, pinned apps, and a weather widget" class="themedComponent_mlkZ themedComponent--light_NVdE"><img src="https://duxlabs.dev/img/blog/v2.0/dock-dark.png" alt="A dock mixing app icons with a clock, pinned apps, and a weather widget" class="themedComponent_mlkZ themedComponent--dark_xIcU"><figcaption>App icons and widgets sharing the dock.</figcaption></figure>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="control-center">Control Center<a href="https://duxlabs.dev/blog/v2-0-release#control-center" class="hash-link" aria-label="Direct link to Control Center" title="Direct link to Control Center" translate="no">​</a></h2>
<p>In the Control Center, tiles come in a smaller half-height size for tighter grids, and pill widgets like volume and brightness can be sized in half steps.</p>
<figure class="screenshot_ZRMh"><img src="https://duxlabs.dev/img/blog/v2.0/control-center-light.png" alt="Control Center in edit mode, with a profile header, power buttons, and a grid of tiles being resized" class="themedComponent_mlkZ themedComponent--light_NVdE"><img src="https://duxlabs.dev/img/blog/v2.0/control-center-dark.png" alt="Control Center in edit mode, with a profile header, power buttons, and a grid of tiles being resized" class="themedComponent_mlkZ themedComponent--dark_xIcU"><figcaption>The Control Center, laid out and resized.</figcaption></figure>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="digital-wellbeing">Digital Wellbeing<a href="https://duxlabs.dev/blog/v2-0-release#digital-wellbeing" class="hash-link" aria-label="Direct link to Digital Wellbeing" title="Direct link to Digital Wellbeing" translate="no">​</a></h2>
<p>Dash has a new Digital Wellbeing tab. It tracks screen time, lets you set a daily limit and per-app limits, and tells you when you hit one. Scripts can read the same status over IPC.</p>
<figure class="screenshot_ZRMh"><img src="https://duxlabs.dev/img/blog/v2.0/digital-wellbeing-light.png" alt="The Digital Wellbeing tab in Dash, with weekly screen time and a list of the most used apps" class="themedComponent_mlkZ themedComponent--light_NVdE"><img src="https://duxlabs.dev/img/blog/v2.0/digital-wellbeing-dark.png" alt="The Digital Wellbeing tab in Dash, with weekly screen time and a list of the most used apps" class="themedComponent_mlkZ themedComponent--dark_xIcU"><figcaption>Weekly screen time and the most used apps.</figcaption></figure>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="niri">niri<a href="https://duxlabs.dev/blog/v2-0-release#niri" class="hash-link" aria-label="Direct link to niri" title="Direct link to niri" translate="no">​</a></h2>
<p>niri can turn the touchpad on and off. DMS shows the change on screen, and the default config binds the touchpad key to <code>toggle-touchpad</code>. Focus follows mouse works too.</p>
<p>Switching workspaces can show an on-screen display, window rules can set a column's width and height as a percentage, and connected displays can be cycled. A hidden bar gets out of the way while the overview is open, and a dock set to overview-only shows up there.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="hyprland-and-mangowc">Hyprland and MangoWC<a href="https://duxlabs.dev/blog/v2-0-release#hyprland-and-mangowc" class="hash-link" aria-label="Direct link to Hyprland and MangoWC" title="Direct link to Hyprland and MangoWC" translate="no">​</a></h2>
<p><strong>Hyprland</strong> catches up with 0.56: dwindle, master, and scrolling layouts with their own settings, special workspaces as scratchpads, and the new blur styles, glow, motion blur, and group tabs. Wobbly windows work on Hyprland git.</p>
<p><strong>MangoWC</strong> 0.18 renamed its config keys to snake_case. DMS writes the new format, and <code>dms config mango-migrate</code> converts an existing config.</p>
<p>On both, mouse, touchpad, keyboard, and focus follows mouse are in Settings, and <code>dms setup</code> can start the shell from <code>hyprland-session.target</code> or <code>mango-session.target</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="aqueous-and-umbriel">Aqueous and Umbriel<a href="https://duxlabs.dev/blog/v2-0-release#aqueous-and-umbriel" class="hash-link" aria-label="Direct link to Aqueous and Umbriel" title="Direct link to Aqueous and Umbriel" translate="no">​</a></h2>
<p><strong><a href="https://www.seafoam-labs.org/" target="_blank" rel="noopener noreferrer" class="">Aqueous</a></strong> gets comprehensive support, and <strong><a href="https://github.com/noctalia-dev/umbriel" target="_blank" rel="noopener noreferrer" class="">Umbriel</a></strong> gets basic support.</p>
<p>They join niri, Hyprland, MangoWC, Sway, labwc, and Miracle.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="more-in-20">More in 2.0<a href="https://duxlabs.dev/blog/v2-0-release#more-in-20" class="hash-link" aria-label="Direct link to More in 2.0" title="Direct link to More in 2.0" translate="no">​</a></h2>
<ul>
<li class=""><strong>Launcher:</strong> dmenu mode, custom keybinds, app editing, VPN search, Open with for files, Flatpak uninstall, an option to focus a running window instead of launching a new one, and an option to turn off history.</li>
<li class=""><strong>Workspaces:</strong> dot, line, and card indicators, a compact mode, and a minimum workspace count.</li>
<li class=""><strong>Theming:</strong> bold color variants, wallpaper-tinted terminal colors with background opacity, Positron support, and a per-bar background color.</li>
<li class=""><strong>Wallpaper:</strong> cycling can recurse into subdirectories.</li>
<li class=""><strong>Audio:</strong> mono audio toggle.</li>
<li class=""><strong>Network:</strong> Fortinet VPN with SAML and password auth.</li>
<li class=""><strong>Settings:</strong> Alt+Arrow switches panes, touchpad click method, and <code>config.d</code> to split settings across files.</li>
<li class=""><strong>Multiplexers:</strong> Herdr joins tmux and zellij.</li>
<li class=""><strong>Blur:</strong> strength slider.</li>
<li class=""><strong>Plugin browser:</strong> shelves, typo-tolerant search, detail pages, and one-click upvotes.</li>
<li class=""><strong>Desktop widgets:</strong> editor improvements.</li>
<li class=""><strong>Notifications:</strong> extra rule conditions, timed per-app mutes, hovered popups stay put, and <code>invokeLast</code> over IPC.</li>
<li class=""><strong>Screenshots:</strong> snap to open popouts and Ctrl+C to copy without saving.</li>
<li class=""><strong>Displays:</strong> per-output ICC color profiles and color temperature.</li>
<li class=""><strong>System updates:</strong> floating window, Portage backend, highlighted upgrade logs, and a reboot prompt after kernel updates.</li>
<li class=""><strong>Channels:</strong> <code>dms switch beta</code> moves to beta packages after taking a backup, and <code>dms switch stable</code> goes back. Name a package to switch only that one. See <a class="" href="https://duxlabs.dev/docs/dms/cli-switch">Switch channels</a>.</li>
<li class=""><strong>Distros:</strong> official PikaOS support, Enterprise Linux 10 (RHEL, CentOS Stream, Rocky Linux, AlmaLinux), and native FreeBSD support.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-plugin-types">New plugin types<a href="https://duxlabs.dev/blog/v2-0-release#new-plugin-types" class="hash-link" aria-label="Direct link to New plugin types" title="Direct link to New plugin types" translate="no">​</a></h2>
<p>Plugins can now add a tab or a card to <strong>Dash</strong> and sit in the <strong>dock</strong>, opening as a popout or a panel that grows the dock. Desktop plugins can also go on the <strong>lock screen</strong>. See the <a class="" href="https://duxlabs.dev/docs/dms/plugin-development#dash-plugins">Dash plugin docs</a> and <a class="" href="https://duxlabs.dev/docs/dms/plugin-development#widgets-in-a-dock">widgets in a dock</a>.</p>
<p>The plugin browser in Settings was rebuilt, led by <a href="https://github.com/lung595" target="_blank" rel="noopener noreferrer" class="">lung595</a>. It has a Discover page with shelves and daily and weekly picks, filters for your compositor, typo-tolerant search, detail pages, one-click upvotes, and undo after an uninstall.</p>
<figure class="screenshot_ZRMh"><img src="https://duxlabs.dev/img/blog/v2.0/plugins-light.png" alt="The plugin browser with the Discover shelves, picks of the week and day, sort and filter chips, and plugin cards with badges and vote counts" class="themedComponent_mlkZ themedComponent--light_NVdE"><img src="https://duxlabs.dev/img/blog/v2.0/plugins-dark.png" alt="The plugin browser with the Discover shelves, picks of the week and day, sort and filter chips, and plugin cards with badges and vote counts" class="themedComponent_mlkZ themedComponent--dark_xIcU"><figcaption>The new plugin browser.</figcaption></figure>
<p>Update checks only flag a plugin when the remote has commits you don't have yet (<a href="https://github.com/bernardopg" target="_blank" rel="noopener noreferrer" class="">Bernardo Gomes</a>), and plugin state saves on the first change after a reload (<a href="https://github.com/Mario-Mohar" target="_blank" rel="noopener noreferrer" class="">Mario-Mohar</a>).</p>
<p>The <a class="" href="https://duxlabs.dev/plugins">registry</a> is past 380 plugins and 47 themes, up from 337 and 42 at 1.6. The most upvoted new plugins are Sands and Orbit Bluetooth by <a href="https://github.com/lung595" target="_blank" rel="noopener noreferrer" class="">lung595</a>, Screenshot+ by <a href="https://github.com/pcmid" target="_blank" rel="noopener noreferrer" class="">pcmid</a>, MangoWM Layout Manager by <a href="https://github.com/omarluq" target="_blank" rel="noopener noreferrer" class="">omarluq</a>, and Bitwarden Dankbar and DankChat by <a href="https://github.com/coldi1337" target="_blank" rel="noopener noreferrer" class="">coldi1337</a>. <a href="https://github.com/satoshoe-dev" target="_blank" rel="noopener noreferrer" class="">satoshoe-dev</a> and <a href="https://github.com/by-architect" target="_blank" rel="noopener noreferrer" class="">by-architect</a> each added six.</p>
<p>Upvote the plugins you use so other people find them.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="fixes-and-polish">Fixes and polish<a href="https://duxlabs.dev/blog/v2-0-release#fixes-and-polish" class="hash-link" aria-label="Direct link to Fixes and polish" title="Direct link to Fixes and polish" translate="no">​</a></h2>
<p>Alongside the redesign, 2.0 carries 90+ bug fixes and quality-of-life improvements across the shell. Some of the ones you may notice:</p>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>View Details</summary><div><div class="collapsibleContent_i85q"><ul>
<li class="">The fingerprint reader keeps working after closing the lid or suspending.</li>
<li class="">The lock screen shows on every display when none is selected, and locks before sleep even when the sleep command skips logind.</li>
<li class="">Monitors wake after an automatic lock.</li>
<li class="">The shell takes the lock back when it restarts into a locked session.</li>
<li class="">Tray icons no longer jump position when their properties change, and the tray keeps working across display reconnects.</li>
<li class="">The island's pill no longer jumps sideways when the compact face switches.</li>
<li class="">Hidden bar pills no longer catch clicks.</li>
<li class="">The dock cycles grouped windows again, keeps its focused indicator in the niri overview, and drops orphaned surfaces when you delete a dock.</li>
<li class="">iwd no longer asks for a Wi-Fi password twice, and Wi-Fi devices are rediscovered before scanning.</li>
<li class="">Bridge, bond, team, and VLAN links count as wired under systemd-networkd.</li>
<li class="">Tailscale follows profile switches.</li>
<li class="">Bluetooth headset controls go to the active player.</li>
<li class="">Refresh rate is restored after resume.</li>
<li class="">Brightness retries the initial DDC read.</li>
<li class="">Screenshot HUD and selection labels scale correctly on HiDPI displays, a saved screenshot can be copied as a file, and only one screenshot instance runs at a time.</li>
<li class="">Screen captures no longer count as camera use in the privacy indicator.</li>
<li class="">Scrolling song titles in the media widget no longer truncate.</li>
<li class="">Wallpapers keep loading when the surface regenerates, and scrolling wallpapers render once they've decoded.</li>
<li class="">Clipboard history decodes file URIs, large file copies no longer fail, and copied folders can be restored.</li>
<li class="">The notepad keeps your notes across repeated saves.</li>
<li class="">Hovered notification popups stay pinned, and the popup timer no longer restarts after the enter animation.</li>
<li class="">Battery reports when a charge threshold isn't supported instead of pretending it worked.</li>
<li class="">The sink volume no longer gets overwritten while you adjust it, and a missing event sound no longer breaks the rest.</li>
<li class="">Pinned state is kept when you edit a launcher entry.</li>
<li class="">The process list searches every process, not just the top 100.</li>
<li class="">Plugin updates only show when the remote has something new, and plugins no longer get injected into app categories.</li>
<li class="">Settings skips unchanged saves so edits you make outside the shell aren't swallowed.</li>
<li class=""><code>dms doctor</code> warns when a Qt platform theme plugin targets a different Qt version.</li>
<li class="">The CLI times out instead of hanging when the DMS server doesn't answer.</li>
<li class="">Logging out ends the logind session on compositors with no quit request.</li>
<li class="">Update lists skip obsoleted dnf packages and collapse rows duplicated across repositories.</li>
<li class="">Hyprland window rules use syntax Hyprland 0.56 accepts.</li>
<li class="">Light-mode colors, KDE color scheme templates, and the kitty cursor color follow your theme more closely.</li>
<li class="">Theme generation runs at low priority and regenerates once when the scheme or monitor changes.</li>
<li class="">The calendar no longer repeats a day.</li>
<li class="">...and many, many more.</li>
</ul></div></div></details>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade-notes">Upgrade Notes<a href="https://duxlabs.dev/blog/v2-0-release#upgrade-notes" class="hash-link" aria-label="Direct link to Upgrade Notes" title="Direct link to Upgrade Notes" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-app-id-change">(Breaking) App ID Change<a href="https://duxlabs.dev/blog/v2-0-release#breaking-app-id-change" class="hash-link" aria-label="Direct link to (Breaking) App ID Change" title="Direct link to (Breaking) App ID Change" translate="no">​</a></h3>
<p>The DMS app ID is now <code>dev.duxlabs.shell</code>, replacing <code>com.danklinux.dms</code>. The window rules DMS manages itself are updated automatically. If you wrote your own compositor window rules for DMS windows, update them to the new ID.</p>
<p>On niri, for example, this:</p>
<div class="language-kdl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#e4e4e7;--prism-background-color:#2e2a3d"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-kdl codeBlock_bY9V thin-scrollbar" style="color:#e4e4e7;background-color:#2e2a3d"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#e4e4e7"><span class="token plain">window-rule {</span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">    match app-id=r#"^com\.danklinux\.dms$"#</span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">    open-floating true</span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">}</span><br></div></code></pre></div></div>
<p>becomes:</p>
<div class="language-kdl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#e4e4e7;--prism-background-color:#2e2a3d"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-kdl codeBlock_bY9V thin-scrollbar" style="color:#e4e4e7;background-color:#2e2a3d"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#e4e4e7"><span class="token plain">window-rule {</span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">    match app-id=r#"^dev\.duxlabs\.shell$"#</span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">    open-floating true</span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="plugin-authors-update-your-widgets">Plugin authors: update your widgets<a href="https://duxlabs.dev/blog/v2-0-release#plugin-authors-update-your-widgets" class="hash-link" aria-label="Direct link to Plugin authors: update your widgets" title="Direct link to Plugin authors: update your widgets" translate="no">​</a></h2>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>Deprecated widget imports and types</div><div class="admonitionContent_BuS1"><p>The old widget wrappers are deprecated and will be removed in a future release. Update the imports <strong>and</strong> the type names. The compatibility wrappers log a warning with the replacement to use.</p></div></div>
<p>For example, this:</p>
<div class="language-qml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#e4e4e7;--prism-background-color:#2e2a3d"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-qml codeBlock_bY9V thin-scrollbar" style="color:#e4e4e7;background-color:#2e2a3d"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#e4e4e7"><span class="token keyword" style="color:#c792ea">import</span><span class="token plain"> qs.Widgets</span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token class-name" style="color:#82aaff">DankButton</span><span class="token plain"> </span><span class="token punctuation" style="color:#c0c0d0">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">    </span><span class="token property" style="color:#f78c6c">text</span><span class="token punctuation" style="color:#c0c0d0">:</span><span class="token plain"> </span><span class="token javascript-expression language-javascript string" style="color:#c3e88d">"Open"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token punctuation" style="color:#c0c0d0">}</span><br></div></code></pre></div></div>
<p>becomes:</p>
<div class="language-qml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#e4e4e7;--prism-background-color:#2e2a3d"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-qml codeBlock_bY9V thin-scrollbar" style="color:#e4e4e7;background-color:#2e2a3d"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#e4e4e7"><span class="token keyword" style="color:#c792ea">import</span><span class="token plain"> qs.DCommon.Widgets</span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token class-name" style="color:#82aaff">DButton</span><span class="token plain"> </span><span class="token punctuation" style="color:#c0c0d0">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">    </span><span class="token property" style="color:#f78c6c">text</span><span class="token punctuation" style="color:#c0c0d0">:</span><span class="token plain"> </span><span class="token javascript-expression language-javascript string" style="color:#c3e88d">"Open"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token punctuation" style="color:#c0c0d0">}</span><br></div></code></pre></div></div>
<p>Some common replacements:</p>
<table><thead><tr><th>Old type</th><th>New type in <code>qs.DCommon.Widgets</code></th></tr></thead><tbody><tr><td><code>DankButton</code></td><td><code>DButton</code></td></tr><tr><td><code>DankActionButton</code></td><td><code>DActionButton</code></td></tr><tr><td><code>DankIcon</code></td><td><code>DIcon</code></td></tr><tr><td><code>DankSlider</code></td><td><code>DSlider</code></td></tr><tr><td><code>DankToggle</code></td><td><code>DToggle</code></td></tr><tr><td><code>DankTextField</code></td><td><code>DTextField</code></td></tr><tr><td><code>DankTabBar</code></td><td><code>DTabBar</code></td></tr><tr><td><code>DankFlickable</code></td><td><code>DFlickable</code></td></tr><tr><td><code>DankListView</code></td><td><code>DListView</code></td></tr><tr><td><code>DankScrollbar</code></td><td><code>DScrollbar</code></td></tr></tbody></table>
<p><code>StyledText</code> keeps its name and is also available from <code>qs.DCommon.Widgets</code>. Shell-specific types still live in <code>qs.Widgets</code>, so keep that import if your plugin uses them. Check the warning for each deprecated type rather than replacing every import blindly.</p>
<p>The replacements are in the <a href="https://github.com/duxlabs-dev/dux-qml-common/tree/master/DCommon/Widgets" target="_blank" rel="noopener noreferrer" class="">shared widget library</a>, and the <a href="https://github.com/duxlabs-dev/dux-shell/tree/master/quickshell/Widgets" target="_blank" rel="noopener noreferrer" class="">compatibility wrappers</a> show the old and new names.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="notes-for-package-maintainers">Notes for Package Maintainers<a href="https://duxlabs.dev/blog/v2-0-release#notes-for-package-maintainers" class="hash-link" aria-label="Direct link to Notes for Package Maintainers" title="Direct link to Notes for Package Maintainers" translate="no">​</a></h2>
<p>DMS now lives at <a href="https://github.com/duxlabs-dev/dux-shell" target="_blank" rel="noopener noreferrer" class="">duxlabs-dev/dux-shell</a>.</p>
<p>The desktop files and icon follow the new app ID, so update any install lines that name them:</p>
<table><thead><tr><th>Old file</th><th>New file</th></tr></thead><tbody><tr><td><code>assets/com.danklinux.dms.desktop</code></td><td><code>assets/dev.duxlabs.shell.desktop</code></td></tr><tr><td><code>assets/com.danklinux.dms.notepad.desktop</code></td><td><code>assets/dev.duxlabs.shell.notepad.desktop</code></td></tr><tr><td><code>assets/com.danklinux.dms.svg</code></td><td><code>assets/dev.duxlabs.shell.svg</code></td></tr></tbody></table>
<p>Dux Calendar's assets moved the same way, from <code>com.danklinux.dankcalendar.*</code> to <code>dev.duxlabs.calendar.*</code>.</p>
<p>Binary names, systemd units, and the <code>dms-open.desktop</code> URL handler are unchanged.</p>
<p>Renaming packages to the new names is not required, but we'd prefer it:</p>
<table><thead><tr><th>Old name</th><th>New name</th></tr></thead><tbody><tr><td><code>dms</code>, <code>DankMaterialShell</code>, <code>dms-shell</code></td><td><code>dux-shell</code></td></tr><tr><td><code>dgop</code></td><td><code>dux-gop</code></td></tr><tr><td><code>dankcalendar</code>, <code>dank-calendar</code></td><td><code>dux-calendar</code></td></tr><tr><td><code>dank-greeter</code></td><td><code>dux-greeter</code></td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-people-behind-it">The people behind it<a href="https://duxlabs.dev/blog/v2-0-release#the-people-behind-it" class="hash-link" aria-label="Direct link to The people behind it" title="Direct link to The people behind it" translate="no">​</a></h2>
<p>DMS is founded and maintained by <strong><a href="https://github.com/bbedward" target="_blank" rel="noopener noreferrer" class="">bbedward</a></strong> and <strong><a href="https://github.com/purian23" target="_blank" rel="noopener noreferrer" class="">purian23</a></strong>. <strong><a href="https://github.com/hthienloc" target="_blank" rel="noopener noreferrer" class="">Huỳnh Thiện Lộc</a></strong> has been a close and vital contributor, landing features, bug fixes, and ongoing plugin maintenance. Thank you to everyone else contributing code, plugins, translations, packaging, testing, and bug reports.</p>
<p>Thanks to <strong>LuckShiba</strong> and <strong>EricDraven</strong> for their NixOS work and community support.</p>
<p>Thank you to <strong>apollo79</strong> and <strong>georgestafilidis</strong>, the two new designers who pioneered the design in 2.0 and much more daily!</p>
<div class="designers_bNvC"><a class="designer_ceKF" href="https://github.com/apollo79"><img src="https://duxlabs.dev/img/blog/v2.0/apollo79.jpg" alt="" width="80" height="80" loading="lazy"><span><strong>apollo79</strong><span>2.0 design</span></span></a><a class="designer_ceKF" href="https://github.com/georgestafilidis"><img src="https://duxlabs.dev/img/blog/v2.0/georgestafilidis.png" alt="" width="80" height="80" loading="lazy"><span><strong>georgestafilidis</strong><span>2.0 design</span></span></a></div>
<p>A special thank you to everyone who supports Dux Labs through GitHub Sponsors and <a href="https://ko-fi.com/duxlabs" target="_blank" rel="noopener noreferrer" class="">Ko-fi</a>. Your support keeps this project going, and we're grateful for every one of you!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="community-contributions">Community Contributions<a href="https://duxlabs.dev/blog/v2-0-release#community-contributions" class="hash-link" aria-label="Direct link to Community Contributions" title="Direct link to Community Contributions" translate="no">​</a></h2>
<p>600+ commits from 65 contributors since 1.6. Time for a callout:</p>
<p><strong><a href="https://github.com/hthienloc" target="_blank" rel="noopener noreferrer" class="">Huỳnh Thiện Lộc</a></strong> landed 31 commits, including the dock's proximity magnification, neighbor push-apart, and animated focused-app pill, plus toggling the compositor overview from the dock's launcher button. He also brought the island's system tray slot and overflow menu, auto-hide for the island in overlay mode, and the niri workspace-switch OSD. On the screenshot side: touch and stylus region capture, snapping to open panels, Ctrl+C to copy without saving, and the <code>--hud</code> flag. Also the redesigned keybinds cheatsheet, Flatpak uninstall from the launcher, and recursive wallpaper cycling.</p>
<p>Also: per-output ICC color profiles and color temperature (<a href="https://github.com/KIDult2226" target="_blank" rel="noopener noreferrer" class="">KIDult2226</a>), VPN search, do-not-disturb while screen sharing, and timed idle inhibitor presets (<a href="https://github.com/avesst" target="_blank" rel="noopener noreferrer" class="">avesst</a>), gamma exceptions for fullscreen and excluded apps (<a href="https://github.com/euletheia" target="_blank" rel="noopener noreferrer" class="">euletheia</a>), and native FreeBSD support (<a href="https://github.com/Zer0TraceX" target="_blank" rel="noopener noreferrer" class="">Zer0TraceX</a>).</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="all-contributions">All Contributions<a href="https://duxlabs.dev/blog/v2-0-release#all-contributions" class="hash-link" aria-label="Direct link to All Contributions" title="Direct link to All Contributions" translate="no">​</a></h3>
<table><thead><tr><th>Contributor</th><th>Contribution</th></tr></thead><tbody><tr><td><strong><a href="https://github.com/0xdeafbeef" target="_blank" rel="noopener noreferrer" class="">0xdeafbeef</a></strong></td><td>Cycle connected displays on niri (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3362" target="_blank" rel="noopener noreferrer" class="">PR #3362</a>)</td></tr><tr><td><strong><a href="https://github.com/14Do" target="_blank" rel="noopener noreferrer" class="">14Do</a></strong></td><td>• Collapse dnf rows duplicated across repos (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3524" target="_blank" rel="noopener noreferrer" class="">PR #3524</a>)<br>• Skip the obsoleted packages in dnf output (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3525" target="_blank" rel="noopener noreferrer" class="">PR #3525</a>)</td></tr><tr><td><strong><a href="https://github.com/aarshivv" target="_blank" rel="noopener noreferrer" class="">aarshivv</a></strong></td><td>Display config: read live layout from hyprland instead of the cached wlr snapshot (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3418" target="_blank" rel="noopener noreferrer" class="">PR #3418</a>)</td></tr><tr><td><strong><a href="https://github.com/al-ula" target="_blank" rel="noopener noreferrer" class="">al-ula</a></strong></td><td>App picker: strip desktop suffix when resolving mime handlers (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3710" target="_blank" rel="noopener noreferrer" class="">PR #3710</a>)</td></tr><tr><td><strong><a href="https://github.com/aldair-meneses" target="_blank" rel="noopener noreferrer" class="">aldair-meneses</a></strong></td><td>Add configurable middle and right click actions on empty space (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3582" target="_blank" rel="noopener noreferrer" class="">PR #3582</a>)</td></tr><tr><td><strong><a href="https://github.com/alexhulbert" target="_blank" rel="noopener noreferrer" class="">alexhulbert</a></strong></td><td>Add shadow to island and satellites when shadow is turned on (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3798" target="_blank" rel="noopener noreferrer" class="">PR #3798</a>)</td></tr><tr><td><strong><a href="https://github.com/alvarosth" target="_blank" rel="noopener noreferrer" class="">alvarosth</a></strong></td><td>• Take the lock back when the shell restarts into a locked session (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3685" target="_blank" rel="noopener noreferrer" class="">PR #3685</a>)<br>• Let the CLI policy turn the registries off (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3703" target="_blank" rel="noopener noreferrer" class="">PR #3703</a>)</td></tr><tr><td><strong><a href="https://github.com/Aman9das" target="_blank" rel="noopener noreferrer" class="">Aman9das</a></strong></td><td>Add positron as a vscode fork (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3507" target="_blank" rel="noopener noreferrer" class="">PR #3507</a>)</td></tr><tr><td><strong><a href="https://github.com/apollo79" target="_blank" rel="noopener noreferrer" class="">apollo79</a></strong></td><td>• Add a link to the source code in plugin details (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3690" target="_blank" rel="noopener noreferrer" class="">PR #3690</a>)<br>• Add seek-to-line on clicking lyrics line (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3823" target="_blank" rel="noopener noreferrer" class="">PR #3823</a>)<br>• Add rotating cookie album style (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3819" target="_blank" rel="noopener noreferrer" class="">PR #3819</a>)<br>• Align with m3e spec (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3689" target="_blank" rel="noopener noreferrer" class="">PR #3689</a>)</td></tr><tr><td><strong><a href="https://github.com/arfan21" target="_blank" rel="noopener noreferrer" class="">arfan21</a></strong></td><td>• Add Word, Spreadsheet, Presentation, Archive app default (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3580" target="_blank" rel="noopener noreferrer" class="">PR #3580</a>)<br>• Expand vscode syntax and semantic token colors (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3686" target="_blank" rel="noopener noreferrer" class="">PR #3686</a>)</td></tr><tr><td><strong><a href="https://github.com/artrixdotdev" target="_blank" rel="noopener noreferrer" class="">artrixdotdev</a></strong></td><td>Show headphones icon for bluetooth headset (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3783" target="_blank" rel="noopener noreferrer" class="">PR #3783</a>)</td></tr><tr><td><strong><a href="https://github.com/arya-satwika" target="_blank" rel="noopener noreferrer" class="">arya-satwika</a></strong></td><td>Improved readability on buttons (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3481" target="_blank" rel="noopener noreferrer" class="">PR #3481</a>)</td></tr><tr><td><strong><a href="https://github.com/avesst" target="_blank" rel="noopener noreferrer" class="">avesst</a></strong></td><td>• Support fortinet vpn with saml and password auth (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3384" target="_blank" rel="noopener noreferrer" class="">PR #3384</a>)<br>• Add vpn connections as a search provider (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3391" target="_blank" rel="noopener noreferrer" class="">PR #3391</a>)<br>• Idle inhibitor: add duration presets and timed expiry (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3344" target="_blank" rel="noopener noreferrer" class="">PR #3344</a>)<br>• Auto-enable do not disturb while screen sharing (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3316" target="_blank" rel="noopener noreferrer" class="">PR #3316</a>)<br>• Stop counting screen captures as camera use (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3428" target="_blank" rel="noopener noreferrer" class="">PR #3428</a>)</td></tr><tr><td><strong><a href="https://github.com/bernardopg" target="_blank" rel="noopener noreferrer" class="">bernardopg</a></strong></td><td>• Warn when a qt platform theme plugin targets another qt minor (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3771" target="_blank" rel="noopener noreferrer" class="">PR #3771</a>)<br>• Only flag updates when remote head is not contained in local history (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3778" target="_blank" rel="noopener noreferrer" class="">PR #3778</a>)</td></tr><tr><td><strong><a href="https://github.com/centifanto" target="_blank" rel="noopener noreferrer" class="">centifanto</a></strong></td><td>Release hidden slideout input mask (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3500" target="_blank" rel="noopener noreferrer" class="">PR #3500</a>)</td></tr><tr><td><strong><a href="https://github.com/chenshifanjian" target="_blank" rel="noopener noreferrer" class="">chenshifanjian</a></strong></td><td>Decode file uris and stop failing oversized file copies (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3598" target="_blank" rel="noopener noreferrer" class="">PR #3598</a>)</td></tr><tr><td><strong><a href="https://github.com/cmleon51" target="_blank" rel="noopener noreferrer" class="">cmleon51</a></strong></td><td>• Explain why the autostart settings page is empty (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3754" target="_blank" rel="noopener noreferrer" class="">PR #3754</a>)<br>• Dim outputs without a backlight or ddc through gamma (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3813" target="_blank" rel="noopener noreferrer" class="">PR #3813</a>)</td></tr><tr><td><strong><a href="https://github.com/Conava" target="_blank" rel="noopener noreferrer" class="">Conava</a></strong></td><td>• Terminal background opacity and wallpaper-tinted colors (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3662" target="_blank" rel="noopener noreferrer" class="">PR #3662</a>)<br>• Open media and the power menu in one step (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3756" target="_blank" rel="noopener noreferrer" class="">PR #3756</a>)</td></tr><tr><td><strong><a href="https://github.com/cwelsys" target="_blank" rel="noopener noreferrer" class="">cwelsys</a></strong></td><td>• Only re-enable displays the cycle itself turned off (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3377" target="_blank" rel="noopener noreferrer" class="">PR #3377</a>)<br>• Stop hidden pills from catching clicks (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3488" target="_blank" rel="noopener noreferrer" class="">PR #3488</a>)</td></tr><tr><td><strong><a href="https://github.com/davidjmdev" target="_blank" rel="noopener noreferrer" class="">davidjmdev</a></strong></td><td>Make popout reopen after terminal upgrade optional (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3307" target="_blank" rel="noopener noreferrer" class="">PR #3307</a>)</td></tr><tr><td><strong><a href="https://github.com/dionjoshualobo" target="_blank" rel="noopener noreferrer" class="">dionjoshualobo</a></strong></td><td>Mono audio toggle (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3539" target="_blank" rel="noopener noreferrer" class="">PR #3539</a>)</td></tr><tr><td><strong><a href="https://github.com/domenkozar" target="_blank" rel="noopener noreferrer" class="">domenkozar</a></strong></td><td>Use available width for menu labels (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3456" target="_blank" rel="noopener noreferrer" class="">PR #3456</a>)</td></tr><tr><td><strong><a href="https://github.com/EmiOnFlux" target="_blank" rel="noopener noreferrer" class="">EmiOnFlux</a></strong></td><td>Add portage backend (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3676" target="_blank" rel="noopener noreferrer" class="">PR #3676</a>)</td></tr><tr><td><strong><a href="https://github.com/enchanteddev" target="_blank" rel="noopener noreferrer" class="">enchanteddev</a></strong></td><td>• Added middle-click to play/pause media and mute audio (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3332" target="_blank" rel="noopener noreferrer" class="">PR #3332</a>)<br>• Added option to choose the control center icon to be either Battery gauge or Connectivity (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3342" target="_blank" rel="noopener noreferrer" class="">PR #3342</a>)</td></tr><tr><td><strong><a href="https://github.com/euletheia" target="_blank" rel="noopener noreferrer" class="">euletheia</a></strong></td><td>Night mode exceptions (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2809" target="_blank" rel="noopener noreferrer" class="">PR #2809</a>)</td></tr><tr><td><strong><a href="https://github.com/ezemtsov" target="_blank" rel="noopener noreferrer" class="">ezemtsov</a></strong></td><td>Network(networkmanager): rebuild the Wi-Fi list once per scan (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3818" target="_blank" rel="noopener noreferrer" class="">PR #3818</a>)</td></tr><tr><td><strong><a href="https://github.com/FengYing1314" target="_blank" rel="noopener noreferrer" class="">FengYing1314</a></strong></td><td>Use plugin ids for management actions (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3284" target="_blank" rel="noopener noreferrer" class="">PR #3284</a>)</td></tr><tr><td><strong><a href="https://github.com/guillemcanal" target="_blank" rel="noopener noreferrer" class="">guillemcanal</a></strong></td><td>• Allow users to customize launcher keybindings (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3800" target="_blank" rel="noopener noreferrer" class="">PR #3800</a>)<br>• Add "Open with..." action to file search results (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3801" target="_blank" rel="noopener noreferrer" class="">PR #3801</a>)</td></tr><tr><td><strong><a href="https://github.com/hattapauzi" target="_blank" rel="noopener noreferrer" class="">hattapauzi</a></strong></td><td>Lock before sleep when the command skips logind (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3587" target="_blank" rel="noopener noreferrer" class="">PR #3587</a>)</td></tr><tr><td><strong><a href="https://github.com/hkoeck" target="_blank" rel="noopener noreferrer" class="">hkoeck</a></strong></td><td>Show the prompt PAM actually asked for (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3691" target="_blank" rel="noopener noreferrer" class="">PR #3691</a>)</td></tr><tr><td><strong><a href="https://github.com/hthienloc" target="_blank" rel="noopener noreferrer" class="">hthienloc</a></strong></td><td>• Add workspace switch OSD for niri (#1756) (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3337" target="_blank" rel="noopener noreferrer" class="">PR #3337</a>)<br>• Add touch &amp; stylus support for region capture (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3353" target="_blank" rel="noopener noreferrer" class="">PR #3353</a>)<br>• Add flatpak uninstall option in context menu (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3340" target="_blank" rel="noopener noreferrer" class="">PR #3340</a>)<br>• Add flag to control HUD scale and visibility (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3398" target="_blank" rel="noopener noreferrer" class="">PR #3398</a>)<br>• Show edit window rule when rule exists (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3516" target="_blank" rel="noopener noreferrer" class="">PR #3516</a>)<br>• Redesign cheatsheet with category navigation (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3534" target="_blank" rel="noopener noreferrer" class="">PR #3534</a>)<br>• Snap to active popouts &amp; modals in region mode (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3618" target="_blank" rel="noopener noreferrer" class="">PR #3618</a>)<br>• Add customizable proximity icon magnification (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3625" target="_blank" rel="noopener noreferrer" class="">PR #3625</a>)<br>• Expand focused app indicator into animated pill (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3640" target="_blank" rel="noopener noreferrer" class="">PR #3640</a>)<br>• Add Ctrl+C shortcut to copy w/o saving (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3645" target="_blank" rel="noopener noreferrer" class="">PR #3645</a>)<br>• Push neighboring icons apart on magnification (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3681" target="_blank" rel="noopener noreferrer" class="">PR #3681</a>)<br>• Toggle compositor overview on launcher button right-click (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3694" target="_blank" rel="noopener noreferrer" class="">PR #3694</a>)<br>• Allow recursive cycling through subdirectories (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3739" target="_blank" rel="noopener noreferrer" class="">PR #3739</a>)<br>• Support auto-hide for island in overlay mode (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3772" target="_blank" rel="noopener noreferrer" class="">PR #3772</a>)<br>• Add system tray slot and overflow menu to compact home (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3780" target="_blank" rel="noopener noreferrer" class="">PR #3780</a>)<br>• Overflow menu &amp; context menu to Dpopout (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3239" target="_blank" rel="noopener noreferrer" class="">PR #3239</a>)<br>• Credit Reverier-Xu/Ori-fcitx5 for fcitx5 theme inspiration (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3510" target="_blank" rel="noopener noreferrer" class="">PR #3510</a>)<br>• Update Ko-fi support link in README (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3578" target="_blank" rel="noopener noreferrer" class="">PR #3578</a>)</td></tr><tr><td><strong><a href="https://github.com/ignacypekala" target="_blank" rel="noopener noreferrer" class="">ignacypekala</a></strong></td><td>Add support for multiple config files (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3425" target="_blank" rel="noopener noreferrer" class="">PR #3425</a>)</td></tr><tr><td><strong><a href="https://github.com/iperegkefalos" target="_blank" rel="noopener noreferrer" class="">iperegkefalos</a></strong></td><td>Add touchpad click method in settings (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3356" target="_blank" rel="noopener noreferrer" class="">PR #3356</a>)</td></tr><tr><td><strong><a href="https://github.com/jetersen" target="_blank" rel="noopener noreferrer" class="">jetersen</a></strong></td><td>Rediscover wifi devices before scanning (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3821" target="_blank" rel="noopener noreferrer" class="">PR #3821</a>)</td></tr><tr><td><strong><a href="https://github.com/KadirJeager" target="_blank" rel="noopener noreferrer" class="">KadirJeager</a></strong></td><td>• App drawer: open the context menu at the click position (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3697" target="_blank" rel="noopener noreferrer" class="">PR #3697</a>)<br>• Hide include setup banners on compositors without includes (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3699" target="_blank" rel="noopener noreferrer" class="">PR #3699</a>)<br>• Send the vrr setting on the wlr-output path (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3701" target="_blank" rel="noopener noreferrer" class="">PR #3701</a>)<br>• Workspace rename: prefill the focused workspace name on hyprland (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3698" target="_blank" rel="noopener noreferrer" class="">PR #3698</a>)<br>• End the logind session on logout when the compositor has no quit request (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3700" target="_blank" rel="noopener noreferrer" class="">PR #3700</a>)</td></tr><tr><td><strong><a href="https://github.com/KIDult2226" target="_blank" rel="noopener noreferrer" class="">KIDult2226</a></strong></td><td>Per-output ICC color profiles and color temperature (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3388" target="_blank" rel="noopener noreferrer" class="">PR #3388</a>)</td></tr><tr><td><strong><a href="https://github.com/koopa1338" target="_blank" rel="noopener noreferrer" class="">koopa1338</a></strong></td><td>Inject external color palettes into matugen (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3509" target="_blank" rel="noopener noreferrer" class="">PR #3509</a>)</td></tr><tr><td><strong><a href="https://github.com/korbash" target="_blank" rel="noopener noreferrer" class="">korbash</a></strong></td><td>• Allow popouts from bars revealed in overview (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3592" target="_blank" rel="noopener noreferrer" class="">PR #3592</a>)<br>• Restore cycling through grouped windows (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3637" target="_blank" rel="noopener noreferrer" class="">PR #3637</a>)<br>• Use the current dms executable for matugen (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3648" target="_blank" rel="noopener noreferrer" class="">PR #3648</a>)<br>• Keep focusedWorkspaceId in sync with niri's focused workspace (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3713" target="_blank" rel="noopener noreferrer" class="">PR #3713</a>)<br>• Use explicit shell readiness (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3514" target="_blank" rel="noopener noreferrer" class="">PR #3514</a>)</td></tr><tr><td><strong><a href="https://github.com/LarsArtmann" target="_blank" rel="noopener noreferrer" class="">LarsArtmann</a></strong></td><td>Timed per-app popup mutes (1h / 4h) (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3628" target="_blank" rel="noopener noreferrer" class="">PR #3628</a>)</td></tr><tr><td><strong><a href="https://github.com/li-yuanfei" target="_blank" rel="noopener noreferrer" class="">li-yuanfei</a></strong></td><td>• Create screenshot directory lazily (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3286" target="_blank" rel="noopener noreferrer" class="">PR #3286</a>)<br>• Retry initial DDC read (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3287" target="_blank" rel="noopener noreferrer" class="">PR #3287</a>)</td></tr><tr><td><strong><a href="https://github.com/lingdiansr" target="_blank" rel="noopener noreferrer" class="">lingdiansr</a></strong></td><td>Identify codecs from the profile description (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3643" target="_blank" rel="noopener noreferrer" class="">PR #3643</a>)</td></tr><tr><td><strong><a href="https://github.com/lostdata2" target="_blank" rel="noopener noreferrer" class="">lostdata2</a></strong></td><td>Pulse the critical bar indicator (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3596" target="_blank" rel="noopener noreferrer" class="">PR #3596</a>)</td></tr><tr><td><strong><a href="https://github.com/LuckShiba" target="_blank" rel="noopener noreferrer" class="">LuckShiba</a></strong></td><td>Add nix-vendor-hash pre-commit hook (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3521" target="_blank" rel="noopener noreferrer" class="">PR #3521</a>)</td></tr><tr><td><strong><a href="https://github.com/lung595" target="_blank" rel="noopener noreferrer" class="">lung595</a></strong></td><td>• Wrap long ToggleSetting labels instead of drawing under the toggle (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3744" target="_blank" rel="noopener noreferrer" class="">PR #3744</a>)<br>• Ranking module and directory metadata for the plugin browser (1/3) (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3751" target="_blank" rel="noopener noreferrer" class="">PR #3751</a>)<br>• Discover shelves, quick filters and typo-tolerant search in the browser (2/3) (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3752" target="_blank" rel="noopener noreferrer" class="">PR #3752</a>)<br>• Detail page actions, one-click upvote, author page and undo after uninstall (3/3) (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3753" target="_blank" rel="noopener noreferrer" class="">PR #3753</a>)</td></tr><tr><td><strong><a href="https://github.com/marcusramberg" target="_blank" rel="noopener noreferrer" class="">marcusramberg</a></strong></td><td>Expose signal strength and conn type (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3533" target="_blank" rel="noopener noreferrer" class="">PR #3533</a>)</td></tr><tr><td><strong><a href="https://github.com/Mario-Mohar" target="_blank" rel="noopener noreferrer" class="">Mario-Mohar</a></strong></td><td>• Add invokeLast ipc to run the newest notification's default action (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3734" target="_blank" rel="noopener noreferrer" class="">PR #3734</a>)<br>• Skip the clear confirmation when there is nothing to clear (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3730" target="_blank" rel="noopener noreferrer" class="">PR #3730</a>)<br>• Stop treating BAMF_DESKTOP_FILE_HINT as a snap marker (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3729" target="_blank" rel="noopener noreferrer" class="">PR #3729</a>)<br>• Write the first state save after a reload (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3733" target="_blank" rel="noopener noreferrer" class="">PR #3733</a>)<br>• Search every process, not just the top 100 by cpu (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3763" target="_blank" rel="noopener noreferrer" class="">PR #3763</a>)<br>• Color picker: remove recent colors with a hover button, delete or backspace (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3764" target="_blank" rel="noopener noreferrer" class="">PR #3764</a>)</td></tr><tr><td><strong><a href="https://github.com/matthewyjiang" target="_blank" rel="noopener noreferrer" class="">matthewyjiang</a></strong></td><td>• Add Herdr backend (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3531" target="_blank" rel="noopener noreferrer" class="">PR #3531</a>)<br>• Reboot into a chosen EFI boot entry (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3568" target="_blank" rel="noopener noreferrer" class="">PR #3568</a>)<br>• Let quickshell run tools from ~/.local/bin under systemd (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3575" target="_blank" rel="noopener noreferrer" class="">PR #3575</a>)</td></tr><tr><td><strong><a href="https://github.com/MishowHD" target="_blank" rel="noopener noreferrer" class="">MishowHD</a></strong></td><td>Handle profile switches and bus updates reactively (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3427" target="_blank" rel="noopener noreferrer" class="">PR #3427</a>)</td></tr><tr><td><strong><a href="https://github.com/neofion" target="_blank" rel="noopener noreferrer" class="">neofion</a></strong></td><td>Keyboard layout: add user-editable label overrides for compact mode (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3503" target="_blank" rel="noopener noreferrer" class="">PR #3503</a>)</td></tr><tr><td><strong><a href="https://github.com/njfletcher215" target="_blank" rel="noopener noreferrer" class="">njfletcher215</a></strong></td><td>• Added launcher dmenu mode (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3639" target="_blank" rel="noopener noreferrer" class="">PR #3639</a>)<br>• Matugen on startup toggle (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3270" target="_blank" rel="noopener noreferrer" class="">PR #3270</a>)</td></tr><tr><td><strong><a href="https://github.com/nofuturekid" target="_blank" rel="noopener noreferrer" class="">nofuturekid</a></strong></td><td>Allow extra conditions per rule (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3683" target="_blank" rel="noopener noreferrer" class="">PR #3683</a>)</td></tr><tr><td><strong><a href="https://github.com/Pedroj-64" target="_blank" rel="noopener noreferrer" class="">Pedroj-64</a></strong></td><td>• Network(iwd): follow the Wi-Fi device when iwd recreates it (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3707" target="_blank" rel="noopener noreferrer" class="">PR #3707</a>)<br>• Network(networkd): treat bridge, bond, team and vlan links as wired (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3706" target="_blank" rel="noopener noreferrer" class="">PR #3706</a>)</td></tr><tr><td><strong><a href="https://github.com/Perdixky" target="_blank" rel="noopener noreferrer" class="">Perdixky</a></strong></td><td>Add focus follows mouse toggle (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3755" target="_blank" rel="noopener noreferrer" class="">PR #3755</a>)</td></tr><tr><td><strong><a href="https://github.com/phoropter" target="_blank" rel="noopener noreferrer" class="">phoropter</a></strong></td><td>Update vesktop.css (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3410" target="_blank" rel="noopener noreferrer" class="">PR #3410</a>)</td></tr><tr><td><strong><a href="https://github.com/satoshoe-dev" target="_blank" rel="noopener noreferrer" class="">satoshoe-dev</a></strong></td><td>• Skip unchanged saves so external edits are not swallowed (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3504" target="_blank" rel="noopener noreferrer" class="">PR #3504</a>)<br>• Pick the DankCommon translation for the chosen locale (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3505" target="_blank" rel="noopener noreferrer" class="">PR #3505</a>)</td></tr><tr><td><strong><a href="https://github.com/schmidma" target="_blank" rel="noopener noreferrer" class="">schmidma</a></strong></td><td>Route headset controls to the active player (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3273" target="_blank" rel="noopener noreferrer" class="">PR #3273</a>)</td></tr><tr><td><strong><a href="https://github.com/skamprogiannis" target="_blank" rel="noopener noreferrer" class="">skamprogiannis</a></strong></td><td>• Wake monitors after automatic lock (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3633" target="_blank" rel="noopener noreferrer" class="">PR #3633</a>)<br>• Prevent repeated saves from erasing notes (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3684" target="_blank" rel="noopener noreferrer" class="">PR #3684</a>)</td></tr><tr><td><strong><a href="https://github.com/SpyrosPsarras" target="_blank" rel="noopener noreferrer" class="">SpyrosPsarras</a></strong></td><td>Network monitor: add hide when idle and compact mode options (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3569" target="_blank" rel="noopener noreferrer" class="">PR #3569</a>)</td></tr><tr><td><strong><a href="https://github.com/tassiovirginio" target="_blank" rel="noopener noreferrer" class="">tassiovirginio</a></strong></td><td>Recover SNI items orphaned at first boot (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3570" target="_blank" rel="noopener noreferrer" class="">PR #3570</a>)</td></tr><tr><td><strong><a href="https://github.com/tomecarvalho" target="_blank" rel="noopener noreferrer" class="">tomecarvalho</a></strong></td><td>Add "hide on last display" option (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3816" target="_blank" rel="noopener noreferrer" class="">PR #3816</a>)</td></tr><tr><td><strong><a href="https://github.com/wowo101" target="_blank" rel="noopener noreferrer" class="">wowo101</a></strong></td><td>Restore copied folders from history (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3695" target="_blank" rel="noopener noreferrer" class="">PR #3695</a>)</td></tr><tr><td><strong><a href="https://github.com/Zer0TraceX" target="_blank" rel="noopener noreferrer" class="">Zer0TraceX</a></strong></td><td>Add initial native FreeBSD support (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3559" target="_blank" rel="noopener noreferrer" class="">PR #3559</a>)</td></tr><tr><td><strong><a href="https://github.com/ZoeyErinBauer" target="_blank" rel="noopener noreferrer" class="">ZoeyErinBauer</a></strong></td><td>Add support for shelly (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3367" target="_blank" rel="noopener noreferrer" class="">PR #3367</a>)</td></tr></tbody></table>
<p>Thanks also to the translators, package maintainers, plugin and theme authors, and everyone testing builds and reporting bugs. If we missed you, let us know on Discord or GitHub.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-repositories">The repositories<a href="https://duxlabs.dev/blog/v2-0-release#the-repositories" class="hash-link" aria-label="Direct link to The repositories" title="Direct link to The repositories" translate="no">​</a></h2>
<p>2.0 is the rebrand. The package repositories move next.</p>
<p>New Dux Labs repositories are almost ready to replace the AvengeMedia and DankLinux ones. Shortly after this release, 2.0.1 will move installs and updates onto them, including dankinstall. Existing users will run <code>dms migrate dux</code> to point their distro's repositories at Dux Labs. Until that ships, keep the repositories you already have.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="resources">Resources<a href="https://duxlabs.dev/blog/v2-0-release#resources" class="hash-link" aria-label="Direct link to Resources" title="Direct link to Resources" translate="no">​</a></h2>
<a href="https://duxlabs.dev/docs/getting-started" class="getStartedLink_nK8Q">Get started with DMS <span aria-hidden="true">→</span></a>
<div class="linksRow_VmBT"><a href="https://github.com/duxlabs-dev/dux-shell">GitHub</a><a href="https://duxlabs.dev/docs/">Documentation</a><a href="https://duxlabs.dev/docs/dfiles">Dux Files</a><a href="https://duxlabs.dev/plugins">Plugins &amp; themes</a><a href="https://wallpaper.duxlabs.dev/">Wallpapers</a><a href="https://discord.gg/ppWTpKmPgT">Discord</a><a href="https://ko-fi.com/duxlabs">Support on Ko-fi</a></div>
<div class="niriThanks_DK36"><img src="https://duxlabs.dev/img/niri.svg" alt="niri" width="48" height="48" loading="lazy"><span>Special thanks to <a href="https://github.com/YaLTeR">YaLTeR</a> and the <a href="https://github.com/niri-wm/niri">niri</a> community for their continued support and collaboration.</span></div>
<div class="thankYouHero_CrzU"><svg viewBox="0 0 1 1" class="shape_qok3 shapeCookie_F0gV" aria-hidden="true" focusable="false"><path d="M0.5 0.00515C0.52561 0.00515 0.55123 0.01546 0.57001 0.03608C0.59493 0.06343 0.6335 0.07376 0.66875 0.06254C0.7219 0.04561 0.7781 0.07805 0.79001 0.13255C0.79792 0.16869 0.82615 0.19693 0.8623 0.20483C0.91679 0.21675 0.94923 0.27294 0.93231 0.32609C0.92108 0.36135 0.93142 0.39992 0.95877 0.42484C1 0.4624 1 0.52729 0.95877 0.56485C0.93142 0.58978 0.92108 0.62834 0.93231 0.6636C0.94923 0.71675 0.91679 0.77294 0.8623 0.78486C0.82615 0.79277 0.79792 0.821 0.79001 0.85715C0.7781 0.91164 0.7219 0.94408 0.66875 0.92716C0.6335 0.91593 0.59493 0.92626 0.57001 0.95361C0.53244 0.99485 0.46756 0.99485 0.42999 0.95361C0.40507 0.92626 0.3665 0.91593 0.33125 0.92716C0.2781 0.94408 0.2219 0.91164 0.20999 0.85715C0.20208 0.821 0.17385 0.79277 0.1377 0.78486C0.08321 0.77294 0.05077 0.71675 0.06769 0.6636C0.07892 0.62834 0.06858 0.58978 0.04123 0.56485C0 0.52729 0 0.4624 0.04123 0.42484C0.06858 0.39992 0.07892 0.36135 0.06769 0.32609C0.05077 0.27294 0.08321 0.21675 0.1377 0.20483C0.17385 0.19693 0.20208 0.16869 0.20999 0.13255C0.2219 0.07805 0.2781 0.04561 0.33125 0.06254C0.3665 0.07376 0.40507 0.06343 0.42999 0.03608C0.44877 0.01546 0.47439 0.00515 0.5 0.00515Z" fill="currentColor"></path></svg><svg viewBox="0 0 1 1" class="shape_qok3 shapeBurst_RrxZ" aria-hidden="true" focusable="false"><path d="M0.18664 0.27242C0.19362 0.26276 0.19729 0.2507 0.19633 0.23807C0.19403 0.20813 0.19174 0.1782 0.18945 0.14826C0.18651 0.10985 0.22501 0.08176 0.26069 0.09629C0.28866 0.10767 0.31662 0.11905 0.34459 0.13043C0.36806 0.13999 0.395 0.13118 0.40828 0.1096C0.42402 0.08403 0.43976 0.05847 0.4555 0.0329C0.4757 0.0001 0.52336 0 0.54369 0.03273C0.55963 0.05837 0.57556 0.08402 0.59149 0.10967C0.60487 0.13119 0.63184 0.1399 0.65527 0.13025C0.68303 0.11882 0.71079 0.10739 0.73855 0.09596C0.77418 0.08129 0.81279 0.10922 0.81001 0.14765C0.80782 0.17776 0.80564 0.20788 0.80345 0.23799C0.80162 0.26327 0.81833 0.28616 0.84295 0.29213C0.87213 0.2992 0.90131 0.30627 0.93049 0.31334C0.96793 0.32241 0.98275 0.36771 0.95791 0.39716C0.93844 0.42024 0.91897 0.44332 0.8995 0.4664C0.88316 0.48577 0.88322 0.51411 0.89964 0.53341C0.91909 0.55628 0.93854 0.57915 0.95799 0.60202C0.98295 0.63137 0.96831 0.67673 0.9309 0.68595C0.90159 0.69318 0.87227 0.70041 0.84296 0.70764C0.81835 0.7137 0.80174 0.73667 0.80367 0.76193C0.80597 0.79187 0.80826 0.8218 0.81055 0.85174C0.81349 0.89015 0.77499 0.91824 0.73931 0.90371C0.71134 0.89233 0.68338 0.88095 0.65541 0.86957C0.63194 0.86001 0.605 0.86882 0.59172 0.8904C0.57598 0.91597 0.56024 0.94153 0.5445 0.9671C0.5243 0.9999 0.47664 1 0.45631 0.96727C0.44037 0.94163 0.42444 0.91598 0.40851 0.89033C0.39513 0.86881 0.36816 0.8601 0.34473 0.86975C0.31697 0.88118 0.28921 0.89261 0.26145 0.90404C0.22582 0.91871 0.18721 0.89078 0.18999 0.85235C0.19218 0.82224 0.19436 0.79212 0.19655 0.76201C0.19838 0.73673 0.18167 0.71384 0.15705 0.70787C0.12787 0.7008 0.09869 0.69373 0.06951 0.68666C0.03207 0.67759 0.01725 0.63229 0.04209 0.60284C0.06156 0.57976 0.08103 0.55668 0.1005 0.5336C0.11684 0.51423 0.11678 0.48589 0.10036 0.46659C0.08091 0.44372 0.06146 0.42085 0.04201 0.39798C0.01705 0.36863 0.03169 0.32327 0.0691 0.31405C0.09841 0.30682 0.12773 0.29959 0.15704 0.29236C0.16934 0.28933 0.17965 0.28207 0.18664 0.27242Z" fill="currentColor"></path></svg><div class="heroContent_tO9u"><h2>Thank <span class="accentText_i18k">you.</span></h2><p>To everyone contributing code, translations, plugins, packaging, feedback, sponsorships, and donations. DMS is here because of you.</p></div></div>]]></content:encoded>
            <category>Release</category>
            <category>Announcement</category>
        </item>
        <item>
            <title><![CDATA[DMS 1.6 "Marble Tabby" Is Here]]></title>
            <link>https://duxlabs.dev/blog/v1-6-release</link>
            <guid>https://duxlabs.dev/blog/v1-6-release</guid>
            <pubDate>Thu, 03 Sep 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Learn about Dank Island, Performance Improvements, and continued ecosystem growth in DMS 1.6.]]></description>
            <content:encoded><![CDATA[
<!-- -->
<div class="blogHero_YbRf"><div class="veins_yhIG" aria-hidden="true"><svg viewBox="0 0 800 300" preserveAspectRatio="none" class="veinAnim_YviA" style="width:100%;height:100%;opacity:0.65"><defs><linearGradient id="vein-g-r4vh2" x1="0%" y1="0%" x2="100%" y2="0%"><stop offset="0%" stop-color="#5E7A94" stop-opacity="0.3"></stop><stop offset="35%" stop-color="#E6EDF4" stop-opacity="0.9"></stop><stop offset="65%" stop-color="#9FB8CC" stop-opacity="0.7"></stop><stop offset="100%" stop-color="#5E7A94" stop-opacity="0.3"></stop></linearGradient></defs><g fill="none" stroke="url(#vein-g-r4vh2)" stroke-linecap="round"><path stroke-width="2.4" d="M -20 34 C 130 60, 250 12, 410 44 S 690 84, 830 58"></path><path stroke-width="1.8" d="M -20 268 C 120 240, 310 286, 510 252 S 740 226, 830 250"></path><path stroke-width="1.1" stroke-opacity="0.55" d="M 92 44 C 122 106, 84 170, 126 232 S 150 290, 144 320"></path><path stroke-width="1.1" stroke-opacity="0.55" d="M 692 66 C 722 126, 706 186, 738 244 S 758 296, 752 320"></path><path stroke-width="0.9" stroke-opacity="0.45" d="M 762 24 C 736 62, 772 100, 752 140"></path><path stroke-width="0.7" stroke-opacity="0.4" d="M 36 88 C 58 128, 44 172, 68 210"></path><path stroke-width="0.6" stroke-opacity="0.35" d="M 330 262 C 358 280, 350 300, 372 318"></path><path stroke-width="0.6" stroke-opacity="0.35" d="M 476 34 C 502 48, 498 72, 522 84"></path></g></svg></div><div class="heroContent_CVLH"><h1 class="heroTitle_urSw"><p>DMS <span class="gradientText_aiPz">1.6</span></p></h1><p class="heroSubtitle_Q2pz">Marble Tabby</p></div></div>
<p>DankMaterialShell (DMS) 1.6 "Marble Tabby" is here! This release brings significant performance improvements and resource optimizations across the shell and CLI, Dank Island - a new island-style bar instance, spring-based motion across the whole shell, GTK3 dynamic theming, a standalone greeter, unified versioning across the Dank Desktop, a big plugin ecosystem push, and hundreds of fixes and improvements across DMS.</p>
<!-- -->
<div class="statsGrid_y5mE" style="grid-template-columns:repeat(2, 1fr);max-width:600px"><div class="statCard_HNfJ"><span class="statNumber__IKc">4,600+</span><span class="statLabel_Fr9R">Commits</span></div><div class="statCard_HNfJ"><span class="statNumber__IKc">7.8k+</span><span class="statLabel_Fr9R">GitHub Stars</span></div><div class="statCard_HNfJ"><span class="statNumber__IKc">250+</span><span class="statLabel_Fr9R">Contributors</span></div><div class="statCard_HNfJ"><span class="statNumber__IKc">330+</span><span class="statLabel_Fr9R">Plugins</span></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="performance--resource-optimizations">Performance &amp; Resource Optimizations<a href="https://duxlabs.dev/blog/v1-6-release#performance--resource-optimizations" class="hash-link" aria-label="Direct link to Performance &amp; Resource Optimizations" title="Direct link to Performance &amp; Resource Optimizations" translate="no">​</a></h2>
<!-- -->
<div class="statsGrid_y5mE" style="grid-template-columns:repeat(2, 1fr);max-width:600px"><div class="statCard_HNfJ"><span class="statNumber__IKc">5.2x</span><span class="statLabel_Fr9R">Faster IPC</span></div><div class="statCard_HNfJ"><span class="statNumber__IKc">8.6x</span><span class="statLabel_Fr9R">Faster Screenshots</span></div><div class="statCard_HNfJ"><span class="statNumber__IKc">3.9x</span><span class="statLabel_Fr9R">Faster Color Picker</span></div><div class="statCard_HNfJ"><span class="statNumber__IKc">-19%</span><span class="statLabel_Fr9R">Shell Memory</span></div></div>
<p>1.6 puts a lot of this cycle into making the shell and its companion tools faster and lighter:</p>
<ul>
<li class=""><strong>IPC</strong>: <code>dms ipc call</code> used to launch a whole quickshell process just to deliver one message. Now it talks to the shell directly, and the median call dropped from 49.8 ms to 9.6 ms. Every keybind and script that goes through dms gets this for free. <code>dms ipc</code> is now even faster than calling <code>quickshell ipc</code> directly.</li>
<li class=""><strong>Screenshots</strong>: saving is 4-8x faster. A full 1440p screen writes in 25 ms instead of 94 ms, JPEG in 29 ms instead of 75 ms, and re-capturing a saved region in 12 ms instead of 106 ms.</li>
<li class=""><strong>Region selector</strong>: dragging a selection used to redraw the entire screen on every pointer move, so it couldn't keep up with the display. Now only the edges of the rectangle redraw, and drags feel instant at any refresh rate.</li>
<li class=""><strong>Color picker</strong>: same story for the eyedropper - it stopped copying the whole screen every time the pointer moves, so it stays smooth on big and multi-monitor setups and stops burning CPU while you drag.</li>
<li class=""><strong>Memory</strong>: the shell uses ~76 MB less idle memory (-19%) on a clean two-monitor setup.<!-- -->
<ul>
<li class="">There is additional work in DMS 1.6 that will further improve startup times and memory usage once <a href="https://github.com/quickshell-mirror/quickshell/pull/1049" target="_blank" rel="noopener noreferrer" class="">QML Caching</a> is implemented in Quickshell.</li>
</ul>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="vs-other-tools">vs other tools<a href="https://duxlabs.dev/blog/v1-6-release#vs-other-tools" class="hash-link" aria-label="Direct link to vs other tools" title="Direct link to vs other tools" translate="no">​</a></h3>
<p>dms, grim, and hyprpicker all grab the screen from the compositor the same way, so the differences below mostly come down to what each tool does after that (Image encoding, compression, etc.).</p>
<p>Screenshots vs grim:</p>
<table><thead><tr><th>capture (PNG)</th><th style="text-align:right">grim</th><th style="text-align:right">dms 1.6</th></tr></thead><tbody><tr><td>one 1440p output</td><td style="text-align:right">114.7 ms</td><td style="text-align:right">23.5 ms (4.9x)</td></tr><tr><td>both outputs</td><td style="text-align:right">344.3 ms</td><td style="text-align:right">71.7 ms</td></tr><tr><td>800x600 region</td><td style="text-align:right">26.0 ms</td><td style="text-align:right">12.1 ms</td></tr></tbody></table>
<p>grim writes its PNG on a single core; dms uses all of them. The new PNG encoder in DMS outperforms grim even with compression enabled.</p>
<p>Color picker vs hyprpicker: with the picker open and the pointer sitting still, hyprpicker keeps redrawing at ~59% of a CPU core on this setup; <code>dms color pick</code> sits at 0% and only redraws when the pointer actually moves.</p>
<small><em>Benchmarked 1.5.3 vs 1.6 with stock settings on one machine (Ryzen AI 9 HX 370, two 1440p displays). Absolute numbers will vary with hardware and config; Tool comparisons ran on the same machine against grim (current Arch) and hyprpicker v0.4.7; hyprpicker's idle CPU likely scales with refresh rate and output count.</em></small>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="dank-island">Dank Island<a href="https://duxlabs.dev/blog/v1-6-release#dank-island" class="hash-link" aria-label="Direct link to Dank Island" title="Direct link to Dank Island" translate="no">​</a></h2>
<p>1.6 introduces Dank Island, a new bar instance built around a central island with satellite widgets.</p>
<figure style="text-align:center"><img src="https://duxlabs.dev/img/blog/v1.6/island_light.png" alt="dank island idle" class="themedComponent_mlkZ themedComponent--light_NVdE" style="max-width:900px;width:100%"><img src="https://duxlabs.dev/img/blog/v1.6/island_dark.png" alt="dank island idle" class="themedComponent_mlkZ themedComponent--dark_xIcU" style="max-width:900px;width:100%"><figcaption>The island idle state, satellites on both sides.</figcaption></figure>
<figure style="text-align:center"><img src="https://duxlabs.dev/img/blog/v1.6/island_faces_light.png" alt="island faces" class="themedComponent_mlkZ themedComponent--light_NVdE" style="max-width:700px;width:100%"><img src="https://duxlabs.dev/img/blog/v1.6/island_faces_dark.png" alt="island faces" class="themedComponent_mlkZ themedComponent--dark_xIcU" style="max-width:700px;width:100%"><figcaption>Idle, a notification, and media playing.</figcaption></figure>
<figure style="text-align:center"><img src="https://duxlabs.dev/img/blog/v1.6/island_faces.gif" alt="island faces animated" style="max-width:900px;width:100%"><figcaption>A notification comes in, then media takes the face.</figcaption></figure>
<figure style="text-align:center"><img src="https://duxlabs.dev/img/blog/v1.6/island_expand_light.gif" alt="island expanding" class="themedComponent_mlkZ themedComponent--light_NVdE" style="max-width:900px;width:100%"><img src="https://duxlabs.dev/img/blog/v1.6/island_expand_dark.gif" alt="island expanding" class="themedComponent_mlkZ themedComponent--dark_xIcU" style="max-width:900px;width:100%"><figcaption>The island opens into the dash and control center in place, on the spring. Notifications, launcher, wallpaper and weather open the same way.</figcaption></figure>
<ul>
<li class=""><strong>Satellites</strong>: areas for widgets on either side of the central island. The island itself hijacks the center section of the bar, and the left and right section become the "satellites."</li>
<li class=""><strong>Live faces</strong>: The face of the island reacts dynamically to user interactions and system events - such as notifications, media playback, and OSD triggers.</li>
<li class=""><strong>Spring physics</strong>: the island uses new spring-based animations that are built into DMS 1.6</li>
<li class=""><strong>Home face layout</strong>: a drag and drop editor in the Island settings decides what sits on the idle face and in what order. Media, clock, weather, status, notifications, plus dedicated volume and brightness activities that show as an icon, a percentage, or both</li>
<li class=""><strong>Media player variant</strong>: the standalone island media player got a redesign, and a Wallpaper toggle in Settings -&gt; Media Player blurs the album art behind the player in both the island and the dashboard</li>
<li class=""><strong>Multiple bars</strong>: island and frame modes support multiple bar instances</li>
</ul>
<small>Enable the Island in Settings -&gt; Bar -&gt; Appearance</small>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="unified-versioning">Unified Versioning<a href="https://duxlabs.dev/blog/v1-6-release#unified-versioning" class="hash-link" aria-label="Direct link to Unified Versioning" title="Direct link to Unified Versioning" translate="no">​</a></h2>
<p>1.6 changes how the Dank Desktop is versioned: dsearch, dgop, dcal, and dgreeter are now versioned and released together with DMS. One version number covers the whole desktop.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="rest-of-the-desktop-suite">Rest of the Desktop Suite<a href="https://duxlabs.dev/blog/v1-6-release#rest-of-the-desktop-suite" class="hash-link" aria-label="Direct link to Rest of the Desktop Suite" title="Direct link to Rest of the Desktop Suite" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dank-greeter">dank-greeter<a href="https://duxlabs.dev/blog/v1-6-release#dank-greeter" class="hash-link" aria-label="Direct link to dank-greeter" title="Direct link to dank-greeter" translate="no">​</a></h3>
<p>The greeter is its own repo now, <a href="https://github.com/duxlabs-dev/dux-greeter" target="_blank" rel="noopener noreferrer" class="">dank-greeter</a>. This is the first release.</p>
<figure style="text-align:center"><img src="https://duxlabs.dev/img/blog/v1.6/greeter_light.png" alt="dank-greeter" class="themedComponent_mlkZ themedComponent--light_NVdE" style="max-width:700px;width:100%"><img src="https://duxlabs.dev/img/blog/v1.6/greeter_dark.png" alt="dank-greeter" class="themedComponent_mlkZ themedComponent--dark_xIcU" style="max-width:700px;width:100%"><figcaption>dank-greeter, same theme as the session behind it.</figcaption></figure>
<ul>
<li class="">Face unlock starts on its own if pam_howdy is in the stack</li>
<li class="">Launched sessions get the desktop env vars, like GDM does (fixes issue with launching GNOME sessions)</li>
<li class="">Follows your live DMS config instead of a copy of it (fixes issues with out-of-sync settings)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dgop">dgop<a href="https://duxlabs.dev/blog/v1-6-release#dgop" class="hash-link" aria-label="Direct link to dgop" title="Direct link to dgop" translate="no">​</a></h3>
<figure style="text-align:center"><img src="https://duxlabs.dev/img/blog/v1.6/dgop_tui.png" alt="dgop tui" style="max-width:700px;width:100%"><figcaption>dgop with process search open.</figcaption></figure>
<ul>
<li class="">Process CPU% is per sample interval now (<a href="https://github.com/cwelsys" target="_blank" rel="noopener noreferrer" class="">cwelsys</a>)</li>
<li class="">GPU reclaimable memory no longer counted as used</li>
<li class="">Falls back to per-core temps when there is no package sensor</li>
<li class="">TUI search and custom keybinds</li>
<li class="">FreeBSD support</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dsearch">dsearch<a href="https://duxlabs.dev/blog/v1-6-release#dsearch" class="hash-link" aria-label="Direct link to dsearch" title="Direct link to dsearch" translate="no">​</a></h3>
<ul>
<li class="">Survives a corrupted index or metastore db instead of dying</li>
<li class="">Fixed watcher churn and a few search panics</li>
<li class="">FreeBSD support</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dcal">dcal<a href="https://duxlabs.dev/blog/v1-6-release#dcal" class="hash-link" aria-label="Direct link to dcal" title="Direct link to dcal" translate="no">​</a></h3>
<figure style="text-align:center"><img src="https://duxlabs.dev/img/blog/v1.6/dcal_drag.png" alt="dcal drag to create" style="max-width:700px;width:100%"><figcaption>Dragging out a new event in week view.</figcaption></figure>
<ul>
<li class="">Drag to create events in day and week views</li>
<li class="">Multi-select, context actions, copy/paste (<a href="https://github.com/artrixdotdev" target="_blank" rel="noopener noreferrer" class="">artrixdotdev</a>)</li>
<li class="">RSVP to one occurrence of a recurring invite, chips show RSVP state</li>
<li class="">Completing a recurring task moves it to the next occurrence</li>
<li class="">Default calendar, date/time locale override, ctrl+n for a new event</li>
<li class="">CalDAV fixes for non-compliant servers (<a href="https://github.com/JCapucho" target="_blank" rel="noopener noreferrer" class="">JCapucho</a>)</li>
<li class="">Fixed rescheduled series on Microsoft and all-day events on Google</li>
<li class="">All-day events and exported ics keep the right timezone</li>
<li class="">French and Bulgarian translations</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="screenshots--capture">Screenshots &amp; Capture<a href="https://duxlabs.dev/blog/v1-6-release#screenshots--capture" class="hash-link" aria-label="Direct link to Screenshots &amp; Capture" title="Direct link to Screenshots &amp; Capture" translate="no">​</a></h2>
<p>Beyond the encoder speedups above, capture itself got better:</p>
<figure style="text-align:center"><img src="https://duxlabs.dev/img/blog/v1.6/screenshot_region.png" alt="region across two outputs" style="max-width:900px;width:100%"><figcaption>One region across two monitors.</figcaption></figure>
<ul>
<li class="">Drag a region across outputs, alt to restrict to one output, ctrl to drag the selection or resize it from any corner (<a href="https://github.com/hthienloc" target="_blank" rel="noopener noreferrer" class="">hthienloc</a>)</li>
<li class="">Native cursor shapes in the selector (<a href="https://github.com/hthienloc" target="_blank" rel="noopener noreferrer" class="">hthienloc</a>)</li>
<li class="">Initial scroll capture mode, with a live preview of the stitched result beside the capture area (<a href="https://github.com/hthienloc" target="_blank" rel="noopener noreferrer" class="">hthienloc</a>)</li>
<li class=""><code>dms screenshot -g</code> prints the selected region as <code>X,Y WxH</code> and skips the capture, exit code 1 on cancel, so scripts that used slurp can swap it in (<a href="https://github.com/hthienloc" target="_blank" rel="noopener noreferrer" class="">hthienloc</a>)</li>
<li class="">10-bit color/HDR support via <code>wp_color_manager_v1</code></li>
<li class=""><code>--json</code> flag for capture metadata</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="theming">Theming<a href="https://duxlabs.dev/blog/v1-6-release#theming" class="hash-link" aria-label="Direct link to Theming" title="Direct link to Theming" translate="no">​</a></h2>
<ul>
<li class=""><strong>GTK3 dynamic theming</strong>: with adw-gtk3 installed, DMS copies the light and dark variants into <code>~/.local/share/themes</code> and patches the copies with your generated colors. GTK3 apps then follow the system color scheme and switch live, no restart. Without adw-gtk3 it falls back to the <code>dank-colors.css</code> import. A <code>gtk.css</code> or dconf <code>gtk-theme</code> you set yourself is no longer overwritten. (<a href="https://github.com/euletheia" target="_blank" rel="noopener noreferrer" class="">euletheia</a>)</li>
</ul>
<figure style="text-align:center"><img src="https://duxlabs.dev/img/blog/v1.6/gtk3_light.png" alt="thunar and nautilus themed" class="themedComponent_mlkZ themedComponent--light_NVdE" style="max-width:900px;width:100%"><img src="https://duxlabs.dev/img/blog/v1.6/gtk3_dark.png" alt="thunar and nautilus themed" class="themedComponent_mlkZ themedComponent--dark_xIcU" style="max-width:900px;width:100%"><figcaption>Thunar is GTK3, Nautilus is libadwaita. Same folder, same colors.</figcaption></figure>
<ul>
<li class=""><strong>Qt</strong>: qtengine works as a platform theme (<a href="https://github.com/Conava" target="_blank" rel="noopener noreferrer" class="">Conava</a>), and so does <code>QT_PLATFORMTHEME=kde</code>.</li>
<li class=""><strong>Source color</strong>: Settings -&gt; Theme &amp; Colors has a Source Color dropdown for wallpaper palettes. Dominant is the default and matches previous behavior. Colorful quantizes the image and scores toward a vivid, well-lit color, so a warm wallpaper with a large muted region no longer produces a cold palette. Five more modes map to matugen's <code>--prefer</code> and need matugen 4.1. Also <code>--source-mode</code> on <code>dms matugen generate</code>. (<a href="https://github.com/Conava" target="_blank" rel="noopener noreferrer" class="">Conava</a>)</li>
<li class=""><strong>matugen</strong>: smart mode and scheme type are configurable (<a href="https://github.com/haikalllp" target="_blank" rel="noopener noreferrer" class="">haikalllp</a>), dank16 emits the full matugen color format (<a href="https://github.com/pdf" target="_blank" rel="noopener noreferrer" class="">pdf</a>), and there are new templates for Fcitx5 and Vesktop (<a href="https://github.com/hthienloc" target="_blank" rel="noopener noreferrer" class="">hthienloc</a>).</li>
<li class=""><strong>Contrast</strong>: registry themes ship a contrast report and the theme browser badges each one AA or AAA. The levels are <a href="https://www.w3.org/TR/WCAG22/#contrast-minimum" target="_blank" rel="noopener noreferrer" class="">WCAG</a>, the W3C accessibility spec: AA is body text at 4.5:1 or better against its background, AAA is 7:1. The report covers body text, accents, and non-text bits like borders and icons in both dark and light, and the badge is the worst of them.</li>
</ul>
<figure style="text-align:center"><img src="https://duxlabs.dev/img/blog/v1.6/contrast_light.png" alt="theme browser contrast" class="themedComponent_mlkZ themedComponent--light_NVdE" style="max-width:700px;width:100%"><img src="https://duxlabs.dev/img/blog/v1.6/contrast_dark.png" alt="theme browser contrast" class="themedComponent_mlkZ themedComponent--dark_xIcU" style="max-width:700px;width:100%"><figcaption>WCAG badges on each theme in the browser.</figcaption></figure>
<ul>
<li class="">Settings -&gt; Theme Color has an Extract button that writes the live theme out as one dark and light JSON file. (<a href="https://github.com/hthienloc" target="_blank" rel="noopener noreferrer" class="">hthienloc</a>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="network">Network<a href="https://duxlabs.dev/blog/v1-6-release#network" class="hash-link" aria-label="Direct link to Network" title="Direct link to Network" translate="no">​</a></h2>
<ul>
<li class=""><strong>WiFi hotspot</strong>: share the machine's connection from the shell (<a href="https://github.com/ronharel02" target="_blank" rel="noopener noreferrer" class="">ronharel02</a>)</li>
<li class=""><strong>WiFi list</strong>: refresh button in the control center (<a href="https://github.com/YewFence" target="_blank" rel="noopener noreferrer" class="">YewFence</a>)</li>
<li class=""><strong>Cellular</strong>: modem support on the NetworkManager backend (<a href="https://github.com/kmf" target="_blank" rel="noopener noreferrer" class="">kmf</a>)</li>
<li class=""><strong>OWE</strong>: open networks with opportunistic wireless encryption connect, including transition mode</li>
<li class=""><strong>Fortinet</strong>: password profiles authenticate inside DMS with <code>openconnect --authenticate</code> and hand the short-lived cookie to NetworkManager. An untrusted server certificate shows its fingerprint for confirmation, and the fingerprint is only saved once the tunnel actually connects (<a href="https://github.com/Grant07" target="_blank" rel="noopener noreferrer" class="">Grant07</a>)</li>
<li class=""><strong>802.1x</strong>: EAP method selection, and credential persistence works again</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="config--backup">Config &amp; Backup<a href="https://duxlabs.dev/blog/v1-6-release#config--backup" class="hash-link" aria-label="Direct link to Config &amp; Backup" title="Direct link to Config &amp; Backup" translate="no">​</a></h2>
<p>settings.json and session.json only store what differs from the defaults now, so your config is the diff and not a dump of every value DMS knows about. Machine-specific state moved out of settings.json into session.json, which makes the settings half portable between machines.</p>
<p><code>dms backup create</code> writes a tar.gz of <code>~/.config/DankMaterialShell</code>, and <code>dms backup restore &lt;archive&gt;</code> puts it back.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="fewer-dependencies">Fewer Dependencies<a href="https://duxlabs.dev/blog/v1-6-release#fewer-dependencies" class="hash-link" aria-label="Direct link to Fewer Dependencies" title="Direct link to Fewer Dependencies" translate="no">​</a></h2>
<p>1.6 keeps shedding external dependencies:</p>
<ul>
<li class="">The quickshell configuration is now embedded in the DMS binary and mounted at runtime</li>
<li class="">dgop is built in instead of a separate process</li>
<li class="">curl dropped, bluetooth audio codec support built in</li>
<li class="">Initial FreeBSD support landed along the way</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="notes-for-package-maintainers">Notes for Package Maintainers<a href="https://duxlabs.dev/blog/v1-6-release#notes-for-package-maintainers" class="hash-link" aria-label="Direct link to Notes for Package Maintainers" title="Direct link to Notes for Package Maintainers" translate="no">​</a></h2>
<ul>
<li class="">The quickshell UI is embedded in the dms binary and mounted at runtime. Packages no longer install <code>/usr/share/quickshell/dms</code>, and XDG auto-discovery of <code>~/.config/quickshell/dms</code> is removed: <code>-c</code> or <code>DMS_SHELL_DIR</code> explicitly override the embedded config.</li>
<li class="">Shared widgets live in the dank-qml-common git submodule. Building from a clone needs <code>git submodule update --init --recursive</code> first. GitHub's auto-generated "Source code" archive never contains submodule content, so build from <code>dms-source.tar.gz</code> on the release instead: it ships with DankCommon bundled and needs no submodule step. <code>dms-cli-&lt;version&gt;.tar.gz</code> carries the Go source with vendored modules.</li>
<li class="">The embedded shell is staged into <code>core/internal/shellembed/dist</code> by <code>make sync-shell</code>. <code>make dist</code> and <code>make build</code> run it for you. If you call <code>go build</code> directly, run <code>make sync-shell</code> first or the <code>withshell</code> tag fails with <code>pattern all:dist: no matching files found</code>. Pass tags as one list: <code>-tags 'distro_binary,withshell'</code>.</li>
<li class="">Release binaries and all -git packages build with the embedded shell.</li>
<li class="">The greeter is its own package now, <a href="https://github.com/duxlabs-dev/dux-greeter" target="_blank" rel="noopener noreferrer" class="">dank-greeter</a>, with its own release artifacts. <code>dms greeter install</code> expects the dms-greeter binary from that package.</li>
<li class="">dsearch, dgop, dcal, and dgreeter tag and release together with DMS from this release on.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="plugins">Plugins<a href="https://duxlabs.dev/blog/v1-6-release#plugins" class="hash-link" aria-label="Direct link to Plugins" title="Direct link to Plugins" translate="no">​</a></h2>
<p>The plugin ecosystem got numerous updates this cycle</p>
<ul>
<li class=""><strong>New grid-style plugin browser</strong>, and runtime plugins are searchable from settings (<a href="https://github.com/hthienloc" target="_blank" rel="noopener noreferrer" class="">hthienloc</a>)</li>
</ul>
<figure style="text-align:center"><img src="https://duxlabs.dev/img/blog/v1.6/plugin_browser_light.png" alt="plugin browser" class="themedComponent_mlkZ themedComponent--light_NVdE" style="max-width:700px;width:100%"><img src="https://duxlabs.dev/img/blog/v1.6/plugin_browser_dark.png" alt="plugin browser" class="themedComponent_mlkZ themedComponent--dark_xIcU" style="max-width:700px;width:100%"><figcaption>The plugin browser, now a grid.</figcaption></figure>
<ul>
<li class=""><strong>Portable plugin lockfile</strong> for reproducing a plugin set across machines (<a href="https://github.com/artrixdotdev" target="_blank" rel="noopener noreferrer" class="">artrixdotdev</a>)</li>
<li class=""><strong>Support for multiple plugin &amp; theme registries</strong>: <code>dms registry add &lt;name&gt; &lt;git-url&gt;</code>, or Settings → Plugins → Registries. Themes resolve from extra registries too. Started by <a href="https://github.com/louzt" target="_blank" rel="noopener noreferrer" class="">louzt</a> via env vars</li>
<li class=""><strong>Plugin translations</strong>: drop a <code>translations/</code> directory next to <code>plugin.json</code> and wrap strings in <code>I18n.trFor("myPlugin", "...")</code>. Nothing has to land in the DMS repo, users get your translations by installing the plugin</li>
<li class=""><strong>Desktop widgets</strong>: runtime resize API, so a widget can change its own size (<a href="https://github.com/SunPodder" target="_blank" rel="noopener noreferrer" class="">SunPodder</a>)</li>
<li class="">Plugins are a step in the first-start wizard now, and the launcher's power options moved to a built-in plugin</li>
</ul>
<p>The <a href="https://plugins.danklinux.com/" target="_blank" rel="noopener noreferrer" class="">registry</a> is past 335 plugins and 42 themes, 86 of the plugins added this cycle. The directory ranks them by 👍 on each plugin's tracking issue in the <a href="https://github.com/duxlabs-dev/dux-plugin-registry/issues" target="_blank" rel="noopener noreferrer" class="">registry repo</a>. If a plugin earned a spot in your setup, go upvote it so other people find it.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="translations">Translations<a href="https://duxlabs.dev/blog/v1-6-release#translations" class="hash-link" aria-label="Direct link to Translations" title="Direct link to Translations" translate="no">​</a></h2>
<p>DMS ships 22 languages besides English. The term catalog got an overhaul this cycle: around 160 dead terms deleted, context added where one English word was doing two jobs, and a mechanism for carrying the same term under different contexts. Arabic, Bulgarian, and Ukrainian are new. Time and date formatting can follow the system locale instead of the DMS format options.</p>
<p>Plugins carry their own catalogs on top of that, so a plugin can be translated without anything landing in the DMS repo. Settings option rows that overflowed in longer languages are dropdowns now.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="everything-else">Everything Else<a href="https://duxlabs.dev/blog/v1-6-release#everything-else" class="hash-link" aria-label="Direct link to Everything Else" title="Direct link to Everything Else" translate="no">​</a></h2>
<ul>
<li class=""><strong>Bluetooth</strong>: multi-adapter support, soft rfkill unblock</li>
<li class=""><strong>Notifications</strong>: DnD bypass globally and per-app, an option to ignore app-requested timeouts (<a href="https://github.com/tkroll-ionos" target="_blank" rel="noopener noreferrer" class="">tkroll-ionos</a>), and running the default action on body click instead of expanding the text</li>
<li class=""><strong>Launcher</strong>: ctrl-tab to cycle modes, a spotlight style for the niri overview, and IPC parity between spotlight-bar and the full launcher (<a href="https://github.com/hthienloc" target="_blank" rel="noopener noreferrer" class="">hthienloc</a>)</li>
<li class=""><strong>Dock</strong>: separate pinned and running apps, cycle grouped windows (<a href="https://github.com/hthienloc" target="_blank" rel="noopener noreferrer" class="">hthienloc</a>), minimize support</li>
<li class=""><strong>Clipboard</strong>: drop content in to store it, an overlay layer option (<a href="https://github.com/hthienloc" target="_blank" rel="noopener noreferrer" class="">hthienloc</a>), clearing only what the filter matches (<a href="https://github.com/Mario-Mohar" target="_blank" rel="noopener noreferrer" class="">Mario-Mohar</a>), and copy as plain text for entries that have one</li>
<li class=""><strong>Bar</strong>: corner style and length padding, a focused window details popout (<a href="https://github.com/hthienloc" target="_blank" rel="noopener noreferrer" class="">hthienloc</a>), configurable tray icon spacing (<a href="https://github.com/tassiovirginio" target="_blank" rel="noopener noreferrer" class="">tassiovirginio</a>), popout variants for the power menu and color picker</li>
<li class=""><strong>Lock screen</strong>: vertical clock style (<a href="https://github.com/hthienloc" target="_blank" rel="noopener noreferrer" class="">hthienloc</a>), a separate text input for IMEs, an option to hide weather</li>
<li class=""><strong>Settings</strong>: Niri keyboard and mouse/touchpad tabs (<a href="https://github.com/hthienloc" target="_blank" rel="noopener noreferrer" class="">hthienloc</a>), location search for theme and gamma coordinates (<a href="https://github.com/Curious-r" target="_blank" rel="noopener noreferrer" class="">Curious-r</a>)</li>
<li class=""><strong>Gamma</strong>: configurable transition duration for time-based night mode, values below 2500k, a suspend-aware scheduler that stops losing track across sleep, and gamma and contrast sliders that work with night mode off</li>
<li class=""><strong>Power menu</strong>: user-defined custom buttons (<a href="https://github.com/FormalSnake" target="_blank" rel="noopener noreferrer" class="">FormalSnake</a>), soft reboot on systemd</li>
<li class=""><strong>Battery</strong>: optionally lower refresh rate on battery (<a href="https://github.com/atimofeev" target="_blank" rel="noopener noreferrer" class="">atimofeev</a>), estimated end time (<a href="https://github.com/hthienloc" target="_blank" rel="noopener noreferrer" class="">hthienloc</a>), charge and discharge rate in the bar widget (<a href="https://github.com/SpyrosPsarras" target="_blank" rel="noopener noreferrer" class="">SpyrosPsarras</a>), and a circle style per bar instance with theme or step colors</li>
<li class=""><strong>Wallpaper</strong>: folder-based selection, shuffle (<a href="https://github.com/greenbugx" target="_blank" rel="noopener noreferrer" class="">greenbugx</a>), random cycling order (<a href="https://github.com/hthienloc" target="_blank" rel="noopener noreferrer" class="">hthienloc</a>)</li>
<li class=""><strong>Install</strong>: <code>dms setup headless</code> and a non-interactive dankinstall script (<a href="https://github.com/JDKamalakar" target="_blank" rel="noopener noreferrer" class="">JDKamalakar</a>)</li>
<li class=""><strong>IPC</strong>: <code>settings dump</code> for the full live config as JSON (<a href="https://github.com/sweenu" target="_blank" rel="noopener noreferrer" class="">sweenu</a>), <code>dumpSession</code>, notification dismiss (<a href="https://github.com/euletheia" target="_blank" rel="noopener noreferrer" class="">euletheia</a>), tray menu open (<a href="https://github.com/lankong0522" target="_blank" rel="noopener noreferrer" class="">lankong0522</a>), and <code>openAt</code>/<code>toggleAt</code> for opening popouts at a location</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next">What's Next<a href="https://duxlabs.dev/blog/v1-6-release#whats-next" class="hash-link" aria-label="Direct link to What's Next" title="Direct link to What's Next" translate="no">​</a></h2>
<p>1.6 is also a direction marker. DMS started as a shell, and the pieces around it - search, monitoring, calendar, greeter - have grown into a suite that now versions and releases as one. From here development shifts toward a full desktop environment paradigm: standalone apps that share the Dank design language and theming, on any compositor, instead of everything living inside the shell.</p>
<p>In development for upcoming releases:</p>
<ul>
<li class=""><strong>Standalone file browser</strong>: the file browser graduates from a shell surface into its own app</li>
<li class=""><strong>DankConnect</strong>: phone integration for the Dank Desktop</li>
<li class="">More shell built-ins splitting into standalone suite apps, the way the greeter did this cycle</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="community-contributions">Community Contributions<a href="https://duxlabs.dev/blog/v1-6-release#community-contributions" class="hash-link" aria-label="Direct link to Community Contributions" title="Direct link to Community Contributions" translate="no">​</a></h2>
<p>540+ commits from 63 contributors this cycle. One deserves a callout:</p>
<p><strong><a href="https://github.com/hthienloc" target="_blank" rel="noopener noreferrer" class="">Huỳnh Thiện Lộc</a></strong> landed 62 commits, including two of the performance wins above: the direct-socket IPC path and the region selector overlay cache. Also the cross-output region capture, native cursor shapes, the scroll capture live preview and <code>--geometry</code> flag, the dock pinned/running split and grouped window cycling, Niri keyboard and mouse/touchpad settings tabs, the QR generator launcher, and battery end-time estimates. On top of that, the Quick Capture and Emoji Picker plugins in the registry are his.</p>
<p>Also: GTK3 dynamic theming (<a href="https://github.com/euletheia" target="_blank" rel="noopener noreferrer" class="">euletheia</a>), custom power menu buttons and Apple Music animated covers (<a href="https://github.com/FormalSnake" target="_blank" rel="noopener noreferrer" class="">FormalSnake</a>), WiFi hotspot (<a href="https://github.com/ronharel02" target="_blank" rel="noopener noreferrer" class="">ronharel02</a>).</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="all-contributions">All Contributions<a href="https://duxlabs.dev/blog/v1-6-release#all-contributions" class="hash-link" aria-label="Direct link to All Contributions" title="Direct link to All Contributions" translate="no">​</a></h3>
<table><thead><tr><th>Contributor</th><th>Contribution</th></tr></thead><tbody><tr><td><strong><a href="https://github.com/0xdeafbeef" target="_blank" rel="noopener noreferrer" class="">0xdeafbeef</a></strong></td><td>• Feat(control-center): show Bluetooth battery in quick tile (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3160" target="_blank" rel="noopener noreferrer" class="">PR #3160</a>)<br>• Fix(tray): prefer tooltip title in menu (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3181" target="_blank" rel="noopener noreferrer" class="">PR #3181</a>)<br>• Fix(bar): prevent focused app overlap (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3190" target="_blank" rel="noopener noreferrer" class="">PR #3190</a>)</td></tr><tr><td><strong><a href="https://github.com/14Do" target="_blank" rel="noopener noreferrer" class="">14Do</a></strong></td><td>Fix(ListViewTransitions): null transitions when duration truncates to 0ms (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2791" target="_blank" rel="noopener noreferrer" class="">PR #2791</a>)</td></tr><tr><td><strong><a href="https://github.com/A0-42" target="_blank" rel="noopener noreferrer" class="">A0-42</a></strong></td><td>Fix: use sleep_monitor/wakeup_monitor for DPMS to preserve monitor layout (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2842" target="_blank" rel="noopener noreferrer" class="">PR #2842</a>)</td></tr><tr><td><strong><a href="https://github.com/aaronjamt" target="_blank" rel="noopener noreferrer" class="">aaronjamt</a></strong></td><td>Bar(IdleInhibitor): Color icon when activated (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2395" target="_blank" rel="noopener noreferrer" class="">PR #2395</a>)</td></tr><tr><td><strong><a href="https://github.com/AiraNadih" target="_blank" rel="noopener noreferrer" class="">AiraNadih</a></strong></td><td>Fix(process-list): defer IPC actions until modal is loaded (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2829" target="_blank" rel="noopener noreferrer" class="">PR #2829</a>)</td></tr><tr><td><strong><a href="https://github.com/alamin147" target="_blank" rel="noopener noreferrer" class="">alamin147</a></strong></td><td>• Dankdash: add inline wallpaper search (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3048" target="_blank" rel="noopener noreferrer" class="">PR #3048</a>)<br>• Control-center: route Bluetooth power toggles through DMS backend (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3082" target="_blank" rel="noopener noreferrer" class="">PR #3082</a>)</td></tr><tr><td><strong><a href="https://github.com/Alexis12119" target="_blank" rel="noopener noreferrer" class="">Alexis12119</a></strong></td><td>Chore: fix indentation in niri media key bindings. (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2858" target="_blank" rel="noopener noreferrer" class="">PR #2858</a>)</td></tr><tr><td><strong><a href="https://github.com/arfan21" target="_blank" rel="noopener noreferrer" class="">arfan21</a></strong></td><td>Workspace switcher: fix apps icon won't re focus (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2830" target="_blank" rel="noopener noreferrer" class="">PR #2830</a>)</td></tr><tr><td><strong><a href="https://github.com/ArijanJ" target="_blank" rel="noopener noreferrer" class="">ArijanJ</a></strong></td><td>Osd: click to hide some osds (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2927" target="_blank" rel="noopener noreferrer" class="">PR #2927</a>)</td></tr><tr><td><strong><a href="https://github.com/arqueon" target="_blank" rel="noopener noreferrer" class="">arqueon</a></strong></td><td>Refactor(mpris): enrich metadata across equivalent players (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2928" target="_blank" rel="noopener noreferrer" class="">PR #2928</a>)</td></tr><tr><td><strong><a href="https://github.com/artrixdotdev" target="_blank" rel="noopener noreferrer" class="">artrixdotdev</a></strong></td><td>Feat(plugins): add portable plugin lockfile (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2976" target="_blank" rel="noopener noreferrer" class="">PR #2976</a>)</td></tr><tr><td><strong><a href="https://github.com/asteroidzman" target="_blank" rel="noopener noreferrer" class="">asteroidzman</a></strong></td><td>Core: fix security and concurrency issues found in a backend audit (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2805" target="_blank" rel="noopener noreferrer" class="">PR #2805</a>)</td></tr><tr><td><strong><a href="https://github.com/atimofeev" target="_blank" rel="noopener noreferrer" class="">atimofeev</a></strong></td><td>• Feat(power): lower refresh rate on battery (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2428" target="_blank" rel="noopener noreferrer" class="">PR #2428</a>)<br>• Fix(notifications): dismiss popups when senders close notifications (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2815" target="_blank" rel="noopener noreferrer" class="">PR #2815</a>)</td></tr><tr><td><strong><a href="https://github.com/bernardopg" target="_blank" rel="noopener noreferrer" class="">bernardopg</a></strong></td><td>Fix(doctor): explain Qt private API mismatch (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3131" target="_blank" rel="noopener noreferrer" class="">PR #3131</a>)</td></tr><tr><td><strong><a href="https://github.com/Conava" target="_blank" rel="noopener noreferrer" class="">Conava</a></strong></td><td>• Feat(theme): support qtengine as a Qt platform theme (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3019" target="_blank" rel="noopener noreferrer" class="">PR #3019</a>)<br>• Fix(trash): keep tests off the machine's real per-mount trash dirs (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3100" target="_blank" rel="noopener noreferrer" class="">PR #3100</a>)<br>• Feat(theme): add a selectable source color mode for wallpaper palettes (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3020" target="_blank" rel="noopener noreferrer" class="">PR #3020</a>)</td></tr><tr><td><strong><a href="https://github.com/Curious-r" target="_blank" rel="noopener noreferrer" class="">Curious-r</a></strong></td><td>• Feat(settings): add location search to theme &amp; gamma coordinates (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3010" target="_blank" rel="noopener noreferrer" class="">PR #3010</a>)<br>• Feat(settings): echo location name in location search (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3040" target="_blank" rel="noopener noreferrer" class="">PR #3040</a>)</td></tr><tr><td><strong><a href="https://github.com/cwelsys" target="_blank" rel="noopener noreferrer" class="">cwelsys</a></strong></td><td>• Popout: re-apply surface geometry after shouldBeVisible (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2983" target="_blank" rel="noopener noreferrer" class="">PR #2983</a>)<br>• Fix(dgop): stop the process list opening blank (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3108" target="_blank" rel="noopener noreferrer" class="">PR #3108</a>)<br>• Fix(tailscale): back off when the IPN bus read fails (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3142" target="_blank" rel="noopener noreferrer" class="">PR #3142</a>)<br>• Deps: bump tailscale.com to v1.102.0 (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3143" target="_blank" rel="noopener noreferrer" class="">PR #3143</a>)<br>• Test(plugins): isolate git config in the real git client test (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3144" target="_blank" rel="noopener noreferrer" class="">PR #3144</a>)</td></tr><tr><td><strong><a href="https://github.com/EbonJaeger" target="_blank" rel="noopener noreferrer" class="">EbonJaeger</a></strong></td><td>Build: Add support for DESTDIR (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2783" target="_blank" rel="noopener noreferrer" class="">PR #2783</a>)</td></tr><tr><td><strong><a href="https://github.com/elel-code" target="_blank" rel="noopener noreferrer" class="">elel-code</a></strong></td><td>Fix(matugen): honor config dir for qtengine sync (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3195" target="_blank" rel="noopener noreferrer" class="">PR #3195</a>)</td></tr><tr><td><strong><a href="https://github.com/euletheia" target="_blank" rel="noopener noreferrer" class="">euletheia</a></strong></td><td>• Feat(Themes): add support for GTK3 dynamic theming (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2523" target="_blank" rel="noopener noreferrer" class="">PR #2523</a>)<br>• Feat(ipc): add 'dismiss' function to notifications ipc (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2942" target="_blank" rel="noopener noreferrer" class="">PR #2942</a>)<br>• Fix(BatteryService): fix unresolved icons for notifications and dismiss alerts when plugged in (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2943" target="_blank" rel="noopener noreferrer" class="">PR #2943</a>)<br>• Fix(BatteryService): fix typo in notification check (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2944" target="_blank" rel="noopener noreferrer" class="">PR #2944</a>)</td></tr><tr><td><strong><a href="https://github.com/FaintFlower" target="_blank" rel="noopener noreferrer" class="">FaintFlower</a></strong></td><td>Readme: fix broken star history chart (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3088" target="_blank" rel="noopener noreferrer" class="">PR #3088</a>)</td></tr><tr><td><strong><a href="https://github.com/feng-yifan" target="_blank" rel="noopener noreferrer" class="">feng-yifan</a></strong></td><td>Fix(settings): reset AppBrowserPopup model on close to avoid crash (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2925" target="_blank" rel="noopener noreferrer" class="">PR #2925</a>)</td></tr><tr><td><strong><a href="https://github.com/fluxwrk" target="_blank" rel="noopener noreferrer" class="">fluxwrk</a></strong></td><td>Fix: update Mango named scratchpad keybind (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3118" target="_blank" rel="noopener noreferrer" class="">PR #3118</a>)</td></tr><tr><td><strong><a href="https://github.com/FormalSnake" target="_blank" rel="noopener noreferrer" class="">FormalSnake</a></strong></td><td>• Location: add missing subscribe fan-out for location events (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2914" target="_blank" rel="noopener noreferrer" class="">PR #2914</a>)<br>• Powermenu: support user-defined custom power buttons (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2916" target="_blank" rel="noopener noreferrer" class="">PR #2916</a>)<br>• Media: add opt-in Apple Music animated album covers (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2918" target="_blank" rel="noopener noreferrer" class="">PR #2918</a>)</td></tr><tr><td><strong><a href="https://github.com/fromelicks" target="_blank" rel="noopener noreferrer" class="">fromelicks</a></strong></td><td>Fix(lint-qml): explain how to actually create the tooling VFS config (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3249" target="_blank" rel="noopener noreferrer" class="">PR #3249</a>)</td></tr><tr><td><strong><a href="https://github.com/Grant07" target="_blank" rel="noopener noreferrer" class="">Grant07</a></strong></td><td>Fix(network): authenticate Fortinet VPNs natively (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2959" target="_blank" rel="noopener noreferrer" class="">PR #2959</a>)</td></tr><tr><td><strong><a href="https://github.com/greenbugx" target="_blank" rel="noopener noreferrer" class="">greenbugx</a></strong></td><td>Feat(wallpaper): add folder-based wallpaper selection and shuffle (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2990" target="_blank" rel="noopener noreferrer" class="">PR #2990</a>)</td></tr><tr><td><strong><a href="https://github.com/haikalllp" target="_blank" rel="noopener noreferrer" class="">haikalllp</a></strong></td><td>Feat(theme): add support for matugen smart mode and type (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3109" target="_blank" rel="noopener noreferrer" class="">PR #3109</a>)</td></tr><tr><td><strong><a href="https://github.com/hecknt" target="_blank" rel="noopener noreferrer" class="">hecknt</a></strong></td><td>Systemlogo: Add Zirconium (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2881" target="_blank" rel="noopener noreferrer" class="">PR #2881</a>)</td></tr><tr><td><strong><a href="https://github.com/hthienloc" target="_blank" rel="noopener noreferrer" class="">hthienloc</a></strong></td><td>• Feat(media): add toggle for album art accent colors (#2831) (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2832" target="_blank" rel="noopener noreferrer" class="">PR #2832</a>)<br>• Fix(dash): resolve pointer cursor hover issue in connected mode (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2845" target="_blank" rel="noopener noreferrer" class="">PR #2845</a>)<br>• Fix(Modal): respect targetScreen property instead of always using focused screen (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2861" target="_blank" rel="noopener noreferrer" class="">PR #2861</a>)<br>• Fix(slideout): yield keyboard focus when modal is open on same screen (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2902" target="_blank" rel="noopener noreferrer" class="">PR #2902</a>)<br>• Feat(settings): add Mouse &amp; Touchpad settings tab for Niri (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2905" target="_blank" rel="noopener noreferrer" class="">PR #2905</a>)<br>• Feat(settings): add option to suppress config reload toast (#2730) (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2915" target="_blank" rel="noopener noreferrer" class="">PR #2915</a>)<br>• Feat(wallpaper): support random cycling order (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2936" target="_blank" rel="noopener noreferrer" class="">PR #2936</a>)<br>• Feat(settings): add keyboard configuration tab for Niri (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2937" target="_blank" rel="noopener noreferrer" class="">PR #2937</a>)<br>• Feat: add QR Generator launcher (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2941" target="_blank" rel="noopener noreferrer" class="">PR #2941</a>)<br>• Fix(launcher): honor source badge setting in grid mode (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3002" target="_blank" rel="noopener noreferrer" class="">PR #3002</a>)<br>• Fix(settings): hide removed widget tooltip (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3003" target="_blank" rel="noopener noreferrer" class="">PR #3003</a>)<br>• Feat(theme): add extract dynamic theme to JSON file (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3009" target="_blank" rel="noopener noreferrer" class="">PR #3009</a>)<br>• Fix(dock): skip creating dock layers when dock is disabled (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3014" target="_blank" rel="noopener noreferrer" class="">PR #3014</a>)<br>• Feat(filebrowser): expose folder mode on surface modal (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3022" target="_blank" rel="noopener noreferrer" class="">PR #3022</a>)<br>• Feat(dock): cycle grouped app windows (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3023" target="_blank" rel="noopener noreferrer" class="">PR #3023</a>)<br>• Feat(dock): add option to separate pinned and running apps (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3025" target="_blank" rel="noopener noreferrer" class="">PR #3025</a>)<br>• Feat(clock): add widget date order option (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3028" target="_blank" rel="noopener noreferrer" class="">PR #3028</a>)<br>• Fix(dock): preserve overview-only visibility (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3029" target="_blank" rel="noopener noreferrer" class="">PR #3029</a>)<br>• Fix(brightness): initialize display state (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3035" target="_blank" rel="noopener noreferrer" class="">PR #3035</a>)<br>• Feat(clipboard): add overlay layer option (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3037" target="_blank" rel="noopener noreferrer" class="">PR #3037</a>)<br>• Fix(dock): cycle niri overview groups (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3038" target="_blank" rel="noopener noreferrer" class="">PR #3038</a>)<br>• Fix(frame): align connected chrome layer (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3039" target="_blank" rel="noopener noreferrer" class="">PR #3039</a>)<br>• Perf(screenshot): cache overlay background (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3061" target="_blank" rel="noopener noreferrer" class="">PR #3061</a>)<br>• Fix(dock): close grouped app on middle click (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3064" target="_blank" rel="noopener noreferrer" class="">PR #3064</a>)<br>• Fix(dock): animate overview reveal in frame mode (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3065" target="_blank" rel="noopener noreferrer" class="">PR #3065</a>)<br>• Fix(osd): clamp vertical brightness slider (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3067" target="_blank" rel="noopener noreferrer" class="">PR #3067</a>)<br>• Fix(launcher): hide spotlight placeholder during IME input (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3071" target="_blank" rel="noopener noreferrer" class="">PR #3071</a>)<br>• Fix(matugen): support Vesktop Flatpak themes (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3075" target="_blank" rel="noopener noreferrer" class="">PR #3075</a>)<br>• Feat(matugen): add Fcitx5 theme template (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3076" target="_blank" rel="noopener noreferrer" class="">PR #3076</a>)<br>• Perf(ipc): call Quickshell directly (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3081" target="_blank" rel="noopener noreferrer" class="">PR #3081</a>)<br>• Feat(dankbar): corner style &amp; bar length padding (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3085" target="_blank" rel="noopener noreferrer" class="">PR #3085</a>)<br>• Fix(lock): handle ctrl-backspace (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3087" target="_blank" rel="noopener noreferrer" class="">PR #3087</a>)<br>• Feat(chooser): edit and copy target (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3094" target="_blank" rel="noopener noreferrer" class="">PR #3094</a>)<br>• Fix(notifications): keep popup above frame chrome (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3099" target="_blank" rel="noopener noreferrer" class="">PR #3099</a>)<br>• Fix(frame): preserve connected popout chrome (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3101" target="_blank" rel="noopener noreferrer" class="">PR #3101</a>)<br>• Feat(settings): improve battery status layout (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3103" target="_blank" rel="noopener noreferrer" class="">PR #3103</a>)<br>• Fix(settings): restore control center menu (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3113" target="_blank" rel="noopener noreferrer" class="">PR #3113</a>)<br>• Feat(battery): show estimated end time (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3117" target="_blank" rel="noopener noreferrer" class="">PR #3117</a>)<br>• Fix(displays): restore scale after revert (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3124" target="_blank" rel="noopener noreferrer" class="">PR #3124</a>)<br>• Fix(launcher): clip tile labels to rounded corners (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3126" target="_blank" rel="noopener noreferrer" class="">PR #3126</a>)<br>• Fix(dankbar): consume empty-area right clicks (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3127" target="_blank" rel="noopener noreferrer" class="">PR #3127</a>)<br>• Fix(screenshot): support multi-monitor region capture (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3132" target="_blank" rel="noopener noreferrer" class="">PR #3132</a>)<br>• Feat(settings): search runtime plugins (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3136" target="_blank" rel="noopener noreferrer" class="">PR #3136</a>)<br>• Feat(bar): add focused window details popout (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3139" target="_blank" rel="noopener noreferrer" class="">PR #3139</a>)<br>• Feat(screenshot): use native cursor shapes (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3155" target="_blank" rel="noopener noreferrer" class="">PR #3155</a>)<br>• Feat(screenshot): drag region with ctrl (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3157" target="_blank" rel="noopener noreferrer" class="">PR #3157</a>)<br>• Fix(frame): consume gutter clicks (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3158" target="_blank" rel="noopener noreferrer" class="">PR #3158</a>)<br>• Feat(launcher): cycle modes with ctrl-tab (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3204" target="_blank" rel="noopener noreferrer" class="">PR #3204</a>)<br>• Feat(spotlight): align tab navigation with full launcher (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3205" target="_blank" rel="noopener noreferrer" class="">PR #3205</a>)<br>• Fix(clipboard): stack clear dialog above modal (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3207" target="_blank" rel="noopener noreferrer" class="">PR #3207</a>)<br>• Fix(settings): keep search result visible (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3209" target="_blank" rel="noopener noreferrer" class="">PR #3209</a>)<br>• Feat(clipboard): accept dropped content (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3211" target="_blank" rel="noopener noreferrer" class="">PR #3211</a>)<br>• Feat(lock): add vertical clock style (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3220" target="_blank" rel="noopener noreferrer" class="">PR #3220</a>)<br>• Fix(popouts): close hover surface on click (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3223" target="_blank" rel="noopener noreferrer" class="">PR #3223</a>)<br>• Fix(dock): hide overlay dock over fullscreen (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3224" target="_blank" rel="noopener noreferrer" class="">PR #3224</a>)<br>• Feat(dock): sync background and icons in frame overview (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3252" target="_blank" rel="noopener noreferrer" class="">PR #3252</a>)<br>• Fix(dock): layout &amp; indicator misalignment on orientation switch (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3256" target="_blank" rel="noopener noreferrer" class="">PR #3256</a>)<br>• Fix(bar): prevent focused app widget from blanking and live-sync (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3258" target="_blank" rel="noopener noreferrer" class="">PR #3258</a>)<br>• Feat(screenshot): support 4-corner resizing while holding Ctrl (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3259" target="_blank" rel="noopener noreferrer" class="">PR #3259</a>)<br>• Fix(powermenu): close on escape key, dedup action shortcuts (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3262" target="_blank" rel="noopener noreferrer" class="">PR #3262</a>)<br>• Feat(screenshot): add live preview panel for scroll capture (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3269" target="_blank" rel="noopener noreferrer" class="">PR #3269</a>)<br>• Feat(screenshot): add --geometry flag to selection coordinates (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3274" target="_blank" rel="noopener noreferrer" class="">PR #3274</a>)</td></tr><tr><td><strong><a href="https://github.com/jack-mil" target="_blank" rel="noopener noreferrer" class="">jack-mil</a></strong></td><td>Fix(mpris): remove required non-null artist/title from idle condition (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2993" target="_blank" rel="noopener noreferrer" class="">PR #2993</a>)</td></tr><tr><td><strong><a href="https://github.com/JDKamalakar" target="_blank" rel="noopener noreferrer" class="">JDKamalakar</a></strong></td><td>Dankinstall: add non-interactive install script (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3063" target="_blank" rel="noopener noreferrer" class="">PR #3063</a>)</td></tr><tr><td><strong><a href="https://github.com/kanghengliu" target="_blank" rel="noopener noreferrer" class="">kanghengliu</a></strong></td><td>• Fix(player): combine trackid with text identity (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2808" target="_blank" rel="noopener noreferrer" class="">PR #2808</a>)<br>• Fix(processlist): stop polling when the popout is closed (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3159" target="_blank" rel="noopener noreferrer" class="">PR #3159</a>)</td></tr><tr><td><strong><a href="https://github.com/kmf" target="_blank" rel="noopener noreferrer" class="">kmf</a></strong></td><td>Add cellular network support (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3096" target="_blank" rel="noopener noreferrer" class="">PR #3096</a>)</td></tr><tr><td><strong><a href="https://github.com/korbash" target="_blank" rel="noopener noreferrer" class="">korbash</a></strong></td><td>Feat(niri): close overview on window focus (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3030" target="_blank" rel="noopener noreferrer" class="">PR #3030</a>)</td></tr><tr><td><strong><a href="https://github.com/lankong0522" target="_blank" rel="noopener noreferrer" class="">lankong0522</a></strong></td><td>Feat(tray): add IPC action to open tray menus (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2701" target="_blank" rel="noopener noreferrer" class="">PR #2701</a>)</td></tr><tr><td><strong><a href="https://github.com/Legend-017" target="_blank" rel="noopener noreferrer" class="">Legend-017</a></strong></td><td>Fix(spotlight): improve file search query restoration and mode switching (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2887" target="_blank" rel="noopener noreferrer" class="">PR #2887</a>)</td></tr><tr><td><strong><a href="https://github.com/louzt" target="_blank" rel="noopener noreferrer" class="">louzt</a></strong></td><td>Feat(registry): support multiple plugin and theme registries via env vars (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2972" target="_blank" rel="noopener noreferrer" class="">PR #2972</a>)</td></tr><tr><td><strong><a href="https://github.com/Mario-Mohar" target="_blank" rel="noopener noreferrer" class="">Mario-Mohar</a></strong></td><td>• Feat(clipboard): clear only the filtered entries (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3235" target="_blank" rel="noopener noreferrer" class="">PR #3235</a>)<br>• Fix(theme): take sun times from the local calendar day, not the UTC one (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3237" target="_blank" rel="noopener noreferrer" class="">PR #3237</a>)<br>• Fix(keybinds): show hl.unbind + hl.bind overrides from user Lua modules (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3238" target="_blank" rel="noopener noreferrer" class="">PR #3238</a>)</td></tr><tr><td><strong><a href="https://github.com/Mark2Mac" target="_blank" rel="noopener noreferrer" class="">Mark2Mac</a></strong></td><td>• Fix(session): persist the idle inhibitor across shell restarts (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3123" target="_blank" rel="noopener noreferrer" class="">PR #3123</a>)<br>• Fix(suncalc): parenthesise the sunrise-equation denominator (up to 24 min error at high latitude) (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3192" target="_blank" rel="noopener noreferrer" class="">PR #3192</a>)</td></tr><tr><td><strong><a href="https://github.com/Mati7235" target="_blank" rel="noopener noreferrer" class="">Mati7235</a></strong></td><td>Dms doctor: detect missing XDG_MENU_PREFIX when KDE apps are installed (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2840" target="_blank" rel="noopener noreferrer" class="">PR #2840</a>)</td></tr><tr><td><strong><a href="https://github.com/maximal1st" target="_blank" rel="noopener noreferrer" class="">maximal1st</a></strong></td><td>Feat/translation (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2980" target="_blank" rel="noopener noreferrer" class="">PR #2980</a>)</td></tr><tr><td><strong><a href="https://github.com/Mikilio" target="_blank" rel="noopener noreferrer" class="">Mikilio</a></strong></td><td>• Feature/split move size hyprland windowrules (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2824" target="_blank" rel="noopener noreferrer" class="">PR #2824</a>)<br>• Fix(display): enforce at least one real monitor in profile application (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3106" target="_blank" rel="noopener noreferrer" class="">PR #3106</a>)</td></tr><tr><td><strong><a href="https://github.com/NeoDarkness" target="_blank" rel="noopener noreferrer" class="">NeoDarkness</a></strong></td><td>Fix: include Hyprland in minimal install logic (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2872" target="_blank" rel="noopener noreferrer" class="">PR #2872</a>)</td></tr><tr><td><strong><a href="https://github.com/njfletcher215" target="_blank" rel="noopener noreferrer" class="">njfletcher215</a></strong></td><td>Fix(settings): label primary bar spacing sliders correctly (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3228" target="_blank" rel="noopener noreferrer" class="">PR #3228</a>)</td></tr><tr><td><strong><a href="https://github.com/nofuturekid" target="_blank" rel="noopener noreferrer" class="">nofuturekid</a></strong></td><td>Fix(tray): don't dismiss click-opened tray menus from the hover controller (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2979" target="_blank" rel="noopener noreferrer" class="">PR #2979</a>)</td></tr><tr><td><strong><a href="https://github.com/nozsh" target="_blank" rel="noopener noreferrer" class="">nozsh</a></strong></td><td>Feat(keybinds): add keybind for PAM U2F on lock screen (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2930" target="_blank" rel="noopener noreferrer" class="">PR #2930</a>)</td></tr><tr><td><strong><a href="https://github.com/pdf" target="_blank" rel="noopener noreferrer" class="">pdf</a></strong></td><td>Feat(dank16): Support full matugen color format output (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3148" target="_blank" rel="noopener noreferrer" class="">PR #3148</a>)</td></tr><tr><td><strong><a href="https://github.com/ronharel02" target="_blank" rel="noopener noreferrer" class="">ronharel02</a></strong></td><td>Feat(network): initial WiFi hotspot support (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2825" target="_blank" rel="noopener noreferrer" class="">PR #2825</a>)</td></tr><tr><td><strong><a href="https://github.com/rredlip" target="_blank" rel="noopener noreferrer" class="">rredlip</a></strong></td><td>Fix(Lockscreen) - cover pixel of the loading Spinner (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2989" target="_blank" rel="noopener noreferrer" class="">PR #2989</a>)</td></tr><tr><td><strong><a href="https://github.com/Salio24" target="_blank" rel="noopener noreferrer" class="">Salio24</a></strong></td><td>Fixed bluetooth UI bug mentioned in #2627 (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2850" target="_blank" rel="noopener noreferrer" class="">PR #2850</a>)</td></tr><tr><td><strong><a href="https://github.com/scottmckendry" target="_blank" rel="noopener noreferrer" class="">scottmckendry</a></strong></td><td>• Fix(settings): battery tab items not in search (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2794" target="_blank" rel="noopener noreferrer" class="">PR #2794</a>)<br>• Fix(plugin): support for symlinked configs (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3090" target="_blank" rel="noopener noreferrer" class="">PR #3090</a>)</td></tr><tr><td><strong><a href="https://github.com/scottsteely" target="_blank" rel="noopener noreferrer" class="">scottsteely</a></strong></td><td>Feat(mpris): pin preferred media source (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3150" target="_blank" rel="noopener noreferrer" class="">PR #3150</a>)</td></tr><tr><td><strong><a href="https://github.com/shalevc1098" target="_blank" rel="noopener noreferrer" class="">shalevc1098</a></strong></td><td>Keyboard layout widget: refresh once compositor detection lands (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3225" target="_blank" rel="noopener noreferrer" class="">PR #3225</a>)</td></tr><tr><td><strong><a href="https://github.com/SpyrosPsarras" target="_blank" rel="noopener noreferrer" class="">SpyrosPsarras</a></strong></td><td>Feat(battery): show charge/discharge rate in the bar widget (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3210" target="_blank" rel="noopener noreferrer" class="">PR #3210</a>)</td></tr><tr><td><strong><a href="https://github.com/SunPodder" target="_blank" rel="noopener noreferrer" class="">SunPodder</a></strong></td><td>Feat(resize-api): add runtime resize functionality for desktop widgets (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3114" target="_blank" rel="noopener noreferrer" class="">PR #3114</a>)</td></tr><tr><td><strong><a href="https://github.com/sweenu" target="_blank" rel="noopener noreferrer" class="">sweenu</a></strong></td><td>Feat(ipc): add settings dump to print full live config as JSON (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2817" target="_blank" rel="noopener noreferrer" class="">PR #2817</a>)</td></tr><tr><td><strong><a href="https://github.com/tassiovirginio" target="_blank" rel="noopener noreferrer" class="">tassiovirginio</a></strong></td><td>SystemTrayBar: add configurable icon spacing (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3183" target="_blank" rel="noopener noreferrer" class="">PR #3183</a>)</td></tr><tr><td><strong><a href="https://github.com/tkroll-ionos" target="_blank" rel="noopener noreferrer" class="">tkroll-ionos</a></strong></td><td>• Fix(lock): hold sleep inhibitor until compositor confirms lock (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2907" target="_blank" rel="noopener noreferrer" class="">PR #2907</a>)<br>• Add option to ignore app-requested notification timeout (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2909" target="_blank" rel="noopener noreferrer" class="">PR #2909</a>)<br>• Fix(system-update): apply saved updaterIntervalSeconds on daemon connect (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3093" target="_blank" rel="noopener noreferrer" class="">PR #3093</a>)</td></tr><tr><td><strong><a href="https://github.com/wongcallum" target="_blank" rel="noopener noreferrer" class="">wongcallum</a></strong></td><td>• Feat(audio): add output port selection (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2779" target="_blank" rel="noopener noreferrer" class="">PR #2779</a>)<br>• Smooth battery time remaining estimate (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2854" target="_blank" rel="noopener noreferrer" class="">PR #2854</a>)</td></tr><tr><td><strong><a href="https://github.com/YewFence" target="_blank" rel="noopener noreferrer" class="">YewFence</a></strong></td><td>Feat(controlcenter): add wifi refresh button (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3245" target="_blank" rel="noopener noreferrer" class="">PR #3245</a>)</td></tr><tr><td><strong><a href="https://github.com/z1-0" target="_blank" rel="noopener noreferrer" class="">z1-0</a></strong></td><td>Fix(launcher): DankLauncherV2 was missing id and genericName search (<a href="https://github.com/duxlabs-dev/dux-shell/pull/3122" target="_blank" rel="noopener noreferrer" class="">PR #3122</a>)</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="resources">Resources<a href="https://duxlabs.dev/blog/v1-6-release#resources" class="hash-link" aria-label="Direct link to Resources" title="Direct link to Resources" translate="no">​</a></h2>
<a href="https://duxlabs.dev/docs/getting-started" class="getStartedLink_ATvI"><p>Get Started with DMS <span>→</span></p></a>
<div class="linksRow_BDVx"><a href="https://github.com/duxlabs-dev/dux-shell" class="supportLink_iul6">GitHub</a><span class="linkDivider_TkSA">•</span><a href="https://duxlabs.dev/docs/" class="supportLink_iul6">Documentation</a><span class="linkDivider_TkSA">•</span><a href="https://plugins.danklinux.com/" class="supportLink_iul6">Plugins</a><span class="linkDivider_TkSA">•</span><a href="https://discord.gg/ppWTpKmPgT" class="supportLink_iul6">Discord</a><span class="linkDivider_TkSA">•</span><a href="https://github.com/sponsors/AvengeMedia" class="supportLink_iul6">Sponsor on GitHub</a><span class="linkDivider_TkSA">•</span><a href="https://ko-fi.com/duxlabs" class="supportLink_iul6">Support on Ko-fi</a></div>
<div class="niriThanks_c0X0"><img src="https://duxlabs.dev/img/niri.svg" alt="niri"><span>Special thanks to <a href="https://github.com/YaLTeR">YaLTeR</a> for collaborating with the DMS team, for <a href="https://github.com/niri-wm/niri">niri</a> - the compositor that inspired DMS, and for hosting DMS on the <a href="https://discord.gg/ppWTpKmPgT">niri Discord</a>.</span></div>
<div class="thankYouHero__018"><div class="veins_yhIG" aria-hidden="true"><svg viewBox="0 0 800 300" preserveAspectRatio="none" class="veinAnim_YviA" style="width:100%;height:100%;opacity:0.45"><defs><linearGradient id="vein-g-gg8bt" x1="0%" y1="0%" x2="100%" y2="0%"><stop offset="0%" stop-color="#5E7A94" stop-opacity="0.3"></stop><stop offset="35%" stop-color="#E6EDF4" stop-opacity="0.9"></stop><stop offset="65%" stop-color="#9FB8CC" stop-opacity="0.7"></stop><stop offset="100%" stop-color="#5E7A94" stop-opacity="0.3"></stop></linearGradient></defs><g fill="none" stroke="url(#vein-g-gg8bt)" stroke-linecap="round"><path stroke-width="2.4" d="M -20 34 C 130 60, 250 12, 410 44 S 690 84, 830 58"></path><path stroke-width="1.8" d="M -20 268 C 120 240, 310 286, 510 252 S 740 226, 830 250"></path><path stroke-width="1.1" stroke-opacity="0.55" d="M 92 44 C 122 106, 84 170, 126 232 S 150 290, 144 320"></path><path stroke-width="1.1" stroke-opacity="0.55" d="M 692 66 C 722 126, 706 186, 738 244 S 758 296, 752 320"></path><path stroke-width="0.9" stroke-opacity="0.45" d="M 762 24 C 736 62, 772 100, 752 140"></path><path stroke-width="0.7" stroke-opacity="0.4" d="M 36 88 C 58 128, 44 172, 68 210"></path><path stroke-width="0.6" stroke-opacity="0.35" d="M 330 262 C 358 280, 350 300, 372 318"></path><path stroke-width="0.6" stroke-opacity="0.35" d="M 476 34 C 502 48, 498 72, 522 84"></path></g></svg></div><div class="heroContent_CVLH"><h2 class="thankYouTitle_GYzR"><p>Thank <span class="gradientText_aiPz">You</span></p></h2><p class="thankYouText_eS2E">To everyone who has supported DMS through feedback, contributions, sponsorships, donations, and packaging.</p><p class="thankYouTagline_HLaE">Polished like marble, sheds like a tabby</p></div></div>]]></content:encoded>
            <category>Release</category>
            <category>Announcement</category>
        </item>
        <item>
            <title><![CDATA[DMS 1.5 "The Wolverine" Released]]></title>
            <link>https://duxlabs.dev/blog/v1-5-release</link>
            <guid>https://duxlabs.dev/blog/v1-5-release</guid>
            <pubDate>Tue, 23 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[The fourth major release of DMS - Frame Mode, DankCalendar integration, Hyprland Lua config, enhanced MangoWM support, and a lot more.]]></description>
            <content:encoded><![CDATA[
<!-- -->
<!-- -->
<!-- -->
<div class="blogHero_Hhxz"><div class="claws_fGDC" aria-hidden="true"><div class="clawSet_hqQo clawLeft_GwDK"><svg viewBox="0 0 164 244" preserveAspectRatio="none" class="clawAnim1_Dksq" style="width:100%;height:100%;overflow:visible;opacity:0.5"><defs><linearGradient id="tear-g-h03b9" x1="0%" y1="0%" x2="0%" y2="100%"><stop offset="0%" stop-color="#FFE9B8" stop-opacity="0"></stop><stop offset="20%" stop-color="#FFF3D6" stop-opacity="0.95"></stop><stop offset="48%" stop-color="#F0A93C" stop-opacity="0.95"></stop><stop offset="78%" stop-color="#C2641F" stop-opacity="0.78"></stop><stop offset="100%" stop-color="#8A4B1A" stop-opacity="0"></stop></linearGradient><linearGradient id="tear-r-h03b9" x1="0%" y1="0%" x2="0%" y2="100%"><stop offset="0%" stop-color="#FFF6E0" stop-opacity="0"></stop><stop offset="30%" stop-color="#FFF6E0" stop-opacity="1"></stop><stop offset="70%" stop-color="#FFCE7A" stop-opacity="0.85"></stop><stop offset="100%" stop-color="#FFCE7A" stop-opacity="0"></stop></linearGradient><filter id="tear-s-h03b9" x="-70%" y="-30%" width="240%" height="160%"><fedropshadow dx="0" dy="0" stdDeviation="4" flood-color="#05070B" flood-opacity="0.9"></fedropshadow></filter></defs><g transform="" filter="url(#tear-s-h03b9)"><g><path fill="url(#tear-g-h03b9)" d="M 54.0 4.0 L 54.0 4.0 L 55.2 27.6 L 47.6 51.2 L 52.1 74.8 L 43.9 98.4 L 47.0 122.0 L 35.8 145.6 L 36.4 169.2 L 24.8 192.8 L 23.8 216.4 L 16.0 240.0 L 16.0 240.0 L 18.8 216.4 L 15.4 192.8 L 23.4 169.2 L 20.6 145.6 L 31.0 122.0 L 28.7 98.4 L 39.1 74.8 L 38.2 51.2 L 50.2 27.6 L 54.0 4.0 Z"></path><path fill="none" stroke="url(#tear-r-h03b9)" stroke-width="0.9" stroke-linejoin="round" d="M 54.0 4.0 L 54.0 4.0 L 55.2 27.6 L 47.6 51.2 L 52.1 74.8 L 43.9 98.4 L 47.0 122.0 L 35.8 145.6 L 36.4 169.2 L 24.8 192.8 L 23.8 216.4 L 16.0 240.0 L 16.0 240.0 L 18.8 216.4 L 15.4 192.8 L 23.4 169.2 L 20.6 145.6 L 31.0 122.0 L 28.7 98.4 L 39.1 74.8 L 38.2 51.2 L 50.2 27.6 L 54.0 4.0 Z"></path></g><g><path fill="url(#tear-g-h03b9)" d="M 96.0 4.0 L 96.0 4.0 L 93.6 27.6 L 100.4 51.2 L 94.2 74.8 L 99.8 98.4 L 90.5 122.0 L 93.9 145.6 L 83.9 169.2 L 86.7 192.8 L 76.5 216.4 L 74.0 240.0 L 74.0 240.0 L 70.9 216.4 L 76.1 192.8 L 69.3 169.2 L 76.7 145.6 L 72.5 122.0 L 82.6 98.4 L 79.6 74.8 L 89.8 51.2 L 88.0 27.6 L 96.0 4.0 Z"></path><path fill="none" stroke="url(#tear-r-h03b9)" stroke-width="0.9" stroke-linejoin="round" d="M 96.0 4.0 L 96.0 4.0 L 93.6 27.6 L 100.4 51.2 L 94.2 74.8 L 99.8 98.4 L 90.5 122.0 L 93.9 145.6 L 83.9 169.2 L 86.7 192.8 L 76.5 216.4 L 74.0 240.0 L 74.0 240.0 L 70.9 216.4 L 76.1 192.8 L 69.3 169.2 L 76.7 145.6 L 72.5 122.0 L 82.6 98.4 L 79.6 74.8 L 89.8 51.2 L 88.0 27.6 L 96.0 4.0 Z"></path></g><g><path fill="url(#tear-g-h03b9)" d="M 138.0 4.0 L 138.0 4.0 L 143.8 27.6 L 141.3 51.2 L 150.4 74.8 L 146.3 98.4 L 153.0 122.0 L 146.4 145.6 L 152.6 169.2 L 146.1 192.8 L 149.7 216.4 L 146.0 240.0 L 146.0 240.0 L 144.7 216.4 L 136.7 192.8 L 139.6 169.2 L 131.2 145.6 L 137.0 122.0 L 131.1 98.4 L 137.4 74.8 L 131.9 51.2 L 138.8 27.6 L 138.0 4.0 Z"></path><path fill="none" stroke="url(#tear-r-h03b9)" stroke-width="0.9" stroke-linejoin="round" d="M 138.0 4.0 L 138.0 4.0 L 143.8 27.6 L 141.3 51.2 L 150.4 74.8 L 146.3 98.4 L 153.0 122.0 L 146.4 145.6 L 152.6 169.2 L 146.1 192.8 L 149.7 216.4 L 146.0 240.0 L 146.0 240.0 L 144.7 216.4 L 136.7 192.8 L 139.6 169.2 L 131.2 145.6 L 137.0 122.0 L 131.1 98.4 L 137.4 74.8 L 131.9 51.2 L 138.8 27.6 L 138.0 4.0 Z"></path></g><circle cx="8" cy="60" r="2.2" fill="url(#tear-r-h03b9)" opacity="0.7"></circle><circle cx="150" cy="50" r="1.8" fill="url(#tear-r-h03b9)" opacity="0.7"></circle><circle cx="24" cy="150" r="1.6" fill="url(#tear-r-h03b9)" opacity="0.7"></circle><circle cx="156" cy="168" r="2.4" fill="url(#tear-r-h03b9)" opacity="0.7"></circle><circle cx="70" cy="230" r="1.8" fill="url(#tear-r-h03b9)" opacity="0.7"></circle><circle cx="120" cy="18" r="1.5" fill="url(#tear-r-h03b9)" opacity="0.7"></circle></g></svg></div><div class="clawSet_hqQo clawRight_g6T7"><svg viewBox="0 0 164 244" preserveAspectRatio="none" class="clawAnim2_EM_m" style="width:100%;height:100%;overflow:visible;opacity:0.5"><defs><linearGradient id="tear-g-4wju6" x1="0%" y1="0%" x2="0%" y2="100%"><stop offset="0%" stop-color="#FFE9B8" stop-opacity="0"></stop><stop offset="20%" stop-color="#FFF3D6" stop-opacity="0.95"></stop><stop offset="48%" stop-color="#F0A93C" stop-opacity="0.95"></stop><stop offset="78%" stop-color="#C2641F" stop-opacity="0.78"></stop><stop offset="100%" stop-color="#8A4B1A" stop-opacity="0"></stop></linearGradient><linearGradient id="tear-r-4wju6" x1="0%" y1="0%" x2="0%" y2="100%"><stop offset="0%" stop-color="#FFF6E0" stop-opacity="0"></stop><stop offset="30%" stop-color="#FFF6E0" stop-opacity="1"></stop><stop offset="70%" stop-color="#FFCE7A" stop-opacity="0.85"></stop><stop offset="100%" stop-color="#FFCE7A" stop-opacity="0"></stop></linearGradient><filter id="tear-s-4wju6" x="-70%" y="-30%" width="240%" height="160%"><fedropshadow dx="0" dy="0" stdDeviation="4" flood-color="#05070B" flood-opacity="0.9"></fedropshadow></filter></defs><g transform="translate(164,0) scale(-1,1)" filter="url(#tear-s-4wju6)"><g><path fill="url(#tear-g-4wju6)" d="M 54.0 4.0 L 54.0 4.0 L 55.2 27.6 L 47.6 51.2 L 52.1 74.8 L 43.9 98.4 L 47.0 122.0 L 35.8 145.6 L 36.4 169.2 L 24.8 192.8 L 23.8 216.4 L 16.0 240.0 L 16.0 240.0 L 18.8 216.4 L 15.4 192.8 L 23.4 169.2 L 20.6 145.6 L 31.0 122.0 L 28.7 98.4 L 39.1 74.8 L 38.2 51.2 L 50.2 27.6 L 54.0 4.0 Z"></path><path fill="none" stroke="url(#tear-r-4wju6)" stroke-width="0.9" stroke-linejoin="round" d="M 54.0 4.0 L 54.0 4.0 L 55.2 27.6 L 47.6 51.2 L 52.1 74.8 L 43.9 98.4 L 47.0 122.0 L 35.8 145.6 L 36.4 169.2 L 24.8 192.8 L 23.8 216.4 L 16.0 240.0 L 16.0 240.0 L 18.8 216.4 L 15.4 192.8 L 23.4 169.2 L 20.6 145.6 L 31.0 122.0 L 28.7 98.4 L 39.1 74.8 L 38.2 51.2 L 50.2 27.6 L 54.0 4.0 Z"></path></g><g><path fill="url(#tear-g-4wju6)" d="M 96.0 4.0 L 96.0 4.0 L 93.6 27.6 L 100.4 51.2 L 94.2 74.8 L 99.8 98.4 L 90.5 122.0 L 93.9 145.6 L 83.9 169.2 L 86.7 192.8 L 76.5 216.4 L 74.0 240.0 L 74.0 240.0 L 70.9 216.4 L 76.1 192.8 L 69.3 169.2 L 76.7 145.6 L 72.5 122.0 L 82.6 98.4 L 79.6 74.8 L 89.8 51.2 L 88.0 27.6 L 96.0 4.0 Z"></path><path fill="none" stroke="url(#tear-r-4wju6)" stroke-width="0.9" stroke-linejoin="round" d="M 96.0 4.0 L 96.0 4.0 L 93.6 27.6 L 100.4 51.2 L 94.2 74.8 L 99.8 98.4 L 90.5 122.0 L 93.9 145.6 L 83.9 169.2 L 86.7 192.8 L 76.5 216.4 L 74.0 240.0 L 74.0 240.0 L 70.9 216.4 L 76.1 192.8 L 69.3 169.2 L 76.7 145.6 L 72.5 122.0 L 82.6 98.4 L 79.6 74.8 L 89.8 51.2 L 88.0 27.6 L 96.0 4.0 Z"></path></g><g><path fill="url(#tear-g-4wju6)" d="M 138.0 4.0 L 138.0 4.0 L 143.8 27.6 L 141.3 51.2 L 150.4 74.8 L 146.3 98.4 L 153.0 122.0 L 146.4 145.6 L 152.6 169.2 L 146.1 192.8 L 149.7 216.4 L 146.0 240.0 L 146.0 240.0 L 144.7 216.4 L 136.7 192.8 L 139.6 169.2 L 131.2 145.6 L 137.0 122.0 L 131.1 98.4 L 137.4 74.8 L 131.9 51.2 L 138.8 27.6 L 138.0 4.0 Z"></path><path fill="none" stroke="url(#tear-r-4wju6)" stroke-width="0.9" stroke-linejoin="round" d="M 138.0 4.0 L 138.0 4.0 L 143.8 27.6 L 141.3 51.2 L 150.4 74.8 L 146.3 98.4 L 153.0 122.0 L 146.4 145.6 L 152.6 169.2 L 146.1 192.8 L 149.7 216.4 L 146.0 240.0 L 146.0 240.0 L 144.7 216.4 L 136.7 192.8 L 139.6 169.2 L 131.2 145.6 L 137.0 122.0 L 131.1 98.4 L 137.4 74.8 L 131.9 51.2 L 138.8 27.6 L 138.0 4.0 Z"></path></g><circle cx="8" cy="60" r="2.2" fill="url(#tear-r-4wju6)" opacity="0.7"></circle><circle cx="150" cy="50" r="1.8" fill="url(#tear-r-4wju6)" opacity="0.7"></circle><circle cx="24" cy="150" r="1.6" fill="url(#tear-r-4wju6)" opacity="0.7"></circle><circle cx="156" cy="168" r="2.4" fill="url(#tear-r-4wju6)" opacity="0.7"></circle><circle cx="70" cy="230" r="1.8" fill="url(#tear-r-4wju6)" opacity="0.7"></circle><circle cx="120" cy="18" r="1.5" fill="url(#tear-r-4wju6)" opacity="0.7"></circle></g></svg></div></div><div class="heroContent_jLTE"><h1 class="heroTitle_ZQjq"><p>DMS <span class="gradientText_Fdu8">1.5</span></p></h1><p class="heroSubtitle_AB1Q">The Wolverine</p></div></div>
<p>DankMaterialShell (DMS) 1.5 "The Wolverine" is here! This release introduces Frame Mode, a new connected surface that ties the whole shell together, native DankCalendar integration, Hyprland Lua config and enhanced MangoWM support, a reworked Material 3-like shadow system, and hundreds of fixes and improvements across DMS.</p>
<!-- -->
<div class="statsGrid_P9Gd" style="grid-template-columns:repeat(2, 1fr);max-width:600px"><div class="statCard_5qoD"><span class="statNumber_ivyY">4,000+</span><span class="statLabel_Edl2">Commits</span></div><div class="statCard_5qoD"><span class="statNumber_ivyY">7k+</span><span class="statLabel_Edl2">GitHub Stars</span></div><div class="statCard_5qoD"><span class="statNumber_ivyY">200+</span><span class="statLabel_Edl2">Contributors</span></div><div class="statCard_5qoD"><span class="statNumber_ivyY">230+</span><span class="statLabel_Edl2">Plugins</span></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="frame-mode--connected-or-standalone-surfaces">Frame Mode + Connected or Standalone Surfaces<a href="https://duxlabs.dev/blog/v1-5-release#frame-mode--connected-or-standalone-surfaces" class="hash-link" aria-label="Direct link to Frame Mode + Connected or Standalone Surfaces" title="Direct link to Frame Mode + Connected or Standalone Surfaces" translate="no">​</a></h2>
<figure style="text-align:center"><img src="https://duxlabs.dev/img/blog/v1.5/frame_light.png" alt="Frame Mode: the bar, dock, popouts, and modals drawn as one connected surface" class="themedComponent_mlkZ themedComponent--light_NVdE" style="max-width:700px;width:100%"><img src="https://duxlabs.dev/img/blog/v1.5/frame_dark.png" alt="Frame Mode: the bar, dock, popouts, and modals drawn as one connected surface" class="themedComponent_mlkZ themedComponent--dark_xIcU" style="max-width:700px;width:100%"><figcaption>Frame Mode ties the bar, dock, popouts, and modals into one connected surface.</figcaption></figure>
<p>DMS 1.5 adds the option to draw the shell surfaces as one connected surface, tying modals (such as the launcher), popouts, and notifications into the bar and frame.</p>
<ul>
<li class=""><strong>New Animations</strong>: There are new animation options "Directional" and "Depth" in addition to the standard and default "Fade and Scale"</li>
<li class=""><strong>Hover to Open</strong>: Optionally popouts can be opened on hover, without a mouse-click</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="dankcalendar">DankCalendar<a href="https://duxlabs.dev/blog/v1-5-release#dankcalendar" class="hash-link" aria-label="Direct link to DankCalendar" title="Direct link to DankCalendar" translate="no">​</a></h2>
<figure style="text-align:center"><img src="https://duxlabs.dev/img/blog/v1.5/dcal_light.png" alt="Creating, editing, and navigating events right from the shell" class="themedComponent_mlkZ themedComponent--light_NVdE" style="max-width:700px;width:100%"><img src="https://duxlabs.dev/img/blog/v1.5/dcal_dark.png" alt="Creating, editing, and navigating events right from the shell" class="themedComponent_mlkZ themedComponent--dark_xIcU" style="max-width:700px;width:100%"><figcaption>Create, edit, and navigate events right from the shell calendar overview.</figcaption></figure>
<p>DMS 1.5 brings native support for <a class="" href="https://duxlabs.dev/blog/dankcalendar-release">DankCalendar</a> (<a class="" href="https://duxlabs.dev/docs/dcal">docs</a>) as a calendar backend over IPC. This is a major new application addition that unifies Local, Google, Microsoft, CalDAV, and iCloud accounts into a single agenda.</p>
<p>When the <code>dcal</code> daemon is active, DMS detects it and establishes a bidirectional IPC connection. That connection enables several shell integrations:</p>
<ul>
<li class=""><strong>Full Event CRUD:</strong> You can now create, edit, and delete events directly within the shell calendar overview.</li>
<li class=""><strong>Reminders Routing:</strong> Upcoming-event notifications are delivered natively through the DMS notification system.</li>
<li class=""><strong>Offline Cache:</strong> Managed via a local SQLite cache database so agenda views work offline, syncing back as soon as connection is re-established.</li>
<li class=""><strong>Secure Keyring Storage:</strong> OAuth tokens and secrets are stored directly in your system keyring (GNOME Keyring/KWallet) instead of plaintext files.</li>
<li class=""><strong>Keyboard Navigation:</strong> Full arrow-key navigation for managing calendar events.</li>
<li class=""><strong>Fully On Device:</strong> DankCalendar runs entirely on-device, connecting directly to your providers.</li>
</ul>
<p>The DMS calendar provider is configurable for backwards compatibility with <a class="" href="https://duxlabs.dev/docs/dms/calendar-integration">Khal</a>, so users can continue to use the <code>khal</code> backend if desired.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="integrated-task-planner">Integrated Task Planner<a href="https://duxlabs.dev/blog/v1-5-release#integrated-task-planner" class="hash-link" aria-label="Direct link to Integrated Task Planner" title="Direct link to Integrated Task Planner" translate="no">​</a></h3>
<p>In addition to task/reminder/VTODO integration from DankCalendar, a local to-do and task planner widget has been added to the calendar overview, contributed by <strong><a href="https://github.com/goatnath" target="_blank" rel="noopener noreferrer" class="">goatnath</a></strong> (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2583" target="_blank" rel="noopener noreferrer" class="">PR #2583</a>). It manages your to-do lists and task states from within the shell calendar panel.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="greeter-enhancements">Greeter Enhancements<a href="https://duxlabs.dev/blog/v1-5-release#greeter-enhancements" class="hash-link" aria-label="Direct link to Greeter Enhancements" title="Direct link to Greeter Enhancements" translate="no">​</a></h2>
<figure style="text-align:center"><img src="https://duxlabs.dev/img/blog/v1.5/greeter_light.png" alt="The DMS greeter login screen with user selection and auto-login" class="themedComponent_mlkZ themedComponent--light_NVdE" style="max-width:700px;width:100%"><img src="https://duxlabs.dev/img/blog/v1.5/greeter_dark.png" alt="The DMS greeter login screen with user selection and auto-login" class="themedComponent_mlkZ themedComponent--dark_xIcU" style="max-width:700px;width:100%"><figcaption>The DMS greeter with user selection, session picker, and auto-login.</figcaption></figure>
<p>DMS 1.5 adds a settings GUI, multi-user account management, and per-user theme sync to the <a class="" href="https://duxlabs.dev/docs/dms-greeter">greeter</a>.</p>
<ul>
<li class=""><strong>Settings GUI:</strong> Manage dms-greeter and greetd settings without editing config files by hand.</li>
<li class=""><strong>Improved PAM Support:</strong> PAM authentication for fingerprint readers and U2F devices, with timeout recovery and unlock-state sync.</li>
<li class=""><strong>User Accounts:</strong> A <strong>Users</strong> tab in DMS Settings creates accounts - username, initial password, and optional <code>wheel</code>/<code>sudo</code> privileges and greeter-group access - and lists every human user on the system with their UID, GECOS, and group membership.</li>
<li class=""><strong>Behavior Toggles:</strong> Remember the last user, remember the last session, and auto-login.</li>
<li class=""><strong>Greeter Appearance:</strong> Per-greeter font family, 24-hour clock, seconds display, hour padding, and date format presets, separate from the lock screen settings.</li>
<li class=""><strong>Custom Greeter Wallpaper:</strong> A login screen background independent of your desktop wallpaper, with the same fill-mode options.</li>
<li class=""><strong>Sync Pending Indicator:</strong> A floating pill appears at the bottom of the tab when there are unsaved changes, so you can apply them without scrolling back to the top.</li>
<li class=""><strong>Per-User Theme Sync:</strong> Each account gets an independent cache slot, so users can sync their own login-screen appearance - theme, wallpaper (light/dark/per-monitor variants), custom theme files, and profile picture - without system-wide sudo.<!-- -->
<ul>
<li class=""><code>dms greeter sync</code> pushes the primary user's full theme, wallpaper, and auth config.</li>
<li class=""><code>dms greeter sync --profile</code> syncs just one greeter-group user's slot, without touching the global config.</li>
<li class="">A <strong>Sync</strong> button in Settings handles both modes, falling back to a terminal when sudo isn't available.</li>
</ul>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="window-rules-manager">Window Rules Manager<a href="https://duxlabs.dev/blog/v1-5-release#window-rules-manager" class="hash-link" aria-label="Direct link to Window Rules Manager" title="Direct link to Window Rules Manager" translate="no">​</a></h2>
<figure style="text-align:center"><img src="https://duxlabs.dev/img/blog/v1.5/windowrule_light.png" alt="Creating a new window rule with match criteria and conditions" class="themedComponent_mlkZ themedComponent--light_NVdE" style="max-width:500px;width:100%"><img src="https://duxlabs.dev/img/blog/v1.5/windowrule_dark.png" alt="Creating a new window rule with match criteria and conditions" class="themedComponent_mlkZ themedComponent--dark_xIcU" style="max-width:500px;width:100%"><figcaption>Configure match criteria and state-based conditions for a new window rule.</figcaption></figure>
<p>DMS 1.5 adds a <strong>Window Rules Manager</strong> for controlling window behaviors across Hyprland, Niri, and MangoWM.</p>
<p>A dedicated settings page allows viewing, editing, and creating window rules. A new <a href="https://duxlabs.dev/docs/dms/keybinds-ipc#window-rules" target="_blank" rel="noopener noreferrer" class="">IPC</a> allows creating a window rule for the currently focused window.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="display-profiles">Display Profiles<a href="https://duxlabs.dev/blog/v1-5-release#display-profiles" class="hash-link" aria-label="Direct link to Display Profiles" title="Direct link to Display Profiles" translate="no">​</a></h2>
<figure style="text-align:center"><img src="https://duxlabs.dev/img/blog/v1.5/displayconfig_light.png" alt="Display Profiles and monitor configuration with auto-switching layouts" class="themedComponent_mlkZ themedComponent--light_NVdE" style="max-width:600px;width:100%"><img src="https://duxlabs.dev/img/blog/v1.5/displayconfig_dark.png" alt="Display Profiles and monitor configuration with auto-switching layouts" class="themedComponent_mlkZ themedComponent--dark_xIcU" style="max-width:600px;width:100%"><figcaption>Save monitor layouts as Display Profiles and auto-switch as outputs change.</figcaption></figure>
<p>DMS 1.5 adds Display Profiles: saved monitor layouts that DMS can switch between automatically as outputs are connected or disconnected.</p>
<ul>
<li class=""><strong>Automatic Switching:</strong> DMS matches the connected set of outputs to a saved profile and applies it, so docking, undocking, or plugging in an external display restores the right layout.</li>
<li class=""><strong>Control Center Widget:</strong> A Display Profiles widget switches layouts without opening Settings.</li>
<li class=""><strong>Fractional Scaling Presets:</strong> Hyprland setups gain fractional scaling display presets.</li>
<li class=""><strong>Disabled Outputs:</strong> Profiles can leave specific outputs turned off.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="hyprland-lua-configuration">Hyprland Lua Configuration<a href="https://duxlabs.dev/blog/v1-5-release#hyprland-lua-configuration" class="hash-link" aria-label="Direct link to Hyprland Lua Configuration" title="Direct link to Hyprland Lua Configuration" translate="no">​</a></h2>
<p>DMS 1.5 moves all Hyprland default configurations to the new <a href="https://hypr.land/news/26_lua/" target="_blank" rel="noopener noreferrer" class="">Lua format</a>. When DMS deploys configs for Hyprland (via <code>dms setup</code> or <code>dankinstall</code>), it generates native Lua files instead of the older <code>.conf</code> format. This applies to all DMS-managed configurations such as key binds and monitor/output configurations. See the <a class="" href="https://duxlabs.dev/docs/dms/compositors#hyprland-configuration">Hyprland configuration guide</a> for details.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="enhanced-mangowm-support">Enhanced MangoWM Support<a href="https://duxlabs.dev/blog/v1-5-release#enhanced-mangowm-support" class="hash-link" aria-label="Direct link to Enhanced MangoWM Support" title="Direct link to Enhanced MangoWM Support" translate="no">​</a></h2>
<p>DMS 1.5 adds better support for the <a class="" href="https://duxlabs.dev/docs/dms/compositors#mangowc-configuration">MangoWM compositor</a> across the shell, installer, and UI tools. <code>dms setup</code> now deploys MangoWM configurations and <code>dankinstall</code> supports MangoWM as a compositor option.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="material-3-shadows--elevation">Material 3 Shadows &amp; Elevation<a href="https://duxlabs.dev/blog/v1-5-release#material-3-shadows--elevation" class="hash-link" aria-label="Direct link to Material 3 Shadows &amp; Elevation" title="Direct link to Material 3 Shadows &amp; Elevation" translate="no">​</a></h2>
<figure style="text-align:center"><img src="https://duxlabs.dev/img/blog/v1.5/shadow_light.png" alt="The reworked shadow and elevation controls with global and per-surface settings" class="themedComponent_mlkZ themedComponent--light_NVdE" style="max-width:600px;width:100%"><img src="https://duxlabs.dev/img/blog/v1.5/shadow_dark.png" alt="The reworked shadow and elevation controls with global and per-surface settings" class="themedComponent_mlkZ themedComponent--dark_xIcU" style="max-width:600px;width:100%"><figcaption>Global shadow controls with intensity, opacity, color, and per-surface elevation.</figcaption></figure>
<p>To support Frame Mode, the Material 3 elevation and shadow system was reworked so shadows stay consistent across connected, floating, and overlapping surfaces. A global shadow toggle lives in the Themes tab, with light/dark overrides and independent shadow controls per Dank Bar.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="spotlight---lightweight-launcher">Spotlight - Lightweight Launcher<a href="https://duxlabs.dev/blog/v1-5-release#spotlight---lightweight-launcher" class="hash-link" aria-label="Direct link to Spotlight - Lightweight Launcher" title="Direct link to Spotlight - Lightweight Launcher" translate="no">​</a></h2>
<figure style="text-align:center"><img src="https://duxlabs.dev/img/blog/v1.5/spotlight_light.png" alt="The lightweight Spotlight launcher searching files with a directory prefix" class="themedComponent_mlkZ themedComponent--light_NVdE" style="max-width:700px;width:100%"><img src="https://duxlabs.dev/img/blog/v1.5/spotlight_dark.png" alt="The lightweight Spotlight launcher searching files with a directory prefix" class="themedComponent_mlkZ themedComponent--dark_xIcU" style="max-width:700px;width:100%"><figcaption>New spotlight-style launcher</figcaption></figure>
<p>DMS 1.5 introduces <strong>Spotlight</strong>, a lightweight overlay launcher for minimalist setups. It sits in the center of your screen and searches files, folders, applications, and settings.</p>
<ul>
<li class=""><strong>Search Persistence:</strong> Spotlight persists your last search query and highlights it on open, contributed by <strong><a href="https://github.com/Legend-017" target="_blank" rel="noopener noreferrer" class="">Legend-017</a></strong> (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2726" target="_blank" rel="noopener noreferrer" class="">PR #2726</a>).</li>
<li class=""><strong>Prefix Queries:</strong> Use <code>/d</code> and <code>/f</code> prefix tags to narrow the search to directories and files when <a href="https://duxlabs.dev/docs/dsearch/" target="_blank" rel="noopener noreferrer" class="">dsearch</a> is installed.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="notepad-rewritten-with-standalone-window--mime-type-registration">Notepad Rewritten with Standalone Window &amp; Mime-Type Registration<a href="https://duxlabs.dev/blog/v1-5-release#notepad-rewritten-with-standalone-window--mime-type-registration" class="hash-link" aria-label="Direct link to Notepad Rewritten with Standalone Window &amp; Mime-Type Registration" title="Direct link to Notepad Rewritten with Standalone Window &amp; Mime-Type Registration" translate="no">​</a></h2>
<figure style="text-align:center"><img src="https://duxlabs.dev/img/blog/v1.5/notepad_light.png" alt="The redesigned Notepad as a standalone window" class="themedComponent_mlkZ themedComponent--light_NVdE" style="max-width:700px;width:100%"><img src="https://duxlabs.dev/img/blog/v1.5/notepad_dark.png" alt="The redesigned Notepad as a standalone window" class="themedComponent_mlkZ themedComponent--dark_xIcU" style="max-width:700px;width:100%"><figcaption>Notepad can now convert into a standalone window and back to a surface.</figcaption></figure>
<p>The Notepad utility has been rewritten with the ability to convert it into a standalone window and back to a surface. Additionally mime-type registration has been added so DMS Notepad can be (optionally) used as a default text editor for files.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="native-tailscale-integration">Native Tailscale Integration<a href="https://duxlabs.dev/blog/v1-5-release#native-tailscale-integration" class="hash-link" aria-label="Direct link to Native Tailscale Integration" title="Direct link to Native Tailscale Integration" translate="no">​</a></h2>
<figure style="text-align:center"><img src="https://duxlabs.dev/img/blog/v1.5/tailscale_light.png" alt="Tailscale status and device controls in the Control Center" class="themedComponent_mlkZ themedComponent--light_NVdE" style="max-width:500px;width:100%"><img src="https://duxlabs.dev/img/blog/v1.5/tailscale_dark.png" alt="Tailscale status and device controls in the Control Center" class="themedComponent_mlkZ themedComponent--dark_xIcU" style="max-width:500px;width:100%"><figcaption>Tailscale connection status, device search, and controls in the Control Center.</figcaption></figure>
<p>DMS 1.5 adds native <strong>Tailscale</strong> support inside the Control Center. Instead of custom scripts or command-line wrappers, DMS talks directly to the local Tailscale daemon for full VPN controls.</p>
<ul>
<li class=""><strong>Connection Toggle:</strong> Connect or disconnect your tailnet from the Control Center.</li>
<li class=""><strong>Exit Node Selector:</strong> A dropdown lists the available exit nodes on your tailnet to route your traffic through.</li>
<li class=""><strong>LAN Access Toggle:</strong> Allow or disallow local network access when connected to an exit node, so you can still reach local devices.</li>
<li class=""><strong>Node Details:</strong> Shows your active Tailscale IP addresses (IPv4 and IPv6) and connection quality indicators.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="system-management">System Management<a href="https://duxlabs.dev/blog/v1-5-release#system-management" class="hash-link" aria-label="Direct link to System Management" title="Direct link to System Management" translate="no">​</a></h2>
<p>DMS 1.5 pulls more of the system into the shell, so you can manage updates, power, autostart, and default apps without leaving your desktop.</p>
<ul>
<li class=""><strong><a class="" href="https://duxlabs.dev/docs/dms/cli-system-updater">System Updater</a>:</strong> Check for and apply system updates from the shell, with multiple package-manager backends and polkit authentication for privileged operations.</li>
<li class=""><strong>Power Profiles:</strong> Switch between power-saver, balanced, and performance profiles from the Control Center or by scrolling the battery widget. A <code>cycleProfile</code> IPC command is bound to <code>Mod+P</code> by default.</li>
<li class=""><strong>XDG Autostart:</strong> A new Autostart tab in Settings manages the applications that launch at login, following the XDG autostart specification.</li>
<li class=""><strong>Default Apps:</strong> A Default Apps page in Settings sets your preferred applications for file types and URL schemes.</li>
<li class=""><strong>User Session Switching:</strong> Switch between local user sessions directly from the shell.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="plugin-ranking-moderation-and-community-feedback">Plugin Ranking, Moderation, and Community Feedback<a href="https://duxlabs.dev/blog/v1-5-release#plugin-ranking-moderation-and-community-feedback" class="hash-link" aria-label="Direct link to Plugin Ranking, Moderation, and Community Feedback" title="Direct link to Plugin Ranking, Moderation, and Community Feedback" translate="no">​</a></h2>
<p>With 230+ community plugins in the registry, DMS 1.5 introduces a ranking and feedback system so the best plugins rise to the top. Every plugin now has a tracking issue in the <a href="https://github.com/duxlabs-dev/dux-plugin-registry/issues" target="_blank" rel="noopener noreferrer" class="">dms-plugin-registry</a> that doubles as a forum and voting surface, and the <a href="https://plugins.danklinux.com/" target="_blank" rel="noopener noreferrer" class="">plugins directory</a> displays all of the new metadata affiliated with plugins.</p>
<ul>
<li class=""><strong>Upvotes:</strong> Anyone with a GitHub account can 👍 a plugin's issue to upvote it. The plugins page ranks by upvotes by default, so popular plugins surface first.</li>
<li class=""><strong>Sorting &amp; Filtering:</strong> Sort by upvotes, last updated, date added, name, or random, with an ascending/descending toggle, plus filters for reviewed-only and first-party-only plugins.</li>
<li class=""><strong>Status Badges:</strong> Plugins can be flagged <code>reviewed</code>, <code>broken</code>, <code>unmaintained</code>, or <code>deprecated</code>, surfaced as badges both on the web page and in the in-shell plugin browser.</li>
<li class=""><strong>Moderator &amp; Author Commands:</strong> Catalog moderators apply status flags via bot commands on the issue, and a plugin's own author can self-flag their plugin <code>/unmaintained</code> (seeking a new maintainer) or <code>/deprecated</code> (superseded by another plugin or a built-in DMS feature).</li>
</ul>
<p>Browse and vote on plugins at <strong><a href="https://plugins.danklinux.com/" target="_blank" rel="noopener noreferrer" class="">plugins.danklinux.com</a></strong>.</p>
<p><strong>Huge thanks to <a href="https://github.com/hthienloc" target="_blank" rel="noopener noreferrer" class="">hthienloc</a> for working through the existing plugin registry to review and significantly improve the quality of the plugin ecosystem!</strong></p>
<p>If you wish to contribute as a plugin moderator, refer to <a href="https://github.com/duxlabs-dev/dux-plugin-registry/issues/573" target="_blank" rel="noopener noreferrer" class="">this ticket</a> for details.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="other-notable-features">Other Notable Features<a href="https://duxlabs.dev/blog/v1-5-release#other-notable-features" class="hash-link" aria-label="Direct link to Other Notable Features" title="Direct link to Other Notable Features" translate="no">​</a></h2>
<p>DMS 1.5 also brings a wide array of enhancements and options across other components of the shell:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="launcher--clipboard">Launcher &amp; Clipboard<a href="https://duxlabs.dev/blog/v1-5-release#launcher--clipboard" class="hash-link" aria-label="Direct link to Launcher &amp; Clipboard" title="Direct link to Launcher &amp; Clipboard" translate="no">​</a></h3>
<ul>
<li class=""><strong>Plugin Browser Screenshot Previews:</strong> The plugin browser now displays inline screenshot previews while browsing, alongside brand new sorting and filtering controls.</li>
<li class=""><strong>Launcher QOL Improvements:</strong> Grid mode now supports <code>Ctrl+H/L</code> navigation (contributed by <strong><a href="https://github.com/kanghengliu" target="_blank" rel="noopener noreferrer" class="">kanghengliu</a></strong>, <a href="https://github.com/duxlabs-dev/dux-shell/pull/2688" target="_blank" rel="noopener noreferrer" class="">PR #2688</a>), toggleable color-picker entries (<strong><a href="https://github.com/lambdaclan" target="_blank" rel="noopener noreferrer" class="">lambdaclan</a></strong>, <a href="https://github.com/duxlabs-dev/dux-shell/pull/2667" target="_blank" rel="noopener noreferrer" class="">PR #2667</a>), and the option to hide package source badges (<strong><a href="https://github.com/hthienloc" target="_blank" rel="noopener noreferrer" class="">hthienloc</a></strong>, <a href="https://github.com/duxlabs-dev/dux-shell/pull/2676" target="_blank" rel="noopener noreferrer" class="">PR #2676</a>).</li>
<li class=""><strong>Clipboard Type Filtering:</strong> The clipboard history popout can now filter between Text, Image, and pinned entries, contributed by <strong><a href="https://github.com/dionjoshualobo" target="_blank" rel="noopener noreferrer" class="">dionjoshualobo</a></strong> (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2640" target="_blank" rel="noopener noreferrer" class="">PR #2640</a>).</li>
<li class=""><strong>Launcher History:</strong> The launcher keeps a history of recent entries (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2086" target="_blank" rel="noopener noreferrer" class="">PR #2086</a>).</li>
<li class=""><strong>Terminal Multiplexer Launcher:</strong> A launcher mode for opening and attaching to terminal multiplexer sessions (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1687" target="_blank" rel="noopener noreferrer" class="">PR #1687</a>).</li>
<li class=""><strong>Clipboard Editor &amp; Search:</strong> Edit saved clipboard entries and search or filter clipboard history (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2492" target="_blank" rel="noopener noreferrer" class="">PR #2492</a>, <a href="https://github.com/duxlabs-dev/dux-shell/pull/2464" target="_blank" rel="noopener noreferrer" class="">PR #2464</a>).</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="network--power">Network &amp; Power<a href="https://duxlabs.dev/blog/v1-5-release#network--power" class="hash-link" aria-label="Direct link to Network &amp; Power" title="Direct link to Network &amp; Power" translate="no">​</a></h3>
<ul>
<li class=""><strong>Secret Service Integration:</strong> Auto-retrieves and unlocks WiFi/VPN credentials directly from D-Bus Secret Service backends.</li>
<li class=""><strong>Saved Wi-Fi &amp; Progress:</strong> WiFi connection progress indicators (contributed by <strong><a href="https://github.com/NihilDigit" target="_blank" rel="noopener noreferrer" class="">NihilDigit</a></strong>, <a href="https://github.com/duxlabs-dev/dux-shell/pull/2684" target="_blank" rel="noopener noreferrer" class="">PR #2684</a>) and a dedicated saved-networks editor tab (contributed by <strong><a href="https://github.com/jbwfu" target="_blank" rel="noopener noreferrer" class="">jbwfu</a></strong>, <a href="https://github.com/duxlabs-dev/dux-shell/pull/2648" target="_blank" rel="noopener noreferrer" class="">PR #2648</a>) are now integrated, alongside a subtab network layout (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2633" target="_blank" rel="noopener noreferrer" class="">PR #2633</a>).</li>
<li class=""><strong>Network Link Rate Reporting:</strong> DMS now reports the negotiated link speed when connected, providing accurate bandwidth context rather than theoretical maximums.</li>
<li class=""><strong>Battery Settings Tab:</strong> A new battery management section in settings with toggles for remaining time, percentage display, and critical alerts was designed by <strong><a href="https://github.com/hthienloc" target="_blank" rel="noopener noreferrer" class="">hthienloc</a></strong> (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2634" target="_blank" rel="noopener noreferrer" class="">PR #2634</a>).</li>
<li class=""><strong>Battery Refresh Rate:</strong> Automatically lower display refresh rates on battery power to conserve energy, contributed by <strong><a href="https://github.com/atimofeev" target="_blank" rel="noopener noreferrer" class="">atimofeev</a></strong> (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2428" target="_blank" rel="noopener noreferrer" class="">PR #2428</a>).</li>
<li class=""><strong>Bluetooth Status:</strong> Added a visual bar indicator for connected Bluetooth devices, contributed by <strong><a href="https://github.com/yechielw" target="_blank" rel="noopener noreferrer" class="">yechielw</a></strong> (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2662" target="_blank" rel="noopener noreferrer" class="">PR #2662</a>).</li>
<li class=""><strong>Bluetooth Trust/Untrust:</strong> Control trusted status of Bluetooth devices directly from the Control Center.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="privacy--security">Privacy &amp; Security<a href="https://duxlabs.dev/blog/v1-5-release#privacy--security" class="hash-link" aria-label="Direct link to Privacy &amp; Security" title="Direct link to Privacy &amp; Security" translate="no">​</a></h3>
<ul>
<li class=""><strong>Screen Casting Detection on Niri:</strong> The privacy indicator now correctly detects active screen casting sessions on the Niri compositor via PipeWire (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2185" target="_blank" rel="noopener noreferrer" class="">PR #2185</a>).</li>
<li class=""><strong>Night Mode &amp; OSD Restoration:</strong> Night mode and OSD surfaces are now correctly restored after system resume from suspend (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2254" target="_blank" rel="noopener noreferrer" class="">PR #2254</a>).</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="lock-screen">Lock Screen<a href="https://duxlabs.dev/blog/v1-5-release#lock-screen" class="hash-link" aria-label="Direct link to Lock Screen" title="Direct link to Lock Screen" translate="no">​</a></h3>
<ul>
<li class=""><strong>Lock Screen IME Bypass:</strong> Implemented a direct keyboard layout and input method bypass for lock screen password fields, avoiding login failure due to layout mismatches (contributed by <strong><a href="https://github.com/awerty-noob" target="_blank" rel="noopener noreferrer" class="">awerty-noob</a></strong>, <a href="https://github.com/duxlabs-dev/dux-shell/pull/2609" target="_blank" rel="noopener noreferrer" class="">PR #2609</a>).</li>
<li class=""><strong>Lockout Feedback:</strong> Rather than showing generic errors, the lock screen now queries and displays explicit faillock lockout reasons, contributed by <strong><a href="https://github.com/Rocho-EL-Locho" target="_blank" rel="noopener noreferrer" class="">Rocho-EL-Locho</a></strong> (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2669" target="_blank" rel="noopener noreferrer" class="">PR #2669</a>).</li>
<li class=""><strong>Fingerprint/U2F Auth:</strong> Lock screen fingerprint and U2F authentication has been restored and hardened with timeout recovery and unlock-state sync (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2052" target="_blank" rel="noopener noreferrer" class="">PR #2052</a>).</li>
<li class=""><strong>Video Wallpapers:</strong> Support for video files as a screen-saving background when the lock screen activates.</li>
<li class=""><strong>Declarative NixOS Auto-Login:</strong> Added native support for configuring greeter auto-login declaratively within NixOS modules (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2734" target="_blank" rel="noopener noreferrer" class="">PR #2734</a>).</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="odds--ends">Odds &amp; Ends<a href="https://duxlabs.dev/blog/v1-5-release#odds--ends" class="hash-link" aria-label="Direct link to Odds &amp; Ends" title="Direct link to Odds &amp; Ends" translate="no">​</a></h3>
<p>A handful of smaller fixes and quality-of-life touches, several from the community:</p>
<ul>
<li class=""><strong>DankDash Drag-n-Drop:</strong> Rearrange dashboard tabs and widget layout, with visibility toggles in Settings.</li>
<li class=""><strong>System Tray Icon Tinting:</strong> Tint overrides keep tray icons consistent with your Material theme (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2266" target="_blank" rel="noopener noreferrer" class="">PR #2266</a>).</li>
<li class=""><strong>Animated GIF Profile Pictures:</strong> The user avatar now supports animated GIFs (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1804" target="_blank" rel="noopener noreferrer" class="">PR #1804</a>).</li>
<li class=""><strong>Tilde Expansion in Config Paths:</strong> <code>~</code> now expands in all user-provided file paths (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2242" target="_blank" rel="noopener noreferrer" class="">PR #2242</a>).</li>
<li class=""><strong><code>dms randr</code> Command:</strong> Query physical monitor scale factors without opening the display configurator.</li>
<li class=""><strong>Per-Screen Focus:</strong> The focused app widget tracks only the focused window on its own screen in multi-monitor setups (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2152" target="_blank" rel="noopener noreferrer" class="">PR #2152</a>).</li>
<li class=""><strong>Do Not Disturb &amp; Idle Inhibitor Indicators:</strong> New Control Center button indicators for do-not-disturb and idle-inhibitor state (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2513" target="_blank" rel="noopener noreferrer" class="">PR #2513</a>).</li>
<li class=""><strong>Microphone Volume OSD:</strong> An interactive microphone volume OSD with IPC controls (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2406" target="_blank" rel="noopener noreferrer" class="">PR #2406</a>).</li>
<li class=""><strong>Locale Hot-Reload:</strong> Change the shell locale and have it apply without a restart (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1817" target="_blank" rel="noopener noreferrer" class="">PR #1817</a>).</li>
<li class=""><strong>Neovim Theme Engine:</strong> A rebuilt Neovim theme engine for Matugen color sync (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1985" target="_blank" rel="noopener noreferrer" class="">PR #1985</a>).</li>
<li class=""><strong>GeoClue2 Location:</strong> Optional GeoClue2 location as an alternative to IP-based location (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1856" target="_blank" rel="noopener noreferrer" class="">PR #1856</a>).</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="headless-installation">Headless Installation<a href="https://duxlabs.dev/blog/v1-5-release#headless-installation" class="hash-link" aria-label="Direct link to Headless Installation" title="Direct link to Headless Installation" translate="no">​</a></h2>
<p>The <a class="" href="https://duxlabs.dev/docs/duxinstall"><code>dankinstall</code></a> installer can now run <strong>fully unattended</strong> - no TUI, scriptable for provisioning, dotfile bootstraps, and CI. Passing <code>--compositor</code> and <code>--term</code> switches it into headless mode:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#e4e4e7;--prism-background-color:#2e2a3d"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#e4e4e7;background-color:#2e2a3d"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#e4e4e7"><span class="token plain">dankinstall </span><span class="token parameter variable" style="color:#89ddff">--compositor</span><span class="token plain"> niri </span><span class="token parameter variable" style="color:#89ddff">--term</span><span class="token plain"> ghostty </span><span class="token parameter variable" style="color:#89ddff">--yes</span><br></div></code></pre></div></div>
<p>Choose <code>niri</code>, <code>hyprland</code>, or <code>mango</code> for the compositor and <code>ghostty</code>, <code>kitty</code>, or <code>alacritty</code> for the terminal. Additional flags give you control over the rest of the install: <code>--include-deps</code> / <code>--exclude-deps</code> to tune optional dependencies (like <code>dms-greeter</code>), <code>--replace-configs</code> (or <code>--replace-configs-all</code>) to deploy named configs, and <code>--yes</code> to auto-confirm every prompt. Install logs are written to <code>$DANKINSTALL_LOG</code> (falling back to <code>/var/tmp</code>) and streamed to stdout.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="available-distributions">Available Distributions<a href="https://duxlabs.dev/blog/v1-5-release#available-distributions" class="hash-link" aria-label="Direct link to Available Distributions" title="Direct link to Available Distributions" translate="no">​</a></h2>
<div class="distroMashup_XgTu"><div class="distroOrbit_m22F"><img src="https://duxlabs.dev/img/path32.svg" alt="DMS" class="distroCenterLogo_lkUT"><div class="distroLogo_OBco"><img src="https://duxlabs.dev/img/distros/arch.svg" alt="Arch Linux"></div><div class="distroLogo_OBco"><img src="https://duxlabs.dev/img/distros/fedora.svg" alt="Fedora"></div><div class="distroLogo_OBco"><img src="https://duxlabs.dev/img/distros/suse.svg" alt="openSUSE"></div><div class="distroLogo_OBco"><img src="https://duxlabs.dev/img/distros/debian.svg" alt="Debian"></div><div class="distroLogo_OBco"><img src="https://duxlabs.dev/img/distros/ubuntu.svg" alt="Ubuntu"></div><div class="distroLogo_OBco"><img src="https://duxlabs.dev/img/distros/CentOS_color_logo.svg" alt="CentOS"></div><div class="distroLogo_OBco"><img src="https://duxlabs.dev/img/distros/NixOS.svg" alt="NixOS"></div><div class="distroLogo_OBco"><img src="https://duxlabs.dev/img/gentoo-logo.svg" alt="Gentoo"></div><div class="distroLogo_OBco"><img src="https://duxlabs.dev/img/distros/void.svg" alt="Void Linux"></div></div></div>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>New Supported Distributions</div><div class="admonitionContent_BuS1"><p>DMS 1.5 officially adds support for <strong>Void Linux</strong> and introduces official compatibility with Ubuntu <strong>26.04 LTS</strong>.</p></div></div>
<p>See the <a class="" href="https://duxlabs.dev/docs/getting-started">installation guide</a> for setup instructions.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade-notes">Upgrade Notes<a href="https://duxlabs.dev/blog/v1-5-release#upgrade-notes" class="hash-link" aria-label="Direct link to Upgrade Notes" title="Direct link to Upgrade Notes" translate="no">​</a></h2>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>warning</div><div class="admonitionContent_BuS1"><p>This release contains changes that may require manual intervention.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-app-id-change">(Breaking) App ID Change<a href="https://duxlabs.dev/blog/v1-5-release#breaking-app-id-change" class="hash-link" aria-label="Direct link to (Breaking) App ID Change" title="Direct link to (Breaking) App ID Change" translate="no">​</a></h3>
<p>The DMS app ID is now <code>com.danklinux.dms</code>. If you have compositor window rules targeting the old app ID, you'll need to update them to the new ID.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="quickshell-030-required">Quickshell 0.3.0+ Required<a href="https://duxlabs.dev/blog/v1-5-release#quickshell-030-required" class="hash-link" aria-label="Direct link to Quickshell 0.3.0+ Required" title="Direct link to Quickshell 0.3.0+ Required" translate="no">​</a></h3>
<p>DMS 1.5 requires Quickshell 0.3.0 or newer; support for 0.2 has been dropped. If you install via the Dank Linux repositories or <code>dankinstall</code>, this is handled for you - otherwise update Quickshell before upgrading DMS.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bug-fixes-and-improvements">Bug Fixes and Improvements<a href="https://duxlabs.dev/blog/v1-5-release#bug-fixes-and-improvements" class="hash-link" aria-label="Direct link to Bug Fixes and Improvements" title="Direct link to Bug Fixes and Improvements" translate="no">​</a></h2>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>View Details (309 fixes in v1.4.6..v1.5.0)</summary><div><div class="collapsibleContent_i85q"><ul>
<li class="">Add complete bundled PAM services (contributed by <strong><a href="https://github.com/awerty-noob" target="_blank" rel="noopener noreferrer" class="">awerty-noob</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2685" target="_blank" rel="noopener noreferrer" class="">PR #2685</a>).</li>
<li class="">Add match rule for new version of Gnome Calculator app ID (contributed by <strong><a href="https://github.com/CodeWithAlamin" target="_blank" rel="noopener noreferrer" class="">CodeWithAlamin</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2157" target="_blank" rel="noopener noreferrer" class="">PR #2157</a>).</li>
<li class="">Add middle mouse click to close running applications in vertical orientation (contributed by <strong><a href="https://github.com/kostiato" target="_blank" rel="noopener noreferrer" class="">kostiato</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2386" target="_blank" rel="noopener noreferrer" class="">PR #2386</a>).</li>
<li class="">Add missing qs.Common import (contributed by <strong><a href="https://github.com/cwelsys" target="_blank" rel="noopener noreferrer" class="">cwelsys</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/1926" target="_blank" rel="noopener noreferrer" class="">PR #1926</a>).</li>
<li class="">Add missing vertical anchor for cava/music icon (contributed by <strong><a href="https://github.com/kanghengliu" target="_blank" rel="noopener noreferrer" class="">kanghengliu</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2742" target="_blank" rel="noopener noreferrer" class="">PR #2742</a>).</li>
<li class="">Add newline at end of JSON file and output file (<code>1c0245f</code>).</li>
<li class="">Add TrayRecoveryService with bidirectional SNI dedup (Go server) (contributed by <strong><a href="https://github.com/Dimariqe" target="_blank" rel="noopener noreferrer" class="">Dimariqe</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2137" target="_blank" rel="noopener noreferrer" class="">PR #2137</a>).</li>
<li class="">Add window rule for the new version of Gnome Calculator (contributed by <strong><a href="https://github.com/CodeWithAlamin" target="_blank" rel="noopener noreferrer" class="">CodeWithAlamin</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2125" target="_blank" rel="noopener noreferrer" class="">PR #2125</a>).</li>
<li class="">Add wireplumber state directory &amp; update U2F env variables (<code>e86227f</code>).</li>
<li class="">Adjust the Popout/Control Center motion (<code>f2d5ee4</code>).</li>
<li class="">Align dimensions to whole pixels to avoid blurry rendering (contributed by <strong><a href="https://github.com/gbPagano" target="_blank" rel="noopener noreferrer" class="">gbPagano</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2494" target="_blank" rel="noopener noreferrer" class="">PR #2494</a>).</li>
<li class="">Allow duplicate history entry management w/unique IDs &amp; source tracking (<code>1bf66ee</code>).</li>
<li class="">Allow empty password submits to reach PAM (<code>ded2c38</code>).</li>
<li class="">Allow region capture over shell overlays (<code>7c2d5ce</code>).</li>
<li class="">Anchor cc and notification center to top and bottom (<code>9417eda</code>).</li>
<li class="">Animated Image warnings (<code>b8014fd</code>).</li>
<li class="">Apply appIdSubs to iconFrImage fallback path - Consistent with the appIcon PR changes in #1880 (<code>971a511</code>).</li>
<li class="">Apply file path substitutions in launcher icon resolution (contributed by <strong><a href="https://github.com/odtgit" target="_blank" rel="noopener noreferrer" class="">odtgit</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/1877" target="_blank" rel="noopener noreferrer" class="">PR #1877</a>).</li>
<li class="">Apply stored icon theme at startup (contributed by <strong><a href="https://github.com/lingdiansr" target="_blank" rel="noopener noreferrer" class="">lingdiansr</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2511" target="_blank" rel="noopener noreferrer" class="">PR #2511</a>).</li>
<li class="">Auto-rebuild font cache when configured fonts are missing (<code>8155970</code>).</li>
<li class="">Avoid event loop termination core: bump go to 1.26 (<code>46aaf5f</code>).</li>
<li class="">Avoid pinning auto-login session commands (<code>fdbbcaf</code>).</li>
<li class="">Avoid U2F PAM polling in OR mode (contributed by <strong><a href="https://github.com/Cloud0310" target="_blank" rel="noopener noreferrer" class="">Cloud0310</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2459" target="_blank" rel="noopener noreferrer" class="">PR #2459</a>).</li>
<li class="">Awk in new greeter (contributed by <strong><a href="https://github.com/ewtodd" target="_blank" rel="noopener noreferrer" class="">ewtodd</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2508" target="_blank" rel="noopener noreferrer" class="">PR #2508</a>).</li>
<li class="">Blur handling on the header layer to remain in sync - Fixes #2372 (<code>ee16047</code>).</li>
<li class="">Bucket WiFi signal for stable list order (contributed by <strong><a href="https://github.com/domenkozar" target="_blank" rel="noopener noreferrer" class="">domenkozar</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2449" target="_blank" rel="noopener noreferrer" class="">PR #2449</a>).</li>
<li class="">Bypass IME for password input (contributed by <strong><a href="https://github.com/awerty-noob" target="_blank" rel="noopener noreferrer" class="">awerty-noob</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2609" target="_blank" rel="noopener noreferrer" class="">PR #2609</a>).</li>
<li class="">Charging state binding loop (<code>fd65a8c</code>).</li>
<li class="">Clean up edge cases &amp; updated popout handling (<code>2026ba5</code>).</li>
<li class="">Clean up orphaned idle inhibitor processes on startup (contributed by <strong><a href="https://github.com/ksp-apoc" target="_blank" rel="noopener noreferrer" class="">ksp-apoc</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2324" target="_blank" rel="noopener noreferrer" class="">PR #2324</a>).</li>
<li class="">Clear blur region when the bar is hidden (auto-hide) (contributed by <strong><a href="https://github.com/Rocho-EL-Locho" target="_blank" rel="noopener noreferrer" class="">Rocho-EL-Locho</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2658" target="_blank" rel="noopener noreferrer" class="">PR #2658</a>).</li>
<li class="">Clipboard button widget alignment (<code>c425e35</code>).</li>
<li class="">Clipboard confirmation keyboard safety (contributed by <strong><a href="https://github.com/jbwfu" target="_blank" rel="noopener noreferrer" class="">jbwfu</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2623" target="_blank" rel="noopener noreferrer" class="">PR #2623</a>).</li>
<li class="">Clipboard pinned recents dedupe (contributed by <strong><a href="https://github.com/jbwfu" target="_blank" rel="noopener noreferrer" class="">jbwfu</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2605" target="_blank" rel="noopener noreferrer" class="">PR #2605</a>).</li>
<li class="">Clock off-center with single hour digit (contributed by <strong><a href="https://github.com/scottmckendry" target="_blank" rel="noopener noreferrer" class="">scottmckendry</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2745" target="_blank" rel="noopener noreferrer" class="">PR #2745</a>).</li>
<li class="">Close control center on lock and power actions (contributed by <strong><a href="https://github.com/jbwfu" target="_blank" rel="noopener noreferrer" class="">jbwfu</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2598" target="_blank" rel="noopener noreferrer" class="">PR #2598</a>).</li>
<li class="">Close notification center after clicking action buttons (contributed by <strong><a href="https://github.com/nficca" target="_blank" rel="noopener noreferrer" class="">nficca</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2276" target="_blank" rel="noopener noreferrer" class="">PR #2276</a>).</li>
<li class="">Coerce optional chain to bool in VolumeOSD enabled bindings (contributed by <strong><a href="https://github.com/GraemeF" target="_blank" rel="noopener noreferrer" class="">GraemeF</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2101" target="_blank" rel="noopener noreferrer" class="">PR #2101</a>).</li>
<li class="">Color handling w/animation transition (<code>69d7c1f</code>).</li>
<li class="">Correct Lua keybind writes (<code>3118e7b</code>).</li>
<li class="">Correct parameter name in Hyprland windowrule (no_initial_focus) (contributed by <strong><a href="https://github.com/beluch-dev" target="_blank" rel="noopener noreferrer" class="">beluch-dev</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/1726" target="_blank" rel="noopener noreferrer" class="">PR #1726</a>).</li>
<li class="">Correctly handle Sway named workspaces (<code>7178563</code>).</li>
<li class="">Cover edge cases of compact focused app widget (contributed by <strong><a href="https://github.com/marcinjahn" target="_blank" rel="noopener noreferrer" class="">marcinjahn</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/1918" target="_blank" rel="noopener noreferrer" class="">PR #1918</a>).</li>
<li class="">Dash and dankdash commands work without clock widget (contributed by <strong><a href="https://github.com/rochacbruno" target="_blank" rel="noopener noreferrer" class="">rochacbruno</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2392" target="_blank" rel="noopener noreferrer" class="">PR #2392</a>).</li>
<li class="">Decode path URI when saving/creating a file (contributed by <strong><a href="https://github.com/Silzinc" target="_blank" rel="noopener noreferrer" class="">Silzinc</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/1805" target="_blank" rel="noopener noreferrer" class="">PR #1805</a>).</li>
<li class="">Dedupe search index tab entries (contributed by <strong><a href="https://github.com/jbwfu" target="_blank" rel="noopener noreferrer" class="">jbwfu</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2643" target="_blank" rel="noopener noreferrer" class="">PR #2643</a>).</li>
<li class="">Defer DankCircularImage saving until the window is available (<code>2796c1c</code>).</li>
<li class="">Defer keyboard hold actions to key release (<code>a73380b</code>).</li>
<li class="">Detect screen casting on Niri (contributed by <strong><a href="https://github.com/tkroll-ionos" target="_blank" rel="noopener noreferrer" class="">tkroll-ionos</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2185" target="_blank" rel="noopener noreferrer" class="">PR #2185</a>).</li>
<li class="">Detect Zed Linux binary aliases (contributed by <strong><a href="https://github.com/nekwebdev" target="_blank" rel="noopener noreferrer" class="">nekwebdev</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/1982" target="_blank" rel="noopener noreferrer" class="">PR #1982</a>).</li>
<li class="">Dismiss fade-to-lock overlay when using a custom lock command (contributed by <strong><a href="https://github.com/Rocho-EL-Locho" target="_blank" rel="noopener noreferrer" class="">Rocho-EL-Locho</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2653" target="_blank" rel="noopener noreferrer" class="">PR #2653</a>).</li>
<li class="">Dismiss popup reliably on user-initiated close paths (contributed by <strong><a href="https://github.com/louzt" target="_blank" rel="noopener noreferrer" class="">louzt</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2761" target="_blank" rel="noopener noreferrer" class="">PR #2761</a>).</li>
<li class="">Display Configurator in Hyprland (contributed by <strong><a href="https://github.com/Stodtyy" target="_blank" rel="noopener noreferrer" class="">Stodtyy</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2506" target="_blank" rel="noopener noreferrer" class="">PR #2506</a>).</li>
<li class="">Dock flickering when having cursor floating by the side (contributed by <strong><a href="https://github.com/lakapple" target="_blank" rel="noopener noreferrer" class="">lakapple</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/1897" target="_blank" rel="noopener noreferrer" class="">PR #1897</a>).</li>
<li class="">Don't stop greeter immediately upon uninstallation (<code>baa956c</code>).</li>
<li class="">Don't treat DPMS off/on as a screen-reconnect recovery storm (contributed by <strong><a href="https://github.com/Rocho-EL-Locho" target="_blank" rel="noopener noreferrer" class="">Rocho-EL-Locho</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2654" target="_blank" rel="noopener noreferrer" class="">PR #2654</a>).</li>
<li class="">Dsearch references (<code>60118c5</code>).</li>
<li class="">Dup crash handlers (<code>95c4aa9</code>).</li>
<li class="">Enable overlay layer for for auth popups (<code>6c58367</code>).</li>
<li class="">Enhance column movement functions to focus on specified monitor (<code>a2513e9</code>).</li>
<li class="">Ensure blurRegion is cleared if BackgroundEffect exists (<code>cde0d83</code>).</li>
<li class="">Ensure OSD appears on all monitors after resume (contributed by <strong><a href="https://github.com/klesh" target="_blank" rel="noopener noreferrer" class="">klesh</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2453" target="_blank" rel="noopener noreferrer" class="">PR #2453</a>).</li>
<li class="">Ensure timeouts can never be 0 (<code>e78ba77</code>).</li>
<li class="">Epic RAM Growth - Closes #1920 (<code>7840294</code>).</li>
<li class="">Exclude niri from fullscreen toplevel detection (contributed by <strong><a href="https://github.com/cwelsys" target="_blank" rel="noopener noreferrer" class="">cwelsys</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2091" target="_blank" rel="noopener noreferrer" class="">PR #2091</a>).</li>
<li class="">Exclude virtual ether links and prune stale ones from networkd (contributed by <strong><a href="https://github.com/GraemeF" target="_blank" rel="noopener noreferrer" class="">GraemeF</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2505" target="_blank" rel="noopener noreferrer" class="">PR #2505</a>).</li>
<li class="">Exit saved filter when pinned entries are empty (contributed by <strong><a href="https://github.com/jbwfu" target="_blank" rel="noopener noreferrer" class="">jbwfu</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2604" target="_blank" rel="noopener noreferrer" class="">PR #2604</a>).</li>
<li class="">Expand tilde from config paths (contributed by <strong><a href="https://github.com/salah-walid" target="_blank" rel="noopener noreferrer" class="">salah-walid</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2242" target="_blank" rel="noopener noreferrer" class="">PR #2242</a>).</li>
<li class="">External management toggle &amp; partial monitor DPMS recovery (<code>4d0aab7</code>).</li>
<li class="">Fallback icon does not dim when not focused (contributed by <strong><a href="https://github.com/kanghengliu" target="_blank" rel="noopener noreferrer" class="">kanghengliu</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2063" target="_blank" rel="noopener noreferrer" class="">PR #2063</a>).</li>
<li class="">Fix accent colors in light mode fixes #2711 (<code>d1eb655</code>).</li>
<li class="">Fix action buttons hover cursor shape (contributed by <strong><a href="https://github.com/hthienloc" target="_blank" rel="noopener noreferrer" class="">hthienloc</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2744" target="_blank" rel="noopener noreferrer" class="">PR #2744</a>).</li>
<li class="">Fix animation speed binding in notifications tab fixes #1974 (<code>d445d18</code>).</li>
<li class="">Fix blur (<code>5adc0c4</code>).</li>
<li class="">Fix blur error message (<code>b117c80</code>).</li>
<li class="">Fix blur for goth corners in dankbar fixes #2666 (<code>85fa332</code>).</li>
<li class="">Fix blur on popout fixes #2288 (<code>8b79d1d</code>).</li>
<li class="">Fix charger plugged/unplugged sound playing while the battery is full (contributed by <strong><a href="https://github.com/IrisHormoviti" target="_blank" rel="noopener noreferrer" class="">IrisHormoviti</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/1859" target="_blank" rel="noopener noreferrer" class="">PR #1859</a>).</li>
<li class="">Fix check scheduling - deadline-based, fixes the issue before that would reset the interval   without accounting for prior time waited (<code>73f3a72</code>).</li>
<li class="">Fix clock index hardcoded at tab 0 (<code>cc0bec2</code>).</li>
<li class="">Fix codec parsing names (<code>7c991bc</code>).</li>
<li class="">Fix context menu overflow fixes #2287 (<code>3bb3da2</code>).</li>
<li class="">Fix context menu styling fixes #1742 (<code>77889ce</code>).</li>
<li class="">Fix custom lock commands with lock before suspend and hibernate fixes #2326 (<code>4c43bed</code>).</li>
<li class="">Fix cycle output, improve icon resolution for sink fixes #1808 (<code>05eaf59</code>).</li>
<li class="">Fix DankDash Wallpaper call (<code>46d4288</code>).</li>
<li class="">Fix dbar autohide w/xray blur (<code>5594ec2</code>).</li>
<li class="">Fix ddc brightness not applying because process exits before debounce timer runs (contributed by <strong><a href="https://github.com/DavutHaxor" target="_blank" rel="noopener noreferrer" class="">DavutHaxor</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2217" target="_blank" rel="noopener noreferrer" class="">PR #2217</a>).</li>
<li class="">Fix Debian ARM64 detection (<code>d219d3b</code>).</li>
<li class="">Fix dev flake for go 1.25 and ashellchheck (<code>526e242</code>).</li>
<li class="">Fix display of named workspace + icon set on vertical bars fixes #2067 (<code>3253adb</code>).</li>
<li class="">Fix DMS binding to ext-workspace-v1 even when we don't use it (<code>2fc3b8e</code>).</li>
<li class="">Fix dms-git Go versioning to restore builds (<code>95c66b4</code>).</li>
<li class="">Fix dock visible when theres no app (contributed by <strong><a href="https://github.com/lakapple" target="_blank" rel="noopener noreferrer" class="">lakapple</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/1797" target="_blank" rel="noopener noreferrer" class="">PR #1797</a>).</li>
<li class="">Fix editing in popout (<code>12a744e</code>).</li>
<li class="">Fix emacs template constant line number size (contributed by <strong><a href="https://github.com/zgibberish" target="_blank" rel="noopener noreferrer" class="">zgibberish</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2317" target="_blank" rel="noopener noreferrer" class="">PR #2317</a>).</li>
<li class="">Fix escape in keybinds modal (<code>8e4a63d</code>).</li>
<li class="">Fix excessive network prompting on failures, add VPN connection statuses (<code>28f40af</code>).</li>
<li class="">Fix fallback temporarily (<code>b9e9da5</code>).</li>
<li class="">Fix fatal error handling when the socket becomes unavailable (<code>6e508d4</code>).</li>
<li class="">Fix files tab actions fixes #2357 (<code>d8835f2</code>).</li>
<li class="">Fix flaky test (<code>7a566e1</code>).</li>
<li class="">Fix focus regression on close (<code>21ddc3c</code>).</li>
<li class="">Fix focused app when switching to empty workspace (contributed by <strong><a href="https://github.com/salah-walid" target="_blank" rel="noopener noreferrer" class="">salah-walid</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2259" target="_blank" rel="noopener noreferrer" class="">PR #2259</a>).</li>
<li class="">Fix focusing of password prompts when popout is open undesired effect of closing the popout but its probably the best solution (<code>9578d6d</code>).</li>
<li class="">Fix frecency ranking in search results fixes #1799 (<code>6ee419b</code>).</li>
<li class="">Fix fullscreen-detection race during cross-monitor focus moves (contributed by <strong><a href="https://github.com/joshsymonds" target="_blank" rel="noopener noreferrer" class="">joshsymonds</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2373" target="_blank" rel="noopener noreferrer" class="">PR #2373</a>).</li>
<li class="">Fix gentoo parsing and use guru overlays for DMS/dgop (<code>7143853</code>).</li>
<li class="">Fix geoclue IP fallback (<code>3600e03</code>).</li>
<li class="">Fix GitHub issue labels (<code>401b409</code>).</li>
<li class="">Fix go regex matching (<code>04555db</code>).</li>
<li class="">Fix Go versioning on dms-git builds (<code>e931829</code>).</li>
<li class="">Fix greeter loading priority (contributed by <strong><a href="https://github.com/ramblingenzyme" target="_blank" rel="noopener noreferrer" class="">ramblingenzyme</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2341" target="_blank" rel="noopener noreferrer" class="">PR #2341</a>).</li>
<li class="">Fix gtk3 checkboxes in light mode fixes #1555 (<code>8f10096</code>).</li>
<li class="">Fix hardcoded branch in vendor workflow (<code>aad7011</code>).</li>
<li class="">Fix hardcoded font weight to use configured value fixes #2076 (<code>8e71264</code>).</li>
<li class="">Fix hide device not working (<code>6ceb1b1</code>).</li>
<li class="">Fix hiding index numbers on sway fixes #2768 (<code>6f298d3</code>).</li>
<li class="">Fix html elements get parsed in clipboard entry (contributed by <strong><a href="https://github.com/lakapple" target="_blank" rel="noopener noreferrer" class="">lakapple</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/1798" target="_blank" rel="noopener noreferrer" class="">PR #1798</a>).</li>
<li class="">Fix hyprland focus on context menu fixes #2714 (<code>1611181</code>).</li>
<li class="">Fix hyprland focus window (contributed by <strong><a href="https://github.com/arfan21" target="_blank" rel="noopener noreferrer" class="">arfan21</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2426" target="_blank" rel="noopener noreferrer" class="">PR #2426</a>).</li>
<li class="">Fix Hyprland Lua dispatch helpers (contributed by <strong><a href="https://github.com/kevichi7" target="_blank" rel="noopener noreferrer" class="">kevichi7</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2443" target="_blank" rel="noopener noreferrer" class="">PR #2443</a>).</li>
<li class="">Fix Hyprland scrolling overview geometry (contributed by <strong><a href="https://github.com/kevichi7" target="_blank" rel="noopener noreferrer" class="">kevichi7</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2442" target="_blank" rel="noopener noreferrer" class="">PR #2442</a>).</li>
<li class="">Fix idle monitors firing when bar isnt visible + keep awake is active fixes #2698 (<code>ae52062</code>).</li>
<li class="">Fix imageformats detection (contributed by <strong><a href="https://github.com/LuckShiba" target="_blank" rel="noopener noreferrer" class="">LuckShiba</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/1811" target="_blank" rel="noopener noreferrer" class="">PR #1811</a>).</li>
<li class="">Fix inconsistent transparency (<code>8ef1d95</code>).</li>
<li class="">Fix inconsistent transparency fixes #2330 (<code>50f0cbb</code>).</li>
<li class="">Fix index conflict on battery tab (<code>9a4cff4</code>).</li>
<li class="">Fix index/pre-commit (<code>bed6622</code>).</li>
<li class="">Fix invalid number displays on percentages fixes #2010 (<code>28c9bb0</code>).</li>
<li class="">Fix kb navigation not always showing last delegate in view (<code>48a566a</code>).</li>
<li class="">Fix launcher button color override fixes #2530 (<code>dfe309a</code>).</li>
<li class="">Fix Light/Dark mode portal sync (<code>65516e8</code>).</li>
<li class="">Fix list delegates (<code>ebc77b6</code>).</li>
<li class="">Fix list gaps and overlap when searching (contributed by <strong><a href="https://github.com/Bodify" target="_blank" rel="noopener noreferrer" class="">Bodify</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2315" target="_blank" rel="noopener noreferrer" class="">PR #2315</a>).</li>
<li class="">Fix locale override persisting even when not explicitly set (<code>fbc1ff6</code>).</li>
<li class="">Fix location search with han characters fixes #2274 (<code>518cc93</code>).</li>
<li class="">Fix lua parsing on Hyprland for non-static configuration fixes #2753 (<code>36ad34a</code>).</li>
<li class="">Fix memory leak from unbounded offer maps and unguarded file reads (<code>babc8fe</code>).</li>
<li class="">Fix menu overlays (<code>c76e29c</code>).</li>
<li class="">Fix missing import (<code>da3df9b</code>).</li>
<li class="">Fix modal escape key handling in connected mode fixes #2566 (<code>e5fff91</code>).</li>
<li class="">Fix moddedAppID consistency (<code>fb66eff</code>).</li>
<li class="">Fix mouse area to edges fixes #2108 (<code>fb02f72</code>).</li>
<li class="">Fix mouse wheel keysims on Hyprland and Mango fixes #2683 (<code>0e7901e</code>).</li>
<li class="">Fix multi-monitor cycling not working (contributed by <strong><a href="https://github.com/beckend" target="_blank" rel="noopener noreferrer" class="">beckend</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2042" target="_blank" rel="noopener noreferrer" class="">PR #2042</a>).</li>
<li class="">Fix named workspace icons (<code>414d81a</code>).</li>
<li class="">Fix named workspaces hiding from widget fixes #2047 (<code>31efe9b</code>).</li>
<li class="">Fix new session hint fixes #2556 (<code>2723022</code>).</li>
<li class="">Fix night mode and OSD recovery after suspend/resume (contributed by <strong><a href="https://github.com/kristijanribaric" target="_blank" rel="noopener noreferrer" class="">kristijanribaric</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2254" target="_blank" rel="noopener noreferrer" class="">PR #2254</a>).</li>
<li class="">Fix occupied color in niri fixes #2538 (<code>09ca37c</code>).</li>
<li class="">Fix opening popouts across monitors cc/brightness: fix delegate bindings and pinning (<code>cdc1102</code>).</li>
<li class="">Fix output config on delete &amp; popup height (<code>51f6f37</code>).</li>
<li class="">Fix plugin browser parentWindow and add similar support (<code>016527f</code>).</li>
<li class="">Fix plugin reloading in bar position changes (<code>3d35af2</code>).</li>
<li class="">Fix positioning with multiple bars fixes #2387 (<code>b192b5f</code>).</li>
<li class="">Fix premature exit of file search fixes #1749 (<code>db8ebd6</code>).</li>
<li class="">Fix quickshell regex fixes #2204 (<code>f61438e</code>).</li>
<li class="">Fix quote preservation (<code>2f445c5</code>).</li>
<li class="">Fix regression eliding button group text caused by recently RTL fixes fixes #2741 (<code>8cb4e21</code>).</li>
<li class="">Fix reliability of modal/popout (<code>0b88055</code>).</li>
<li class="">Fix scaling of global coordinate space when using all screens (<code>28f9aab</code>).</li>
<li class="">Fix screensaver inhibit interfering with manually triggered inhibitor (<code>2861cc8</code>).</li>
<li class="">Fix scrolling to use ID instead of Index fixes #2212 (<code>79fe956</code>).</li>
<li class="">Fix semvar signal moved to different service (<code>c1cbd09</code>).</li>
<li class="">Fix setting color mode when no wallpaper is set in auto mode fixes #2239 (<code>d766c07</code>).</li>
<li class="">Fix settings focus loss (<code>d8cf1af</code>).</li>
<li class="">Fix shellcheck (<code>85b00d3</code>).</li>
<li class="">Fix single user artifact (<code>d1f833f</code>).</li>
<li class="">Fix some defaults in reset (<code>e536456</code>).</li>
<li class="">Fix startup warning (<code>a6ba4b1</code>).</li>
<li class="">Fix sub-modals and power menu keyboard focus in connected mode fixes #2346 (<code>cc47703</code>).</li>
<li class="">Fix syncing settings to new bars (<code>1f26092</code>).</li>
<li class="">Fix syncWallpaperForCurrentMode (<code>521a3fa</code>).</li>
<li class="">Fix text truncation in some section of settings and update icons (contributed by <strong><a href="https://github.com/Youseffo13" target="_blank" rel="noopener noreferrer" class="">Youseffo13</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2618" target="_blank" rel="noopener noreferrer" class="">PR #2618</a>).</li>
<li class="">Fix texture sizing during animation (<code>a874f76</code>).</li>
<li class="">Fix thumbnail load &amp; modal bottom margin (<code>cf4c4b7</code>).</li>
<li class="">Fix tls openvpn connection types related #1344 (<code>eedba0e</code>).</li>
<li class="">Fix tooltip position mapping (<code>29f19b0</code>).</li>
<li class="">Fix tooltip positioning (<code>df2ba3a</code>).</li>
<li class="">Fix transparency setting fixes #1739 (<code>5490731</code>).</li>
<li class="">Fix undefined icon warnings (<code>59fec88</code>).</li>
<li class="">Fix VPN UI for active transient entries (contributed by <strong><a href="https://github.com/louzt" target="_blank" rel="noopener noreferrer" class="">louzt</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2312" target="_blank" rel="noopener noreferrer" class="">PR #2312</a>).</li>
<li class="">Fix vscode text legibility on auto-complete menu fixes #2198 (<code>1c5965f</code>).</li>
<li class="">Fix weather location sync fixes #2303 (<code>e7bd8e4</code>).</li>
<li class="">Fix widget registration during visibility changes fixes #1956 (<code>70fa0ec</code>).</li>
<li class="">Fix widgets across different bar section fixes #1764s (<code>a0283b3</code>).</li>
<li class="">Fix words (<code>bdfd565</code>).</li>
<li class="">Fix(Clipboard) remove unused copyServe logic (<code>c984b0b</code>).</li>
<li class="">Fixed batterylevel shown zero in case of unknown state (contributed by <strong><a href="https://github.com/Tobi-maru" target="_blank" rel="noopener noreferrer" class="">Tobi-maru</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2436" target="_blank" rel="noopener noreferrer" class="">PR #2436</a>).</li>
<li class="">Fixed mux tab having same id as locale tab (contributed by <strong><a href="https://github.com/Youseffo13" target="_blank" rel="noopener noreferrer" class="">Youseffo13</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2031" target="_blank" rel="noopener noreferrer" class="">PR #2031</a>).</li>
<li class="">Fixes autohide + click through edge case (<code>7d1519f</code>).</li>
<li class="">Fixes for updatesEnable handling (<code>0a8c111</code>).</li>
<li class="">Follow symlinks when scanning wallpaper directory (contributed by <strong><a href="https://github.com/CaptainSpof" target="_blank" rel="noopener noreferrer" class="">CaptainSpof</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/1947" target="_blank" rel="noopener noreferrer" class="">PR #1947</a>).</li>
<li class="">Gate mango matugen and Cosmic config sync on active session (<code>aea5189</code>).</li>
<li class="">Guard missing fields in cheatsheet search filter (<code>5943186</code>).</li>
<li class="">Hide pin action while keeping saved indicator (contributed by <strong><a href="https://github.com/jbwfu" target="_blank" rel="noopener noreferrer" class="">jbwfu</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2626" target="_blank" rel="noopener noreferrer" class="">PR #2626</a>).</li>
<li class="">Honor $XDG_CONFIG_HOME for config paths (<code>6f387b0</code>).</li>
<li class="">Honor plugin ccDetailHeight for detail section sizing (contributed by <strong><a href="https://github.com/gbPagano" target="_blank" rel="noopener noreferrer" class="">gbPagano</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2559" target="_blank" rel="noopener noreferrer" class="">PR #2559</a>).</li>
<li class="">Honour _preScored for no-query when value exceeds typeBonus (contributed by <strong><a href="https://github.com/devnullvoid" target="_blank" rel="noopener noreferrer" class="">devnullvoid</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2065" target="_blank" rel="noopener noreferrer" class="">PR #2065</a>).</li>
<li class="">Hyprland import for scrolling workspace sync (<code>dd3eb71</code>).</li>
<li class="">Ignore keyboard shortcuts of disabled powermenu actions (contributed by <strong><a href="https://github.com/pathmann" target="_blank" rel="noopener noreferrer" class="">pathmann</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2580" target="_blank" rel="noopener noreferrer" class="">PR #2580</a>).</li>
<li class="">Improve cache management &amp; file handling (<code>583e46f</code>).</li>
<li class="">Improve clipping logic for connected chrome - Fixes #2397 (<code>c878ffb</code>).</li>
<li class="">Improve error handling for plugin settings loading (<code>7113afe</code>).</li>
<li class="">Improve menu position boundaries (<code>fefc0af</code>).</li>
<li class="">Improve save-to-file handling w/safety override diags (<code>1df7e47</code>).</li>
<li class="">Keep first item selected when navigating upward (contributed by <strong><a href="https://github.com/jbwfu" target="_blank" rel="noopener noreferrer" class="">jbwfu</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2622" target="_blank" rel="noopener noreferrer" class="">PR #2622</a>).</li>
<li class="">Keep Hyprland focus during close (contributed by <strong><a href="https://github.com/awerty-noob" target="_blank" rel="noopener noreferrer" class="">awerty-noob</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2655" target="_blank" rel="noopener noreferrer" class="">PR #2655</a>).</li>
<li class="">Keep Wi-Fi when password prompt is canceled (contributed by <strong><a href="https://github.com/jbwfu" target="_blank" rel="noopener noreferrer" class="">jbwfu</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2651" target="_blank" rel="noopener noreferrer" class="">PR #2651</a>).</li>
<li class="">Launcher launched via appdrawer doesnt respect size setting (contributed by <strong><a href="https://github.com/lakapple" target="_blank" rel="noopener noreferrer" class="">lakapple</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/1960" target="_blank" rel="noopener noreferrer" class="">PR #1960</a>).</li>
<li class="">Lua config for display setup writes (<code>4bfb08f</code>).</li>
<li class="">Make bluetoothBattery detection actually work (contributed by <strong><a href="https://github.com/CongLuanTran" target="_blank" rel="noopener noreferrer" class="">CongLuanTran</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2486" target="_blank" rel="noopener noreferrer" class="">PR #2486</a>).</li>
<li class="">Make desktop widget group delete button clickable (contributed by <strong><a href="https://github.com/jbwfu" target="_blank" rel="noopener noreferrer" class="">jbwfu</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2512" target="_blank" rel="noopener noreferrer" class="">PR #2512</a>).</li>
<li class="">Make matugen switch pywalfox dark/light mode (contributed by <strong><a href="https://github.com/miguelsaliba" target="_blank" rel="noopener noreferrer" class="">miguelsaliba</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2537" target="_blank" rel="noopener noreferrer" class="">PR #2537</a>).</li>
<li class="">Missing appID references (<code>8d0f256</code>).</li>
<li class="">Missing import in Hyprland service (<code>a58037b</code>).</li>
<li class="">Missing vpn confirm delete modal (contributed by <strong><a href="https://github.com/scottmckendry" target="_blank" rel="noopener noreferrer" class="">scottmckendry</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2759" target="_blank" rel="noopener noreferrer" class="">PR #2759</a>).</li>
<li class="">Multi-distro reliability updates - Merge duplicate niri input/output KDL nodes instead of appending. Allows more overrides - Guard AppArmor install/uninstall behind IsAppArmorEnabled() check (<code>acf63c5</code>).</li>
<li class="">Open Wi-Fi password modal upfront for enterprise networks (contributed by <strong><a href="https://github.com/domenkozar" target="_blank" rel="noopener noreferrer" class="">domenkozar</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2414" target="_blank" rel="noopener noreferrer" class="">PR #2414</a>).</li>
<li class="">Parse niri configs with leading-underscore identifiers (contributed by <strong><a href="https://github.com/Rocho-EL-Locho" target="_blank" rel="noopener noreferrer" class="">Rocho-EL-Locho</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2646" target="_blank" rel="noopener noreferrer" class="">PR #2646</a>).</li>
<li class="">Paste selected history entry (contributed by <strong><a href="https://github.com/jbwfu" target="_blank" rel="noopener noreferrer" class="">jbwfu</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2660" target="_blank" rel="noopener noreferrer" class="">PR #2660</a>).</li>
<li class="">Patch U2F PAM config with full Nix store path (contributed by <strong><a href="https://github.com/xPathin" target="_blank" rel="noopener noreferrer" class="">xPathin</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2071" target="_blank" rel="noopener noreferrer" class="">PR #2071</a>).</li>
<li class="">Play/pause icon flipped in MediaPlaybackOSD (contributed by <strong><a href="https://github.com/lakapple" target="_blank" rel="noopener noreferrer" class="">lakapple</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/1889" target="_blank" rel="noopener noreferrer" class="">PR #1889</a>).</li>
<li class="">Popout first-click and AUR package listing (contributed by <strong><a href="https://github.com/tkroll-ionos" target="_blank" rel="noopener noreferrer" class="">tkroll-ionos</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2183" target="_blank" rel="noopener noreferrer" class="">PR #2183</a>).</li>
<li class="">Prefer image MIME types over text fallbacks (contributed by <strong><a href="https://github.com/jbwfu" target="_blank" rel="noopener noreferrer" class="">jbwfu</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2551" target="_blank" rel="noopener noreferrer" class="">PR #2551</a>).</li>
<li class="">Preserve per-monitor cycling when changing interval (contributed by <strong><a href="https://github.com/nekwebdev" target="_blank" rel="noopener noreferrer" class="">nekwebdev</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/1981" target="_blank" rel="noopener noreferrer" class="">PR #1981</a>).</li>
<li class="">Prevent 100% CPU EOF spin loop by using temp file (contributed by <strong><a href="https://github.com/Angerion" target="_blank" rel="noopener noreferrer" class="">Angerion</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2471" target="_blank" rel="noopener noreferrer" class="">PR #2471</a>).</li>
<li class="">Prevent negative WaitGroup counter on rapid brightness changes (<code>cf0fa7d</code>).</li>
<li class="">Prevent security risk HTML in window titles from fetching remote URLs (<code>98844a3</code>).</li>
<li class="">Pywalfox template light theme colors (contributed by <strong><a href="https://github.com/Desdaemon" target="_blank" rel="noopener noreferrer" class="">Desdaemon</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2075" target="_blank" rel="noopener noreferrer" class="">PR #2075</a>).</li>
<li class="">Raise CLI IPC scanner limit for large entry payloads (contributed by <strong><a href="https://github.com/jbwfu" target="_blank" rel="noopener noreferrer" class="">jbwfu</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2550" target="_blank" rel="noopener noreferrer" class="">PR #2550</a>).</li>
<li class="">Record numpad keys as KP_* keysyms (contributed by <strong><a href="https://github.com/Rocho-EL-Locho" target="_blank" rel="noopener noreferrer" class="">Rocho-EL-Locho</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2645" target="_blank" rel="noopener noreferrer" class="">PR #2645</a>).</li>
<li class="">Redraw wallpaper after DMS lock screen is dismissed (contributed by <strong><a href="https://github.com/Dimariqe" target="_blank" rel="noopener noreferrer" class="">Dimariqe</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2037" target="_blank" rel="noopener noreferrer" class="">PR #2037</a>).</li>
<li class="">Redraw wallpaper layers when fill mode changes (contributed by <strong><a href="https://github.com/jbwfu" target="_blank" rel="noopener noreferrer" class="">jbwfu</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2542" target="_blank" rel="noopener noreferrer" class="">PR #2542</a>).</li>
<li class="">Refactor &amp; Fix Dock in FrameModes. Updates to Zone offset in Standalone &amp; Connected modes - Fixed hairline seam in some connected mode variants - Moved dock-related properties to a new DockGeometry component for a future base (<code>7f6486b</code>).</li>
<li class="">Refactor &amp; update hover tracking w/context menus (<code>c554d97</code>).</li>
<li class="">Reintroduce texture sizing during animation to prevent content shift (<code>32e2d96</code>).</li>
<li class="">Remove auto-login state resolution from first install configuration (<code>f5295fb</code>).</li>
<li class="">Remove recent duplicate IPC bindings (<code>b75453c</code>).</li>
<li class="">Repair crash introduced in Automatic configs PR (<code>3989c7f</code>).</li>
<li class="">Replace hardcoded max height mask in vertical mode (<code>be8326f</code>).</li>
<li class="">Resolve tray freeze and wallpaper loss after DPMS resume (contributed by <strong><a href="https://github.com/abcfy2" target="_blank" rel="noopener noreferrer" class="">abcfy2</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2457" target="_blank" rel="noopener noreferrer" class="">PR #2457</a>).</li>
<li class="">Resolve ui inconsistencies and missing i18n strings (contributed by <strong><a href="https://github.com/Youseffo13" target="_blank" rel="noopener noreferrer" class="">Youseffo13</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2719" target="_blank" rel="noopener noreferrer" class="">PR #2719</a>).</li>
<li class="">Respect Animation Duration setting for DankDropdown popups (contributed by <strong><a href="https://github.com/Rocho-EL-Locho" target="_blank" rel="noopener noreferrer" class="">Rocho-EL-Locho</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2661" target="_blank" rel="noopener noreferrer" class="">PR #2661</a>).</li>
<li class="">Respect legacy conf configs before migrating to lua (<code>81a1bb1</code>).</li>
<li class="">Respect niri mod-key when capturing binds (<code>b34941e</code>).</li>
<li class="">Restore Blur on Overview mode on niri (<code>368536f</code>).</li>
<li class="">Restore Darken Modal Background ops in Standalone mode (<code>80c853f</code>).</li>
<li class="">Restore jump windows (<code>cf641b4</code>).</li>
<li class="">Restore legacy remembered sessions by desktop id (<code>b0edccb</code>).</li>
<li class="">Restore lock screen U2F/fingerprint auth to working state (contributed by <strong><a href="https://github.com/xPathin" target="_blank" rel="noopener noreferrer" class="">xPathin</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2052" target="_blank" rel="noopener noreferrer" class="">PR #2052</a>).</li>
<li class="">Restore login config fallback (<code>185284d</code>).</li>
<li class="">Restore long message content from overflowing (<code>a44bef5</code>).</li>
<li class="">Restore system PAM fallback, faillock support, and auth feedback (<code>d5ceea8</code>).</li>
<li class="">Retain user dbar standalone configs while in framemode fullscreen (<code>6679458</code>).</li>
<li class="">Robust location resolution with parallel fetch and multi-tier fallback (contributed by <strong><a href="https://github.com/lingdiansr" target="_blank" rel="noopener noreferrer" class="">lingdiansr</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2638" target="_blank" rel="noopener noreferrer" class="">PR #2638</a>).</li>
<li class="">Select first file search result by default fixes #1967 (<code>25dce29</code>).</li>
<li class="">Select last query text on open; last-query persistence in connected frame mode (contributed by <strong><a href="https://github.com/Legend-017" target="_blank" rel="noopener noreferrer" class="">Legend-017</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2726" target="_blank" rel="noopener noreferrer" class="">PR #2726</a>).</li>
<li class="">Set default value for matugenTemplateNeovimSetBackground (contributed by <strong><a href="https://github.com/Silzinc" target="_blank" rel="noopener noreferrer" class="">Silzinc</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2081" target="_blank" rel="noopener noreferrer" class="">PR #2081</a>).</li>
<li class="">Set TextInput 'fontFamily' (contributed by <strong><a href="https://github.com/euletheia" target="_blank" rel="noopener noreferrer" class="">euletheia</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2399" target="_blank" rel="noopener noreferrer" class="">PR #2399</a>).</li>
<li class="">Show bar when scrolling away from fullscreen window (contributed by <strong><a href="https://github.com/kanghengliu" target="_blank" rel="noopener noreferrer" class="">kanghengliu</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2089" target="_blank" rel="noopener noreferrer" class="">PR #2089</a>).</li>
<li class="">Show percentage amount in titles &amp; performance improvements (<code>510269d</code>).</li>
<li class="">Show the faillock lockout reason instead of "incorrect password" (contributed by <strong><a href="https://github.com/Rocho-EL-Locho" target="_blank" rel="noopener noreferrer" class="">Rocho-EL-Locho</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2669" target="_blank" rel="noopener noreferrer" class="">PR #2669</a>).</li>
<li class="">Show WiFi connection progress (contributed by <strong><a href="https://github.com/NihilDigit" target="_blank" rel="noopener noreferrer" class="">NihilDigit</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2684" target="_blank" rel="noopener noreferrer" class="">PR #2684</a>).</li>
<li class="">Simplify model binding for filtered plugins (<code>a3ecef7</code>).</li>
<li class="">Simplify wallpaper rendering logic &amp; reliability (<code>bae98da</code>).</li>
<li class="">Size from PanelWindow.screen (contributed by <strong><a href="https://github.com/cwelsys" target="_blank" rel="noopener noreferrer" class="">cwelsys</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2582" target="_blank" rel="noopener noreferrer" class="">PR #2582</a>).</li>
<li class="">Skip invalid customThemeFile in preStart (contributed by <strong><a href="https://github.com/z1-0" target="_blank" rel="noopener noreferrer" class="">z1-0</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/1997" target="_blank" rel="noopener noreferrer" class="">PR #1997</a>).</li>
<li class="">Stabilize control center numeric widths (contributed by <strong><a href="https://github.com/0xdeafbeef" target="_blank" rel="noopener noreferrer" class="">0xdeafbeef</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/1943" target="_blank" rel="noopener noreferrer" class="">PR #1943</a>).</li>
<li class="">Stale image entry handling (<code>a34fda9</code>).</li>
<li class="">Startup tray scan to prevent duplicate icons on boot (contributed by <strong><a href="https://github.com/Dimariqe" target="_blank" rel="noopener noreferrer" class="">Dimariqe</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2225" target="_blank" rel="noopener noreferrer" class="">PR #2225</a>).</li>
<li class="">Support declarative greeter auto-login (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2734" target="_blank" rel="noopener noreferrer" class="">PR #2734</a>).</li>
<li class="">Support legacy QT 6.xx decoding &amp; large clipboard data (<code>a366bf3</code>).</li>
<li class="">Support localized settings search (contributed by <strong><a href="https://github.com/jbwfu" target="_blank" rel="noopener noreferrer" class="">jbwfu</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2521" target="_blank" rel="noopener noreferrer" class="">PR #2521</a>).</li>
<li class="">Surface Windows Rules Tab for Hyprland (<code>6991b45</code>).</li>
<li class="">UI polishes, uptime formatting, and missing i18n strings (contributed by <strong><a href="https://github.com/Youseffo13" target="_blank" rel="noopener noreferrer" class="">Youseffo13</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2686" target="_blank" rel="noopener noreferrer" class="">PR #2686</a>).</li>
<li class="">Unify compositor output profiles (<code>713ce5f</code>).</li>
<li class="">Unused imports removed (<code>4ecdba9</code>).</li>
<li class="">Update card registration logic to fix binded crash (<code>c7d44cf</code>).</li>
<li class="">Update codec selection and error handling (<code>c5c3105</code>).</li>
<li class="">Update config selection logic for PAM context (<code>9a5fa50</code>).</li>
<li class="">Update custom keyboard shortcut parsing properties (<code>33384e4</code>).</li>
<li class="">Update distro detection handling (<code>78f2ea4</code>).</li>
<li class="">Update distro detection logic for qmllint (<code>76c50a6</code>).</li>
<li class="">Update flexible image caching in DankCircularImage (<code>0509694</code>).</li>
<li class="">Update hairline seam in notification joined surface (<code>1cc9218</code>).</li>
<li class="">Update hasNotificationImage logic to support file paths (<code>b8fd52e</code>).</li>
<li class="">Update HTML rendering injections (<code>8bb3ee5</code>).</li>
<li class="">Update key mapping w/symbolic &amp; shifted fallback support (<code>da44e07</code>).</li>
<li class="">Update logic to hide the dbar/dock upon maximized windows/apps/games (<code>31e60a3</code>).</li>
<li class="">Update modal state management w/ownership Id (<code>1c01774</code>).</li>
<li class="">Update NixOS declarative configuration (<code>e423e17</code>).</li>
<li class="">Update resizeactive binding to include height to make it work (contributed by <strong><a href="https://github.com/CodeWithAlamin" target="_blank" rel="noopener noreferrer" class="">CodeWithAlamin</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2126" target="_blank" rel="noopener noreferrer" class="">PR #2126</a>).</li>
<li class="">Update rfkill to allow backend management (<code>7dffe85</code>).</li>
<li class="">Update Separate mode render to remove connected layer (<code>05c7a77</code>).</li>
<li class="">Update tabIndex reordering for media &amp; weather widgets (<code>590555d</code>).</li>
<li class="">Update the default audio sink device handling (<code>1724aed</code>).</li>
<li class="">Update the new clipboard/settings merge w/cache &amp; debouced refresh (<code>4845299</code>).</li>
<li class="">Update user cursor theme support (<code>74d2207</code>).</li>
<li class="">Use explicit mouse params in modal MouseArea handlers (<code>0bc8942</code>).</li>
<li class="">Use overlay layer in standalone mode (<code>e7221ec</code>).</li>
<li class="">Use primaryText instead of primary for text and icons displayed on primaryContainer background in the launcher (contributed by <strong><a href="https://github.com/Silzinc" target="_blank" rel="noopener noreferrer" class="">Silzinc</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2586" target="_blank" rel="noopener noreferrer" class="">PR #2586</a>).</li>
<li class="">Use single quotes for zed template paths (contributed by <strong><a href="https://github.com/Adarsh219" target="_blank" rel="noopener noreferrer" class="">Adarsh219</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/1972" target="_blank" rel="noopener noreferrer" class="">PR #1972</a>).</li>
<li class="">Use surfaceVariantText color for line numbers (<code>2fade1a</code>).</li>
<li class="">Use UnsetWorkspaceName to fix  empty input in workspace rename (contributed by <strong><a href="https://github.com/Tobi-maru" target="_blank" rel="noopener noreferrer" class="">Tobi-maru</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2094" target="_blank" rel="noopener noreferrer" class="">PR #2094</a>).</li>
<li class="">Wait for forked child to register Wayland source before returning (<code>62c6090</code>).</li>
<li class="">Wake monitors on input when powered off by lock (contributed by <strong><a href="https://github.com/nabaco" target="_blank" rel="noopener noreferrer" class="">nabaco</a></strong> <a href="https://github.com/duxlabs-dev/dux-shell/pull/2572" target="_blank" rel="noopener noreferrer" class="">PR #2572</a>).</li>
<li class="">Workflow dput &amp; SFTP (<code>1b9d1c6</code>).</li>
</ul></div></div></details>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="community-contributors">Community Contributors<a href="https://duxlabs.dev/blog/v1-5-release#community-contributors" class="hash-link" aria-label="Direct link to Community Contributors" title="Direct link to Community Contributors" translate="no">​</a></h2>
<p>DMS 1.5, and the hotfix series leading up to it, would not be possible without the contributions of the wider community. A huge thank you to everyone who opened a PR, filed a detailed issue, tested a fix, or helped translate the shell.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="quick-acknowledgements">Quick Acknowledgements<a href="https://duxlabs.dev/blog/v1-5-release#quick-acknowledgements" class="hash-link" aria-label="Direct link to Quick Acknowledgements" title="Direct link to Quick Acknowledgements" translate="no">​</a></h3>
<ul>
<li class="">
<p>Special thanks to our <strong>NixOS Maintainers</strong>, <strong>LuckShiba and EricDraven</strong>, for their numerous contributions to DMS overall and maintaining the NixOS Community!</p>
</li>
<li class="">
<p>If you were missed we're sorry! It's hard to keep track of everything sometimes, reach out on Discord or Github and we'll make sure to add you to the list.*</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="feature-contributors">Feature Contributors<a href="https://duxlabs.dev/blog/v1-5-release#feature-contributors" class="hash-link" aria-label="Direct link to Feature Contributors" title="Direct link to Feature Contributors" translate="no">​</a></h3>
<table><thead><tr><th>Contributor</th><th>Contribution</th></tr></thead><tbody><tr><td><strong><a href="https://github.com/0xdeafbeef" target="_blank" rel="noopener noreferrer" class="">0xdeafbeef</a></strong></td><td>Highlight active workspace app tiles (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1957" target="_blank" rel="noopener noreferrer" class="">PR #1957</a>)</td></tr><tr><td><strong><a href="https://github.com/Adarsh219" target="_blank" rel="noopener noreferrer" class="">Adarsh219</a></strong></td><td>Add Zed editor theming support (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1954" target="_blank" rel="noopener noreferrer" class="">PR #1954</a>)</td></tr><tr><td><strong><a href="https://github.com/andrhua" target="_blank" rel="noopener noreferrer" class="">andrhua</a></strong></td><td>Persist last active player (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2184" target="_blank" rel="noopener noreferrer" class="">PR #2184</a>)</td></tr><tr><td><strong><a href="https://github.com/arfan21" target="_blank" rel="noopener noreferrer" class="">arfan21</a></strong></td><td>Added Settings Tab Autostart App (XDG Autostart) (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2535" target="_blank" rel="noopener noreferrer" class="">PR #2535</a>)</td></tr><tr><td><strong><a href="https://github.com/arora-archit" target="_blank" rel="noopener noreferrer" class="">arora-archit</a></strong></td><td>Add icon tinting (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2266" target="_blank" rel="noopener noreferrer" class="">PR #2266</a>)</td></tr><tr><td><strong><a href="https://github.com/augustocdias" target="_blank" rel="noopener noreferrer" class="">augustocdias</a></strong></td><td>• Enable use of videos as screensaver in the lock screen (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1819" target="_blank" rel="noopener noreferrer" class="">PR #1819</a>)<br>• Add toggle to enable/disable auto connecting (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1925" target="_blank" rel="noopener noreferrer" class="">PR #1925</a>)<br>• Show notification only on current focused display (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1923" target="_blank" rel="noopener noreferrer" class="">PR #1923</a>)</td></tr><tr><td><strong><a href="https://github.com/b0o" target="_blank" rel="noopener noreferrer" class="">b0o</a></strong></td><td>• Add openColor IPC handler to set color on open (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2017" target="_blank" rel="noopener noreferrer" class="">PR #2017</a>)<br>• Separate workspace appearance for unfocused displays (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2687" target="_blank" rel="noopener noreferrer" class="">PR #2687</a>)</td></tr><tr><td><strong><a href="https://github.com/Bodify" target="_blank" rel="noopener noreferrer" class="">Bodify</a></strong></td><td>Add search/filter to saved clipboard entries &amp; animation states (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2464" target="_blank" rel="noopener noreferrer" class="">PR #2464</a>)</td></tr><tr><td><strong><a href="https://github.com/Bogdan-Torkhov" target="_blank" rel="noopener noreferrer" class="">Bogdan-Torkhov</a></strong></td><td>Updated dynamic width options for DiskUsage widget (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2517" target="_blank" rel="noopener noreferrer" class="">PR #2517</a>)</td></tr><tr><td><strong><a href="https://github.com/bogdan-velicu" target="_blank" rel="noopener noreferrer" class="">bogdan-velicu</a></strong></td><td>Add opt-in timeout progress bar on popups (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2587" target="_blank" rel="noopener noreferrer" class="">PR #2587</a>)</td></tr><tr><td><strong><a href="https://github.com/cwelsys" target="_blank" rel="noopener noreferrer" class="">cwelsys</a></strong></td><td>Add 'Hide When Fullscreen' opt-out toggles (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2349" target="_blank" rel="noopener noreferrer" class="">PR #2349</a>)</td></tr><tr><td><strong><a href="https://github.com/dionjoshualobo" target="_blank" rel="noopener noreferrer" class="">dionjoshualobo</a></strong></td><td>Add type filters to clipboard history (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2640" target="_blank" rel="noopener noreferrer" class="">PR #2640</a>)</td></tr><tr><td><strong><a href="https://github.com/DK0280705" target="_blank" rel="noopener noreferrer" class="">DK0280705</a></strong></td><td>Fix and implement display auto-switching with JSON profile storage (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2275" target="_blank" rel="noopener noreferrer" class="">PR #2275</a>)</td></tr><tr><td><strong><a href="https://github.com/domenkozar" target="_blank" rel="noopener noreferrer" class="">domenkozar</a></strong></td><td>Blink WiFi/Bluetooth icons while connecting (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2448" target="_blank" rel="noopener noreferrer" class="">PR #2448</a>)</td></tr><tr><td><strong><a href="https://github.com/dvjn" target="_blank" rel="noopener noreferrer" class="">dvjn</a></strong></td><td>• Add cycleProfile IPC command and default Mod+P keybind (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2411" target="_blank" rel="noopener noreferrer" class="">PR #2411</a>)<br>• Add Display Profiles builtin control center widget (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2410" target="_blank" rel="noopener noreferrer" class="">PR #2410</a>)</td></tr><tr><td><strong><a href="https://github.com/gbPagano" target="_blank" rel="noopener noreferrer" class="">gbPagano</a></strong></td><td>Add DiskUsage widget config overlay with showMountPath toggle and standardized tile sizing (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2507" target="_blank" rel="noopener noreferrer" class="">PR #2507</a>)</td></tr><tr><td><strong><a href="https://github.com/Gdetrane" target="_blank" rel="noopener noreferrer" class="">Gdetrane</a></strong></td><td>• Add manual printer by IP/hostname (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1868" target="_blank" rel="noopener noreferrer" class="">PR #1868</a>)<br>• Add Tailscale control center widget (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1875" target="_blank" rel="noopener noreferrer" class="">PR #1875</a>)</td></tr><tr><td><strong><a href="https://github.com/hthienloc" target="_blank" rel="noopener noreferrer" class="">hthienloc</a></strong></td><td>• Add expandable search bar to plugins settings tab (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2377" target="_blank" rel="noopener noreferrer" class="">PR #2377</a>)<br>• Consolidate plugin directory management into a single dynamic button (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2400" target="_blank" rel="noopener noreferrer" class="">PR #2400</a>)<br>• Implement interactive microphone volume OSD and IPC controls (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2406" target="_blank" rel="noopener noreferrer" class="">PR #2406</a>)<br>• Unify media controls dropdown interactions, hover behavior and cycle controls (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2470" target="_blank" rel="noopener noreferrer" class="">PR #2470</a>)<br>• Add native powerprofile target for power profiles management (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2515" target="_blank" rel="noopener noreferrer" class="">PR #2515</a>)<br>• Support scroll and right-click on audio output devices in media popout (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2615" target="_blank" rel="noopener noreferrer" class="">PR #2615</a>)<br>• Add battery settings tab and update battery widget interactions (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2634" target="_blank" rel="noopener noreferrer" class="">PR #2634</a>)<br>• Port critical battery alert from DankBatteryAlerts plugin (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2664" target="_blank" rel="noopener noreferrer" class="">PR #2664</a>)<br>• Add option to hide package source badges in launcher (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2676" target="_blank" rel="noopener noreferrer" class="">PR #2676</a>)<br>• Support configurable background color (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2671" target="_blank" rel="noopener noreferrer" class="">PR #2671</a>)<br>• Add options to toggle percentage and remaining time (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2672" target="_blank" rel="noopener noreferrer" class="">PR #2672</a>)<br>• Allow excluding specific media players by identity (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2712" target="_blank" rel="noopener noreferrer" class="">PR #2712</a>)<br>• Add update all CLI flag and settings updates dialog (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2682" target="_blank" rel="noopener noreferrer" class="">PR #2682</a>)</td></tr><tr><td><strong><a href="https://github.com/IrisHormoviti" target="_blank" rel="noopener noreferrer" class="">IrisHormoviti</a></strong></td><td>• Add login sound functionality and settings entry (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2155" target="_blank" rel="noopener noreferrer" class="">PR #2155</a>)<br>• Added Default Apps page to settings (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2416" target="_blank" rel="noopener noreferrer" class="">PR #2416</a>)</td></tr><tr><td><strong><a href="https://github.com/JamesFromFL" target="_blank" rel="noopener noreferrer" class="">JamesFromFL</a></strong></td><td>Add default app IPC actions (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2546" target="_blank" rel="noopener noreferrer" class="">PR #2546</a>)</td></tr><tr><td><strong><a href="https://github.com/jbwfu" target="_blank" rel="noopener noreferrer" class="">jbwfu</a></strong></td><td>• Add clipboard entry action visibility controls (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2621" target="_blank" rel="noopener noreferrer" class="">PR #2621</a>)<br>• Expose saved WiFi networks in settings (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2648" target="_blank" rel="noopener noreferrer" class="">PR #2648</a>)</td></tr><tr><td><strong><a href="https://github.com/kanghengliu" target="_blank" rel="noopener noreferrer" class="">kanghengliu</a></strong></td><td>• Animate dock apps on entry addition/deletion (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2064" target="_blank" rel="noopener noreferrer" class="">PR #2064</a>)<br>• Add FullscreenToplevel detection (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2069" target="_blank" rel="noopener noreferrer" class="">PR #2069</a>)<br>• FileBrowser video thumbnail (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2077" target="_blank" rel="noopener noreferrer" class="">PR #2077</a>)<br>• Expose accept keyboard focus to desktop widgets (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2285" target="_blank" rel="noopener noreferrer" class="">PR #2285</a>)<br>• Expose screen var to desktop plugins (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2300" target="_blank" rel="noopener noreferrer" class="">PR #2300</a>)</td></tr><tr><td><strong><a href="https://github.com/klesh" target="_blank" rel="noopener noreferrer" class="">klesh</a></strong></td><td>User-configurable font size for notification summary and body (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2461" target="_blank" rel="noopener noreferrer" class="">PR #2461</a>)</td></tr><tr><td><strong><a href="https://github.com/lakapple" target="_blank" rel="noopener noreferrer" class="">lakapple</a></strong></td><td>• Have selected item at dropdown beginning on launch (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1968" target="_blank" rel="noopener noreferrer" class="">PR #1968</a>)<br>• Add show week number option (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1990" target="_blank" rel="noopener noreferrer" class="">PR #1990</a>)<br>• Add launcher history (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2086" target="_blank" rel="noopener noreferrer" class="">PR #2086</a>)<br>• Add --raw flag (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2103" target="_blank" rel="noopener noreferrer" class="">PR #2103</a>)</td></tr><tr><td><strong><a href="https://github.com/lambdaclan" target="_blank" rel="noopener noreferrer" class="">lambdaclan</a></strong></td><td>Make dms color picker entry toggleable (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2667" target="_blank" rel="noopener noreferrer" class="">PR #2667</a>)</td></tr><tr><td><strong><a href="https://github.com/lichie567" target="_blank" rel="noopener noreferrer" class="">lichie567</a></strong></td><td>Improve content width calculation and add size options (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2444" target="_blank" rel="noopener noreferrer" class="">PR #2444</a>)</td></tr><tr><td><strong><a href="https://github.com/louzt" target="_blank" rel="noopener noreferrer" class="">louzt</a></strong></td><td>Expose scan/rescan/reload IPC handlers for runtime plugin discovery (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2611" target="_blank" rel="noopener noreferrer" class="">PR #2611</a>)</td></tr><tr><td><strong><a href="https://github.com/lpv11" target="_blank" rel="noopener noreferrer" class="">lpv11</a></strong></td><td>Add --no-confirm and --reset flags (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2059" target="_blank" rel="noopener noreferrer" class="">PR #2059</a>)</td></tr><tr><td><strong><a href="https://github.com/LuckShiba" target="_blank" rel="noopener noreferrer" class="">LuckShiba</a></strong></td><td>Improve context keyboard navigation and mode persistence (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2467" target="_blank" rel="noopener noreferrer" class="">PR #2467</a>)</td></tr><tr><td><strong><a href="https://github.com/merdely" target="_blank" rel="noopener noreferrer" class="">merdely</a></strong></td><td>Better keybinds (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2002" target="_blank" rel="noopener noreferrer" class="">PR #2002</a>)</td></tr><tr><td><strong><a href="https://github.com/mihem" target="_blank" rel="noopener noreferrer" class="">mihem</a></strong></td><td>Stronger active app highlight (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2190" target="_blank" rel="noopener noreferrer" class="">PR #2190</a>)</td></tr><tr><td><strong><a href="https://github.com/Mikilio" target="_blank" rel="noopener noreferrer" class="">Mikilio</a></strong></td><td>Retrieve WiFi/VPN secrets from D-Bus Secret Service with unlock support (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2402" target="_blank" rel="noopener noreferrer" class="">PR #2402</a>)</td></tr><tr><td><strong><a href="https://github.com/nemu626" target="_blank" rel="noopener noreferrer" class="">nemu626</a></strong></td><td>Show power rate (W) in DankBar battery widget. (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1814" target="_blank" rel="noopener noreferrer" class="">PR #1814</a>)</td></tr><tr><td><strong><a href="https://github.com/NikSneMC" target="_blank" rel="noopener noreferrer" class="">NikSneMC</a></strong></td><td>Add new includes for dms 1.4 (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1998" target="_blank" rel="noopener noreferrer" class="">PR #1998</a>)</td></tr><tr><td><strong><a href="https://github.com/odtgit" target="_blank" rel="noopener noreferrer" class="">odtgit</a></strong></td><td>Support file path substitutions for PWA icons (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1867" target="_blank" rel="noopener noreferrer" class="">PR #1867</a>)</td></tr><tr><td><strong><a href="https://github.com/philjackson" target="_blank" rel="noopener noreferrer" class="">philjackson</a></strong></td><td>Rewind to track start on previous when past 8 seconds (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2136" target="_blank" rel="noopener noreferrer" class="">PR #2136</a>)</td></tr><tr><td><strong><a href="https://github.com/Rocho-EL-Locho" target="_blank" rel="noopener noreferrer" class="">Rocho-EL-Locho</a></strong></td><td>• Add connect/disconnect, exit-node and LAN-access controls (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2644" target="_blank" rel="noopener noreferrer" class="">PR #2644</a>)<br>• Make muting sounds during media playback configurable (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2652" target="_blank" rel="noopener noreferrer" class="">PR #2652</a>)</td></tr><tr><td><strong><a href="https://github.com/rollecode" target="_blank" rel="noopener noreferrer" class="">rollecode</a></strong></td><td>Add optional monochrome icons setting (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2241" target="_blank" rel="noopener noreferrer" class="">PR #2241</a>)</td></tr><tr><td><strong><a href="https://github.com/ronharel02" target="_blank" rel="noopener noreferrer" class="">ronharel02</a></strong></td><td>• Add color picker to launcher (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1999" target="_blank" rel="noopener noreferrer" class="">PR #1999</a>)<br>• Add configurable control center group ordering (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2006" target="_blank" rel="noopener noreferrer" class="">PR #2006</a>)<br>• Add adaptive sizing for the media widget (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2165" target="_blank" rel="noopener noreferrer" class="">PR #2165</a>)<br>• Add optional inline expansion for system tray overflow (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2171" target="_blank" rel="noopener noreferrer" class="">PR #2171</a>)<br>• Improve media seekbar scrubbing feedback and wave preview behavior (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2181" target="_blank" rel="noopener noreferrer" class="">PR #2181</a>)</td></tr><tr><td><strong><a href="https://github.com/scottmckendry" target="_blank" rel="noopener noreferrer" class="">scottmckendry</a></strong></td><td>Lockscreen screen filter (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2740" target="_blank" rel="noopener noreferrer" class="">PR #2740</a>)</td></tr><tr><td><strong><a href="https://github.com/SHORiN-KiWATA" target="_blank" rel="noopener noreferrer" class="">SHORiN-KiWATA</a></strong></td><td>Allow CatOS to run DMS installer (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1768" target="_blank" rel="noopener noreferrer" class="">PR #1768</a>)</td></tr><tr><td><strong><a href="https://github.com/Silzinc" target="_blank" rel="noopener noreferrer" class="">Silzinc</a></strong></td><td>• Add support for animated gifs as profile pictures (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1804" target="_blank" rel="noopener noreferrer" class="">PR #1804</a>)<br>• Add setting to change and hotreload locale (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1817" target="_blank" rel="noopener noreferrer" class="">PR #1817</a>)<br>• Add setting for first day of the week (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1854" target="_blank" rel="noopener noreferrer" class="">PR #1854</a>)</td></tr><tr><td><strong><a href="https://github.com/TheSynt4x" target="_blank" rel="noopener noreferrer" class="">TheSynt4x</a></strong></td><td>• Improve icon resolution and align switcher fallback styling (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1823" target="_blank" rel="noopener noreferrer" class="">PR #1823</a>)<br>• Show memory widget in gb (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1825" target="_blank" rel="noopener noreferrer" class="">PR #1825</a>)<br>• Add more disk usage viewing options (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1833" target="_blank" rel="noopener noreferrer" class="">PR #1833</a>)</td></tr><tr><td><strong><a href="https://github.com/xPathin" target="_blank" rel="noopener noreferrer" class="">xPathin</a></strong></td><td>Add FIDO2/U2F security key support for lock screen (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1842" target="_blank" rel="noopener noreferrer" class="">PR #1842</a>)</td></tr><tr><td><strong><a href="https://github.com/yechielw" target="_blank" rel="noopener noreferrer" class="">yechielw</a></strong></td><td>Add visual indication for connected bluetooth (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2662" target="_blank" rel="noopener noreferrer" class="">PR #2662</a>)</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="general-contributions">General Contributions<a href="https://duxlabs.dev/blog/v1-5-release#general-contributions" class="hash-link" aria-label="Direct link to General Contributions" title="Direct link to General Contributions" translate="no">​</a></h3>
<table><thead><tr><th>Contributor</th><th>Contribution</th></tr></thead><tbody><tr><td><strong><a href="https://github.com/01micko" target="_blank" rel="noopener noreferrer" class="">01micko</a></strong></td><td>Update deprecated syntax (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1928" target="_blank" rel="noopener noreferrer" class="">PR #1928</a>)</td></tr><tr><td><strong><a href="https://github.com/0xdeafbeef" target="_blank" rel="noopener noreferrer" class="">0xdeafbeef</a></strong></td><td>Run qmllint through Quickshell tooling VFS (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1958" target="_blank" rel="noopener noreferrer" class="">PR #1958</a>)</td></tr><tr><td><strong><a href="https://github.com/aaronjamt" target="_blank" rel="noopener noreferrer" class="">aaronjamt</a></strong></td><td>Change power profile by scrolling battery (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2142" target="_blank" rel="noopener noreferrer" class="">PR #2142</a>)</td></tr><tr><td><strong><a href="https://github.com/adienox" target="_blank" rel="noopener noreferrer" class="">adienox</a></strong></td><td>Add lexical-binding to emacs theme (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2649" target="_blank" rel="noopener noreferrer" class="">PR #2649</a>)</td></tr><tr><td><strong><a href="https://github.com/amaanq" target="_blank" rel="noopener noreferrer" class="">amaanq</a></strong></td><td>• Let module callers supply pkgs so overlays reach the build (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2244" target="_blank" rel="noopener noreferrer" class="">PR #2244</a>)<br>• Expose <code>mkDmsShell</code> and <code>buildDmsPkgs</code> via lib output (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2409" target="_blank" rel="noopener noreferrer" class="">PR #2409</a>)</td></tr><tr><td><strong><a href="https://github.com/arora-archit" target="_blank" rel="noopener noreferrer" class="">arora-archit</a></strong></td><td>Generate theme for Vencord (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2320" target="_blank" rel="noopener noreferrer" class="">PR #2320</a>)</td></tr><tr><td><strong><a href="https://github.com/artrixdotdev" target="_blank" rel="noopener noreferrer" class="">artrixdotdev</a></strong></td><td>Add automatic overflow popup (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2629" target="_blank" rel="noopener noreferrer" class="">PR #2629</a>)</td></tr><tr><td><strong><a href="https://github.com/borisbabic" target="_blank" rel="noopener noreferrer" class="">borisbabic</a></strong></td><td>Support Hyprland lua dispatching (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2419" target="_blank" rel="noopener noreferrer" class="">PR #2419</a>)</td></tr><tr><td><strong><a href="https://github.com/corcoran" target="_blank" rel="noopener noreferrer" class="">corcoran</a></strong></td><td>Sort Dropdown's fuzzy search results by score and fix empty results on reopen (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2051" target="_blank" rel="noopener noreferrer" class="">PR #2051</a>)</td></tr><tr><td><strong><a href="https://github.com/cwelsys" target="_blank" rel="noopener noreferrer" class="">cwelsys</a></strong></td><td>• Add cups-pk-helper to recommended dependencies (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1670" target="_blank" rel="noopener noreferrer" class="">PR #1670</a>)<br>• Hide MPRIS players that have nothing to play (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2509" target="_blank" rel="noopener noreferrer" class="">PR #2509</a>)</td></tr><tr><td><strong><a href="https://github.com/dev-dev-dev-dev-dev-dev-dev-dev" target="_blank" rel="noopener noreferrer" class="">dev-dev-dev-dev-dev-dev-dev-dev</a></strong></td><td>• CpuBaseline text as "100%" to reserve enough width - previously "88%" (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2135" target="_blank" rel="noopener noreferrer" class="">PR #2135</a>)<br>• README.md - Update AUR badge to Arch (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2228" target="_blank" rel="noopener noreferrer" class="">PR #2228</a>)</td></tr><tr><td><strong><a href="https://github.com/euletheia" target="_blank" rel="noopener noreferrer" class="">euletheia</a></strong></td><td>Add DoNotDisturb &amp; IdleInhibitor Indicators for the ControlCenterButton widget + Add optional icon to KeyboardLayoutName widget (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2513" target="_blank" rel="noopener noreferrer" class="">PR #2513</a>)</td></tr><tr><td><strong><a href="https://github.com/EvernightFedora" target="_blank" rel="noopener noreferrer" class="">EvernightFedora</a></strong></td><td>Add support for 'evernight' distribution in Fedora (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1786" target="_blank" rel="noopener noreferrer" class="">PR #1786</a>)</td></tr><tr><td><strong><a href="https://github.com/ezemtsov" target="_blank" rel="noopener noreferrer" class="">ezemtsov</a></strong></td><td>• Handle recycled server object IDs for workspace/group handles (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1725" target="_blank" rel="noopener noreferrer" class="">PR #1725</a>)<br>• Support generic wlr-output-management-unstable-v1 (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1840" target="_blank" rel="noopener noreferrer" class="">PR #1840</a>)</td></tr><tr><td><strong><a href="https://github.com/goatnath" target="_blank" rel="noopener noreferrer" class="">goatnath</a></strong></td><td>Add local to-do planner / tasks to calendar overvie… (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2583" target="_blank" rel="noopener noreferrer" class="">PR #2583</a>)</td></tr><tr><td><strong><a href="https://github.com/GraemeF" target="_blank" rel="noopener noreferrer" class="">GraemeF</a></strong></td><td>Classify links by Type instead of name prefix (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2447" target="_blank" rel="noopener noreferrer" class="">PR #2447</a>)</td></tr><tr><td><strong><a href="https://github.com/greenm01" target="_blank" rel="noopener noreferrer" class="">greenm01</a></strong></td><td>Wait for location capability before requesting state (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2476" target="_blank" rel="noopener noreferrer" class="">PR #2476</a>)</td></tr><tr><td><strong><a href="https://github.com/hthienloc" target="_blank" rel="noopener noreferrer" class="">hthienloc</a></strong></td><td>• Sync toggle button between saved and recent tabs (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2407" target="_blank" rel="noopener noreferrer" class="">PR #2407</a>)<br>• Ensure plugin browser install button resizes correctly (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2431" target="_blank" rel="noopener noreferrer" class="">PR #2431</a>)<br>• Align status layout and add individual notification types (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2743" target="_blank" rel="noopener noreferrer" class="">PR #2743</a>)</td></tr><tr><td><strong><a href="https://github.com/ilkecan" target="_blank" rel="noopener noreferrer" class="">ilkecan</a></strong></td><td>Add <code>package</code> option for <code>dms-shell</code> (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1864" target="_blank" rel="noopener noreferrer" class="">PR #1864</a>)</td></tr><tr><td><strong><a href="https://github.com/jbwfu" target="_blank" rel="noopener noreferrer" class="">jbwfu</a></strong></td><td>• Split network page into subtabs (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2633" target="_blank" rel="noopener noreferrer" class="">PR #2633</a>)<br>• Enhance/clipboard history interactions (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2668" target="_blank" rel="noopener noreferrer" class="">PR #2668</a>)</td></tr><tr><td><strong><a href="https://github.com/jgreimann-ionos" target="_blank" rel="noopener noreferrer" class="">jgreimann-ionos</a></strong></td><td>SystemUpdate widget: show terminal in case of failures (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1845" target="_blank" rel="noopener noreferrer" class="">PR #1845</a>)</td></tr><tr><td><strong><a href="https://github.com/joshsymonds" target="_blank" rel="noopener noreferrer" class="">joshsymonds</a></strong></td><td>• Expose tertiary on the singleton (was undefined in dynamic mode) (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2375" target="_blank" rel="noopener noreferrer" class="">PR #2375</a>)<br>• Honor freedesktop suppress-sound hint (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2440" target="_blank" rel="noopener noreferrer" class="">PR #2440</a>)</td></tr><tr><td><strong><a href="https://github.com/joske" target="_blank" rel="noopener noreferrer" class="">joske</a></strong></td><td>Labwc service (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2248" target="_blank" rel="noopener noreferrer" class="">PR #2248</a>)</td></tr><tr><td><strong><a href="https://github.com/kanghengliu" target="_blank" rel="noopener noreferrer" class="">kanghengliu</a></strong></td><td>• Call context menu fallback for legacy protocol (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1839" target="_blank" rel="noopener noreferrer" class="">PR #1839</a>)<br>• Add keybind to switch tabs and toggle pinned (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2262" target="_blank" rel="noopener noreferrer" class="">PR #2262</a>)<br>• Add move workspace to monitor keybinds (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2268" target="_blank" rel="noopener noreferrer" class="">PR #2268</a>)<br>• Add trash bin button (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2277" target="_blank" rel="noopener noreferrer" class="">PR #2277</a>)<br>• Add ctrl+H/L navigation in grid mode (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2688" target="_blank" rel="noopener noreferrer" class="">PR #2688</a>)</td></tr><tr><td><strong><a href="https://github.com/khpark43" target="_blank" rel="noopener noreferrer" class="">khpark43</a></strong></td><td>Add missing XF86 key mappings (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2500" target="_blank" rel="noopener noreferrer" class="">PR #2500</a>)</td></tr><tr><td><strong><a href="https://github.com/lakapple" target="_blank" rel="noopener noreferrer" class="">lakapple</a></strong></td><td>• Improve image thumbnail (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1759" target="_blank" rel="noopener noreferrer" class="">PR #1759</a>)<br>• Parity(danktoggle): follow m3 disabled state color specs (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1973" target="_blank" rel="noopener noreferrer" class="">PR #1973</a>)</td></tr><tr><td><strong><a href="https://github.com/lpv11" target="_blank" rel="noopener noreferrer" class="">lpv11</a></strong></td><td>Restore Hyprland special workspace windows on click (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1924" target="_blank" rel="noopener noreferrer" class="">PR #1924</a>)</td></tr><tr><td><strong><a href="https://github.com/LuckShiba" target="_blank" rel="noopener noreferrer" class="">LuckShiba</a></strong></td><td>• Add more commands to detection (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1792" target="_blank" rel="noopener noreferrer" class="">PR #1792</a>)<br>• Update flake.lock (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1809" target="_blank" rel="noopener noreferrer" class="">PR #1809</a>)<br>• Update DankBar selection (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1894" target="_blank" rel="noopener noreferrer" class="">PR #1894</a>)<br>• Allow extra QT packages in dms-shell package (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1903" target="_blank" rel="noopener noreferrer" class="">PR #1903</a>)<br>• Update flake.lock (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2237" target="_blank" rel="noopener noreferrer" class="">PR #2237</a>)<br>• Add blur support (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2236" target="_blank" rel="noopener noreferrer" class="">PR #2236</a>)<br>• Update quickshell version (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2263" target="_blank" rel="noopener noreferrer" class="">PR #2263</a>)<br>• Add VM tests for flake modules (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2281" target="_blank" rel="noopener noreferrer" class="">PR #2281</a>)<br>• Use quickshell from nixpkgs-unstable pkgs (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2417" target="_blank" rel="noopener noreferrer" class="">PR #2417</a>)<br>• Add descriptions for DankBar -&gt; Settings menu (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2490" target="_blank" rel="noopener noreferrer" class="">PR #2490</a>)<br>• Remove keep-max-bpc-unchanged option (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2528" target="_blank" rel="noopener noreferrer" class="">PR #2528</a>)<br>• Add optional=true to niri configs (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2776" target="_blank" rel="noopener noreferrer" class="">PR #2776</a>)</td></tr><tr><td><strong><a href="https://github.com/marcusramberg" target="_blank" rel="noopener noreferrer" class="">marcusramberg</a></strong></td><td>Core(doctor): show all detected terminals (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2163" target="_blank" rel="noopener noreferrer" class="">PR #2163</a>)</td></tr><tr><td><strong><a href="https://github.com/merdely" target="_blank" rel="noopener noreferrer" class="">merdely</a></strong></td><td>• Not everyone uses paru or yay on Arch: Support pacman command (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1900" target="_blank" rel="noopener noreferrer" class="">PR #1900</a>)<br>• Implement ability to cycle through launcher modes (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2003" target="_blank" rel="noopener noreferrer" class="">PR #2003</a>)</td></tr><tr><td><strong><a href="https://github.com/Mikilio" target="_blank" rel="noopener noreferrer" class="">Mikilio</a></strong></td><td>Automatic Display Profiles Enhancement &amp; Disabled Output Support (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2367" target="_blank" rel="noopener noreferrer" class="">PR #2367</a>)</td></tr><tr><td><strong><a href="https://github.com/nick-linux8" target="_blank" rel="noopener noreferrer" class="">nick-linux8</a></strong></td><td>• Issue:(Settings)Switched Neovim Mutagen Theme To Default False (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1964" target="_blank" rel="noopener noreferrer" class="">PR #1964</a>)<br>• Compositor Pause Hardening (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1980" target="_blank" rel="noopener noreferrer" class="">PR #1980</a>)<br>• Change Greetd logic to pull accent color (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2000" target="_blank" rel="noopener noreferrer" class="">PR #2000</a>)</td></tr><tr><td><strong><a href="https://github.com/odtgit" target="_blank" rel="noopener noreferrer" class="">odtgit</a></strong></td><td>Centralize icon resolution into Paths.resolveIconPath/resolveIconUrl (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1880" target="_blank" rel="noopener noreferrer" class="">PR #1880</a>)</td></tr><tr><td><strong><a href="https://github.com/PandorasFox" target="_blank" rel="noopener noreferrer" class="">PandorasFox</a></strong></td><td>Shader-based scrolling wallpaper mode (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1802" target="_blank" rel="noopener noreferrer" class="">PR #1802</a>)</td></tr><tr><td><strong><a href="https://github.com/ParticleG" target="_blank" rel="noopener noreferrer" class="">ParticleG</a></strong></td><td>Add headless mode support with command-line flags (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2182" target="_blank" rel="noopener noreferrer" class="">PR #2182</a>)</td></tr><tr><td><strong><a href="https://github.com/rochacbruno" target="_blank" rel="noopener noreferrer" class="">rochacbruno</a></strong></td><td>• Add dms-plugin-dev agent skill (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2394" target="_blank" rel="noopener noreferrer" class="">PR #2394</a>)<br>• Skill(dms-plugin-dev): update for composite plugins, startupCheck, IPC discovery (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2699" target="_blank" rel="noopener noreferrer" class="">PR #2699</a>)</td></tr><tr><td><strong><a href="https://github.com/rPlakama" target="_blank" rel="noopener noreferrer" class="">rPlakama</a></strong></td><td>Pasterizing neovim. (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1828" target="_blank" rel="noopener noreferrer" class="">PR #1828</a>)</td></tr><tr><td><strong><a href="https://github.com/salah-walid" target="_blank" rel="noopener noreferrer" class="">salah-walid</a></strong></td><td>• Add terminal multiplexer launcher (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1687" target="_blank" rel="noopener noreferrer" class="">PR #1687</a>)<br>• Make focused app widget only show focused app on the current screen (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2152" target="_blank" rel="noopener noreferrer" class="">PR #2152</a>)</td></tr><tr><td><strong><a href="https://github.com/Silzinc" target="_blank" rel="noopener noreferrer" class="">Silzinc</a></strong></td><td>• Search keybinds fixes (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1748" target="_blank" rel="noopener noreferrer" class="">PR #1748</a>)<br>• Wifi QR code generation (requires testing) (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1794" target="_blank" rel="noopener noreferrer" class="">PR #1794</a>)<br>• New neovim theme engine (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1985" target="_blank" rel="noopener noreferrer" class="">PR #1985</a>)<br>• Neovim template enhancements (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2078" target="_blank" rel="noopener noreferrer" class="">PR #2078</a>)</td></tr><tr><td><strong><a href="https://github.com/SuNNjek" target="_blank" rel="noopener noreferrer" class="">SuNNjek</a></strong></td><td>Add GeoClue2 integration as alternative to IP location (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1856" target="_blank" rel="noopener noreferrer" class="">PR #1856</a>)</td></tr><tr><td><strong><a href="https://github.com/sunworms" target="_blank" rel="noopener noreferrer" class="">sunworms</a></strong></td><td>Added non-flake nix compatibility with flake-compat (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2009" target="_blank" rel="noopener noreferrer" class="">PR #2009</a>)</td></tr><tr><td><strong><a href="https://github.com/supposede" target="_blank" rel="noopener noreferrer" class="">supposede</a></strong></td><td>• Update toolbar button styles with primary color on Zen browser (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1879" target="_blank" rel="noopener noreferrer" class="">PR #1879</a>)<br>• Update color variables in zen-userchrome.css because it got broken again (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2246" target="_blank" rel="noopener noreferrer" class="">PR #2246</a>)</td></tr><tr><td><strong><a href="https://github.com/Tobi-maru" target="_blank" rel="noopener noreferrer" class="">Tobi-maru</a></strong></td><td>False error Fix (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2109" target="_blank" rel="noopener noreferrer" class="">PR #2109</a>)</td></tr><tr><td><strong><a href="https://github.com/tulilirockz" target="_blank" rel="noopener noreferrer" class="">tulilirockz</a></strong></td><td>Use satty screenshot tool as default (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2105" target="_blank" rel="noopener noreferrer" class="">PR #2105</a>)</td></tr><tr><td><strong><a href="https://github.com/xPathin" target="_blank" rel="noopener noreferrer" class="">xPathin</a></strong></td><td>Emit ActiveChanged on lock/unlock (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1761" target="_blank" rel="noopener noreferrer" class="">PR #1761</a>)</td></tr><tr><td><strong><a href="https://github.com/Youseffo13" target="_blank" rel="noopener noreferrer" class="">Youseffo13</a></strong></td><td>• Added Missing i18n strings (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1729" target="_blank" rel="noopener noreferrer" class="">PR #1729</a>)<br>• Added missing i18n strings and changed reset button (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1746" target="_blank" rel="noopener noreferrer" class="">PR #1746</a>)<br>• Added plural support (<a href="https://github.com/duxlabs-dev/dux-shell/pull/1750" target="_blank" rel="noopener noreferrer" class="">PR #1750</a>)<br>• Wrapped all missing i18n strings (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2013" target="_blank" rel="noopener noreferrer" class="">PR #2013</a>)<br>• Added Missing i18n Strings (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2398" target="_blank" rel="noopener noreferrer" class="">PR #2398</a>)<br>• Add context to font weight keys, wrap render settings, fix uptime prefix (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2529" target="_blank" rel="noopener noreferrer" class="">PR #2529</a>)<br>• Revamp of 25% pill option (<a href="https://github.com/duxlabs-dev/dux-shell/pull/2568" target="_blank" rel="noopener noreferrer" class="">PR #2568</a>)</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="resources">Resources<a href="https://duxlabs.dev/blog/v1-5-release#resources" class="hash-link" aria-label="Direct link to Resources" title="Direct link to Resources" translate="no">​</a></h2>
<a href="https://duxlabs.dev/docs/getting-started" class="getStartedLink_JzkM"><p>Get Started with DMS <span>→</span></p></a>
<div class="linksRow_Ia9_"><a href="https://github.com/duxlabs-dev/dux-shell" class="supportLink_Wuo1">GitHub</a><span class="linkDivider_gnos">•</span><a href="https://duxlabs.dev/docs/" class="supportLink_Wuo1">Documentation</a><span class="linkDivider_gnos">•</span><a href="https://plugins.danklinux.com/" class="supportLink_Wuo1">Plugins</a><span class="linkDivider_gnos">•</span><a href="https://discord.gg/ppWTpKmPgT" class="supportLink_Wuo1">Discord</a><span class="linkDivider_gnos">•</span><a href="https://github.com/sponsors/AvengeMedia" class="supportLink_Wuo1">Sponsor on GitHub</a><span class="linkDivider_gnos">•</span><a href="https://ko-fi.com/duxlabs" class="supportLink_Wuo1">Support on Ko-fi</a></div>
<div class="niriThanks_e0jt"><img src="https://duxlabs.dev/img/niri.svg" alt="niri"><span>Special thanks to <a href="https://github.com/YaLTeR">YaLTeR</a> for collaborating with the DMS team, for <a href="https://github.com/niri-wm/niri">niri</a> - the compositor that inspired DMS, and for hosting DMS on the <a href="https://discord.gg/ppWTpKmPgT">niri Discord</a>.</span></div>
<div class="thankYouHero_dsJy"><div class="claws_fGDC" aria-hidden="true"><div class="clawSet_hqQo clawLeft_GwDK"><svg viewBox="0 0 164 244" preserveAspectRatio="none" class="clawAnim1_Dksq" style="width:100%;height:100%;overflow:visible;opacity:0.4"><defs><linearGradient id="tear-g-3kpkz" x1="0%" y1="0%" x2="0%" y2="100%"><stop offset="0%" stop-color="#FFE9B8" stop-opacity="0"></stop><stop offset="20%" stop-color="#FFF3D6" stop-opacity="0.95"></stop><stop offset="48%" stop-color="#F0A93C" stop-opacity="0.95"></stop><stop offset="78%" stop-color="#C2641F" stop-opacity="0.78"></stop><stop offset="100%" stop-color="#8A4B1A" stop-opacity="0"></stop></linearGradient><linearGradient id="tear-r-3kpkz" x1="0%" y1="0%" x2="0%" y2="100%"><stop offset="0%" stop-color="#FFF6E0" stop-opacity="0"></stop><stop offset="30%" stop-color="#FFF6E0" stop-opacity="1"></stop><stop offset="70%" stop-color="#FFCE7A" stop-opacity="0.85"></stop><stop offset="100%" stop-color="#FFCE7A" stop-opacity="0"></stop></linearGradient><filter id="tear-s-3kpkz" x="-70%" y="-30%" width="240%" height="160%"><fedropshadow dx="0" dy="0" stdDeviation="4" flood-color="#05070B" flood-opacity="0.9"></fedropshadow></filter></defs><g transform="" filter="url(#tear-s-3kpkz)"><g><path fill="url(#tear-g-3kpkz)" d="M 54.0 4.0 L 54.0 4.0 L 55.2 27.6 L 47.6 51.2 L 52.1 74.8 L 43.9 98.4 L 47.0 122.0 L 35.8 145.6 L 36.4 169.2 L 24.8 192.8 L 23.8 216.4 L 16.0 240.0 L 16.0 240.0 L 18.8 216.4 L 15.4 192.8 L 23.4 169.2 L 20.6 145.6 L 31.0 122.0 L 28.7 98.4 L 39.1 74.8 L 38.2 51.2 L 50.2 27.6 L 54.0 4.0 Z"></path><path fill="none" stroke="url(#tear-r-3kpkz)" stroke-width="0.9" stroke-linejoin="round" d="M 54.0 4.0 L 54.0 4.0 L 55.2 27.6 L 47.6 51.2 L 52.1 74.8 L 43.9 98.4 L 47.0 122.0 L 35.8 145.6 L 36.4 169.2 L 24.8 192.8 L 23.8 216.4 L 16.0 240.0 L 16.0 240.0 L 18.8 216.4 L 15.4 192.8 L 23.4 169.2 L 20.6 145.6 L 31.0 122.0 L 28.7 98.4 L 39.1 74.8 L 38.2 51.2 L 50.2 27.6 L 54.0 4.0 Z"></path></g><g><path fill="url(#tear-g-3kpkz)" d="M 96.0 4.0 L 96.0 4.0 L 93.6 27.6 L 100.4 51.2 L 94.2 74.8 L 99.8 98.4 L 90.5 122.0 L 93.9 145.6 L 83.9 169.2 L 86.7 192.8 L 76.5 216.4 L 74.0 240.0 L 74.0 240.0 L 70.9 216.4 L 76.1 192.8 L 69.3 169.2 L 76.7 145.6 L 72.5 122.0 L 82.6 98.4 L 79.6 74.8 L 89.8 51.2 L 88.0 27.6 L 96.0 4.0 Z"></path><path fill="none" stroke="url(#tear-r-3kpkz)" stroke-width="0.9" stroke-linejoin="round" d="M 96.0 4.0 L 96.0 4.0 L 93.6 27.6 L 100.4 51.2 L 94.2 74.8 L 99.8 98.4 L 90.5 122.0 L 93.9 145.6 L 83.9 169.2 L 86.7 192.8 L 76.5 216.4 L 74.0 240.0 L 74.0 240.0 L 70.9 216.4 L 76.1 192.8 L 69.3 169.2 L 76.7 145.6 L 72.5 122.0 L 82.6 98.4 L 79.6 74.8 L 89.8 51.2 L 88.0 27.6 L 96.0 4.0 Z"></path></g><g><path fill="url(#tear-g-3kpkz)" d="M 138.0 4.0 L 138.0 4.0 L 143.8 27.6 L 141.3 51.2 L 150.4 74.8 L 146.3 98.4 L 153.0 122.0 L 146.4 145.6 L 152.6 169.2 L 146.1 192.8 L 149.7 216.4 L 146.0 240.0 L 146.0 240.0 L 144.7 216.4 L 136.7 192.8 L 139.6 169.2 L 131.2 145.6 L 137.0 122.0 L 131.1 98.4 L 137.4 74.8 L 131.9 51.2 L 138.8 27.6 L 138.0 4.0 Z"></path><path fill="none" stroke="url(#tear-r-3kpkz)" stroke-width="0.9" stroke-linejoin="round" d="M 138.0 4.0 L 138.0 4.0 L 143.8 27.6 L 141.3 51.2 L 150.4 74.8 L 146.3 98.4 L 153.0 122.0 L 146.4 145.6 L 152.6 169.2 L 146.1 192.8 L 149.7 216.4 L 146.0 240.0 L 146.0 240.0 L 144.7 216.4 L 136.7 192.8 L 139.6 169.2 L 131.2 145.6 L 137.0 122.0 L 131.1 98.4 L 137.4 74.8 L 131.9 51.2 L 138.8 27.6 L 138.0 4.0 Z"></path></g><circle cx="8" cy="60" r="2.2" fill="url(#tear-r-3kpkz)" opacity="0.7"></circle><circle cx="150" cy="50" r="1.8" fill="url(#tear-r-3kpkz)" opacity="0.7"></circle><circle cx="24" cy="150" r="1.6" fill="url(#tear-r-3kpkz)" opacity="0.7"></circle><circle cx="156" cy="168" r="2.4" fill="url(#tear-r-3kpkz)" opacity="0.7"></circle><circle cx="70" cy="230" r="1.8" fill="url(#tear-r-3kpkz)" opacity="0.7"></circle><circle cx="120" cy="18" r="1.5" fill="url(#tear-r-3kpkz)" opacity="0.7"></circle></g></svg></div><div class="clawSet_hqQo clawRight_g6T7"><svg viewBox="0 0 164 244" preserveAspectRatio="none" class="clawAnim2_EM_m" style="width:100%;height:100%;overflow:visible;opacity:0.4"><defs><linearGradient id="tear-g-2cez0" x1="0%" y1="0%" x2="0%" y2="100%"><stop offset="0%" stop-color="#FFE9B8" stop-opacity="0"></stop><stop offset="20%" stop-color="#FFF3D6" stop-opacity="0.95"></stop><stop offset="48%" stop-color="#F0A93C" stop-opacity="0.95"></stop><stop offset="78%" stop-color="#C2641F" stop-opacity="0.78"></stop><stop offset="100%" stop-color="#8A4B1A" stop-opacity="0"></stop></linearGradient><linearGradient id="tear-r-2cez0" x1="0%" y1="0%" x2="0%" y2="100%"><stop offset="0%" stop-color="#FFF6E0" stop-opacity="0"></stop><stop offset="30%" stop-color="#FFF6E0" stop-opacity="1"></stop><stop offset="70%" stop-color="#FFCE7A" stop-opacity="0.85"></stop><stop offset="100%" stop-color="#FFCE7A" stop-opacity="0"></stop></linearGradient><filter id="tear-s-2cez0" x="-70%" y="-30%" width="240%" height="160%"><fedropshadow dx="0" dy="0" stdDeviation="4" flood-color="#05070B" flood-opacity="0.9"></fedropshadow></filter></defs><g transform="translate(164,0) scale(-1,1)" filter="url(#tear-s-2cez0)"><g><path fill="url(#tear-g-2cez0)" d="M 54.0 4.0 L 54.0 4.0 L 55.2 27.6 L 47.6 51.2 L 52.1 74.8 L 43.9 98.4 L 47.0 122.0 L 35.8 145.6 L 36.4 169.2 L 24.8 192.8 L 23.8 216.4 L 16.0 240.0 L 16.0 240.0 L 18.8 216.4 L 15.4 192.8 L 23.4 169.2 L 20.6 145.6 L 31.0 122.0 L 28.7 98.4 L 39.1 74.8 L 38.2 51.2 L 50.2 27.6 L 54.0 4.0 Z"></path><path fill="none" stroke="url(#tear-r-2cez0)" stroke-width="0.9" stroke-linejoin="round" d="M 54.0 4.0 L 54.0 4.0 L 55.2 27.6 L 47.6 51.2 L 52.1 74.8 L 43.9 98.4 L 47.0 122.0 L 35.8 145.6 L 36.4 169.2 L 24.8 192.8 L 23.8 216.4 L 16.0 240.0 L 16.0 240.0 L 18.8 216.4 L 15.4 192.8 L 23.4 169.2 L 20.6 145.6 L 31.0 122.0 L 28.7 98.4 L 39.1 74.8 L 38.2 51.2 L 50.2 27.6 L 54.0 4.0 Z"></path></g><g><path fill="url(#tear-g-2cez0)" d="M 96.0 4.0 L 96.0 4.0 L 93.6 27.6 L 100.4 51.2 L 94.2 74.8 L 99.8 98.4 L 90.5 122.0 L 93.9 145.6 L 83.9 169.2 L 86.7 192.8 L 76.5 216.4 L 74.0 240.0 L 74.0 240.0 L 70.9 216.4 L 76.1 192.8 L 69.3 169.2 L 76.7 145.6 L 72.5 122.0 L 82.6 98.4 L 79.6 74.8 L 89.8 51.2 L 88.0 27.6 L 96.0 4.0 Z"></path><path fill="none" stroke="url(#tear-r-2cez0)" stroke-width="0.9" stroke-linejoin="round" d="M 96.0 4.0 L 96.0 4.0 L 93.6 27.6 L 100.4 51.2 L 94.2 74.8 L 99.8 98.4 L 90.5 122.0 L 93.9 145.6 L 83.9 169.2 L 86.7 192.8 L 76.5 216.4 L 74.0 240.0 L 74.0 240.0 L 70.9 216.4 L 76.1 192.8 L 69.3 169.2 L 76.7 145.6 L 72.5 122.0 L 82.6 98.4 L 79.6 74.8 L 89.8 51.2 L 88.0 27.6 L 96.0 4.0 Z"></path></g><g><path fill="url(#tear-g-2cez0)" d="M 138.0 4.0 L 138.0 4.0 L 143.8 27.6 L 141.3 51.2 L 150.4 74.8 L 146.3 98.4 L 153.0 122.0 L 146.4 145.6 L 152.6 169.2 L 146.1 192.8 L 149.7 216.4 L 146.0 240.0 L 146.0 240.0 L 144.7 216.4 L 136.7 192.8 L 139.6 169.2 L 131.2 145.6 L 137.0 122.0 L 131.1 98.4 L 137.4 74.8 L 131.9 51.2 L 138.8 27.6 L 138.0 4.0 Z"></path><path fill="none" stroke="url(#tear-r-2cez0)" stroke-width="0.9" stroke-linejoin="round" d="M 138.0 4.0 L 138.0 4.0 L 143.8 27.6 L 141.3 51.2 L 150.4 74.8 L 146.3 98.4 L 153.0 122.0 L 146.4 145.6 L 152.6 169.2 L 146.1 192.8 L 149.7 216.4 L 146.0 240.0 L 146.0 240.0 L 144.7 216.4 L 136.7 192.8 L 139.6 169.2 L 131.2 145.6 L 137.0 122.0 L 131.1 98.4 L 137.4 74.8 L 131.9 51.2 L 138.8 27.6 L 138.0 4.0 Z"></path></g><circle cx="8" cy="60" r="2.2" fill="url(#tear-r-2cez0)" opacity="0.7"></circle><circle cx="150" cy="50" r="1.8" fill="url(#tear-r-2cez0)" opacity="0.7"></circle><circle cx="24" cy="150" r="1.6" fill="url(#tear-r-2cez0)" opacity="0.7"></circle><circle cx="156" cy="168" r="2.4" fill="url(#tear-r-2cez0)" opacity="0.7"></circle><circle cx="70" cy="230" r="1.8" fill="url(#tear-r-2cez0)" opacity="0.7"></circle><circle cx="120" cy="18" r="1.5" fill="url(#tear-r-2cez0)" opacity="0.7"></circle></g></svg></div></div><div class="heroContent_jLTE"><h2 class="thankYouTitle_tcrY"><p>Thank <span class="gradientText_Fdu8">You</span></p></h2><p class="thankYouText_TFc0">To everyone who has supported DMS through feedback, contributions, sponsorships, donations, and packaging.</p><p class="thankYouTagline_KjiC">Zan, Zendegi, Azadi</p></div></div>]]></content:encoded>
            <category>Release</category>
            <category>Announcement</category>
        </item>
        <item>
            <title><![CDATA[Introducing DankCalendar]]></title>
            <link>https://duxlabs.dev/blog/dankcalendar-release</link>
            <guid>https://duxlabs.dev/blog/dankcalendar-release</guid>
            <pubDate>Mon, 15 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[A standalone calendar app that unifies Local, Google, Microsoft, CalDAV, and iCloud calendars. Now available.]]></description>
            <content:encoded><![CDATA[<div class="blogHero_wReW"><div class="tiles_MeT0" aria-hidden="true"><div class="tile_qVmC tileFloat1_r1PD" style="top:14%;left:4%;--rot:-12deg">15</div><div class="tile_qVmC tileFloat2_f1sW" style="top:44%;left:9%;--rot:8deg">3</div><div class="tile_qVmC tileFloat3_WuyK" style="top:70%;left:3%;--rot:15deg">28</div><div class="tile_qVmC tileFloat2_f1sW" style="top:80%;left:13%;--rot:-8deg">9</div><div class="tile_qVmC tileFloat1_r1PD" style="top:14%;left:90%;--rot:10deg">21</div><div class="tile_qVmC tileFloat3_WuyK" style="top:44%;left:95%;--rot:-14deg">6</div><div class="tile_qVmC tileFloat2_f1sW" style="top:70%;left:88%;--rot:6deg">17</div><div class="tile_qVmC tileFloat1_r1PD" style="top:80%;left:78%;--rot:12deg">30</div></div><div class="heroContent_Mn0w"><h1 class="heroTitle_YeAX"><p>Dank<span class="gradientText_WlkG">Calendar</span></p></h1><p class="heroSubtitle_sog_">0.2 · Latest Release</p></div></div>
<p><strong>DankCalendar</strong> is a solution for calendar management on Linux that unifies Local, Google, Microsoft, CalDAV, and iCloud calendars into a single agenda. It features background synchronization, native event reminders, secure credential storage, a comprehensive GUI, keyboard-driven navigation, and a scriptable IPC interface. It is available now on every DankLinux-supported distro: Arch (AUR), Fedora, Debian, Ubuntu, and openSUSE.</p>
<!-- -->
<figure style="text-align:center"><img src="https://duxlabs.dev/img/blog/dankcalendar/preview.png" alt="DankCalendar showing the month view, settings, and the add-account picker" style="max-width:520px;width:100%;border-radius:12px"><figcaption>DankCalendar with the month view, settings, and account setup.</figcaption></figure>
<div class="featureGrid_B3ND"><div class="featureCard_ecjh"><h3 class="featureTitle_g83y">Every Calendar, One View</h3><p>Connect Local, Google, Microsoft, CalDAV, and iCloud accounts and see them all in a single unified agenda.</p></div><div class="featureCard_ecjh"><h3 class="featureTitle_g83y">Background Sync</h3><p>A lightweight daemon keeps accounts in sync and serves notifications.</p></div><div class="featureCard_ecjh"><h3 class="featureTitle_g83y">Event Reminders</h3><p>Native desktop notifications for upcoming events, configurable per-event and per-calendar.</p></div><div class="featureCard_ecjh"><h3 class="featureTitle_g83y">Secure by Default</h3><p>OAuth tokens and account secrets are stored in your system keyring, not in plaintext config files.</p></div><div class="featureCard_ecjh"><h3 class="featureTitle_g83y">Keyboard First</h3><p>Full keyboard-driven navigation with a shortcuts overlay and spotlight-style event search.</p></div><div class="featureCard_ecjh"><h3 class="featureTitle_g83y">Scriptable IPC</h3><p>A full IPC surface for compositor keybinds and automation. Toggle, query events, and more from scripts.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="built-into-dms-v15">Built into DMS v1.5<a href="https://duxlabs.dev/blog/dankcalendar-release#built-into-dms-v15" class="hash-link" aria-label="Direct link to Built into DMS v1.5" title="Direct link to Built into DMS v1.5" translate="no">​</a></h2>
<p>DMS v1.5 detects a running <code>dcal</code> daemon and uses it as a calendar backend over IPC, with no extra setup.</p>
<ul>
<li class=""><strong>Unified agenda in DankDash.</strong> The calendar card shows your real events from every connected account, color-coded per calendar.</li>
<li class=""><strong>Create and edit events from the shell.</strong> You can add, edit, and delete events right in DankDash. The old khal integration was read-only, so this is new.</li>
<li class=""><strong>Keyboard navigation throughout.</strong> Move around the agenda, open event details, and dismiss it all from the keyboard.</li>
<li class=""><strong>Native reminders.</strong> Upcoming-event notifications come through the DMS notification system you already use.</li>
<li class=""><strong>A backend selector</strong> lives in Settings &gt; Time &amp; Weather (Auto, khal, or DankCalendar), along with a Launch DankCalendar button.</li>
</ul>
<p>If <code>dcal</code> isn't running, DMS falls back to khal, so nothing breaks.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="credentials-and-data">Credentials and data<a href="https://duxlabs.dev/blog/dankcalendar-release#credentials-and-data" class="hash-link" aria-label="Direct link to Credentials and data" title="Direct link to Credentials and data" translate="no">​</a></h2>
<p>There's no DankLinux server involved. <code>dcal</code> talks to Google, Microsoft, your CalDAV or iCloud host, or your local <code>.ics</code> files directly, so your events and tokens never leave your machine. For Google and Microsoft you create your own OAuth app, so the whole connection is yours.</p>
<ul>
<li class="">Credentials go in your system keyring (e.g. GNOME Keyring, KWallet) rather than your config files. If no keyring is available, <code>dcal</code> falls back to an encrypted on-disk store.</li>
<li class="">Synced calendars and events are cached in a local SQLite database under <code>~/.local/share/dankcal/</code>, following the XDG base directory spec. Everything works offline, and sync catches up when you're back online.</li>
<li class="">The daemon listens on a per-user Unix socket in <code>$XDG_RUNTIME_DIR</code>, scoped to your login session. It's not a network port.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="getting-started">Getting Started<a href="https://duxlabs.dev/blog/dankcalendar-release#getting-started" class="hash-link" aria-label="Direct link to Getting Started" title="Direct link to Getting Started" translate="no">​</a></h2>
<p>DankCalendar ships as <strong><code>dankcalendar-git</code></strong>, a rolling build from upstream <code>master</code>, across the DankLinux repositories. On Arch you can also use the prebuilt <strong><code>dankcalendar-bin</code></strong> AUR package.</p>
<p><strong>Arch Linux (AUR)</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#e4e4e7;--prism-background-color:#2e2a3d"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#e4e4e7;background-color:#2e2a3d"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#e4e4e7"><span class="token plain">yay </span><span class="token parameter variable" style="color:#89ddff">-S</span><span class="token plain"> dankcalendar-bin    </span><span class="token comment" style="color:#7c7c99;font-style:italic"># prebuilt binary</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token comment" style="color:#7c7c99;font-style:italic"># or</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">yay </span><span class="token parameter variable" style="color:#89ddff">-S</span><span class="token plain"> dankcalendar-git    </span><span class="token comment" style="color:#7c7c99;font-style:italic"># build from latest git</span><br></div></code></pre></div></div>
<p><strong>Fedora &amp; CentOS (COPR)</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#e4e4e7;--prism-background-color:#2e2a3d"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#e4e4e7;background-color:#2e2a3d"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#e4e4e7"><span class="token function" style="color:#82aaff">sudo</span><span class="token plain"> dnf copr </span><span class="token builtin class-name" style="color:#82aaff">enable</span><span class="token plain"> avengemedia/danklinux</span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token function" style="color:#82aaff">sudo</span><span class="token plain"> dnf </span><span class="token function" style="color:#82aaff">install</span><span class="token plain"> dankcalendar-git</span><br></div></code></pre></div></div>
<p><strong>Debian (OBS)</strong> and <strong>Ubuntu (PPA)</strong> first enable the <a class="" href="https://duxlabs.dev/docs/packaging/">DankLinux repository</a>, then:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#e4e4e7;--prism-background-color:#2e2a3d"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#e4e4e7;background-color:#2e2a3d"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#e4e4e7"><span class="token function" style="color:#82aaff">sudo</span><span class="token plain"> </span><span class="token function" style="color:#82aaff">apt</span><span class="token plain"> </span><span class="token function" style="color:#82aaff">install</span><span class="token plain"> dankcalendar-git</span><br></div></code></pre></div></div>
<p><strong>openSUSE (OBS)</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#e4e4e7;--prism-background-color:#2e2a3d"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#e4e4e7;background-color:#2e2a3d"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#e4e4e7"><span class="token function" style="color:#82aaff">sudo</span><span class="token plain"> </span><span class="token function" style="color:#82aaff">zypper</span><span class="token plain"> </span><span class="token function" style="color:#82aaff">install</span><span class="token plain"> dankcalendar-git</span><br></div></code></pre></div></div>
<p>Repository setup commands for each Debian release, Ubuntu, and openSUSE variant are in the <a class="" href="https://duxlabs.dev/docs/dcal/installation">installation guide</a>. You can also build from source with <code>git clone</code> and <code>make install</code>.</p>
<p>You can connect accounts from the GUI or the CLI.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#e4e4e7;--prism-background-color:#2e2a3d"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#e4e4e7;background-color:#2e2a3d"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#e4e4e7"><span class="token plain">dcal run                  </span><span class="token comment" style="color:#7c7c99;font-style:italic"># Launch DankCalendar</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">dcal account </span><span class="token function" style="color:#82aaff">add</span><span class="token plain"> google   </span><span class="token comment" style="color:#7c7c99;font-style:italic"># or microsoft, caldav, icloud, local</span><br></div></code></pre></div></div>
<p>DankCalendar runs as a daemon, so closing the window only hides it and sync and reminders keep running in the tray - you can change the close behavior in settings. Enable <strong>Start at login</strong> from Settings, or install the systemd user service.</p>
<p>See the <a class="" href="https://duxlabs.dev/docs/dcal/">DankCalendar documentation</a> for full installation, account setup, and IPC reference.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="updates-since-v01">Updates since v0.1<a href="https://duxlabs.dev/blog/dankcalendar-release#updates-since-v01" class="hash-link" aria-label="Direct link to Updates since v0.1" title="Direct link to Updates since v0.1" translate="no">​</a></h2>
<p>DankCalendar has moved quickly since the initial release. <a href="https://github.com/duxlabs-dev/dux-calendar/releases/tag/v0.2.0" target="_blank" rel="noopener noreferrer" class="">v0.2.0</a> is the latest; here are the headline additions from v0.1.1 through v0.2.0.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="calendar-sources">Calendar sources<a href="https://duxlabs.dev/blog/dankcalendar-release#calendar-sources" class="hash-link" aria-label="Direct link to Calendar sources" title="Direct link to Calendar sources" translate="no">​</a></h3>
<ul>
<li class=""><strong>iCal feeds and webcal URLs</strong> — Subscribe to public calendar feeds and open <code>webcal://</code> links directly.</li>
<li class=""><strong>Evolution Data Server</strong> — Read calendars already managed by GNOME Evolution without duplicating account setup.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="tasks-events-and-reminders">Tasks, events, and reminders<a href="https://duxlabs.dev/blog/dankcalendar-release#tasks-events-and-reminders" class="hash-link" aria-label="Direct link to Tasks, events, and reminders" title="Direct link to Tasks, events, and reminders" translate="no">​</a></h3>
<ul>
<li class=""><strong>Tasks and reminders (VTODO)</strong> — View and manage tasks from every connected provider, not just calendar events.</li>
<li class=""><strong>Event RSVP</strong> — Accept or decline invitations from inside DankCalendar.</li>
<li class=""><strong>Meeting links</strong> — Video call URLs are parsed from events and shown in event details and reminders.</li>
<li class=""><strong>Event-driven reminders</strong> — The reminder scheduler wakes on upcoming events instead of polling on a fixed interval.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ui-and-navigation">UI and navigation<a href="https://duxlabs.dev/blog/dankcalendar-release#ui-and-navigation" class="hash-link" aria-label="Direct link to UI and navigation" title="Direct link to UI and navigation" translate="no">​</a></h3>
<ul>
<li class=""><strong>Theme engine</strong> — Custom themes plus a native colorscheme watcher that follows your system light/dark preference.</li>
<li class=""><strong>Sidebar</strong> — Resizable, collapsible, and scrollable, with long calendar names elided cleanly.</li>
<li class=""><strong>Month view</strong> — Scroll through dense months and expand a day to see every event when a cell overflows.</li>
<li class=""><strong>Day and week views</strong> — A time-of-day indicator marks your current position in the schedule.</li>
<li class=""><strong>View shortcuts</strong> — <code>Ctrl+1</code> through <code>Ctrl+5</code> jump between agenda views.</li>
<li class=""><strong>Quick create</strong> — Double-click a time slot to start a new event.</li>
<li class=""><strong>Close behavior</strong> — Choose whether the window close button hides DankCalendar or quits entirely.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ipc-and-integration">IPC and integration<a href="https://duxlabs.dev/blog/dankcalendar-release#ipc-and-integration" class="hash-link" aria-label="Direct link to IPC and integration" title="Direct link to IPC and integration" translate="no">​</a></h3>
<ul>
<li class=""><strong>Open in a specific view</strong> — IPC can show the calendar already focused on month, week, day, or agenda.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="translations">Translations<a href="https://duxlabs.dev/blog/dankcalendar-release#translations" class="hash-link" aria-label="Direct link to Translations" title="Direct link to Translations" translate="no">​</a></h3>
<ul>
<li class=""><strong>More languages</strong> — Dutch, Italian, Vietnamese, Spanish, Hebrew, Russian, Ukrainian (with RTL), Polish, and Chinese Simplified.</li>
</ul>
<p>See the full <a href="https://github.com/duxlabs-dev/dux-calendar/releases" target="_blank" rel="noopener noreferrer" class="">release history</a> on GitHub for version-by-version notes.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-a-new-linux-calendar">Why a new Linux calendar?<a href="https://duxlabs.dev/blog/dankcalendar-release#why-a-new-linux-calendar" class="hash-link" aria-label="Direct link to Why a new Linux calendar?" title="Direct link to Why a new Linux calendar?" translate="no">​</a></h2>
<p>It fits the Dank philosophy of focused tools (<a class="" href="https://duxlabs.dev/docs/dgop/">dgop</a>, <a class="" href="https://duxlabs.dev/docs/dsearch/">dsearch</a>) that do one thing well and integrate together, without unnecessary dependencies or assumptions about your setup. The calendar is a core part of the user experience, so it deserves a first-party solution that works well with the shell and with your existing accounts.</p>
<p>khal and vdirsyncer are scriptable and lightweight, but they're two tools you wire together yourself. You write a <code>vdirsyncer</code> config, set up OAuth tokens by hand, run sync on a cron, then point khal at the output. It's not a user-friendly or comprehensive solution.</p>
<p>Evolution and Evolution Data Server are powerful, but they're tied to the GNOME desktop and incredibly difficult to build on or integrate with. The calendar is just one part of a huge suite of apps sharing the EDS backend.</p>
<ul>
<li class="">The calendar is buried inside an Outlook-style suite, and account setup is spread across GNOME Settings, GNOME Online Accounts, and Evolution itself, so it's never clear which one actually owns a calendar.</li>
<li class="">EDS is a shared backend, which is a good idea, but its API is GObject/C with async GLib and very few real examples. Writing a launcher widget, a shell card, or a CLI against it means digging through source-registry concepts and <code>ECalClient</code> instead of calling something simple.</li>
<li class="">It drags in a heavy GTK and WebKitGTK stack and assumes you're on GNOME, which is awkward on niri, Hyprland, Sway, KDE, or a custom shell.</li>
</ul>
<p>DankCalendar keeps the good part of that idea, one synced backend that lots of things can read, but makes it pleasant to use and to build on: sign-in style account setup, a local cache that works offline, a documented IPC API (<code>dcal ipc events.list</code>, <code>events.create</code>, and so on) with JSON output, and a daemon-plus-frontends design that behaves the same on any compositor.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="resources">Resources<a href="https://duxlabs.dev/blog/dankcalendar-release#resources" class="hash-link" aria-label="Direct link to Resources" title="Direct link to Resources" translate="no">​</a></h2>
<a href="https://duxlabs.dev/docs/dcal/" class="getStartedLink_EOXp"><p>Read the DankCalendar docs <span>→</span></p></a>
<div class="linksRow_WWMI"><a href="https://github.com/duxlabs-dev/dux-calendar" class="supportLink_TZyH">GitHub</a><span class="linkDivider_nagZ">•</span><a href="https://duxlabs.dev/docs/dcal/" class="supportLink_TZyH">Documentation</a><span class="linkDivider_nagZ">•</span><a href="https://discord.gg/ppWTpKmPgT" class="supportLink_TZyH">Discord</a><span class="linkDivider_nagZ">•</span><a href="https://ko-fi.com/duxlabs" class="supportLink_TZyH">Support on Ko-fi</a></div>
<div class="communityHero_qtRI"><div class="tiles_MeT0" aria-hidden="true"><div class="tile_qVmC tileFloat1_r1PD" style="top:18%;left:6%;--rot:-10deg">12</div><div class="tile_qVmC tileFloat3_WuyK" style="top:62%;left:9%;--rot:12deg">5</div><div class="tile_qVmC tileFloat2_f1sW" style="top:20%;left:89%;--rot:9deg">24</div><div class="tile_qVmC tileFloat1_r1PD" style="top:64%;left:86%;--rot:-12deg">8</div></div><div class="heroContent_Mn0w"><h2 class="communityTitle_yLpq"><p>Join the <span class="gradientText_WlkG">community</span></p></h2><p class="communityText_N0Ma">DankCalendar is brand new, so feedback and bug reports go a long way. Come hang out in the <code>#dms</code> channels on the niri Discord, or open an issue on GitHub. Providers, widgets, and translations are all welcome.</p><div class="communityLinks_GiuX"><a href="https://discord.gg/ppWTpKmPgT" class="discordButton_A5Je">Join the Discord</a><a href="https://github.com/duxlabs-dev/dux-calendar/issues" class="ghostButton_EYLe">Report an issue</a></div></div></div>]]></content:encoded>
            <category>Release</category>
            <category>Announcement</category>
        </item>
        <item>
            <title><![CDATA[DMS 1.4 "Saffron Bloom" Released]]></title>
            <link>https://duxlabs.dev/blog/v1-4-release</link>
            <guid>https://duxlabs.dev/blog/v1-4-release</guid>
            <pubDate>Tue, 17 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[The third major release of DMS]]></description>
            <content:encoded><![CDATA[
<!-- -->
<!-- -->
<!-- -->
<div class="blogHero_Lfl2"><div class="confetti_wL7G" aria-hidden="true"><div style="position:absolute;top:4%;left:2%;width:24px;height:48px;transform:rotate(-20deg)"><svg viewBox="0 0 32 60" class="stigmaAnim1_X9QU" style="width:100%;height:100%;overflow:visible;opacity:0.55"><defs><linearGradient id="bundle-grad-mvl5r-1" x1="0%" y1="100%" x2="0%" y2="0%"><stop offset="0%" stop-color="#E8A832"></stop><stop offset="40%" stop-color="#C65D3B"></stop><stop offset="75%" stop-color="#8B1E1E"></stop><stop offset="100%" stop-color="#6B1515"></stop></linearGradient><linearGradient id="bundle-grad-mvl5r-2" x1="0%" y1="100%" x2="0%" y2="0%"><stop offset="0%" stop-color="#D4912A"></stop><stop offset="35%" stop-color="#B54E32"></stop><stop offset="70%" stop-color="#7A1A1A"></stop><stop offset="100%" stop-color="#5A1010"></stop></linearGradient></defs><g transform=""><path fill="none" stroke="url(#bundle-grad-mvl5r-1)" stroke-width="2" stroke-linecap="round" d="M16 58 Q14 48 12 38 Q9 26 6 16 Q4 8 5 4"></path><path fill="none" stroke="url(#bundle-grad-mvl5r-2)" stroke-width="2.2" stroke-linecap="round" d="M16 58 Q16 46 16 34 Q16 22 16 12 Q16 6 16 2"></path><path fill="none" stroke="url(#bundle-grad-mvl5r-1)" stroke-width="2" stroke-linecap="round" d="M16 58 Q18 48 20 38 Q23 26 26 16 Q28 8 27 4"></path><ellipse cx="5" cy="3" rx="3.5" ry="1.8" fill="#6B1515" opacity="0.85"></ellipse><ellipse cx="16" cy="1.5" rx="4" ry="2" fill="#5A1010" opacity="0.9"></ellipse><ellipse cx="27" cy="3" rx="3.5" ry="1.8" fill="#6B1515" opacity="0.85"></ellipse></g></svg></div><div style="position:absolute;top:18%;left:5%;width:18px;height:40px;transform:rotate(15deg)"><svg viewBox="0 0 24 52" class="stigmaAnim2_bVb4" style="width:100%;height:100%;overflow:visible;opacity:0.45"><defs><linearGradient id="pair-grad-fl2op-1" x1="0%" y1="100%" x2="0%" y2="0%"><stop offset="0%" stop-color="#E8A832"></stop><stop offset="38%" stop-color="#C65D3B"></stop><stop offset="72%" stop-color="#8B1E1E"></stop><stop offset="100%" stop-color="#6B1515"></stop></linearGradient></defs><g transform="translate(24,0) scale(-1,1)"><path fill="none" stroke="url(#pair-grad-fl2op-1)" stroke-width="2.2" stroke-linecap="round" d="M12 50 Q10 40 8 30 Q5 20 4 12 Q3 6 4 3"></path><path fill="none" stroke="url(#pair-grad-fl2op-1)" stroke-width="2" stroke-linecap="round" d="M12 50 Q14 40 16 30 Q19 20 20 12 Q21 6 20 3"></path><ellipse cx="4" cy="2.5" rx="3.2" ry="1.6" fill="#6B1515" opacity="0.88"></ellipse><ellipse cx="20" cy="2.5" rx="3.2" ry="1.6" fill="#6B1515" opacity="0.88"></ellipse></g></svg></div><div style="position:absolute;top:38%;left:3%;width:22px;height:46px;transform:rotate(-35deg)"><svg viewBox="0 0 32 60" class="stigmaAnim3_XTsE" style="width:100%;height:100%;overflow:visible;opacity:0.5"><defs><linearGradient id="bundle-grad-oau4u-1" x1="0%" y1="100%" x2="0%" y2="0%"><stop offset="0%" stop-color="#E8A832"></stop><stop offset="40%" stop-color="#C65D3B"></stop><stop offset="75%" stop-color="#8B1E1E"></stop><stop offset="100%" stop-color="#6B1515"></stop></linearGradient><linearGradient id="bundle-grad-oau4u-2" x1="0%" y1="100%" x2="0%" y2="0%"><stop offset="0%" stop-color="#D4912A"></stop><stop offset="35%" stop-color="#B54E32"></stop><stop offset="70%" stop-color="#7A1A1A"></stop><stop offset="100%" stop-color="#5A1010"></stop></linearGradient></defs><g transform=""><path fill="none" stroke="url(#bundle-grad-oau4u-1)" stroke-width="2" stroke-linecap="round" d="M16 58 Q14 48 12 38 Q9 26 6 16 Q4 8 5 4"></path><path fill="none" stroke="url(#bundle-grad-oau4u-2)" stroke-width="2.2" stroke-linecap="round" d="M16 58 Q16 46 16 34 Q16 22 16 12 Q16 6 16 2"></path><path fill="none" stroke="url(#bundle-grad-oau4u-1)" stroke-width="2" stroke-linecap="round" d="M16 58 Q18 48 20 38 Q23 26 26 16 Q28 8 27 4"></path><ellipse cx="5" cy="3" rx="3.5" ry="1.8" fill="#6B1515" opacity="0.85"></ellipse><ellipse cx="16" cy="1.5" rx="4" ry="2" fill="#5A1010" opacity="0.9"></ellipse><ellipse cx="27" cy="3" rx="3.5" ry="1.8" fill="#6B1515" opacity="0.85"></ellipse></g></svg></div><div style="position:absolute;top:55%;left:4%;width:15px;height:42px;transform:rotate(25deg)"><svg viewBox="0 0 20 56" class="stigmaAnim1_X9QU" style="width:100%;height:100%;overflow:visible;opacity:0.42"><defs><linearGradient id="saffron-grad-0-jl7do" x1="0%" y1="100%" x2="0%" y2="0%"><stop offset="0%" stop-color="#E8A832"></stop><stop offset="35%" stop-color="#C65D3B"></stop><stop offset="70%" stop-color="#8B1E1E"></stop><stop offset="100%" stop-color="#6B1515"></stop></linearGradient></defs><g transform="translate(20,0) scale(-1,1)"><path fill="none" stroke="url(#saffron-grad-0-jl7do)" stroke-width="2.2" stroke-linecap="round" d="M10 52 Q9 42 8 32 Q7 22 8 14 Q9 8 10 4"></path><ellipse cx="10" cy="2" rx="4" ry="2" fill="#6B1515" opacity="0.9"></ellipse><path fill="none" stroke="#5A1212" stroke-width="0.8" stroke-linecap="round" opacity="0.6" d="M6 2 Q8 0 10 1 Q12 0 14 2"></path></g></svg></div><div style="position:absolute;top:72%;left:2%;width:18px;height:40px;transform:rotate(-10deg)"><svg viewBox="0 0 24 52" class="stigmaAnim2_bVb4" style="width:100%;height:100%;overflow:visible;opacity:0.48"><defs><linearGradient id="pair-grad-gndne-1" x1="0%" y1="100%" x2="0%" y2="0%"><stop offset="0%" stop-color="#E8A832"></stop><stop offset="38%" stop-color="#C65D3B"></stop><stop offset="72%" stop-color="#8B1E1E"></stop><stop offset="100%" stop-color="#6B1515"></stop></linearGradient></defs><g transform=""><path fill="none" stroke="url(#pair-grad-gndne-1)" stroke-width="2.2" stroke-linecap="round" d="M12 50 Q10 40 8 30 Q5 20 4 12 Q3 6 4 3"></path><path fill="none" stroke="url(#pair-grad-gndne-1)" stroke-width="2" stroke-linecap="round" d="M12 50 Q14 40 16 30 Q19 20 20 12 Q21 6 20 3"></path><ellipse cx="4" cy="2.5" rx="3.2" ry="1.6" fill="#6B1515" opacity="0.88"></ellipse><ellipse cx="20" cy="2.5" rx="3.2" ry="1.6" fill="#6B1515" opacity="0.88"></ellipse></g></svg></div><div style="position:absolute;top:8%;left:12%;width:14px;height:38px;transform:rotate(30deg)"><svg viewBox="0 0 20 56" class="stigmaAnim3_XTsE" style="width:100%;height:100%;overflow:visible;opacity:0.35"><defs><linearGradient id="saffron-grad-1-uki4n" x1="0%" y1="100%" x2="0%" y2="0%"><stop offset="0%" stop-color="#E8A832"></stop><stop offset="35%" stop-color="#C65D3B"></stop><stop offset="70%" stop-color="#8B1E1E"></stop><stop offset="100%" stop-color="#6B1515"></stop></linearGradient></defs><g transform=""><path fill="none" stroke="url(#saffron-grad-1-uki4n)" stroke-width="2.2" stroke-linecap="round" d="M10 52 Q11 44 9 34 Q7 24 8 14 Q10 6 11 3"></path><ellipse cx="10" cy="2" rx="4" ry="2" fill="#6B1515" opacity="0.9"></ellipse><path fill="none" stroke="#5A1212" stroke-width="0.8" stroke-linecap="round" opacity="0.6" d="M6 2 Q8 0 10 1 Q12 0 14 2"></path></g></svg></div><div style="position:absolute;top:65%;left:10%;width:15px;height:40px;transform:rotate(-40deg)"><svg viewBox="0 0 20 56" class="stigmaAnim1_X9QU" style="width:100%;height:100%;overflow:visible;opacity:0.32"><defs><linearGradient id="saffron-grad-2-ni5t9" x1="0%" y1="100%" x2="0%" y2="0%"><stop offset="0%" stop-color="#E8A832"></stop><stop offset="35%" stop-color="#C65D3B"></stop><stop offset="70%" stop-color="#8B1E1E"></stop><stop offset="100%" stop-color="#6B1515"></stop></linearGradient></defs><g transform="translate(20,0) scale(-1,1)"><path fill="none" stroke="url(#saffron-grad-2-ni5t9)" stroke-width="2.2" stroke-linecap="round" d="M10 52 Q8 40 9 30 Q10 20 9 12 Q8 6 10 2"></path><ellipse cx="10" cy="2" rx="4" ry="2" fill="#6B1515" opacity="0.9"></ellipse><path fill="none" stroke="#5A1212" stroke-width="0.8" stroke-linecap="round" opacity="0.6" d="M6 2 Q8 0 10 1 Q12 0 14 2"></path></g></svg></div><div style="position:absolute;top:80%;left:22%;width:22px;height:46px;transform:rotate(-25deg)"><svg viewBox="0 0 32 60" class="stigmaAnim2_bVb4" style="width:100%;height:100%;overflow:visible;opacity:0.45"><defs><linearGradient id="bundle-grad-ie0rh-1" x1="0%" y1="100%" x2="0%" y2="0%"><stop offset="0%" stop-color="#E8A832"></stop><stop offset="40%" stop-color="#C65D3B"></stop><stop offset="75%" stop-color="#8B1E1E"></stop><stop offset="100%" stop-color="#6B1515"></stop></linearGradient><linearGradient id="bundle-grad-ie0rh-2" x1="0%" y1="100%" x2="0%" y2="0%"><stop offset="0%" stop-color="#D4912A"></stop><stop offset="35%" stop-color="#B54E32"></stop><stop offset="70%" stop-color="#7A1A1A"></stop><stop offset="100%" stop-color="#5A1010"></stop></linearGradient></defs><g transform=""><path fill="none" stroke="url(#bundle-grad-ie0rh-1)" stroke-width="2" stroke-linecap="round" d="M16 58 Q14 48 12 38 Q9 26 6 16 Q4 8 5 4"></path><path fill="none" stroke="url(#bundle-grad-ie0rh-2)" stroke-width="2.2" stroke-linecap="round" d="M16 58 Q16 46 16 34 Q16 22 16 12 Q16 6 16 2"></path><path fill="none" stroke="url(#bundle-grad-ie0rh-1)" stroke-width="2" stroke-linecap="round" d="M16 58 Q18 48 20 38 Q23 26 26 16 Q28 8 27 4"></path><ellipse cx="5" cy="3" rx="3.5" ry="1.8" fill="#6B1515" opacity="0.85"></ellipse><ellipse cx="16" cy="1.5" rx="4" ry="2" fill="#5A1010" opacity="0.9"></ellipse><ellipse cx="27" cy="3" rx="3.5" ry="1.8" fill="#6B1515" opacity="0.85"></ellipse></g></svg></div><div style="position:absolute;top:78%;left:42%;width:17px;height:40px;transform:rotate(20deg)"><svg viewBox="0 0 24 52" class="stigmaAnim3_XTsE" style="width:100%;height:100%;overflow:visible;opacity:0.38"><defs><linearGradient id="pair-grad-74t50-1" x1="0%" y1="100%" x2="0%" y2="0%"><stop offset="0%" stop-color="#E8A832"></stop><stop offset="38%" stop-color="#C65D3B"></stop><stop offset="72%" stop-color="#8B1E1E"></stop><stop offset="100%" stop-color="#6B1515"></stop></linearGradient></defs><g transform="translate(24,0) scale(-1,1)"><path fill="none" stroke="url(#pair-grad-74t50-1)" stroke-width="2.2" stroke-linecap="round" d="M12 50 Q10 40 8 30 Q5 20 4 12 Q3 6 4 3"></path><path fill="none" stroke="url(#pair-grad-74t50-1)" stroke-width="2" stroke-linecap="round" d="M12 50 Q14 40 16 30 Q19 20 20 12 Q21 6 20 3"></path><ellipse cx="4" cy="2.5" rx="3.2" ry="1.6" fill="#6B1515" opacity="0.88"></ellipse><ellipse cx="20" cy="2.5" rx="3.2" ry="1.6" fill="#6B1515" opacity="0.88"></ellipse></g></svg></div><div style="position:absolute;top:82%;left:58%;width:14px;height:38px;transform:rotate(-15deg)"><svg viewBox="0 0 20 56" class="stigmaAnim1_X9QU" style="width:100%;height:100%;overflow:visible;opacity:0.35"><defs><linearGradient id="saffron-grad-0-1x92d" x1="0%" y1="100%" x2="0%" y2="0%"><stop offset="0%" stop-color="#E8A832"></stop><stop offset="35%" stop-color="#C65D3B"></stop><stop offset="70%" stop-color="#8B1E1E"></stop><stop offset="100%" stop-color="#6B1515"></stop></linearGradient></defs><g transform=""><path fill="none" stroke="url(#saffron-grad-0-1x92d)" stroke-width="2.2" stroke-linecap="round" d="M10 52 Q9 42 8 32 Q7 22 8 14 Q9 8 10 4"></path><ellipse cx="10" cy="2" rx="4" ry="2" fill="#6B1515" opacity="0.9"></ellipse><path fill="none" stroke="#5A1212" stroke-width="0.8" stroke-linecap="round" opacity="0.6" d="M6 2 Q8 0 10 1 Q12 0 14 2"></path></g></svg></div><div style="position:absolute;top:76%;left:74%;width:20px;height:44px;transform:rotate(35deg)"><svg viewBox="0 0 32 60" class="stigmaAnim2_bVb4" style="width:100%;height:100%;overflow:visible;opacity:0.48"><defs><linearGradient id="bundle-grad-l9wua-1" x1="0%" y1="100%" x2="0%" y2="0%"><stop offset="0%" stop-color="#E8A832"></stop><stop offset="40%" stop-color="#C65D3B"></stop><stop offset="75%" stop-color="#8B1E1E"></stop><stop offset="100%" stop-color="#6B1515"></stop></linearGradient><linearGradient id="bundle-grad-l9wua-2" x1="0%" y1="100%" x2="0%" y2="0%"><stop offset="0%" stop-color="#D4912A"></stop><stop offset="35%" stop-color="#B54E32"></stop><stop offset="70%" stop-color="#7A1A1A"></stop><stop offset="100%" stop-color="#5A1010"></stop></linearGradient></defs><g transform="translate(32,0) scale(-1,1)"><path fill="none" stroke="url(#bundle-grad-l9wua-1)" stroke-width="2" stroke-linecap="round" d="M16 58 Q14 48 12 38 Q9 26 6 16 Q4 8 5 4"></path><path fill="none" stroke="url(#bundle-grad-l9wua-2)" stroke-width="2.2" stroke-linecap="round" d="M16 58 Q16 46 16 34 Q16 22 16 12 Q16 6 16 2"></path><path fill="none" stroke="url(#bundle-grad-l9wua-1)" stroke-width="2" stroke-linecap="round" d="M16 58 Q18 48 20 38 Q23 26 26 16 Q28 8 27 4"></path><ellipse cx="5" cy="3" rx="3.5" ry="1.8" fill="#6B1515" opacity="0.85"></ellipse><ellipse cx="16" cy="1.5" rx="4" ry="2" fill="#5A1010" opacity="0.9"></ellipse><ellipse cx="27" cy="3" rx="3.5" ry="1.8" fill="#6B1515" opacity="0.85"></ellipse></g></svg></div><div style="position:absolute;top:5%;left:86%;width:17px;height:40px;transform:rotate(10deg)"><svg viewBox="0 0 24 52" class="stigmaAnim3_XTsE" style="width:100%;height:100%;overflow:visible;opacity:0.5"><defs><linearGradient id="pair-grad-74eyx-1" x1="0%" y1="100%" x2="0%" y2="0%"><stop offset="0%" stop-color="#E8A832"></stop><stop offset="38%" stop-color="#C65D3B"></stop><stop offset="72%" stop-color="#8B1E1E"></stop><stop offset="100%" stop-color="#6B1515"></stop></linearGradient></defs><g transform=""><path fill="none" stroke="url(#pair-grad-74eyx-1)" stroke-width="2.2" stroke-linecap="round" d="M12 50 Q10 40 8 30 Q5 20 4 12 Q3 6 4 3"></path><path fill="none" stroke="url(#pair-grad-74eyx-1)" stroke-width="2" stroke-linecap="round" d="M12 50 Q14 40 16 30 Q19 20 20 12 Q21 6 20 3"></path><ellipse cx="4" cy="2.5" rx="3.2" ry="1.6" fill="#6B1515" opacity="0.88"></ellipse><ellipse cx="20" cy="2.5" rx="3.2" ry="1.6" fill="#6B1515" opacity="0.88"></ellipse></g></svg></div><div style="position:absolute;top:22%;left:92%;width:23px;height:48px;transform:rotate(-30deg)"><svg viewBox="0 0 32 60" class="stigmaAnim1_X9QU" style="width:100%;height:100%;overflow:visible;opacity:0.52"><defs><linearGradient id="bundle-grad-rqmdd-1" x1="0%" y1="100%" x2="0%" y2="0%"><stop offset="0%" stop-color="#E8A832"></stop><stop offset="40%" stop-color="#C65D3B"></stop><stop offset="75%" stop-color="#8B1E1E"></stop><stop offset="100%" stop-color="#6B1515"></stop></linearGradient><linearGradient id="bundle-grad-rqmdd-2" x1="0%" y1="100%" x2="0%" y2="0%"><stop offset="0%" stop-color="#D4912A"></stop><stop offset="35%" stop-color="#B54E32"></stop><stop offset="70%" stop-color="#7A1A1A"></stop><stop offset="100%" stop-color="#5A1010"></stop></linearGradient></defs><g transform="translate(32,0) scale(-1,1)"><path fill="none" stroke="url(#bundle-grad-rqmdd-1)" stroke-width="2" stroke-linecap="round" d="M16 58 Q14 48 12 38 Q9 26 6 16 Q4 8 5 4"></path><path fill="none" stroke="url(#bundle-grad-rqmdd-2)" stroke-width="2.2" stroke-linecap="round" d="M16 58 Q16 46 16 34 Q16 22 16 12 Q16 6 16 2"></path><path fill="none" stroke="url(#bundle-grad-rqmdd-1)" stroke-width="2" stroke-linecap="round" d="M16 58 Q18 48 20 38 Q23 26 26 16 Q28 8 27 4"></path><ellipse cx="5" cy="3" rx="3.5" ry="1.8" fill="#6B1515" opacity="0.85"></ellipse><ellipse cx="16" cy="1.5" rx="4" ry="2" fill="#5A1010" opacity="0.9"></ellipse><ellipse cx="27" cy="3" rx="3.5" ry="1.8" fill="#6B1515" opacity="0.85"></ellipse></g></svg></div><div style="position:absolute;top:42%;left:88%;width:14px;height:40px;transform:rotate(40deg)"><svg viewBox="0 0 20 56" class="stigmaAnim2_bVb4" style="width:100%;height:100%;overflow:visible;opacity:0.4"><defs><linearGradient id="saffron-grad-1-jghe0" x1="0%" y1="100%" x2="0%" y2="0%"><stop offset="0%" stop-color="#E8A832"></stop><stop offset="35%" stop-color="#C65D3B"></stop><stop offset="70%" stop-color="#8B1E1E"></stop><stop offset="100%" stop-color="#6B1515"></stop></linearGradient></defs><g transform=""><path fill="none" stroke="url(#saffron-grad-1-jghe0)" stroke-width="2.2" stroke-linecap="round" d="M10 52 Q11 44 9 34 Q7 24 8 14 Q10 6 11 3"></path><ellipse cx="10" cy="2" rx="4" ry="2" fill="#6B1515" opacity="0.9"></ellipse><path fill="none" stroke="#5A1212" stroke-width="0.8" stroke-linecap="round" opacity="0.6" d="M6 2 Q8 0 10 1 Q12 0 14 2"></path></g></svg></div><div style="position:absolute;top:58%;left:91%;width:17px;height:42px;transform:rotate(-18deg)"><svg viewBox="0 0 24 52" class="stigmaAnim3_XTsE" style="width:100%;height:100%;overflow:visible;opacity:0.45"><defs><linearGradient id="pair-grad-f2pdw-1" x1="0%" y1="100%" x2="0%" y2="0%"><stop offset="0%" stop-color="#E8A832"></stop><stop offset="38%" stop-color="#C65D3B"></stop><stop offset="72%" stop-color="#8B1E1E"></stop><stop offset="100%" stop-color="#6B1515"></stop></linearGradient></defs><g transform="translate(24,0) scale(-1,1)"><path fill="none" stroke="url(#pair-grad-f2pdw-1)" stroke-width="2.2" stroke-linecap="round" d="M12 50 Q10 40 8 30 Q5 20 4 12 Q3 6 4 3"></path><path fill="none" stroke="url(#pair-grad-f2pdw-1)" stroke-width="2" stroke-linecap="round" d="M12 50 Q14 40 16 30 Q19 20 20 12 Q21 6 20 3"></path><ellipse cx="4" cy="2.5" rx="3.2" ry="1.6" fill="#6B1515" opacity="0.88"></ellipse><ellipse cx="20" cy="2.5" rx="3.2" ry="1.6" fill="#6B1515" opacity="0.88"></ellipse></g></svg></div><div style="position:absolute;top:74%;left:90%;width:22px;height:46px;transform:rotate(22deg)"><svg viewBox="0 0 32 60" class="stigmaAnim1_X9QU" style="width:100%;height:100%;overflow:visible;opacity:0.5"><defs><linearGradient id="bundle-grad-vt2ql-1" x1="0%" y1="100%" x2="0%" y2="0%"><stop offset="0%" stop-color="#E8A832"></stop><stop offset="40%" stop-color="#C65D3B"></stop><stop offset="75%" stop-color="#8B1E1E"></stop><stop offset="100%" stop-color="#6B1515"></stop></linearGradient><linearGradient id="bundle-grad-vt2ql-2" x1="0%" y1="100%" x2="0%" y2="0%"><stop offset="0%" stop-color="#D4912A"></stop><stop offset="35%" stop-color="#B54E32"></stop><stop offset="70%" stop-color="#7A1A1A"></stop><stop offset="100%" stop-color="#5A1010"></stop></linearGradient></defs><g transform=""><path fill="none" stroke="url(#bundle-grad-vt2ql-1)" stroke-width="2" stroke-linecap="round" d="M16 58 Q14 48 12 38 Q9 26 6 16 Q4 8 5 4"></path><path fill="none" stroke="url(#bundle-grad-vt2ql-2)" stroke-width="2.2" stroke-linecap="round" d="M16 58 Q16 46 16 34 Q16 22 16 12 Q16 6 16 2"></path><path fill="none" stroke="url(#bundle-grad-vt2ql-1)" stroke-width="2" stroke-linecap="round" d="M16 58 Q18 48 20 38 Q23 26 26 16 Q28 8 27 4"></path><ellipse cx="5" cy="3" rx="3.5" ry="1.8" fill="#6B1515" opacity="0.85"></ellipse><ellipse cx="16" cy="1.5" rx="4" ry="2" fill="#5A1010" opacity="0.9"></ellipse><ellipse cx="27" cy="3" rx="3.5" ry="1.8" fill="#6B1515" opacity="0.85"></ellipse></g></svg></div><div style="position:absolute;top:12%;left:78%;width:13px;height:36px;transform:rotate(-45deg)"><svg viewBox="0 0 20 56" class="stigmaAnim2_bVb4" style="width:100%;height:100%;overflow:visible;opacity:0.32"><defs><linearGradient id="saffron-grad-2-fknyb" x1="0%" y1="100%" x2="0%" y2="0%"><stop offset="0%" stop-color="#E8A832"></stop><stop offset="35%" stop-color="#C65D3B"></stop><stop offset="70%" stop-color="#8B1E1E"></stop><stop offset="100%" stop-color="#6B1515"></stop></linearGradient></defs><g transform="translate(20,0) scale(-1,1)"><path fill="none" stroke="url(#saffron-grad-2-fknyb)" stroke-width="2.2" stroke-linecap="round" d="M10 52 Q8 40 9 30 Q10 20 9 12 Q8 6 10 2"></path><ellipse cx="10" cy="2" rx="4" ry="2" fill="#6B1515" opacity="0.9"></ellipse><path fill="none" stroke="#5A1212" stroke-width="0.8" stroke-linecap="round" opacity="0.6" d="M6 2 Q8 0 10 1 Q12 0 14 2"></path></g></svg></div><div style="position:absolute;top:35%;left:82%;width:15px;height:40px;transform:rotate(8deg)"><svg viewBox="0 0 20 56" class="stigmaAnim3_XTsE" style="width:100%;height:100%;overflow:visible;opacity:0.3"><defs><linearGradient id="saffron-grad-0-uhvjv" x1="0%" y1="100%" x2="0%" y2="0%"><stop offset="0%" stop-color="#E8A832"></stop><stop offset="35%" stop-color="#C65D3B"></stop><stop offset="70%" stop-color="#8B1E1E"></stop><stop offset="100%" stop-color="#6B1515"></stop></linearGradient></defs><g transform=""><path fill="none" stroke="url(#saffron-grad-0-uhvjv)" stroke-width="2.2" stroke-linecap="round" d="M10 52 Q9 42 8 32 Q7 22 8 14 Q9 8 10 4"></path><ellipse cx="10" cy="2" rx="4" ry="2" fill="#6B1515" opacity="0.9"></ellipse><path fill="none" stroke="#5A1212" stroke-width="0.8" stroke-linecap="round" opacity="0.6" d="M6 2 Q8 0 10 1 Q12 0 14 2"></path></g></svg></div></div><div class="heroContent_lEzW"><h1 class="heroTitle_T1bh"><p>DMS <span class="gradientText_Gjtq">1.4</span></p></h1><p class="heroSubtitle_KPzJ">Saffron Bloom</p></div></div>
<p>We're excited to announce DankMaterialShell (DMS) 1.4 "Saffron Bloom"! This release introduces a brand new launcher, numerous improvements to the plugin system which enables GIFs, KDE Connect, Clight, and a lot of new possibilities for extending DMS features and capabilities.</p>
<!-- -->
<div class="statsGrid_Njs2" style="grid-template-columns:repeat(2, 1fr);max-width:600px"><div class="statCard_rAG6"><span class="statNumber_YF2q">3,100+</span><span class="statLabel_Fdtb">Commits</span></div><div class="statCard_rAG6"><span class="statNumber_YF2q">4.3k+</span><span class="statLabel_Fdtb">GitHub Stars</span></div><div class="statCard_rAG6"><span class="statNumber_YF2q">130+</span><span class="statLabel_Fdtb">Contributors</span></div><div class="statCard_rAG6"><span class="statNumber_YF2q">70</span><span class="statLabel_Fdtb">Plugins</span></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="dank-launcher-v2">Dank Launcher V2<a href="https://duxlabs.dev/blog/v1-4-release#dank-launcher-v2" class="hash-link" aria-label="Direct link to Dank Launcher V2" title="Direct link to Dank Launcher V2" translate="no">​</a></h2>
<figure style="text-align:center"><img src="https://duxlabs.dev/img/blog/v1.4/launcher_light.png" alt="Dank Launcher V2" class="themedComponent_mlkZ themedComponent--light_NVdE" style="max-width:500px;width:100%"><img src="https://duxlabs.dev/img/blog/v1.4/launcher_dark.png" alt="Dank Launcher V2" class="themedComponent_mlkZ themedComponent--dark_xIcU" style="max-width:500px;width:100%"><figcaption>The new Dank Launcher V2 with tiled layout and plugin integrations.</figcaption></figure>
<p>DMS 1.4 introduces a new vicinae-inspired launcher, with many more options, tighter extension integrations, better performance, configurable tab-actions, new tiled layout option, and numerous new first-party plugins including GIF and Sticker searchs.</p>
<ul>
<li class="">Plugins can define context menu and custom tab actions, shift+enter action (such as paste-and-close), and new types of results such as animated images.</li>
<li class="">New tiled layout option for the launcher.</li>
<li class="">New first-party plugins including GIF and Sticker search.</li>
<li class="">Hide or show any extension from "all" tab, change priority-order, keep custom triggers, and configure more launcher options in DMS settings.</li>
<li class="">Edit launch options, environment, or hide entries inline from the launcher.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="kde-connectvalent-phone-connect-and-clight-integration">KDE Connect+Valent (Phone Connect), and Clight Integration<a href="https://duxlabs.dev/blog/v1-4-release#kde-connectvalent-phone-connect-and-clight-integration" class="hash-link" aria-label="Direct link to KDE Connect+Valent (Phone Connect), and Clight Integration" title="Direct link to KDE Connect+Valent (Phone Connect), and Clight Integration" translate="no">​</a></h2>
<p>DMS v1.4 exposes a dbus client that enables plugins to interact with dbus services natively, which has enabled the development of KDE Connect+Valent and Clight plugins.</p>
<figure style="text-align:center"><img src="https://duxlabs.dev/img/blog/v1.4/kdeconnect_light.png" alt="KDE Connect and Valent integration" class="themedComponent_mlkZ themedComponent--light_NVdE" style="max-width:500px;width:100%"><img src="https://duxlabs.dev/img/blog/v1.4/kdeconnect_dark.png" alt="KDE Connect and Valent integration" class="themedComponent_mlkZ themedComponent--dark_xIcU" style="max-width:500px;width:100%"><figcaption>Phone Connect via KDE Connect / Valent.</figcaption></figure>
<p><a href="https://github.com/duxlabs-dev/dux-plugins/tree/master/DankKDEConnect" target="_blank" rel="noopener noreferrer" class="">Phone Connect</a> plugin allows you to connect to your phone via KDE Connect or Valent (gnome-based equivalent) directly from DMS. Receive notifications, send and receive files, synchronize clipboard, view phone battery percentage in the bar, and more.</p>
<p><a href="https://github.com/duxlabs-dev/dux-plugins/tree/master/DankClight" target="_blank" rel="noopener noreferrer" class="">Clight</a> plugin gives integration with <a href="https://github.com/FedeDP/Clight" target="_blank" rel="noopener noreferrer" class="">Clight</a> which is an auto-brightness daemon.</p>
<p>The new dbus client allows creating an entirely new category of plugins that can interact with any dbus service, which opens up a huge range of possibilities for extensions that need to integrate with other applications and system services - in an efficient, event-driven way.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-process-listsystem-monitor">New Process List/System Monitor<a href="https://duxlabs.dev/blog/v1-4-release#new-process-listsystem-monitor" class="hash-link" aria-label="Direct link to New Process List/System Monitor" title="Direct link to New Process List/System Monitor" translate="no">​</a></h2>
<figure style="text-align:center"><img src="https://duxlabs.dev/img/blog/v1.4/sysmon_light.png" alt="New System Monitor" class="themedComponent_mlkZ themedComponent--light_NVdE" style="max-width:500px;width:100%"><img src="https://duxlabs.dev/img/blog/v1.4/sysmon_dark.png" alt="New System Monitor" class="themedComponent_mlkZ themedComponent--dark_xIcU" style="max-width:500px;width:100%"><figcaption>The new built-in System Monitor with process list.</figcaption></figure>
<p>The <a href="https://duxlabs.dev/docs/dgop/" target="_blank" rel="noopener noreferrer" class="">dgop</a> frontend/process monitor has gotten an overhaul with a new, more functional design. Integrated search, full command view, and more relevant information in a single view.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="window-rule-manager-niri-only">Window Rule Manager (niri-only)<a href="https://duxlabs.dev/blog/v1-4-release#window-rule-manager-niri-only" class="hash-link" aria-label="Direct link to Window Rule Manager (niri-only)" title="Direct link to Window Rule Manager (niri-only)" translate="no">​</a></h2>
<p>niri users can now manage window rules directly from DMS. An optional keybind can be used <code>dms ipc call window-rules toggle</code> to create a rule for the currently focused window. All rules can be re-ordered, edited, and managed from DMS settings.</p>
<figure style="text-align:center"><div style="display:flex;gap:1rem;justify-content:center;align-items:start"><div style="flex:1.4;min-width:0"><img src="https://duxlabs.dev/img/blog/v1.4/windowrulesettings_light.png" alt="Window Rules settings" class="themedComponent_mlkZ themedComponent--light_NVdE" style="width:100%;border-radius:8px"><img src="https://duxlabs.dev/img/blog/v1.4/windowrulesettings_dark.png" alt="Window Rules settings" class="themedComponent_mlkZ themedComponent--dark_xIcU" style="width:100%;border-radius:8px"></div><div style="flex:1;min-width:0"><img src="https://duxlabs.dev/img/blog/v1.4/windowrulemodal_light.png" alt="New Window Rule modal" class="themedComponent_mlkZ themedComponent--light_NVdE" style="width:100%;border-radius:8px"><img src="https://duxlabs.dev/img/blog/v1.4/windowrulemodal_dark.png" alt="New Window Rule modal" class="themedComponent_mlkZ themedComponent--dark_xIcU" style="width:100%;border-radius:8px"></div></div><figcaption>Window Rules settings and the rule creation modal.</figcaption></figure>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="dock-enhancements--dank-bar-dock-widget">Dock Enhancements &amp; Dank Bar Dock Widget<a href="https://duxlabs.dev/blog/v1-4-release#dock-enhancements--dank-bar-dock-widget" class="hash-link" aria-label="Direct link to Dock Enhancements &amp; Dank Bar Dock Widget" title="Direct link to Dock Enhancements &amp; Dank Bar Dock Widget" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="intelligent-auto-hide">Intelligent Auto-Hide<a href="https://duxlabs.dev/blog/v1-4-release#intelligent-auto-hide" class="hash-link" aria-label="Direct link to Intelligent Auto-Hide" title="Direct link to Intelligent Auto-Hide" translate="no">​</a></h3>
<p>The dock can now auto-hide itself only when floating windows overlap its area, and reveal when they don't. You get the screen space back when you need it without losing quick access.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dank-bar-apps-dock-widget">Dank Bar Apps Dock Widget<a href="https://duxlabs.dev/blog/v1-4-release#dank-bar-apps-dock-widget" class="hash-link" aria-label="Direct link to Dank Bar Apps Dock Widget" title="Direct link to Dank Bar Apps Dock Widget" translate="no">​</a></h3>
<figure style="text-align:center"><img src="https://duxlabs.dev/img/blog/v1.4/dms_apps_dock_widget_light.png" alt="Dank Bar Apps Dock Widget settings" class="themedComponent_mlkZ themedComponent--light_NVdE" style="max-width:500px;width:100%"><img src="https://duxlabs.dev/img/blog/v1.4/dms_apps_dock_widget_dark.png" alt="Dank Bar Apps Dock Widget settings" class="themedComponent_mlkZ themedComponent--dark_xIcU" style="max-width:500px;width:100%"><figcaption>Configure the standalone Apps Dock widget with overflow options and visual effects.</figcaption></figure>
<p>New Apps Dock widget for Dank Bar — a standalone dock embedded directly in the bar. If you prefer a panel-only workflow without the full dock, this gives you pinned and running apps right in your bar.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="max-pinned--running-apps-with-overflow">Max Pinned &amp; Running Apps with Overflow<a href="https://duxlabs.dev/blog/v1-4-release#max-pinned--running-apps-with-overflow" class="hash-link" aria-label="Direct link to Max Pinned &amp; Running Apps with Overflow" title="Direct link to Max Pinned &amp; Running Apps with Overflow" translate="no">​</a></h3>
<figure style="text-align:center"><img src="https://duxlabs.dev/img/blog/v1.4/dms_dock_pinned_running_apps_light.png" alt="Dock overflow and behavior settings" class="themedComponent_mlkZ themedComponent--light_NVdE" style="max-width:500px;width:100%"><img src="https://duxlabs.dev/img/blog/v1.4/dms_dock_pinned_running_apps_dark.png" alt="Dock overflow and behavior settings" class="themedComponent_mlkZ themedComponent--dark_xIcU" style="max-width:500px;width:100%"><figcaption>New dock behavior controls including max apps and overflow settings.</figcaption></figure>
<p>You can now set max counts for pinned and running apps separately. Anything beyond the limit collapses into an expandable overflow area with a badge count. Works on both the main dock and the new Apps Dock widget.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="audio-device-aliases">Audio Device Aliases<a href="https://duxlabs.dev/blog/v1-4-release#audio-device-aliases" class="hash-link" aria-label="Direct link to Audio Device Aliases" title="Direct link to Audio Device Aliases" translate="no">​</a></h2>
<figure style="text-align:center"><img src="https://duxlabs.dev/img/blog/v1.4/audio_device_aliases_light.png" alt="Audio Device Aliases" class="themedComponent_mlkZ themedComponent--light_NVdE" style="max-width:600px;width:100%"><img src="https://duxlabs.dev/img/blog/v1.4/audio_device_aliases_dark.png" alt="Audio Device Aliases" class="themedComponent_mlkZ themedComponent--dark_xIcU" style="max-width:600px;width:100%"><figcaption>Rename, hide and (optionally) amplify audio devices directly from DMS.</figcaption></figure>
<p>Built-in Audio Device Aliases powered by WirePlumber. Rename any input or output from Audio Settings, hide devices you never use, and if needed — push a device above 100% temporarily. Original names are kept so you can always revert.</p>
<ul>
<li class=""><strong>Rename devices:</strong> Give your devices actual useful names. Original hardware names are preserved.</li>
<li class=""><strong>Hide devices:</strong> Get rid of unused or duplicate entries cluttering your lists.</li>
<li class=""><strong>Amplify beyond 100%:</strong> Bump max volume when you need it. <strong>Note:</strong> excessive amplification may cause distortion or hardware issues, use with caution.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="automatic-light-and-dark-mode">Automatic Light and Dark Mode<a href="https://duxlabs.dev/blog/v1-4-release#automatic-light-and-dark-mode" class="hash-link" aria-label="Direct link to Automatic Light and Dark Mode" title="Direct link to Automatic Light and Dark Mode" translate="no">​</a></h2>
<figure style="text-align:center"><img src="https://duxlabs.dev/img/blog/v1.4/automatic_light_dark_mode_light.png" alt="Automatic Light and Dark Mode" class="themedComponent_mlkZ themedComponent--light_NVdE" style="max-width:700px;width:100%"><img src="https://duxlabs.dev/img/blog/v1.4/automatic_light_dark_mode_dark.png" alt="Automatic Light and Dark Mode" class="themedComponent_mlkZ themedComponent--dark_xIcU" style="max-width:700px;width:100%"><figcaption>Automatic theming with time and location-based transitions, plus Gamma Control sync.</figcaption></figure>
<p>Your desktop theme can now switch between light and dark automatically. Set a simple time schedule, or let DMS figure it out from your location (manual coordinates or IP-based). Location mode shows a preview of when the next transition will happen.</p>
<ul>
<li class=""><strong>Time-based mode:</strong> Set sunrise/sunset or custom times.</li>
<li class=""><strong>Location-based mode:</strong> Manual coordinates or IP geolocation to calculate local sunrise/sunset.</li>
<li class=""><strong>Gamma Control sync:</strong> Tie it into DMS Gamma Control Night Mode so color temperature, brightness, and theme all switch together.</li>
<li class=""><strong>Quick override:</strong> Force light or dark from the Appearance menu anytime; automatic rules kick back in after.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="notification-enhancements">Notification Enhancements<a href="https://duxlabs.dev/blog/v1-4-release#notification-enhancements" class="hash-link" aria-label="Direct link to Notification Enhancements" title="Direct link to Notification Enhancements" translate="no">​</a></h2>
<figure style="text-align:center"><div style="display:flex;gap:1rem;justify-content:center;align-items:start"><div style="flex:1;min-width:0"><img src="https://duxlabs.dev/img/blog/v1.4/notification_toast_light.png" alt="Notification Toasts" class="themedComponent_mlkZ themedComponent--light_NVdE" style="width:100%;border-radius:8px"><img src="https://duxlabs.dev/img/blog/v1.4/notification_toast_dark.png" alt="Notification Toasts" class="themedComponent_mlkZ themedComponent--dark_xIcU" style="width:100%;border-radius:8px"></div><div style="flex:1;min-width:0"><img src="https://duxlabs.dev/img/blog/v1.4/notification_center_light.png" alt="Notification Center" class="themedComponent_mlkZ themedComponent--light_NVdE" style="width:100%;border-radius:8px"><img src="https://duxlabs.dev/img/blog/v1.4/notification_center_dark.png" alt="Notification Center" class="themedComponent_mlkZ themedComponent--dark_xIcU" style="width:100%;border-radius:8px"></div></div><figcaption>Notification toasts (left) and the redesigned Notification Center (right).</figcaption></figure>
<p>Notifications got a visual overhaul based on Material 3 Expressive — new shadows, motion, and overall feel. The notification center and toasts both look and behave better.</p>
<p>What's new:</p>
<ul>
<li class=""><strong>Independent animation speed:</strong> Notification animations are now separate from global UI motion, so you can make them snappier or slower without touching everything else.</li>
<li class=""><strong>Privacy mode:</strong> Hide message content by default (shows sender and app only), click to reveal. Useful if you share your screen or just want less distraction.</li>
<li class=""><strong>Right-click actions:</strong> Right-click any notification to Mute the source, Create a rule, or Dismiss. Works on both toasts and in the Notification Center.</li>
</ul>
<p>More updates to come!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="miracle-wm-support">Miracle WM Support<a href="https://duxlabs.dev/blog/v1-4-release#miracle-wm-support" class="hash-link" aria-label="Direct link to Miracle WM Support" title="Direct link to Miracle WM Support" translate="no">​</a></h2>
<div style="display:flex;align-items:center;gap:1rem;margin-bottom:1rem"><img src="https://duxlabs.dev/img/miraclewm.svg" alt="Miracle WM" style="width:64px;height:64px"><span style="font-size:1.1em"><p><a href="https://miracle-wm.org/">Miracle WM</a> is now a supported compositor.</p></span></div>
<p>DMS 1.4 brings full support for <a href="https://miracle-wm.org/" target="_blank" rel="noopener noreferrer" class="">Miracle WM</a>, including keybind cheatsheets, idle monitor integration, workspace switcher, and the rest of the core DMS feature.</p>
<p>This is ahead of the upcoming Fedora 44 release which will include a <a href="https://www.phoronix.com/news/Fedora-44-Dank-MiracleWM" target="_blank" rel="noopener noreferrer" class="">Dank Miracle spin</a>, so Miracle WM users on Fedora will have DMS available out of the box.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="available-distributions">Available Distributions<a href="https://duxlabs.dev/blog/v1-4-release#available-distributions" class="hash-link" aria-label="Direct link to Available Distributions" title="Direct link to Available Distributions" translate="no">​</a></h2>
<div class="distroMashup_tKN_"><div class="distroOrbit_E56i"><img src="https://duxlabs.dev/img/path32.svg" alt="DMS" class="distroCenterLogo_nDHb"><div class="distroLogo_vqwu"><img src="https://duxlabs.dev/img/distros/arch.svg" alt="Arch Linux"></div><div class="distroLogo_vqwu"><img src="https://duxlabs.dev/img/distros/fedora.svg" alt="Fedora"></div><div class="distroLogo_vqwu"><img src="https://duxlabs.dev/img/distros/suse.svg" alt="openSUSE"></div><div class="distroLogo_vqwu"><img src="https://duxlabs.dev/img/distros/debian.svg" alt="Debian"></div><div class="distroLogo_vqwu"><img src="https://duxlabs.dev/img/distros/ubuntu.svg" alt="Ubuntu"></div><div class="distroLogo_vqwu"><img src="https://duxlabs.dev/img/distros/CentOS_color_logo.svg" alt="CentOS"></div><div class="distroLogo_vqwu"><img src="https://duxlabs.dev/img/distros/NixOS.svg" alt="NixOS"></div><div class="distroLogo_vqwu"><img src="https://duxlabs.dev/img/gentoo-logo.svg" alt="Gentoo"></div></div></div>
<p>DMS is available for Arch Linux, Fedora, openSUSE, Debian, Ubuntu, CentOS, NixOS, Gentoo, and more. Gentoo users have three community overlays to choose from: <a href="https://github.com/Graght/quilat-overlay" target="_blank" rel="noopener noreferrer" class="">quilat-overlay</a> (live ebuild tracking git master, OpenRC + systemd), <a href="https://github.com/timdodge/tdgentoo" target="_blank" rel="noopener noreferrer" class="">tdgentoo</a> (versioned ebuild pinned to stable releases), and <a href="https://codeberg.org/dacyberduck/gentoo-overlay" target="_blank" rel="noopener noreferrer" class="">dacyberduck</a> (<code>dank-base/dankmaterialshell</code>).</p>
<p>See the <a class="" href="https://duxlabs.dev/docs/getting-started">installation guide</a> for setup instructions.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bug-fixes-and-improvements">Bug Fixes and Improvements<a href="https://duxlabs.dev/blog/v1-4-release#bug-fixes-and-improvements" class="hash-link" aria-label="Direct link to Bug Fixes and Improvements" title="Direct link to Bug Fixes and Improvements" translate="no">​</a></h2>
<details style="border:1px solid rgba(139, 30, 30, 0.3);border-radius:8px;padding:1rem;margin:1.5rem 0;background:linear-gradient(135deg, rgba(139, 30, 30, 0.08) 0%, rgba(232, 168, 50, 0.04) 100%);backdrop-filter:blur(8px)" class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary style="cursor:pointer;font-weight:600;font-size:1.1em;margin-bottom:1rem;user-select:none;padding:0.25rem 0.5rem;border-radius:4px;transition:all 0.2s ease;display:flex;align-items:center;gap:0.5rem;list-style:none" id="bug-fixes-summary">|- View Details (200+ commits) -|</summary><div><div class="collapsibleContent_i85q"><p>Since the v1.2 release, DMS has received extensive bug fixes and stability improvements across all components:</p><p><strong>Launcher V2</strong></p><ul>
<li class="">New aggregated "all" tab with plugin/extension results, quick tab actions, and tile mode</li>
<li class="">Improve search result responsiveness with highlighted matches</li>
<li class="">General performance optimizations including ListView in all tab, filesystem cache for faster first launch</li>
<li class="">De-duplicate cached entries by ID</li>
<li class="">Support async launcher plugins, cached GIFs, and paste-on-action</li>
<li class="">Allow categories in plugins, plugin sort order preference</li>
<li class="">Allow disabling each plugin from "all" mode, add IPCs for toggling specific modes</li>
<li class="">Add visibility guards, micro size option, and view mode persistence</li>
<li class="">Context menu and keyboard navigation improvements</li>
<li class="">Fix hover effect, state reset on section changes, dGPU race condition, and plugin icon handling</li>
<li class="">Support ScreenCopy in tiles and CachingImage in icon renderer</li>
<li class="">Add name, icon, description overrides and hide/unhide options for entries</li>
<li class="">Retire spotlight launcher in favor of Dank Launcher V2</li>
</ul><p><strong>Notifications</strong></p><ul>
<li class="">Refactor notification animations with Material 3 Expressive design</li>
<li class="">Add configurable notification rules</li>
<li class="">Add left/right keyboard navigation to Current/History tabs</li>
<li class="">Cap max animation speed in popout</li>
<li class="">Fix crash in modal and keyboard navigation on history tab close</li>
<li class="">Update dimensions, text expansion logic, and group expansion card animations</li>
<li class="">Handle material icons</li>
<li class="">Tweak toast button padding</li>
</ul><p><strong>Dock &amp; Bar</strong></p><ul>
<li class="">Intelligent dock auto-hide behavior</li>
<li class="">Apps Dock widget for Dank Bar with overflow and configuration options</li>
<li class="">Implement Dank Launcher button on the Dock with custom icons/logos</li>
<li class="">Pinnable DMS core apps with color options</li>
<li class="">Max pinned and running apps with overflow badge count</li>
<li class="">Fix intelligent auto-hide on Hyprland</li>
<li class="">Resolve icons for pre-substituted app IDs</li>
<li class="">Fix option to use custom logos and launcher button persistence</li>
<li class="">Fix spacing at scale of running apps, dock, and system tray</li>
<li class="">Add click-through option for Dank Bar</li>
<li class="">Fix centering of numerous bar widgets</li>
<li class="">Fix property preservation in widgets</li>
<li class="">Enlarge bar icons if widget background is off</li>
<li class="">Account for outlineThickness in margin settings</li>
<li class="">Fix widget context focus with autohide enabled</li>
</ul><p><strong>Clipboard</strong></p><ul>
<li class="">Save pinned clipboard entries with keyboard navigation</li>
<li class="">Add popout variant for clipboard widget</li>
<li class="">Add option to paste on Enter</li>
<li class="">Add <code>cl copy --download</code> option for images/videos with portal file transfer</li>
<li class="">Add <code>watch -m</code> for mime-types</li>
<li class="">Fix row layout overflow, pinned entry logic, hash duplication check</li>
<li class="">Fix file transfer and export functionality with Flatpak read grants</li>
<li class="">Skip <code>application/vnd.portal.filetransfer</code> mime in history</li>
<li class="">React to changes, fix duplicate clear dialog</li>
<li class="">Touch copied history entry to move it to the top</li>
<li class="">Add raw image mime-type to offers in CopyFile</li>
<li class="">Fix watch command</li>
<li class="">Quick context menu for clipboard widget</li>
</ul><p><strong>Themes &amp; Appearance</strong></p><ul>
<li class="">Automatic light and dark mode based on region/time of day with transition time</li>
<li class="">Improve handling of custom themes with variants and accents in light/dark mode</li>
<li class="">Support matugen v4</li>
<li class="">Sync adwaita accent color by visual similarity</li>
<li class="">Add Cosmic light/dark and icon theming support</li>
<li class="">Allow overriding color center theme</li>
<li class="">Fix popup transparency setting and overflow of option button groups</li>
<li class="">Fix emacs template for both light and dark themes</li>
<li class="">Add dank emacs template</li>
<li class="">Fix Zen Browser theme background color in template</li>
<li class="">Fix terminals always dark with custom themes</li>
<li class="">Post-hook reload GTK4 and qt6ct after matugen changes</li>
<li class="">Don't signal terminals when disabled</li>
<li class="">Update dank16 algorithm for smoother gradients</li>
<li class="">Fix Vesktop theme name</li>
</ul><p><strong>Audio &amp; Media</strong></p><ul>
<li class="">Audio device aliases: rename, hide, and amplify devices via WirePlumber</li>
<li class="">Media playback OSD with updated design</li>
<li class="">Add per-device max volume limit setting</li>
<li class="">Configurable volume amount on scroll for media widget</li>
<li class="">Add player-specific MPRIS volume control via IPC</li>
<li class="">Reverse media playback icons and handle screen changes</li>
<li class="">Fix volume OSD sliding UI update for vertical layout</li>
<li class="">Track art: use URLs directly</li>
<li class="">Cava: use input source pipewire and auto, remove input config</li>
</ul><p><strong>Display &amp; Monitor Configuration</strong></p><ul>
<li class="">Support for multiple output profiles with delete/hide disconnected displays</li>
<li class="">Add full screen only option for Hyprland, convert VRR to dropdown</li>
<li class="">Add disable snap option in display settings</li>
<li class="">Fix VRR=0 setting on Hyprland</li>
<li class="">Fix dropped disconnected displays on save</li>
<li class="">Fix preview centering with scaling</li>
<li class="">Update MangoWC display config syntax</li>
</ul><p><strong>Window Rules (niri)</strong></p><ul>
<li class="">Settings UI for creating, editing, deleting, and reordering window rules</li>
<li class="">IPC to create a window rule for the currently focused toplevel</li>
<li class="">Fix checkbox alignment</li>
<li class="">Update default Steam window rules</li>
</ul><p><strong>Animations</strong></p><ul>
<li class="">Material Animation Refactor based on Material 3 Expressive</li>
<li class="">Fine-grained animation settings for modals and popouts</li>
<li class="">Revise ListView animations and tweak list view transitions</li>
<li class="">Switch to frame animation for kinetic scroll</li>
<li class="">Clean up ripple effect and apply more universally</li>
<li class="">Optimize VRAM usage in DankRipple</li>
</ul><p><strong>Process List &amp; System Monitor</strong></p><ul>
<li class="">Overhaul system monitor popout and app with new design</li>
<li class="">Add full keyboard navigation to process list</li>
<li class="">Fix clipped graphs</li>
<li class="">Fix default popout focus and default sort direction</li>
<li class="">Update gauge sizes</li>
<li class="">Disable animations until list is stable</li>
<li class="">Fix Process List popout crash from AppSearch</li>
</ul><p><strong>Workspace</strong></p><ul>
<li class="">Add workspace rename dialog</li>
<li class="">Drag-and-drop workspace reordering for niri</li>
<li class="">Display niri workspace names</li>
<li class="">Fix occupied color override</li>
<li class="">Fix overflow with grouped apps and icons</li>
<li class="">Fix index numbers with show apps on vertical bar with animation</li>
<li class="">Add icon size offset</li>
</ul><p><strong>Settings</strong></p><ul>
<li class="">DankCollapsible component</li>
<li class="">Optimize sidebar bindings and sidebar scaling improvements</li>
<li class="">Settings search index updates</li>
<li class="">Fix wallpaper cycle buttons, theme flavor buttons, power and sleep tab button groups</li>
<li class="">Make dock position match Dank Bar settings</li>
<li class="">Drop beta from configuration label</li>
<li class="">Don't clear caches or apply on startup</li>
<li class="">Fix modal not opening on latest quickshell</li>
</ul><p><strong>Lock Screen &amp; Greeter</strong></p><ul>
<li class="">DMS Greeter sync with niri include settings (cursor, debug, input, options)</li>
<li class="">Fix keyboard layout on Hyprland</li>
<li class="">Add lock at startup action</li>
<li class="">Add disable media player option on lock screen</li>
<li class="">Remove random facts from greeter and lock</li>
<li class="">Add option to hide profile image</li>
<li class="">Fix 12-hour format single digit hours</li>
<li class="">Power off monitors when lock screen activates</li>
<li class="">Add support for Debian greetd user/group name</li>
<li class="">MangoWC and Scroll Greeter support for NixOS</li>
<li class="">Restore baseline configs and fix Cosmic support</li>
<li class="">Add niri override kdl includes</li>
<li class="">Fix greeter directory permissions</li>
</ul><p><strong>Plugins</strong></p><ul>
<li class="">Add plugin state helpers and toggle support with lazy daemon instantiation</li>
<li class="">Give popout customizable header actions</li>
<li class="">Fix reload IPC on failure</li>
<li class="">Ensure daemon plugins not instantiated twice</li>
<li class="">Represent featured plugins in built-in browsers</li>
<li class="">Fix first plugin install reactivity and confirm third-party repo window</li>
</ul><p><strong>niri</strong></p><ul>
<li class="">Expose when-locked, inhibited, repeat options through GUI keybind editor</li>
<li class="">Support any screenshot editor tool</li>
<li class="">Add ensure colors.kdl existence</li>
<li class="">Restore lazy overview spotlight lifecycle to reduce idle VRAM</li>
<li class="">Replace github ref</li>
<li class="">Add screencast indicator</li>
</ul><p><strong>Network &amp; VPN</strong></p><ul>
<li class="">Add support for GlobalProtect VPN using SAML auth flow</li>
<li class="">Simplify connection handling</li>
<li class="">Fix VPN popout and widget tooltip positions</li>
<li class="">Uncheck "save password" by default</li>
</ul><p><strong>Wallpaper</strong></p><ul>
<li class="">Support more image formats with case insensitivity</li>
<li class="">Only pause cycling when screen is locked or active window is fullscreen</li>
<li class="">Fix per-monitor view modes</li>
</ul><p><strong>Keybinds</strong></p><ul>
<li class="">Don't pass dirs in keybinds</li>
<li class="">Fix MangoWC config traversal in provider</li>
</ul><p><strong>Widgets</strong></p><ul>
<li class="">Add button color setting and theme text field selection color</li>
<li class="">Cleanup rectangles across popouts, modals, OSDs</li>
<li class="">Remove double rectangle artifact in popouts</li>
<li class="">Fix cross-monitor handling of widgets</li>
<li class="">Notepad widget with quick context menu, cursor color, and QOL updates</li>
<li class="">Refresh layout on plugin load</li>
<li class="">Add fallback for Steam app widgets</li>
</ul><p><strong>i18n</strong></p><ul>
<li class="">General RTL fixes across settings, about tab, and Dank Bar</li>
<li class="">Capture missing strings and wrap in I18n.tr()</li>
<li class="">Multiple term updates and sync</li>
</ul><p><strong>Core &amp; Backend</strong></p><ul>
<li class="">Add generic DBus service with QML client (subscribe/introspect/getprop/setprop/call)</li>
<li class="">DMS Chroma syntax highlighter for Notepad</li>
<li class="">Set Qt platform to wayland;xcb by default</li>
<li class="">Add DL helper and gsettingsOrDconf helpers</li>
<li class="">Add screensaver introspect XML methods</li>
<li class="">Replace go-localereader directive</li>
<li class="">Add IPC handlers for color picker modal and tray icon control</li>
<li class="">Add toast IPCs</li>
<li class="">Fix DMS chroma hang on print</li>
<li class="">More intelligent Xresources editing for cursor</li>
<li class="">Doctor: add cups-pk-helper, MangoWC, labwc; use DBus for service checks; add --copy option</li>
<li class="">Polkit: allow empty passwords</li>
<li class="">System tray: allow re-ordering items, use id+title as identifier</li>
</ul><p><strong>Compositor Support</strong></p><ul>
<li class="">Add Miracle WM support</li>
<li class="">labwc patch improvements</li>
<li class="">MangoWC and Scroll Greeter support</li>
</ul><p><strong>Build &amp; Distribution</strong></p><ul>
<li class="">Deprecate cliphist dependencies</li>
<li class="">Update NixOS packaging, vendorHash, and home module</li>
<li class="">Support specifying systemd target for NixOS</li>
<li class="">Add qt-imageformats to DMS QML dependencies for NixOS</li>
<li class="">Fix Fedora version format and dynamic versioning</li>
<li class="">Update OBS workflows and Makefile</li>
<li class="">Support XeroLinux via dankinstall</li>
<li class="">Update Go version and golangci-lint in CI</li>
</ul></div></div></details>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="resources">Resources<a href="https://duxlabs.dev/blog/v1-4-release#resources" class="hash-link" aria-label="Direct link to Resources" title="Direct link to Resources" translate="no">​</a></h2>
<a href="https://duxlabs.dev/docs/getting-started" class="getStartedLink_rEwZ"><p>Get Started with DMS <span>→</span></p></a>
<div class="linksRow_XAkh"><a href="https://github.com/duxlabs-dev/dux-shell" class="supportLink_Aqc5">GitHub</a><span class="linkDivider_llaN">•</span><a href="https://duxlabs.dev/docs/" class="supportLink_Aqc5">Documentation</a><span class="linkDivider_llaN">•</span><a href="https://plugins.danklinux.com/" class="supportLink_Aqc5">Plugins</a><span class="linkDivider_llaN">•</span><a href="https://discord.gg/ppWTpKmPgT" class="supportLink_Aqc5">Discord</a><span class="linkDivider_llaN">•</span><a href="https://github.com/sponsors/AvengeMedia" class="supportLink_Aqc5">Sponsor on GitHub</a><span class="linkDivider_llaN">•</span><a href="https://ko-fi.com/duxlabs" class="supportLink_Aqc5">Support on Ko-fi</a></div>
<div class="niriThanks_o1XJ"><img src="https://duxlabs.dev/img/niri.svg" alt="niri"><span>Special thanks to <a href="https://github.com/YaLTeR">YaLTeR</a> for collaborating with the DMS team, for <a href="https://github.com/niri-wm/niri">niri</a> - the compositor that inspired DMS, and for hosting DMS on the <a href="https://discord.gg/ppWTpKmPgT">niri Discord</a>.</span></div>
<div class="thankYouHero_reT6"><div class="confetti_wL7G" aria-hidden="true"></div><div class="heroContent_lEzW"><h2 class="thankYouTitle_ci9O"><p>Thank <span class="gradientText_Gjtq">You</span></p></h2><p class="thankYouText_AswX">To everyone who has supported DMS through feedback, contributions, sponsorships, donations, and packaging.</p><p class="thankYouTagline_sZ4m">Zan, Zendegi, Azadi</p></div></div>]]></content:encoded>
            <category>Release</category>
            <category>Announcement</category>
        </item>
        <item>
            <title><![CDATA[DMS 1.2 "Spicy Miso" Released]]></title>
            <link>https://duxlabs.dev/blog/v1-2-release</link>
            <guid>https://duxlabs.dev/blog/v1-2-release</guid>
            <pubDate>Tue, 13 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[The second major release of DMS]]></description>
            <content:encoded><![CDATA[<div class="blogHero_jhz4"><div class="confetti_yyNY" aria-hidden="true"><div style="position:absolute;top:2%;left:4%;width:34px;height:68px;transform:rotate(-22deg) scale(0.9)"><svg viewBox="0 0 32 64" class="chiliAnim1_LVjX" style="width:100%;height:100%;overflow:visible;opacity:0.35"><g transform="rotate(-5, 16, 10)"><path fill="#2d4a22" d="M14.5 2C14 0 15 -2 17 -2.5C18 -2.7 18.5 -2 18 -1C17.5 0 17 2 16.5 4"></path><path fill="#3a5a2a" d="M11 6C12 5 13 4.5 16 4.5C19 4.5 20 5 21 6C22 7 20 8 18.5 8.5C16.5 9 14.5 9 13 8.5C11.5 8 10 7 11 6Z"></path><path fill="#ef4444" d="M10 6.5C12 5.5 20 5.5 22 6.5C24 9 25 15 24 22C23 28 20 34 15 42C13 45 11 46 10 45C9 44 10 42 12 40C15 35 11 28 9 22C7 16 8 9 10 6.5Z"></path><path fill="rgba(255,255,255,0.15)" d="M11 10C10.5 14 10 22 12 30C12.5 33 13 36 13 36C12 29 13 18 16 10C14.5 10 12 10 11 10Z"></path></g></svg></div><div style="position:absolute;top:5%;left:16%;width:28px;height:56px;transform:rotate(38deg) scale(0.75)"><svg viewBox="0 0 32 64" class="chiliAnim2_o4vn" style="width:100%;height:100%;overflow:visible;opacity:0.28"><g transform="translate(32,0) scale(-1,1) translate(2,0)"><path fill="#2d4a22" d="M13 2C12.5 0 13.5 -2 16 -2.5C17 -2.7 17.5 -2 17 -1C16.5 0 16 2 16 4"></path><path fill="#3a5a2a" d="M10 6C11 5 12 4.5 15 4.5C18 4.5 19 5 20 6C21 7 19 8 17.5 8.5C15.5 9 13.5 9 12 8.5C10.5 8 9 7 10 6Z"></path><path fill="#dc2626" d="M10 6.5C12 5.5 18 5.5 20 6.5C22 8 23 13 22 20C21 28 17 38 10 50C9 52 8 52 7 50C10 40 12 30 11 20C10.5 13 9 8 10 6.5Z"></path><path fill="rgba(255,255,255,0.15)" d="M12 10C11.5 16 12 24 11 32C10.5 36 9 40 9 40C12 30 14 20 16 10C14.5 10 13 10 12 10Z"></path></g></svg></div><div style="position:absolute;top:3%;left:76%;width:30px;height:60px;transform:rotate(-31deg) scale(0.8)"><svg viewBox="0 0 32 64" class="chiliAnim3_f9Y3" style="width:100%;height:100%;overflow:visible;opacity:0.3"><g transform="translate(32,0) scale(-1,1) translate(4,0)"><path fill="#2d4a22" d="M11 3C10.5 1 11.5 -1 14 -1.5C15 -1.7 15.5 -1 15 0C14.5 1 14 3 14 5"></path><path fill="#3a5a2a" d="M8 7C9 6 10 5.5 13 5.5C16 5.5 17 6 18 7C19 8 17 9 15.5 9.5C13.5 10 11.5 10 10 9.5C8.5 9 7 8 8 7Z"></path><path fill="#f97316" d="M8 7.5C10 6.5 16 6.5 18 7.5C20 9 21 14 19 22C17 32 11 42 1 52C0 53 -1 52 0 50C8 40 11 30 10 20C9.5 14 7 9 8 7.5Z"></path><path fill="rgba(255,255,255,0.15)" d="M10 11C9.5 17 10 25 8 33C7 37 5 41 5 41C9 30 12 20 14 11C12.5 11 11 11 10 11Z"></path></g></svg></div><div style="position:absolute;top:6%;left:88%;width:32px;height:64px;transform:rotate(25deg) scale(0.85)"><svg viewBox="0 0 32 64" class="chiliAnim1_LVjX" style="width:100%;height:100%;overflow:visible;opacity:0.32"><g transform="translate(32,0) scale(-1,1) rotate(-5, 16, 10)"><path fill="#2d4a22" d="M14.5 2C14 0 15 -2 17 -2.5C18 -2.7 18.5 -2 18 -1C17.5 0 17 2 16.5 4"></path><path fill="#3a5a2a" d="M11 6C12 5 13 4.5 16 4.5C19 4.5 20 5 21 6C22 7 20 8 18.5 8.5C16.5 9 14.5 9 13 8.5C11.5 8 10 7 11 6Z"></path><path fill="#ef4444" d="M10 6.5C12 5.5 20 5.5 22 6.5C24 9 25 15 24 22C23 28 20 34 15 42C13 45 11 46 10 45C9 44 10 42 12 40C15 35 11 28 9 22C7 16 8 9 10 6.5Z"></path><path fill="rgba(255,255,255,0.15)" d="M11 10C10.5 14 10 22 12 30C12.5 33 13 36 13 36C12 29 13 18 16 10C14.5 10 12 10 11 10Z"></path></g></svg></div><div style="position:absolute;top:18%;left:2%;width:32px;height:64px;transform:rotate(29deg) scale(0.85)"><svg viewBox="0 0 32 64" class="chiliAnim3_f9Y3" style="width:100%;height:100%;overflow:visible;opacity:0.3"><g transform="translate(4,0)"><path fill="#2d4a22" d="M11 3C10.5 1 11.5 -1 14 -1.5C15 -1.7 15.5 -1 15 0C14.5 1 14 3 14 5"></path><path fill="#3a5a2a" d="M8 7C9 6 10 5.5 13 5.5C16 5.5 17 6 18 7C19 8 17 9 15.5 9.5C13.5 10 11.5 10 10 9.5C8.5 9 7 8 8 7Z"></path><path fill="#f97316" d="M8 7.5C10 6.5 16 6.5 18 7.5C20 9 21 14 19 22C17 32 11 42 1 52C0 53 -1 52 0 50C8 40 11 30 10 20C9.5 14 7 9 8 7.5Z"></path><path fill="rgba(255,255,255,0.15)" d="M10 11C9.5 17 10 25 8 33C7 37 5 41 5 41C9 30 12 20 14 11C12.5 11 11 11 10 11Z"></path></g></svg></div><div style="position:absolute;top:38%;left:4%;width:30px;height:60px;transform:rotate(-41deg) scale(0.8)"><svg viewBox="0 0 32 64" class="chiliAnim2_o4vn" style="width:100%;height:100%;overflow:visible;opacity:0.28"><g transform="translate(32,0) scale(-1,1) translate(2,0)"><path fill="#2d4a22" d="M13 2C12.5 0 13.5 -2 16 -2.5C17 -2.7 17.5 -2 17 -1C16.5 0 16 2 16 4"></path><path fill="#3a5a2a" d="M10 6C11 5 12 4.5 15 4.5C18 4.5 19 5 20 6C21 7 19 8 17.5 8.5C15.5 9 13.5 9 12 8.5C10.5 8 9 7 10 6Z"></path><path fill="#dc2626" d="M10 6.5C12 5.5 18 5.5 20 6.5C22 8 23 13 22 20C21 28 17 38 10 50C9 52 8 52 7 50C10 40 12 30 11 20C10.5 13 9 8 10 6.5Z"></path><path fill="rgba(255,255,255,0.15)" d="M12 10C11.5 16 12 24 11 32C10.5 36 9 40 9 40C12 30 14 20 16 10C14.5 10 13 10 12 10Z"></path></g></svg></div><div style="position:absolute;top:58%;left:2%;width:34px;height:68px;transform:rotate(17deg) scale(0.9)"><svg viewBox="0 0 32 64" class="chiliAnim1_LVjX" style="width:100%;height:100%;overflow:visible;opacity:0.32"><g transform="rotate(-5, 16, 10)"><path fill="#2d4a22" d="M14.5 2C14 0 15 -2 17 -2.5C18 -2.7 18.5 -2 18 -1C17.5 0 17 2 16.5 4"></path><path fill="#3a5a2a" d="M11 6C12 5 13 4.5 16 4.5C19 4.5 20 5 21 6C22 7 20 8 18.5 8.5C16.5 9 14.5 9 13 8.5C11.5 8 10 7 11 6Z"></path><path fill="#ef4444" d="M10 6.5C12 5.5 20 5.5 22 6.5C24 9 25 15 24 22C23 28 20 34 15 42C13 45 11 46 10 45C9 44 10 42 12 40C15 35 11 28 9 22C7 16 8 9 10 6.5Z"></path><path fill="rgba(255,255,255,0.15)" d="M11 10C10.5 14 10 22 12 30C12.5 33 13 36 13 36C12 29 13 18 16 10C14.5 10 12 10 11 10Z"></path></g></svg></div><div style="position:absolute;top:75%;left:5%;width:28px;height:56px;transform:rotate(-33deg) scale(0.75)"><svg viewBox="0 0 32 64" class="chiliAnim3_f9Y3" style="width:100%;height:100%;overflow:visible;opacity:0.25"><g transform="translate(32,0) scale(-1,1) translate(4,0)"><path fill="#2d4a22" d="M11 3C10.5 1 11.5 -1 14 -1.5C15 -1.7 15.5 -1 15 0C14.5 1 14 3 14 5"></path><path fill="#3a5a2a" d="M8 7C9 6 10 5.5 13 5.5C16 5.5 17 6 18 7C19 8 17 9 15.5 9.5C13.5 10 11.5 10 10 9.5C8.5 9 7 8 8 7Z"></path><path fill="#f97316" d="M8 7.5C10 6.5 16 6.5 18 7.5C20 9 21 14 19 22C17 32 11 42 1 52C0 53 -1 52 0 50C8 40 11 30 10 20C9.5 14 7 9 8 7.5Z"></path><path fill="rgba(255,255,255,0.15)" d="M10 11C9.5 17 10 25 8 33C7 37 5 41 5 41C9 30 12 20 14 11C12.5 11 11 11 10 11Z"></path></g></svg></div><div style="position:absolute;top:28%;left:12%;width:26px;height:52px;transform:rotate(47deg) scale(0.7)"><svg viewBox="0 0 32 64" class="chiliAnim1_LVjX" style="width:100%;height:100%;overflow:visible;opacity:0.18"><g transform="translate(2,0)"><path fill="#2d4a22" d="M13 2C12.5 0 13.5 -2 16 -2.5C17 -2.7 17.5 -2 17 -1C16.5 0 16 2 16 4"></path><path fill="#3a5a2a" d="M10 6C11 5 12 4.5 15 4.5C18 4.5 19 5 20 6C21 7 19 8 17.5 8.5C15.5 9 13.5 9 12 8.5C10.5 8 9 7 10 6Z"></path><path fill="#dc2626" d="M10 6.5C12 5.5 18 5.5 20 6.5C22 8 23 13 22 20C21 28 17 38 10 50C9 52 8 52 7 50C10 40 12 30 11 20C10.5 13 9 8 10 6.5Z"></path><path fill="rgba(255,255,255,0.15)" d="M12 10C11.5 16 12 24 11 32C10.5 36 9 40 9 40C12 30 14 20 16 10C14.5 10 13 10 12 10Z"></path></g></svg></div><div style="position:absolute;top:65%;left:10%;width:24px;height:48px;transform:rotate(-28deg) scale(0.65)"><svg viewBox="0 0 32 64" class="chiliAnim2_o4vn" style="width:100%;height:100%;overflow:visible;opacity:0.15"><g transform="translate(32,0) scale(-1,1) rotate(-5, 16, 10)"><path fill="#2d4a22" d="M14.5 2C14 0 15 -2 17 -2.5C18 -2.7 18.5 -2 18 -1C17.5 0 17 2 16.5 4"></path><path fill="#3a5a2a" d="M11 6C12 5 13 4.5 16 4.5C19 4.5 20 5 21 6C22 7 20 8 18.5 8.5C16.5 9 14.5 9 13 8.5C11.5 8 10 7 11 6Z"></path><path fill="#f97316" d="M10 6.5C12 5.5 20 5.5 22 6.5C24 9 25 15 24 22C23 28 20 34 15 42C13 45 11 46 10 45C9 44 10 42 12 40C15 35 11 28 9 22C7 16 8 9 10 6.5Z"></path><path fill="rgba(255,255,255,0.15)" d="M11 10C10.5 14 10 22 12 30C12.5 33 13 36 13 36C12 29 13 18 16 10C14.5 10 12 10 11 10Z"></path></g></svg></div><div style="position:absolute;top:74%;left:22%;width:30px;height:60px;transform:rotate(-45deg) scale(0.8)"><svg viewBox="0 0 32 64" class="chiliAnim2_o4vn" style="width:100%;height:100%;overflow:visible;opacity:0.28"><g transform="translate(2,0)"><path fill="#2d4a22" d="M13 2C12.5 0 13.5 -2 16 -2.5C17 -2.7 17.5 -2 17 -1C16.5 0 16 2 16 4"></path><path fill="#3a5a2a" d="M10 6C11 5 12 4.5 15 4.5C18 4.5 19 5 20 6C21 7 19 8 17.5 8.5C15.5 9 13.5 9 12 8.5C10.5 8 9 7 10 6Z"></path><path fill="#dc2626" d="M10 6.5C12 5.5 18 5.5 20 6.5C22 8 23 13 22 20C21 28 17 38 10 50C9 52 8 52 7 50C10 40 12 30 11 20C10.5 13 9 8 10 6.5Z"></path><path fill="rgba(255,255,255,0.15)" d="M12 10C11.5 16 12 24 11 32C10.5 36 9 40 9 40C12 30 14 20 16 10C14.5 10 13 10 12 10Z"></path></g></svg></div><div style="position:absolute;top:78%;left:42%;width:26px;height:52px;transform:rotate(35deg) scale(0.7)"><svg viewBox="0 0 32 64" class="chiliAnim1_LVjX" style="width:100%;height:100%;overflow:visible;opacity:0.22"><g transform="translate(32,0) scale(-1,1) translate(4,0)"><path fill="#2d4a22" d="M11 3C10.5 1 11.5 -1 14 -1.5C15 -1.7 15.5 -1 15 0C14.5 1 14 3 14 5"></path><path fill="#3a5a2a" d="M8 7C9 6 10 5.5 13 5.5C16 5.5 17 6 18 7C19 8 17 9 15.5 9.5C13.5 10 11.5 10 10 9.5C8.5 9 7 8 8 7Z"></path><path fill="#ef4444" d="M8 7.5C10 6.5 16 6.5 18 7.5C20 9 21 14 19 22C17 32 11 42 1 52C0 53 -1 52 0 50C8 40 11 30 10 20C9.5 14 7 9 8 7.5Z"></path><path fill="rgba(255,255,255,0.15)" d="M10 11C9.5 17 10 25 8 33C7 37 5 41 5 41C9 30 12 20 14 11C12.5 11 11 11 10 11Z"></path></g></svg></div><div style="position:absolute;top:75%;left:58%;width:28px;height:56px;transform:rotate(-19deg) scale(0.75)"><svg viewBox="0 0 32 64" class="chiliAnim3_f9Y3" style="width:100%;height:100%;overflow:visible;opacity:0.25"><g transform="rotate(-5, 16, 10)"><path fill="#2d4a22" d="M14.5 2C14 0 15 -2 17 -2.5C18 -2.7 18.5 -2 18 -1C17.5 0 17 2 16.5 4"></path><path fill="#3a5a2a" d="M11 6C12 5 13 4.5 16 4.5C19 4.5 20 5 21 6C22 7 20 8 18.5 8.5C16.5 9 14.5 9 13 8.5C11.5 8 10 7 11 6Z"></path><path fill="#f97316" d="M10 6.5C12 5.5 20 5.5 22 6.5C24 9 25 15 24 22C23 28 20 34 15 42C13 45 11 46 10 45C9 44 10 42 12 40C15 35 11 28 9 22C7 16 8 9 10 6.5Z"></path><path fill="rgba(255,255,255,0.15)" d="M11 10C10.5 14 10 22 12 30C12.5 33 13 36 13 36C12 29 13 18 16 10C14.5 10 12 10 11 10Z"></path></g></svg></div><div style="position:absolute;top:72%;left:75%;width:30px;height:60px;transform:rotate(42deg) scale(0.8)"><svg viewBox="0 0 32 64" class="chiliAnim2_o4vn" style="width:100%;height:100%;overflow:visible;opacity:0.28"><g transform="translate(32,0) scale(-1,1) translate(2,0)"><path fill="#2d4a22" d="M13 2C12.5 0 13.5 -2 16 -2.5C17 -2.7 17.5 -2 17 -1C16.5 0 16 2 16 4"></path><path fill="#3a5a2a" d="M10 6C11 5 12 4.5 15 4.5C18 4.5 19 5 20 6C21 7 19 8 17.5 8.5C15.5 9 13.5 9 12 8.5C10.5 8 9 7 10 6Z"></path><path fill="#dc2626" d="M10 6.5C12 5.5 18 5.5 20 6.5C22 8 23 13 22 20C21 28 17 38 10 50C9 52 8 52 7 50C10 40 12 30 11 20C10.5 13 9 8 10 6.5Z"></path><path fill="rgba(255,255,255,0.15)" d="M12 10C11.5 16 12 24 11 32C10.5 36 9 40 9 40C12 30 14 20 16 10C14.5 10 13 10 12 10Z"></path></g></svg></div><div style="position:absolute;top:32%;left:82%;width:24px;height:48px;transform:rotate(-38deg) scale(0.65)"><svg viewBox="0 0 32 64" class="chiliAnim3_f9Y3" style="width:100%;height:100%;overflow:visible;opacity:0.15"><g transform="translate(4,0)"><path fill="#2d4a22" d="M11 3C10.5 1 11.5 -1 14 -1.5C15 -1.7 15.5 -1 15 0C14.5 1 14 3 14 5"></path><path fill="#3a5a2a" d="M8 7C9 6 10 5.5 13 5.5C16 5.5 17 6 18 7C19 8 17 9 15.5 9.5C13.5 10 11.5 10 10 9.5C8.5 9 7 8 8 7Z"></path><path fill="#f97316" d="M8 7.5C10 6.5 16 6.5 18 7.5C20 9 21 14 19 22C17 32 11 42 1 52C0 53 -1 52 0 50C8 40 11 30 10 20C9.5 14 7 9 8 7.5Z"></path><path fill="rgba(255,255,255,0.15)" d="M10 11C9.5 17 10 25 8 33C7 37 5 41 5 41C9 30 12 20 14 11C12.5 11 11 11 10 11Z"></path></g></svg></div><div style="position:absolute;top:62%;left:84%;width:26px;height:52px;transform:rotate(31deg) scale(0.7)"><svg viewBox="0 0 32 64" class="chiliAnim1_LVjX" style="width:100%;height:100%;overflow:visible;opacity:0.18"><g transform="translate(32,0) scale(-1,1) rotate(-5, 16, 10)"><path fill="#2d4a22" d="M14.5 2C14 0 15 -2 17 -2.5C18 -2.7 18.5 -2 18 -1C17.5 0 17 2 16.5 4"></path><path fill="#3a5a2a" d="M11 6C12 5 13 4.5 16 4.5C19 4.5 20 5 21 6C22 7 20 8 18.5 8.5C16.5 9 14.5 9 13 8.5C11.5 8 10 7 11 6Z"></path><path fill="#ef4444" d="M10 6.5C12 5.5 20 5.5 22 6.5C24 9 25 15 24 22C23 28 20 34 15 42C13 45 11 46 10 45C9 44 10 42 12 40C15 35 11 28 9 22C7 16 8 9 10 6.5Z"></path><path fill="rgba(255,255,255,0.15)" d="M11 10C10.5 14 10 22 12 30C12.5 33 13 36 13 36C12 29 13 18 16 10C14.5 10 12 10 11 10Z"></path></g></svg></div><div style="position:absolute;top:20%;left:92%;width:32px;height:64px;transform:rotate(-26deg) scale(0.85)"><svg viewBox="0 0 32 64" class="chiliAnim2_o4vn" style="width:100%;height:100%;overflow:visible;opacity:0.3"><g transform="translate(2,0)"><path fill="#2d4a22" d="M13 2C12.5 0 13.5 -2 16 -2.5C17 -2.7 17.5 -2 17 -1C16.5 0 16 2 16 4"></path><path fill="#3a5a2a" d="M10 6C11 5 12 4.5 15 4.5C18 4.5 19 5 20 6C21 7 19 8 17.5 8.5C15.5 9 13.5 9 12 8.5C10.5 8 9 7 10 6Z"></path><path fill="#dc2626" d="M10 6.5C12 5.5 18 5.5 20 6.5C22 8 23 13 22 20C21 28 17 38 10 50C9 52 8 52 7 50C10 40 12 30 11 20C10.5 13 9 8 10 6.5Z"></path><path fill="rgba(255,255,255,0.15)" d="M12 10C11.5 16 12 24 11 32C10.5 36 9 40 9 40C12 30 14 20 16 10C14.5 10 13 10 12 10Z"></path></g></svg></div><div style="position:absolute;top:42%;left:90%;width:30px;height:60px;transform:rotate(37deg) scale(0.8)"><svg viewBox="0 0 32 64" class="chiliAnim1_LVjX" style="width:100%;height:100%;overflow:visible;opacity:0.28"><g transform="translate(32,0) scale(-1,1) rotate(-5, 16, 10)"><path fill="#2d4a22" d="M14.5 2C14 0 15 -2 17 -2.5C18 -2.7 18.5 -2 18 -1C17.5 0 17 2 16.5 4"></path><path fill="#3a5a2a" d="M11 6C12 5 13 4.5 16 4.5C19 4.5 20 5 21 6C22 7 20 8 18.5 8.5C16.5 9 14.5 9 13 8.5C11.5 8 10 7 11 6Z"></path><path fill="#f97316" d="M10 6.5C12 5.5 20 5.5 22 6.5C24 9 25 15 24 22C23 28 20 34 15 42C13 45 11 46 10 45C9 44 10 42 12 40C15 35 11 28 9 22C7 16 8 9 10 6.5Z"></path><path fill="rgba(255,255,255,0.15)" d="M11 10C10.5 14 10 22 12 30C12.5 33 13 36 13 36C12 29 13 18 16 10C14.5 10 12 10 11 10Z"></path></g></svg></div><div style="position:absolute;top:55%;left:93%;width:34px;height:68px;transform:rotate(-21deg) scale(0.9)"><svg viewBox="0 0 32 64" class="chiliAnim3_f9Y3" style="width:100%;height:100%;overflow:visible;opacity:0.32"><g transform="translate(32,0) scale(-1,1) translate(4,0)"><path fill="#2d4a22" d="M11 3C10.5 1 11.5 -1 14 -1.5C15 -1.7 15.5 -1 15 0C14.5 1 14 3 14 5"></path><path fill="#3a5a2a" d="M8 7C9 6 10 5.5 13 5.5C16 5.5 17 6 18 7C19 8 17 9 15.5 9.5C13.5 10 11.5 10 10 9.5C8.5 9 7 8 8 7Z"></path><path fill="#ef4444" d="M8 7.5C10 6.5 16 6.5 18 7.5C20 9 21 14 19 22C17 32 11 42 1 52C0 53 -1 52 0 50C8 40 11 30 10 20C9.5 14 7 9 8 7.5Z"></path><path fill="rgba(255,255,255,0.15)" d="M10 11C9.5 17 10 25 8 33C7 37 5 41 5 41C9 30 12 20 14 11C12.5 11 11 11 10 11Z"></path></g></svg></div><div style="position:absolute;top:73%;left:91%;width:28px;height:56px;transform:rotate(44deg) scale(0.75)"><svg viewBox="0 0 32 64" class="chiliAnim2_o4vn" style="width:100%;height:100%;overflow:visible;opacity:0.25"><g transform="translate(2,0)"><path fill="#2d4a22" d="M13 2C12.5 0 13.5 -2 16 -2.5C17 -2.7 17.5 -2 17 -1C16.5 0 16 2 16 4"></path><path fill="#3a5a2a" d="M10 6C11 5 12 4.5 15 4.5C18 4.5 19 5 20 6C21 7 19 8 17.5 8.5C15.5 9 13.5 9 12 8.5C10.5 8 9 7 10 6Z"></path><path fill="#dc2626" d="M10 6.5C12 5.5 18 5.5 20 6.5C22 8 23 13 22 20C21 28 17 38 10 50C9 52 8 52 7 50C10 40 12 30 11 20C10.5 13 9 8 10 6.5Z"></path><path fill="rgba(255,255,255,0.15)" d="M12 10C11.5 16 12 24 11 32C10.5 36 9 40 9 40C12 30 14 20 16 10C14.5 10 13 10 12 10Z"></path></g></svg></div></div><div class="heroContent_EVvi"><h1 class="heroTitle_j6fj"><p>DMS <span class="gradientText_Yu3r">1.2</span></p></h1><p class="heroSubtitle__CNT">Spicy Miso</p></div></div>
<p>We're excited to announce DankMaterialShell (DMS) 1.2 "Spicy Miso"! This release features numerous new features and major improvements to both the DMS core and plugin system.</p>
<!-- -->
<div class="statsGrid_tkDS" style="grid-template-columns:repeat(2, 1fr);max-width:600px"><div class="statCard_UGe3"><span class="statNumber_plv2">2,800+</span><span class="statLabel_xGOf">Commits</span></div><div class="statCard_UGe3"><span class="statNumber_plv2">3.3k+</span><span class="statLabel_xGOf">GitHub Stars</span></div><div class="statCard_UGe3"><span class="statNumber_plv2">100+</span><span class="statLabel_xGOf">Contributors</span></div><div class="statCard_UGe3"><span class="statNumber_plv2">40</span><span class="statLabel_xGOf">Plugins</span></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-new">What's New<a href="https://duxlabs.dev/blog/v1-2-release#whats-new" class="hash-link" aria-label="Direct link to What's New" title="Direct link to What's New" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="desktop-widgets--plugins">Desktop Widgets &amp; Plugins<a href="https://duxlabs.dev/blog/v1-2-release#desktop-widgets--plugins" class="hash-link" aria-label="Direct link to Desktop Widgets &amp; Plugins" title="Direct link to Desktop Widgets &amp; Plugins" translate="no">​</a></h3>
<p>DMS 1.2 introduces Desktop Widgets - small applets that live on your desktop, below windows and above your wallpaper. Position, resize, and configure them per-display.</p>
<div class="widgetGrid_FbcY"><div class="widgetCard_sGvP"><img src="https://duxlabs.dev/img/blog/v1.2/clock.png" alt="Clock Widget"><div class="widgetInfo_ExLq"><p class="widgetName_ajOz">Clock <span class="widgetBadge_QtoL widgetBadgeBuiltin_Csye">Built-in</span></p><p class="widgetAuthor_cHHg">Analog &amp; digital modes</p></div></div><div class="widgetCard_sGvP"><img src="https://duxlabs.dev/img/blog/v1.2/dgop.png" alt="System Monitor Widget"><div class="widgetInfo_ExLq"><p class="widgetName_ajOz">System Monitor <span class="widgetBadge_QtoL widgetBadgeBuiltin_Csye">Built-in</span></p><p class="widgetAuthor_cHHg">CPU, memory, GPU, temps &amp; more</p></div></div><div class="widgetCard_sGvP"><img src="https://duxlabs.dev/img/blog/v1.2/weather.png" alt="Weather Widget"><div class="widgetInfo_ExLq"><p class="widgetName_ajOz">Weather <span class="widgetBadge_QtoL widgetBadgeCommunity_bToe">Plugin</span></p><p class="widgetAuthor_cHHg">by Avenge Media</p></div></div><div class="widgetCard_sGvP"><img src="https://duxlabs.dev/img/blog/v1.2/mediaplayer.png" alt="Media Player Widget"><div class="widgetInfo_ExLq"><p class="widgetName_ajOz">Media Player <span class="widgetBadge_QtoL widgetBadgeCommunity_bToe">Plugin</span></p><p class="widgetAuthor_cHHg">by Abdur Rahman Rifat</p></div></div><div class="widgetCard_sGvP"><img src="https://duxlabs.dev/img/blog/v1.2/appshortcut.png" alt="App Shortcut Widget"><div class="widgetInfo_ExLq"><p class="widgetName_ajOz">App Shortcuts <span class="widgetBadge_QtoL widgetBadgeCommunity_bToe">Plugin</span></p><p class="widgetAuthor_cHHg">by Omar (@oabragh)</p></div></div><div class="widgetCard_sGvP"><img src="https://duxlabs.dev/img/blog/v1.2/desktopcommand.jpg" alt="Desktop Command Widget"><div class="widgetInfo_ExLq"><p class="widgetName_ajOz">Desktop Command <span class="widgetBadge_QtoL widgetBadgeCommunity_bToe">Plugin</span></p><p class="widgetAuthor_cHHg">by yayuuu</p></div></div></div>
<p>The plugin system makes building your own widgets straightforward - see the <a class="" href="https://duxlabs.dev/docs/dms/plugin-development#desktop-plugins">plugin development guide</a> to get started.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="theme-registry">Theme Registry<a href="https://duxlabs.dev/blog/v1-2-release#theme-registry" class="hash-link" aria-label="Direct link to Theme Registry" title="Direct link to Theme Registry" translate="no">​</a></h3>
<figure style="text-align:center"><img src="https://duxlabs.dev/img/blog/v1.2/themeregistrylight.png" alt="Theme Registry" class="themedComponent_mlkZ themedComponent--light_NVdE" style="max-width:500px;width:100%"><img src="https://duxlabs.dev/img/blog/v1.2/themeregistry.png" alt="Theme Registry" class="themedComponent_mlkZ themedComponent--dark_xIcU" style="max-width:500px;width:100%"><figcaption>Theme browser integrated into DMS settings.</figcaption></figure>
<p>DMS 1.2 introduces a theme system where a single theme can have multiple variants and accent colors. The plugin registry now includes a <a href="https://danklinux.com/plugins?tab=themes" target="_blank" rel="noopener noreferrer" class="">Theme Registry</a> with community-developed themes available for easy installation. Learn how to <a href="https://github.com/duxlabs-dev/dux-plugin-registry/blob/master/CONTRIBUTING.md#contributing-a-theme" target="_blank" rel="noopener noreferrer" class="">contribute your own themes</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="native-clipboard-and-history">Native Clipboard and History<a href="https://duxlabs.dev/blog/v1-2-release#native-clipboard-and-history" class="hash-link" aria-label="Direct link to Native Clipboard and History" title="Direct link to Native Clipboard and History" translate="no">​</a></h3>
<figure style="text-align:center"><img src="https://duxlabs.dev/img/blog/v1.2/clipboardlight.png" alt="Clipboard Settings" class="themedComponent_mlkZ themedComponent--light_NVdE" style="max-width:500px;width:100%"><img src="https://duxlabs.dev/img/blog/v1.2/clipboard.png" alt="Clipboard Settings" class="themedComponent_mlkZ themedComponent--dark_xIcU" style="max-width:500px;width:100%"><figcaption>Configure clipboard history size, entry limits, and auto-cleanup behavior.</figcaption></figure>
<p>Full, zero-dependency clipboard and clipboard history integration.</p>
<ul>
<li class="">No dependency on external tools, such as cliphist or wl-clipboard.</li>
<li class="">Configurable max entry size, retention duration, and automatic cleanup.</li>
<li class="">Search API and CLI with pagination, filtering by text, images, or any mime type.</li>
<li class="">Automatically ignores data from password managers (such as KeepassXC and 1Password). Preventing sensitive data from being stored in the clipboard history.</li>
<li class="">Export &amp; import functionality</li>
<li class="">Migration tool for transferring history from cliphist.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="monitor-configurator">Monitor Configurator<a href="https://duxlabs.dev/blog/v1-2-release#monitor-configurator" class="hash-link" aria-label="Direct link to Monitor Configurator" title="Direct link to Monitor Configurator" translate="no">​</a></h3>
<figure style="text-align:center"><img src="https://duxlabs.dev/img/blog/v1.2/monitorlight.png" alt="Monitor Configuration" class="themedComponent_mlkZ themedComponent--light_NVdE" style="max-width:500px;width:100%"><img src="https://duxlabs.dev/img/blog/v1.2/monitordark.png" alt="Monitor Configuration" class="themedComponent_mlkZ themedComponent--dark_xIcU" style="max-width:500px;width:100%"><figcaption>Configure display settings directly from DMS Settings.</figcaption></figure>
<p>Configure display settings directly from DMS Settings. Available for niri, Hyprland, and MangoWC. Includes positioning, resolution, refresh rate, VRR, full layout customization (niri), HDR (Hyprland), scaling, mirroring (Hyprland), and more.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="notification-improvements">Notification Improvements<a href="https://duxlabs.dev/blog/v1-2-release#notification-improvements" class="hash-link" aria-label="Direct link to Notification Improvements" title="Direct link to Notification Improvements" translate="no">​</a></h3>
<figure style="text-align:center"><img src="https://duxlabs.dev/img/blog/v1.2/notiflight.png" alt="Notification Center" class="themedComponent_mlkZ themedComponent--light_NVdE" style="max-width:400px;width:100%"><img src="https://duxlabs.dev/img/blog/v1.2/notifdark.png" alt="Notification Center" class="themedComponent_mlkZ themedComponent--dark_xIcU" style="max-width:400px;width:100%"><figcaption>Notification center with history and swipe-to-dismiss.</figcaption></figure>
<p>Notifications get several new features and improvements:</p>
<ul>
<li class="">Configurable history with variable size, expirations, and auto-cleanup</li>
<li class="">Gestures to dismiss notifications</li>
<li class="">Ability to display on lock screen (count only, name only, or full content - based on privacy preference)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cursor--layout-configuration">Cursor &amp; Layout Configuration<a href="https://duxlabs.dev/blog/v1-2-release#cursor--layout-configuration" class="hash-link" aria-label="Direct link to Cursor &amp; Layout Configuration" title="Direct link to Cursor &amp; Layout Configuration" translate="no">​</a></h3>
<div style="display:flex;gap:1rem;justify-content:center;flex-wrap:wrap;margin-bottom:1rem;align-items:flex-end"><figure style="text-align:center;margin:0;flex:1 1 300px;max-width:400px"><img src="https://duxlabs.dev/img/blog/v1.2/cursor-control.png" alt="Cursor Control Settings" style="width:100%;border-radius:8px"><figcaption>Cursor theme, size, and behavior settings.</figcaption></figure><figure style="text-align:center;margin:0;flex:1 1 300px;max-width:400px;display:flex;flex-direction:column;justify-content:flex-end"><div style="padding:2rem 1rem;background:var(--ifm-card-background-color);border-radius:8px"><img src="https://duxlabs.dev/img/blog/v1.2/layout.png" alt="Layout Override Settings" style="width:100%;border-radius:4px"></div><figcaption>Override gaps, corner radius, and border size.</figcaption></figure></div>
<p>Customize your compositor settings directly from DMS Settings. Available for niri, Hyprland, and MangoWC:</p>
<ul>
<li class=""><strong>Cursor</strong> - Choose from available cursor themes, adjust size, and configure compositor-specific hiding behavior (hide on typing, hide on touch, inactive timeout)</li>
<li class=""><strong>Gaps</strong> - Adjust gaps around windows</li>
<li class=""><strong>Borders &amp; Corner Radius</strong> - Override theme defaults for window border width and corner radius</li>
<li class=""><strong>Focus Ring</strong> - Customize focus ring color, width, and style</li>
</ul>
<p>Cursor settings are automatically applied to XWayland applications via XResources, ensuring consistent appearance across native Wayland and XWayland apps.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dms-doctor">DMS Doctor<a href="https://duxlabs.dev/blog/v1-2-release#dms-doctor" class="hash-link" aria-label="Direct link to DMS Doctor" title="Direct link to DMS Doctor" translate="no">​</a></h3>
<figure style="text-align:center"><img src="https://duxlabs.dev/img/blog/v1.2/doctorlight.png" alt="DMS Doctor" class="themedComponent_mlkZ themedComponent--light_NVdE" style="max-width:500px;width:100%"><img src="https://duxlabs.dev/img/blog/v1.2/doctordark.png" alt="DMS Doctor" class="themedComponent_mlkZ themedComponent--dark_xIcU" style="max-width:500px;width:100%"><figcaption>System check dialog showing service status and optional features.</figcaption></figure>
<p>New <code>dms doctor</code> command for diagnosing configuration issues and conflicts that may negatively affect DMS feature availability or performance. Also available via DMS GUI.</p>
<p>Shout out to <a href="https://github.com/LuckShiba" target="_blank" rel="noopener noreferrer" class="">@LuckShiba</a> for the contribution!</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="keyboard-shortcuts-editor-for-niri-hyprland--mangowc">Keyboard Shortcuts Editor for niri, Hyprland &amp; MangoWC<a href="https://duxlabs.dev/blog/v1-2-release#keyboard-shortcuts-editor-for-niri-hyprland--mangowc" class="hash-link" aria-label="Direct link to Keyboard Shortcuts Editor for niri, Hyprland &amp; MangoWC" title="Direct link to Keyboard Shortcuts Editor for niri, Hyprland &amp; MangoWC" translate="no">​</a></h3>
<figure style="text-align:center"><img src="https://duxlabs.dev/img/blog/v1.2/bindslight.png" alt="Keyboard Shortcuts" class="themedComponent_mlkZ themedComponent--light_NVdE" style="max-width:500px;width:100%"><img src="https://duxlabs.dev/img/blog/v1.2/bindsdark.png" alt="Keyboard Shortcuts" class="themedComponent_mlkZ themedComponent--dark_xIcU" style="max-width:500px;width:100%"><figcaption>Configure keyboard shortcuts with search, filtering, and conflict detection.</figcaption></figure>
<p>The world famous DMS keyboard shortcuts tool is now available for niri, Hyprland, and MangoWC. Search, edit, and add new keybinds directly from DMS Settings.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="settings-search">Settings Search<a href="https://duxlabs.dev/blog/v1-2-release#settings-search" class="hash-link" aria-label="Direct link to Settings Search" title="Direct link to Settings Search" translate="no">​</a></h3>
<figure style="text-align:center"><img src="https://duxlabs.dev/img/blog/v1.2/searchlight.png" alt="Settings Search" class="themedComponent_mlkZ themedComponent--light_NVdE" style="max-width:280px;width:100%"><img src="https://duxlabs.dev/img/blog/v1.2/searchdark.png" alt="Settings Search" class="themedComponent_mlkZ themedComponent--dark_xIcU" style="max-width:280px;width:100%"><figcaption>Search across all settings to quickly find what you need.</figcaption></figure>
<p>New settings search makes it easier to find what you want to change. Includes integrated launcher search with <code>?</code> by default.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="i18n-rtl-support">i18n: RTL Support<a href="https://duxlabs.dev/blog/v1-2-release#i18n-rtl-support" class="hash-link" aria-label="Direct link to i18n: RTL Support" title="Direct link to i18n: RTL Support" translate="no">​</a></h3>
<figure style="text-align:center"><img src="https://duxlabs.dev/img/blog/v1.2/rtllight.png" alt="RTL Language Support" class="themedComponent_mlkZ themedComponent--light_NVdE" style="max-width:600px;width:100%"><img src="https://duxlabs.dev/img/blog/v1.2/rtldark.png" alt="RTL Language Support" class="themedComponent_mlkZ themedComponent--dark_xIcU" style="max-width:600px;width:100%"><figcaption>DMS Settings displayed in Farsi with full RTL layout support.</figcaption></figure>
<p>DMS 1.2 introduces proper support for right-to-left languages with proper layout mirroring across components. DMS currently has translations for Hebrew and Farsi.</p>
<p>To contribute to translations see the <a href="https://github.com/duxlabs-dev/dux-shell/issues/324" target="_blank" rel="noopener noreferrer" class="">pinned github issue</a></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="launcher-improvements">Launcher Improvements<a href="https://duxlabs.dev/blog/v1-2-release#launcher-improvements" class="hash-link" aria-label="Direct link to Launcher Improvements" title="Direct link to Launcher Improvements" translate="no">​</a></h3>
<figure style="text-align:center"><img src="https://duxlabs.dev/img/blog/v1.2/launcherlight.png" alt="Launcher File Search" class="themedComponent_mlkZ themedComponent--light_NVdE" style="max-width:400px;width:100%"><img src="https://duxlabs.dev/img/blog/v1.2/launcherdark.png" alt="Launcher File Search" class="themedComponent_mlkZ themedComponent--dark_xIcU" style="max-width:400px;width:100%"><figcaption>Indexed filesystem search with the /path prefix.</figcaption></figure>
<p>The DMS launcher has undergone several improvements. Performance improvements, support for plugins to define context menus (with full keyboard navigation), built-in settings search, and a new first-party plugin for searching keybinds (niri, Hyprland, MangoWC, Sway, and custom providers via <code>dms keybinds</code>).</p>
<p>DMS' launcher with plugins supports calculator, niri window management, CLI commands with history, emoji and gitmoji search, web search, extremely fast indexed filesystem search, and more. It also work on the niri overview without any triggers needed.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="debian-sid-opensuse-slowroll-leap-160-and-centos-stream-10-packages">Debian SID, OpenSUSE Slowroll, Leap 16.0, and CentOS Stream 10 Packages<a href="https://duxlabs.dev/blog/v1-2-release#debian-sid-opensuse-slowroll-leap-160-and-centos-stream-10-packages" class="hash-link" aria-label="Direct link to Debian SID, OpenSUSE Slowroll, Leap 16.0, and CentOS Stream 10 Packages" title="Direct link to Debian SID, OpenSUSE Slowroll, Leap 16.0, and CentOS Stream 10 Packages" translate="no">​</a></h2>
<div class="distroMashup_eH_j"><div class="distroOrbit_ZOYh"><img src="https://duxlabs.dev/img/path32.svg" alt="DMS" class="distroCenterLogo_ByJh"><div class="distroLogo_nM_L"><img src="https://duxlabs.dev/img/distros/arch.svg" alt="Arch Linux"></div><div class="distroLogo_nM_L"><img src="https://duxlabs.dev/img/distros/fedora.svg" alt="Fedora"></div><div class="distroLogo_nM_L"><img src="https://duxlabs.dev/img/distros/suse.svg" alt="openSUSE"></div><div class="distroLogo_nM_L"><img src="https://duxlabs.dev/img/distros/debian.svg" alt="Debian"></div><div class="distroLogo_nM_L"><img src="https://duxlabs.dev/img/distros/ubuntu.svg" alt="Ubuntu"></div><div class="distroLogo_nM_L"><img src="https://duxlabs.dev/img/distros/CentOS_color_logo.svg" alt="CentOS"></div><div class="distroLogo_nM_L"><img src="https://duxlabs.dev/img/distros/NixOS.svg" alt="NixOS"></div></div></div>
<p>DMS 1.2 expands distribution support with official packages now available for:</p>
<ul>
<li class=""><strong>Debian SID</strong> - Rolling release packages via OBS</li>
<li class=""><strong>OpenSUSE Slowroll</strong> - Packages via OBS</li>
<li class=""><strong>OpenSUSE Leap 16.0</strong> - Packages via OBS</li>
<li class=""><strong>CentOS Stream 10</strong> - Packages via COPR</li>
</ul>
<p>These are in addition to existing packages for Debian, Ubuntu, Fedora, Arch Linux, and NixOS.</p>
<p>Packages include DMS, niri, quickshell, dgop, dsearch, and other core dependencies. See the <a class="" href="https://duxlabs.dev/docs/getting-started">installation guide</a> for setup instructions.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="upgrade-notes">Upgrade Notes<a href="https://duxlabs.dev/blog/v1-2-release#upgrade-notes" class="hash-link" aria-label="Direct link to Upgrade Notes" title="Direct link to Upgrade Notes" translate="no">​</a></h2>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>warning</div><div class="admonitionContent_BuS1"><p>This release contains changes that may require manual intervention.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-theme-updates">(Breaking) Theme Updates<a href="https://duxlabs.dev/blog/v1-2-release#breaking-theme-updates" class="hash-link" aria-label="Direct link to (Breaking) Theme Updates" title="Direct link to (Breaking) Theme Updates" translate="no">​</a></h3>
<p>Ghostty and VSCode theming have changed and will stop working without manual intervention.</p>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Ghostty &amp; VS Code Theme Changes</summary><div><div class="collapsibleContent_i85q"><p><strong>Ghostty</strong></p><p>The theme path has changed to <code>~/.config/ghostty/themes/danktheme</code>. Update your Ghostty configuration:</p><div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#e4e4e7;--prism-background-color:#2e2a3d"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#e4e4e7;background-color:#2e2a3d"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#e4e4e7"><span class="token comment" style="color:#7c7c99;font-style:italic"># ~/.config/ghostty/config</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token comment" style="color:#7c7c99;font-style:italic"># Add this</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token key property" style="color:#f78c6c">theme</span><span class="token plain"> </span><span class="token punctuation" style="color:#c0c0d0">=</span><span class="token plain"> dankcolors</span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token comment" style="color:#7c7c99;font-style:italic"># ! Remove this</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token comment" style="color:#7c7c99;font-style:italic"># config-file = ./config-dankcolors</span><br></div></code></pre></div></div><p><strong>VS Code / Codium</strong></p><p>The theme extension needs to be reinstalled due to internal changes:</p><ol>
<li class="">Uninstall the current "Dank material shell theme" extension</li>
<li class="">Reinstall from the extensions marketplace: search for "Dank material shell theme" by "DankLinux"</li>
<li class="">Ctrl+Shift+P -&gt; "Preferences: Color Theme" -&gt; Select "Dynamic Base16 DankShell"</li>
<li class="">Trigger theme re-generation - change theme in DMS Settings or restart DMS</li>
<li class="">Fully exit and restart VSCode</li>
</ol></div></div></details>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="clipboard-history-migration">Clipboard History Migration<a href="https://duxlabs.dev/blog/v1-2-release#clipboard-history-migration" class="hash-link" aria-label="Direct link to Clipboard History Migration" title="Direct link to Clipboard History Migration" translate="no">​</a></h3>
<p>Steps are recommended to remove existing clipboard history daemon and migrate existing history to the new DMS clipboard system.</p>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Cleanup &amp; Migration Steps</summary><div><div class="collapsibleContent_i85q"><p><strong>1. Cleanup old clipboard history integration:</strong></p><p>Remove the <code>wl-paste --watch cliphist store</code> daemon/startup from your compositor configuration.</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#e4e4e7;--prism-background-color:#2e2a3d"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#e4e4e7;background-color:#2e2a3d"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#e4e4e7"><span class="token comment" style="color:#7c7c99;font-style:italic">// ~/.config/niri/config.kdl</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">spawn</span><span class="token operator" style="color:#89ddff">-</span><span class="token plain">at</span><span class="token operator" style="color:#89ddff">-</span><span class="token plain">startup </span><span class="token string" style="color:#c3e88d">"wl-paste --watch cliphist store"</span><span class="token plain"> </span><span class="token comment" style="color:#7c7c99;font-style:italic">// REMOVE THIS LINE</span><br></div></code></pre></div></div><div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#e4e4e7;--prism-background-color:#2e2a3d"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#e4e4e7;background-color:#2e2a3d"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#e4e4e7"><span class="token comment" style="color:#7c7c99;font-style:italic"># ~/.config/hypr/hyprland.conf</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token key property" style="color:#f78c6c">exec-once</span><span class="token plain"> </span><span class="token punctuation" style="color:#c0c0d0">=</span><span class="token plain"> wl-paste --watch cliphist store </span><span class="token comment" style="color:#7c7c99;font-style:italic"># REMOVE THIS LINE</span><br></div></code></pre></div></div><p><strong>2. Configure DMS clipboard settings (optional):</strong></p><p>Before migrating, you may want to configure your retention settings in DMS Settings -&gt; System -&gt; Clipboard. You can configure maximum entry size, total entries, and retention durations. Only required if you want to override the defaults.</p><p><strong>3. Migrate clipboard history from <code>cliphist</code> to DMS:</strong></p><p>Clipboard history will not be automatically migrated from previous versions. You can still access it with the <code>cliphist</code> CLI. New clipboard history located in <code>~/.cache/DankMaterialShell/clipboard/db</code> - this is a <a href="https://github.com/etcd-io/bbolt" target="_blank" rel="noopener noreferrer" class="">bbolt</a> database.</p><p>To migrate old history:</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#e4e4e7;--prism-background-color:#2e2a3d"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#e4e4e7;background-color:#2e2a3d"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#e4e4e7"><span class="token comment" style="color:#7c7c99;font-style:italic"># First stop DMS</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">systemctl </span><span class="token parameter variable" style="color:#89ddff">--user</span><span class="token plain"> stop dms </span><span class="token comment" style="color:#7c7c99;font-style:italic"># Or dms kill, if not using systemd</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token comment" style="color:#7c7c99;font-style:italic"># Run migration (optionally override path with cliphist-migrate /path/to/db)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">dms cl cliphist-migrate</span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token comment" style="color:#7c7c99;font-style:italic"># Start DMS again</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">systemctl </span><span class="token parameter variable" style="color:#89ddff">--user</span><span class="token plain"> start dms </span><span class="token comment" style="color:#7c7c99;font-style:italic"># or dms run -d, if not using systemd</span><br></div></code></pre></div></div><p>You can then uninstall cliphist and remove the old database at <code>~/.cache/cliphist/db</code></p><p><code>wl-clipboard</code> can also be removed, although it's useful to keep for plugins or scripts that depend on it.</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#e4e4e7;--prism-background-color:#2e2a3d"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#e4e4e7;background-color:#2e2a3d"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#e4e4e7"><span class="token comment" style="color:#7c7c99;font-style:italic"># DMS clipboard CLI has feature-parity with wl-clipboard</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token comment" style="color:#7c7c99;font-style:italic"># To copy text:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token builtin class-name" style="color:#82aaff">echo</span><span class="token plain"> </span><span class="token string" style="color:#c3e88d">"Hello, World!"</span><span class="token plain"> </span><span class="token operator" style="color:#89ddff">|</span><span class="token plain"> dms cl copy</span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token comment" style="color:#7c7c99;font-style:italic"># To paste text:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">dms cl </span><span class="token function" style="color:#82aaff">paste</span><br></div></code></pre></div></div></div></div></details>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="compositor-configuration-updates">Compositor Configuration Updates<a href="https://duxlabs.dev/blog/v1-2-release#compositor-configuration-updates" class="hash-link" aria-label="Direct link to Compositor Configuration Updates" title="Direct link to Compositor Configuration Updates" translate="no">​</a></h3>
<p>For niri or Hyprland you can run <code>dms setup</code> to generate a new compositor configuration - monitor configuration will be preserved and original configuration will be backed up. The main change is migrating to a more modular configuration.</p>
<p>Changes are required only if you wish to use the new cursor, output, layout, and keybind controls from DMS Settings.</p>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>niri</summary><div><div class="collapsibleContent_i85q"><p>Required to use GUI cursor and output settings.</p><ol>
<li class="">Create new files</li>
</ol><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#e4e4e7;--prism-background-color:#2e2a3d"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#e4e4e7;background-color:#2e2a3d"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#e4e4e7"><span class="token function" style="color:#82aaff">mkdir</span><span class="token plain"> </span><span class="token parameter variable" style="color:#89ddff">-p</span><span class="token plain"> ~/.config/niri/dms</span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token function" style="color:#82aaff">touch</span><span class="token plain"> ~/.config/niri/dms/cursor.kdl</span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token function" style="color:#82aaff">touch</span><span class="token plain"> ~/.config/niri/dms/outputs.kdl</span><br></div></code></pre></div></div><ol start="2">
<li class="">Move existing configuration to new files</li>
</ol><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#e4e4e7;--prism-background-color:#2e2a3d"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#e4e4e7;background-color:#2e2a3d"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#e4e4e7"><span class="token comment" style="color:#7c7c99;font-style:italic">// ~/.config/niri/dms/cursor.kdl</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token comment" style="color:#7c7c99;font-style:italic">// Move cursor {} block from config.kdl</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">cursor </span><span class="token punctuation" style="color:#c0c0d0">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">    xcursor</span><span class="token operator" style="color:#89ddff">-</span><span class="token plain">theme </span><span class="token string" style="color:#c3e88d">"Bibata-Original-Ice"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">    xcursor</span><span class="token operator" style="color:#89ddff">-</span><span class="token plain">size </span><span class="token number" style="color:#f78c6c">24</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token punctuation" style="color:#c0c0d0">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token comment" style="color:#7c7c99;font-style:italic">// ~/.config/niri/dms/outputs.kdl</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token comment" style="color:#7c7c99;font-style:italic">// Move output {} blocks from config.kdl</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">output </span><span class="token string" style="color:#c3e88d">"DP-1"</span><span class="token plain"> </span><span class="token punctuation" style="color:#c0c0d0">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">    position </span><span class="token number" style="color:#f78c6c">0</span><span class="token plain"> </span><span class="token number" style="color:#f78c6c">0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">    scale </span><span class="token number" style="color:#f78c6c">1.0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">    transform normal</span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token punctuation" style="color:#c0c0d0">}</span><br></div></code></pre></div></div><ol start="3">
<li class="">Include new files in your config</li>
</ol><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#e4e4e7;--prism-background-color:#2e2a3d"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#e4e4e7;background-color:#2e2a3d"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#e4e4e7"><span class="token comment" style="color:#7c7c99;font-style:italic">// ~/.config/niri/config.kdl</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token comment" style="color:#7c7c99;font-style:italic">// Recommended to place at the end of the file</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">include </span><span class="token string" style="color:#c3e88d">"dms/cursor.kdl"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">include </span><span class="token string" style="color:#c3e88d">"dms/outputs.kdl"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">include </span><span class="token string" style="color:#c3e88d">"dms/layout.kdl"</span><br></div></code></pre></div></div></div></div></details>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Hyprland</summary><div><div class="collapsibleContent_i85q"><p>Required to use GUI cursor, output, layout, and keybind settings.</p><ol>
<li class="">Create new files</li>
</ol><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#e4e4e7;--prism-background-color:#2e2a3d"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#e4e4e7;background-color:#2e2a3d"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#e4e4e7"><span class="token function" style="color:#82aaff">mkdir</span><span class="token plain"> </span><span class="token parameter variable" style="color:#89ddff">-p</span><span class="token plain"> ~/.config/hypr/dms</span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token function" style="color:#82aaff">touch</span><span class="token plain"> ~/.config/hypr/dms/cursor.conf</span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token function" style="color:#82aaff">touch</span><span class="token plain"> ~/.config/hypr/dms/outputs.conf</span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token function" style="color:#82aaff">touch</span><span class="token plain"> ~/.config/hypr/dms/layout.conf</span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token function" style="color:#82aaff">touch</span><span class="token plain"> ~/.config/hypr/dms/binds.conf</span><br></div></code></pre></div></div><ol start="2">
<li class="">Move existing configuration to new files</li>
</ol><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#e4e4e7;--prism-background-color:#2e2a3d"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#e4e4e7;background-color:#2e2a3d"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#e4e4e7"><span class="token comment" style="color:#7c7c99;font-style:italic"># ~/.config/hypr/dms/cursor.conf</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token comment" style="color:#7c7c99;font-style:italic"># Move cursor settings from hyprland.conf</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token function" style="color:#82aaff">env</span><span class="token plain"> </span><span class="token operator" style="color:#89ddff">=</span><span class="token plain"> HYPRCURSOR_THEME,Bibata-Original-Ice</span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token function" style="color:#82aaff">env</span><span class="token plain"> </span><span class="token operator" style="color:#89ddff">=</span><span class="token plain"> HYPRCURSOR_SIZE,24</span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token function" style="color:#82aaff">env</span><span class="token plain"> </span><span class="token operator" style="color:#89ddff">=</span><span class="token plain"> XCURSOR_THEME,Bibata-Original-Ice</span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token function" style="color:#82aaff">env</span><span class="token plain"> </span><span class="token operator" style="color:#89ddff">=</span><span class="token plain"> XCURSOR_SIZE,24</span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token comment" style="color:#7c7c99;font-style:italic"># ~/.config/hypr/dms/outputs.conf</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token comment" style="color:#7c7c99;font-style:italic"># Move monitor lines from hyprland.conf</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">monitor </span><span class="token operator" style="color:#89ddff">=</span><span class="token plain"> DP-1,2560x1440@144,0x0,1</span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token comment" style="color:#7c7c99;font-style:italic"># ~/.config/hypr/dms/layout.conf</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token comment" style="color:#7c7c99;font-style:italic"># Move general layout settings from hyprland.conf</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">general </span><span class="token punctuation" style="color:#c0c0d0">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">    gaps_in </span><span class="token operator" style="color:#89ddff">=</span><span class="token plain"> </span><span class="token number" style="color:#f78c6c">5</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">    gaps_out </span><span class="token operator" style="color:#89ddff">=</span><span class="token plain"> </span><span class="token number" style="color:#f78c6c">10</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">    border_size </span><span class="token operator" style="color:#89ddff">=</span><span class="token plain"> </span><span class="token number" style="color:#f78c6c">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token punctuation" style="color:#c0c0d0">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token comment" style="color:#7c7c99;font-style:italic"># ! Binds do not need to be moved, only edited/new binds via GUI will be stored here</span><br></div></code></pre></div></div><ol start="3">
<li class="">Source new files in your config</li>
</ol><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#e4e4e7;--prism-background-color:#2e2a3d"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#e4e4e7;background-color:#2e2a3d"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#e4e4e7"><span class="token comment" style="color:#7c7c99;font-style:italic"># ~/.config/hypr/hyprland.conf</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token comment" style="color:#7c7c99;font-style:italic"># Recommended to place at the end of the file</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token builtin class-name" style="color:#82aaff">source</span><span class="token plain"> </span><span class="token operator" style="color:#89ddff">=</span><span class="token plain"> ./dms/cursor.conf</span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token builtin class-name" style="color:#82aaff">source</span><span class="token plain"> </span><span class="token operator" style="color:#89ddff">=</span><span class="token plain"> ./dms/outputs.conf</span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token builtin class-name" style="color:#82aaff">source</span><span class="token plain"> </span><span class="token operator" style="color:#89ddff">=</span><span class="token plain"> ./dms/layout.conf</span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token builtin class-name" style="color:#82aaff">source</span><span class="token plain"> </span><span class="token operator" style="color:#89ddff">=</span><span class="token plain"> ./dms/binds.conf</span><br></div></code></pre></div></div></div></div></details>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>MangoWC</summary><div><div class="collapsibleContent_i85q"><p>Required to use GUI cursor, output, layout, and keybind settings.</p><ol>
<li class="">Create new files</li>
</ol><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#e4e4e7;--prism-background-color:#2e2a3d"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#e4e4e7;background-color:#2e2a3d"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#e4e4e7"><span class="token function" style="color:#82aaff">mkdir</span><span class="token plain"> </span><span class="token parameter variable" style="color:#89ddff">-p</span><span class="token plain"> ~/.config/mangowc/dms</span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token function" style="color:#82aaff">touch</span><span class="token plain"> ~/.config/mangowc/dms/cursor.conf</span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token function" style="color:#82aaff">touch</span><span class="token plain"> ~/.config/mangowc/dms/outputs.conf</span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token function" style="color:#82aaff">touch</span><span class="token plain"> ~/.config/mangowc/dms/layout.conf</span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token function" style="color:#82aaff">touch</span><span class="token plain"> ~/.config/mangowc/dms/binds.conf</span><br></div></code></pre></div></div><ol start="2">
<li class="">Move existing configuration to new files</li>
</ol><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#e4e4e7;--prism-background-color:#2e2a3d"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#e4e4e7;background-color:#2e2a3d"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#e4e4e7"><span class="token comment" style="color:#7c7c99;font-style:italic"># ~/.config/mangowc/dms/cursor.conf</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token comment" style="color:#7c7c99;font-style:italic"># Move cursor settings from mangowc.conf</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token assign-left variable" style="color:#89ddff">cursor_size</span><span class="token operator" style="color:#89ddff">=</span><span class="token number" style="color:#f78c6c">24</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token assign-left variable" style="color:#89ddff">cursor_theme</span><span class="token operator" style="color:#89ddff">=</span><span class="token plain">Bibata-Original-Ice</span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token comment" style="color:#7c7c99;font-style:italic"># ~/.config/mangowc/dms/outputs.conf</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token comment" style="color:#7c7c99;font-style:italic"># Move output blocks from mangowc.conf</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token assign-left variable" style="color:#89ddff">monitorrule</span><span class="token operator" style="color:#89ddff">=</span><span class="token plain">DP-2,0.55,1,tile,0,1,0,0,2560,1440,144</span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token assign-left variable" style="color:#89ddff">monitorrule</span><span class="token operator" style="color:#89ddff">=</span><span class="token plain">eDP-1,0.55,1,tile,0,1,2560,0,2560,1600,240</span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token comment" style="color:#7c7c99;font-style:italic"># ~/.config/mangowc/dms/layout.conf</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token comment" style="color:#7c7c99;font-style:italic"># Move layout settings from mangowc.conf</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token assign-left variable" style="color:#89ddff">border_radius</span><span class="token operator" style="color:#89ddff">=</span><span class="token number" style="color:#f78c6c">13</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token assign-left variable" style="color:#89ddff">gappih</span><span class="token operator" style="color:#89ddff">=</span><span class="token number" style="color:#f78c6c">4</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token assign-left variable" style="color:#89ddff">gappiv</span><span class="token operator" style="color:#89ddff">=</span><span class="token number" style="color:#f78c6c">4</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token assign-left variable" style="color:#89ddff">gappoh</span><span class="token operator" style="color:#89ddff">=</span><span class="token number" style="color:#f78c6c">4</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token assign-left variable" style="color:#89ddff">gappov</span><span class="token operator" style="color:#89ddff">=</span><span class="token number" style="color:#f78c6c">4</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token assign-left variable" style="color:#89ddff">borderpx</span><span class="token operator" style="color:#89ddff">=</span><span class="token number" style="color:#f78c6c">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token comment" style="color:#7c7c99;font-style:italic"># ~/.config/mangowc/dms/binds.conf</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token comment" style="color:#7c7c99;font-style:italic"># Moving binds is not required, only edited/new binds via GUI will be stored here</span><br></div></code></pre></div></div><ol start="3">
<li class="">Source new files in your config</li>
</ol><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#e4e4e7;--prism-background-color:#2e2a3d"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#e4e4e7;background-color:#2e2a3d"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#e4e4e7"><span class="token comment" style="color:#7c7c99;font-style:italic"># ~/.config/mangowc/mangowc.conf</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token comment" style="color:#7c7c99;font-style:italic"># Recommended to place at the end of the file</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token builtin class-name" style="color:#82aaff">source</span><span class="token plain"> </span><span class="token operator" style="color:#89ddff">=</span><span class="token plain"> ./dms/cursor.conf</span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token builtin class-name" style="color:#82aaff">source</span><span class="token plain"> </span><span class="token operator" style="color:#89ddff">=</span><span class="token plain"> ./dms/outputs.conf</span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token builtin class-name" style="color:#82aaff">source</span><span class="token plain"> </span><span class="token operator" style="color:#89ddff">=</span><span class="token plain"> ./dms/layout.conf</span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token builtin class-name" style="color:#82aaff">source</span><span class="token plain"> </span><span class="token operator" style="color:#89ddff">=</span><span class="token plain"> ./dms/binds.conf</span><br></div></code></pre></div></div></div></div></details>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="nixos-updates">NixOS Updates<a href="https://duxlabs.dev/blog/v1-2-release#nixos-updates" class="hash-link" aria-label="Direct link to NixOS Updates" title="Direct link to NixOS Updates" translate="no">​</a></h3>
<p>DMS 1.2 brings significant improvements to NixOS integration and the flake-based installation experience:</p>
<p><strong>Home Manager Module Enhancements</strong></p>
<ul>
<li class="">New <code>clipboardSettings</code> option for declarative clipboard configuration</li>
<li class="">Plugins can now include per-plugin settings directly in their configuration</li>
<li class="">Removed <code>default*</code> settings options in favor of being able to set the actual settings file</li>
<li class="">Improved plugin installation and management through home-manager module</li>
</ul>
<p><strong>NixOS Module Improvements</strong></p>
<ul>
<li class="">Added plugin support in NixOS module with declarative installation</li>
<li class="">Enabled <code>power-profiles-daemon</code> and <code>accounts-daemon</code> by default for better power management and user account integration</li>
<li class="">QML dependencies are now properly included in <code>dms-shell</code> package</li>
</ul>
<p><strong>Niri Integration</strong></p>
<ul>
<li class="">Added support for config includes with niri-flake. DMS-generated configuration files now work seamlessly with niri's flake-based setup</li>
</ul>
<p><strong>Plugin Registry Flake</strong></p>
<ul>
<li class="">New <a href="https://github.com/duxlabs-dev/dux-plugin-registry" target="_blank" rel="noopener noreferrer" class="">dms-plugin-registry</a> Nix flake provides all community plugins as packages</li>
<li class="">Plugins are automatically updated daily from the registry</li>
<li class="">Simple declarative installation - just enable plugins by their ID</li>
<li class="">Works with both NixOS and Home Manager modules</li>
</ul>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>The DMS Flake options name was now changed from <code>programs.dankMaterialShell</code> to <code>programs.dank-material-shell</code>. The modules names also changed.
While the old module names will still work, you'll receive a deprecation warning informing about the new name.</p></div></div>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>The documentation for the <a class="" href="https://duxlabs.dev/docs/dms/nixos">nixpkgs module</a> will get updated as soon as DMS 1.2 gets into <code>nixos-unstable</code>.</p></div></div>
<p>Please check <a class="" href="https://duxlabs.dev/docs/dms/nixos-flake">the documentation</a> for more information in how to configure DMS 1.2 with the new features.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bug-fixes-and-improvements">Bug Fixes and Improvements<a href="https://duxlabs.dev/blog/v1-2-release#bug-fixes-and-improvements" class="hash-link" aria-label="Direct link to Bug Fixes and Improvements" title="Direct link to Bug Fixes and Improvements" translate="no">​</a></h2>
<details style="border:1px solid rgba(239, 68, 68, 0.3);border-radius:8px;padding:1rem;margin:1.5rem 0;background:linear-gradient(135deg, rgba(239, 68, 68, 0.08) 0%, rgba(220, 38, 38, 0.04) 100%);backdrop-filter:blur(8px)" class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary style="cursor:pointer;font-weight:600;font-size:1.1em;margin-bottom:1rem;user-select:none;padding:0.25rem 0.5rem;border-radius:4px;transition:all 0.2s ease;display:flex;align-items:center;gap:0.5rem;list-style:none" id="bug-fixes-summary">|- View Details (300+ commits) -|</summary><div><div class="collapsibleContent_i85q"><p>Since the v1.0 release, DMS has received extensive bug fixes and stability improvements across all components:</p><p><strong>Clipboard</strong></p><ul>
<li class="">Native clipboard and history implementation with zero external dependencies</li>
<li class="">Add cliphist-migrate CLI for importing existing history</li>
<li class="">Add shift+enter to paste from clipboard history modal</li>
<li class="">Configurable persistence, mime-type handling, and auto-cleanup</li>
<li class="">Automatically ignore sensitive mime types from password managers</li>
<li class="">Fix mime type selection and nil offer handling</li>
</ul><p><strong>Bar &amp; Dock</strong></p><ul>
<li class="">Add shadow option for bars</li>
<li class="">Add scroll wheel behavior configuration</li>
<li class="">Add bar get/setPosition IPC</li>
<li class="">Improve high-DPI scrolling logic</li>
<li class="">Fix exclusive zone popup positioning</li>
<li class="">Fix reveal on overview/niri when auto-hide enabled</li>
<li class="">Fix tooltip positioning with adjacent bars</li>
<li class="">Improve pinned app re-ordering feedback</li>
<li class="">Make control center widget per-instance</li>
<li class="">Add option to show bar when hidden and no windows</li>
<li class="">Respect compact mode on vertical bar</li>
<li class="">Mouse wheel options for media player widget</li>
<li class="">Fix widget base hover blend logic</li>
<li class="">Add isolate running apps by display option</li>
</ul><p><strong>Desktop Widgets &amp; Plugins</strong></p><ul>
<li class="">New desktop widget plugin type with draggable per-monitor widgets</li>
<li class="">Built-in clock and system monitor desktop widgets</li>
<li class="">Add grid/grid size hints for widget positioning</li>
<li class="">Add overlay IPC and overview option</li>
<li class="">Enable desktop plugins by default</li>
<li class="">Fix widget display toggle and key event handling</li>
<li class="">Centralize config in desktop widgets tab</li>
<li class="">Add niri overview only option</li>
<li class="">Persistent plugins with async updates</li>
<li class="">Fix first plugin install reactivity</li>
<li class="">Hide uninstall/update buttons for system plugins</li>
<li class="">IPC visibility conditions for plugins</li>
</ul><p><strong>Display &amp; Monitor Configuration</strong></p><ul>
<li class="">Add configurator for niri, Hyprland, and MangoWC</li>
<li class="">Configure position, VRR, orientation, resolution, refresh rate</li>
<li class="">Add Hyprland HDR options</li>
<li class="">Add niri-specific layout options</li>
<li class="">Add mirroring option for Hyprland</li>
<li class="">Add disable output option for Hyprland</li>
<li class="">Fix reverted state for position</li>
<li class="">Fix text-alignment in model mode</li>
<li class="">Explicitly write scale 1 for niri</li>
<li class="">Add adaptiveSyncSupported to wlroutput API</li>
</ul><p><strong>Notifications</strong></p><ul>
<li class="">Add configurable persistent history with variable size and expiration</li>
<li class="">Add swipe to dismiss functionality</li>
<li class="">Add support for lock screen display (count, app name, or full detail)</li>
<li class="">Add compact mode with expansion in history and popup</li>
<li class="">Add image persistence</li>
<li class="">Right-click to toggle Do Not Disturb</li>
<li class="">Add Do Not Disturb to IPC</li>
<li class="">Add modal function for clearing all notifications</li>
<li class="">Fix notifications being transient when history disabled</li>
<li class="">Fix redundant height animation and spacing improvements</li>
<li class="">Minimize rapid window creation/destruction</li>
</ul><p><strong>Themes &amp; Matugen</strong></p><ul>
<li class="">Theme registry with community themes and variants</li>
<li class="">Support for accent colors and theme variants</li>
<li class="">Add color reload capability to VSCode theme</li>
<li class="">Add GTK theme method and fix light mode</li>
<li class="">Move Ghostty theming to new path</li>
<li class="">Add Zen Browser template</li>
<li class="">Add gruvbox material custom theme varieties</li>
<li class="">Add neovim to matugen pipeline with soothing theme</li>
<li class="">Fix adw-gtk3 setting in light mode</li>
<li class="">Set cursor color for themes</li>
<li class="">Fix terminals always dark with custom themes</li>
<li class="">Update VSCode template with improved highlighting</li>
</ul><p><strong>Cursor &amp; Layout</strong></p><ul>
<li class="">DMS Cursor Control for size and theme in niri</li>
<li class="">Create/update XResources for XWayland apps</li>
<li class="">Add Hyprland and MangoWC cursor config support</li>
<li class="">Add GUI gaps, window radius, and border overrides</li>
<li class="">Support for niri, Hyprland, and MangoWC layouts</li>
</ul><p><strong>Launcher</strong></p><ul>
<li class="">Built-in settings search plugin with ? trigger</li>
<li class="">Support for plugins to define context menus</li>
<li class="">Add ID search fallback for non-English apps</li>
<li class="">Allow terminal apps</li>
<li class="">F10 as alt for menu key</li>
<li class="">Optimize bindings and filters</li>
<li class="">Fix invalid icon rendering</li>
</ul><p><strong>Settings</strong></p><ul>
<li class="">Add search across all settings</li>
<li class="">Add doctor command with GUI integration</li>
<li class="">Add battery charge limit setting</li>
<li class="">Add lock screen layout settings</li>
<li class="">Add volume and brightness percentages</li>
<li class="">Fix desktop widget accordion row height</li>
<li class="">Fix generic color selector clipping</li>
<li class="">Fix theme application of default-settings</li>
<li class="">Guard saving before load completed</li>
<li class="">Make default height screen-aware</li>
<li class="">Read-only handling refactor</li>
</ul><p><strong>Network &amp; VPN</strong></p><ul>
<li class="">Support hidden SSIDs</li>
<li class="">Listen to NetworkManager wired interface</li>
<li class="">Use nmcli for route metrics</li>
<li class="">Right-click VPN widget to quick connect</li>
<li class="">Aggregate VPN import errors with toast details</li>
<li class="">Support pkcs11 prompts</li>
<li class="">Cache pkcs11 pin input</li>
</ul><p><strong>Keyboard &amp; Input</strong></p><ul>
<li class="">Initial support for writable Hyprland and MangoWC keybinds</li>
<li class="">Add media control bindings for audio playback</li>
<li class="">Fix keybind handling of cooldown-ms parameter</li>
<li class="">Fix empty string args and screenshot-window options</li>
<li class="">Add log if ShortcutInhibitor is missing</li>
<li class="">Accept numpad enter key for screenshot selection</li>
</ul><p><strong>Lock Screen &amp; Power</strong></p><ul>
<li class="">Add fade to monitor off option</li>
<li class="">Clear lock screen textbox on Escape</li>
<li class="">Handle case where session lock is rejected</li>
<li class="">Fix font alignment</li>
<li class="">Add PAM login fallback</li>
<li class="">Fade to lock and monitor off by default</li>
</ul><p><strong>Audio &amp; Media</strong></p><ul>
<li class="">Recreate media players on pipewire device change</li>
<li class="">Add option to disable visualizer in bar widget</li>
<li class="">Add scroll wheel behavior configuration</li>
<li class="">Allow adjusting notification volume</li>
<li class="">Larger option for media player widget</li>
</ul><p><strong>i18n &amp; RTL</strong></p><ul>
<li class="">Initial RTL support for notifications, settings, control center, launcher</li>
<li class="">Fix RTL alignment of settings sidebar and plugin settings</li>
<li class="">Add Farsi and Hungarian translations</li>
<li class="">General term cleanup and sync</li>
</ul><p><strong>niri</strong></p><ul>
<li class="">Add gaps and radius override</li>
<li class="">Add warnings on auto-generated files</li>
<li class="">Fix effectiveScreenAssignment in modal</li>
<li class="">Fix gap reactivity</li>
<li class="">Handle window urgency event</li>
<li class="">Preserve remaining settings when turning off output</li>
<li class="">Release focus for popouts on overview</li>
<li class="">Track open modals for focus transfers</li>
<li class="">Hack for config includes with niri flake</li>
</ul><p><strong>Hyprland</strong></p><ul>
<li class="">Always use single window mode</li>
<li class="">Fix cursor setting</li>
<li class="">Change DPMS off to DPMS toggle</li>
<li class="">Update reference config for 0.53</li>
<li class="">Smart compositor entry point detection</li>
</ul><p><strong>Core &amp; Backend</strong></p><ul>
<li class="">Add resolve-include recursive functionality</li>
<li class="">Add test coverage for wayland stack with race detection</li>
<li class="">Mock wayland context for tests</li>
<li class="">Detect quickshell crash on SIGTERM</li>
<li class="">Exit non-zero on SIGUSR1 for systemd restart</li>
<li class="">Preserve quickshell exit code</li>
<li class="">Fix socket reported CLI version</li>
<li class="">Use stdlib for XDG dirs</li>
<li class="">Implement screensaver interface for idle inhibitor</li>
<li class="">Poll with wake pipe instead of read deadlines</li>
</ul><p><strong>Greeter</strong></p><ul>
<li class="">Change Hyprland startup to exec-once</li>
<li class="">Use FolderListModel for session iteration</li>
<li class="">Add launch timeout</li>
<li class="">Simplify start-hyprland check</li>
<li class="">Fix per-monitor and per-mode wallpapers (NixOS)</li>
</ul><p><strong>Wallpaper</strong></p><ul>
<li class="">Add seconds to wallpaper cycling</li>
<li class="">Pause cycling when locked</li>
<li class="">Encode image URIs</li>
<li class="">Clamp max texture size</li>
<li class="">Scale texture to physical pixels</li>
</ul><p><strong>Build &amp; Distribution</strong></p><ul>
<li class="">Debian SID, OpenSUSE Slowroll, Leap 16.0, CentOS Stream 10 packages</li>
<li class="">Ubuntu ARM64 support</li>
<li class="">Artix Linux and Void Linux widget mappings</li>
<li class="">Remove cliphist dependency on dms-git</li>
<li class="">OBS and PPA automation improvements</li>
<li class="">NixOS module refactoring and fixes</li>
</ul><p><strong>Miscellaneous</strong></p><ul>
<li class="">Add welcome page with doctor integration for first launch</li>
<li class="">Configurable app ID substitutions</li>
<li class="">Map steam_app_ID to steam_icon_ID for game icons</li>
<li class="">Flatpak introspection utilities</li>
<li class="">Detect flatpak installations of Zen Browser and Vesktop</li>
<li class="">Fix touchpad scrolling behavior</li>
<li class="">Add group workspace apps toggle</li>
<li class="">Reverse workspace scrolling option</li>
<li class="">Add hide option for updater widget</li>
<li class="">Use volume_mute icon for volume==0</li>
</ul></div></div></details>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="resources">Resources<a href="https://duxlabs.dev/blog/v1-2-release#resources" class="hash-link" aria-label="Direct link to Resources" title="Direct link to Resources" translate="no">​</a></h2>
<a href="https://duxlabs.dev/docs/getting-started" class="getStartedLink_Ydq4"><p>Get Started with DMS <span>→</span></p></a>
<div class="linksRow_QIZ5"><a href="https://github.com/duxlabs-dev/dux-shell" class="supportLink_ftuD">GitHub</a><span class="linkDivider_nMYj">•</span><a href="https://duxlabs.dev/docs/" class="supportLink_ftuD">Documentation</a><span class="linkDivider_nMYj">•</span><a href="https://plugins.danklinux.com/" class="supportLink_ftuD">Plugins</a><span class="linkDivider_nMYj">•</span><a href="https://discord.gg/ppWTpKmPgT" class="supportLink_ftuD">Discord</a><span class="linkDivider_nMYj">•</span><a href="https://github.com/sponsors/AvengeMedia" class="supportLink_ftuD">Sponsor on GitHub</a><span class="linkDivider_nMYj">•</span><a href="https://ko-fi.com/duxlabs" class="supportLink_ftuD">Support on Ko-fi</a></div>
<div class="niriThanks_Ryj3"><img src="https://duxlabs.dev/img/niri.svg" alt="niri"><span>Special thanks to <a href="https://github.com/YaLTeR">YaLTeR</a> for collaborating with the DMS team, for <a href="https://github.com/niri-wm/niri">niri</a> - the compositor that inspired DMS, and for hosting DMS on the <a href="https://discord.gg/ppWTpKmPgT">niri Discord</a>.</span></div>
<div class="thankYouHero_S0Vj"><div class="confetti_yyNY" aria-hidden="true"></div><div class="heroContent_EVvi"><h2 class="thankYouTitle_PvPc"><p>Thank <span class="gradientText_Yu3r">You</span></p></h2><p class="thankYouText_yDbO">To everyone who has supported DMS through feedback, contributions, sponsorships, donations, and packaging.</p><p class="thankYouTagline_ELlB">Zan, Zendegi, Azadi</p></div></div>]]></content:encoded>
            <category>Release</category>
            <category>Announcement</category>
        </item>
        <item>
            <title><![CDATA[New Desktop Widgets & Plugins Coming in DMS 1.2]]></title>
            <link>https://duxlabs.dev/blog/desktop-widgets-1-2</link>
            <guid>https://duxlabs.dev/blog/desktop-widgets-1-2</guid>
            <pubDate>Thu, 18 Dec 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[A sneak peek at desktop widgets landing in DMS 1.2 - and why you should build one.]]></description>
            <content:encoded><![CDATA[<p>The next DMS release has a new type of widget and plugin, <strong>Desktop Widgets</strong>. These are little applets that live on your desktop, below your windows and above your wallpaper.</p>
<p>We are pre-announcing this feature to highlight the plugin ecosystem and to encourage the community to build these new types of widgets.</p>
<!-- -->
<figure style="text-align:center"><img src="https://duxlabs.dev/img/blog/widgets/widgets_light.png" alt="Desktop Widgets" class="themedComponent_mlkZ themedComponent--light_NVdE" style="max-width:600px;width:100%"><img src="https://duxlabs.dev/img/blog/widgets/widgets_dark.png" alt="Desktop Widgets" class="themedComponent_mlkZ themedComponent--dark_xIcU" style="max-width:600px;width:100%"></figure>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-are-desktop-widgets">What Are Desktop Widgets?<a href="https://duxlabs.dev/blog/desktop-widgets-1-2#what-are-desktop-widgets" class="hash-link" aria-label="Direct link to What Are Desktop Widgets?" title="Direct link to What Are Desktop Widgets?" translate="no">​</a></h2>
<p>Desktop widgets are small, interactive components that live below windows and above your desktop wallpaper. With these new widgets, you can add useful information and tools to your desktop without cluttering your workspace.</p>
<p>They can be positioned, placed, and sized per-display.</p>
<p>With the DMS plugin system, these widgets are extremely easy to build so we are looking forward to seeing what the community creates! We hope to feature some community widgets in the next 1.2 release.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="built-in-desktop-widgets">Built-in Desktop Widgets<a href="https://duxlabs.dev/blog/desktop-widgets-1-2#built-in-desktop-widgets" class="hash-link" aria-label="Direct link to Built-in Desktop Widgets" title="Direct link to Built-in Desktop Widgets" translate="no">​</a></h2>
<p>DMS 1.2 will ship with two built-in desktop widgets:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="clock">Clock<a href="https://duxlabs.dev/blog/desktop-widgets-1-2#clock" class="hash-link" aria-label="Direct link to Clock" title="Direct link to Clock" translate="no">​</a></h3>
<p>A configurable clock with configurable analog and digital modes, modeled after the Material expressive clock widgets.</p>
<figure style="text-align:center"><img src="https://duxlabs.dev/img/blog/widgets/clock_light.png" alt="Desktop Clock Widget" class="themedComponent_mlkZ themedComponent--light_NVdE" style="max-width:500px;width:100%"><img src="https://duxlabs.dev/img/blog/widgets/clock_dark.png" alt="Desktop Clock Widget" class="themedComponent_mlkZ themedComponent--dark_xIcU" style="max-width:500px;width:100%"></figure>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="system-monitor-dgop">System Monitor (dgop)<a href="https://duxlabs.dev/blog/desktop-widgets-1-2#system-monitor-dgop" class="hash-link" aria-label="Direct link to System Monitor (dgop)" title="Direct link to System Monitor (dgop)" translate="no">​</a></h3>
<p>A configurable system monitor that can display CPU, memory, GPU, disk, network, process, temperature, and other system information in a variety of formats.</p>
<figure style="text-align:center"><img src="https://duxlabs.dev/img/blog/widgets/dgop_light.png" alt="System Monitor Widget" class="themedComponent_mlkZ themedComponent--light_NVdE" style="max-width:500px;width:100%"><img src="https://duxlabs.dev/img/blog/widgets/dgop_dark.png" alt="System Monitor Widget" class="themedComponent_mlkZ themedComponent--dark_xIcU" style="max-width:500px;width:100%"></figure>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="desktop-widget-plugins">Desktop Widget Plugins<a href="https://duxlabs.dev/blog/desktop-widgets-1-2#desktop-widget-plugins" class="hash-link" aria-label="Direct link to Desktop Widget Plugins" title="Direct link to Desktop Widget Plugins" translate="no">​</a></h2>
<p>There is one first-party plugin that is now available on the registry: <em>Dank Desktop Weather</em> (requires DMS git/nightly). This plugin adds a weather widget to your desktop that shows current weather conditions and forecasts.</p>
<figure style="text-align:center"><img src="https://duxlabs.dev/img/blog/widgets/weather_light.png" alt="Dank Desktop Weather Plugin" class="themedComponent_mlkZ themedComponent--light_NVdE" style="max-width:500px;width:100%"><img src="https://duxlabs.dev/img/blog/widgets/weather_dark.png" alt="Dank Desktop Weather Plugin" class="themedComponent_mlkZ themedComponent--dark_xIcU" style="max-width:500px;width:100%"></figure>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="building-your-own">Building Your Own<a href="https://duxlabs.dev/blog/desktop-widgets-1-2#building-your-own" class="hash-link" aria-label="Direct link to Building Your Own" title="Direct link to Building Your Own" translate="no">​</a></h2>
<p>Making your own desktop widget is straight forward. If you've written javascript and a declarative layout (something like react, vue, json, etc) - it should not feel too foreign.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-create-the-plugin-folder">1. Create the plugin folder<a href="https://duxlabs.dev/blog/desktop-widgets-1-2#1-create-the-plugin-folder" class="hash-link" aria-label="Direct link to 1. Create the plugin folder" title="Direct link to 1. Create the plugin folder" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#e4e4e7;--prism-background-color:#2e2a3d"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#e4e4e7;background-color:#2e2a3d"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#e4e4e7"><span class="token function" style="color:#82aaff">mkdir</span><span class="token plain"> </span><span class="token parameter variable" style="color:#89ddff">-p</span><span class="token plain"> ~/.config/DankMaterialShell/plugins/MyDesktopWidget</span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token builtin class-name" style="color:#82aaff">cd</span><span class="token plain"> ~/.config/DankMaterialShell/plugins/MyDesktopWidget</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-write-the-manifest">2. Write the manifest<a href="https://duxlabs.dev/blog/desktop-widgets-1-2#2-write-the-manifest" class="hash-link" aria-label="Direct link to 2. Write the manifest" title="Direct link to 2. Write the manifest" translate="no">​</a></h3>
<p>Save as <code>plugin.json</code>:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#e4e4e7;--prism-background-color:#2e2a3d"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#e4e4e7;background-color:#2e2a3d"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#e4e4e7"><span class="token punctuation" style="color:#c0c0d0">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">  </span><span class="token property" style="color:#f78c6c">"id"</span><span class="token operator" style="color:#89ddff">:</span><span class="token plain"> </span><span class="token string" style="color:#c3e88d">"myDesktopWidget"</span><span class="token punctuation" style="color:#c0c0d0">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">  </span><span class="token property" style="color:#f78c6c">"name"</span><span class="token operator" style="color:#89ddff">:</span><span class="token plain"> </span><span class="token string" style="color:#c3e88d">"My Desktop Widget"</span><span class="token punctuation" style="color:#c0c0d0">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">  </span><span class="token property" style="color:#f78c6c">"description"</span><span class="token operator" style="color:#89ddff">:</span><span class="token plain"> </span><span class="token string" style="color:#c3e88d">"A custom desktop widget"</span><span class="token punctuation" style="color:#c0c0d0">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">  </span><span class="token property" style="color:#f78c6c">"version"</span><span class="token operator" style="color:#89ddff">:</span><span class="token plain"> </span><span class="token string" style="color:#c3e88d">"1.0.0"</span><span class="token punctuation" style="color:#c0c0d0">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">  </span><span class="token property" style="color:#f78c6c">"author"</span><span class="token operator" style="color:#89ddff">:</span><span class="token plain"> </span><span class="token string" style="color:#c3e88d">"Your Name"</span><span class="token punctuation" style="color:#c0c0d0">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">  </span><span class="token property" style="color:#f78c6c">"type"</span><span class="token operator" style="color:#89ddff">:</span><span class="token plain"> </span><span class="token string" style="color:#c3e88d">"desktop"</span><span class="token punctuation" style="color:#c0c0d0">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">  </span><span class="token property" style="color:#f78c6c">"license"</span><span class="token operator" style="color:#89ddff">:</span><span class="token plain"> </span><span class="token string" style="color:#c3e88d">"&lt;your-license-here&gt;"</span><span class="token punctuation" style="color:#c0c0d0">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">  </span><span class="token property" style="color:#f78c6c">"component"</span><span class="token operator" style="color:#89ddff">:</span><span class="token plain"> </span><span class="token string" style="color:#c3e88d">"./MyWidget.qml"</span><span class="token punctuation" style="color:#c0c0d0">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">  </span><span class="token property" style="color:#f78c6c">"icon"</span><span class="token operator" style="color:#89ddff">:</span><span class="token plain"> </span><span class="token string" style="color:#c3e88d">"widgets"</span><span class="token punctuation" style="color:#c0c0d0">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">  </span><span class="token property" style="color:#f78c6c">"settings"</span><span class="token operator" style="color:#89ddff">:</span><span class="token plain"> </span><span class="token string" style="color:#c3e88d">"./MySettings.qml"</span><span class="token punctuation" style="color:#c0c0d0">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">  </span><span class="token property" style="color:#f78c6c">"requires_dms"</span><span class="token operator" style="color:#89ddff">:</span><span class="token plain"> </span><span class="token string" style="color:#c3e88d">"&gt;=1.2.0"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token punctuation" style="color:#c0c0d0">}</span><br></div></code></pre></div></div>
<p>The key bit is <code>"type": "desktop"</code> - that tells DMS this is a desktop widget, not a bar widget.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-create-the-widget">3. Create the widget<a href="https://duxlabs.dev/blog/desktop-widgets-1-2#3-create-the-widget" class="hash-link" aria-label="Direct link to 3. Create the widget" title="Direct link to 3. Create the widget" translate="no">​</a></h3>
<p>Save as <code>MyWidget.qml</code>:</p>
<div class="language-qml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#e4e4e7;--prism-background-color:#2e2a3d"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-qml codeBlock_bY9V thin-scrollbar" style="color:#e4e4e7;background-color:#2e2a3d"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#e4e4e7"><span class="token keyword" style="color:#c792ea">import</span><span class="token plain"> QtQuick</span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token keyword" style="color:#c792ea">import</span><span class="token plain"> qs.Common</span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token keyword" style="color:#c792ea">import</span><span class="token plain"> qs.Widgets</span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token keyword" style="color:#c792ea">import</span><span class="token plain"> qs.Modules.Plugins</span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token class-name" style="color:#82aaff">DesktopPluginComponent</span><span class="token plain"> </span><span class="token punctuation" style="color:#c0c0d0">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">    </span><span class="token property" style="color:#f78c6c">id</span><span class="token punctuation" style="color:#c0c0d0">:</span><span class="token plain"> </span><span class="token javascript-expression language-javascript">root</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">    </span><span class="token property" style="color:#f78c6c">minWidth</span><span class="token punctuation" style="color:#c0c0d0">:</span><span class="token plain"> </span><span class="token javascript-expression language-javascript number" style="color:#f78c6c">150</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">    </span><span class="token property" style="color:#f78c6c">minHeight</span><span class="token punctuation" style="color:#c0c0d0">:</span><span class="token plain"> </span><span class="token javascript-expression language-javascript number" style="color:#f78c6c">100</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">    </span><span class="token property keyword" style="color:#c792ea">property</span><span class="token property" style="color:#f78c6c"> </span><span class="token property" style="color:#f78c6c">string</span><span class="token property" style="color:#f78c6c"> </span><span class="token property" style="color:#f78c6c">displayText</span><span class="token punctuation" style="color:#c0c0d0">:</span><span class="token plain"> </span><span class="token javascript-expression language-javascript">pluginData</span><span class="token javascript-expression language-javascript punctuation" style="color:#c0c0d0">.</span><span class="token javascript-expression language-javascript">displayText </span><span class="token javascript-expression language-javascript operator" style="color:#89ddff">??</span><span class="token javascript-expression language-javascript"> </span><span class="token javascript-expression language-javascript string" style="color:#c3e88d">"Hello!"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">    </span><span class="token property keyword" style="color:#c792ea">property</span><span class="token property" style="color:#f78c6c"> </span><span class="token property" style="color:#f78c6c">real</span><span class="token property" style="color:#f78c6c"> </span><span class="token property" style="color:#f78c6c">bgOpacity</span><span class="token punctuation" style="color:#c0c0d0">:</span><span class="token plain"> </span><span class="token javascript-expression language-javascript punctuation" style="color:#c0c0d0">(</span><span class="token javascript-expression language-javascript">pluginData</span><span class="token javascript-expression language-javascript punctuation" style="color:#c0c0d0">.</span><span class="token javascript-expression language-javascript">backgroundOpacity </span><span class="token javascript-expression language-javascript operator" style="color:#89ddff">??</span><span class="token javascript-expression language-javascript"> </span><span class="token javascript-expression language-javascript number" style="color:#f78c6c">80</span><span class="token javascript-expression language-javascript punctuation" style="color:#c0c0d0">)</span><span class="token javascript-expression language-javascript"> </span><span class="token javascript-expression language-javascript operator" style="color:#89ddff">/</span><span class="token javascript-expression language-javascript"> </span><span class="token javascript-expression language-javascript number" style="color:#f78c6c">100</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">    </span><span class="token class-name" style="color:#82aaff">Rectangle</span><span class="token plain"> </span><span class="token punctuation" style="color:#c0c0d0">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">        </span><span class="token property" style="color:#f78c6c">anchors.fill</span><span class="token punctuation" style="color:#c0c0d0">:</span><span class="token plain"> </span><span class="token javascript-expression language-javascript">parent</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">        </span><span class="token property" style="color:#f78c6c">radius</span><span class="token punctuation" style="color:#c0c0d0">:</span><span class="token plain"> </span><span class="token javascript-expression language-javascript">Theme</span><span class="token javascript-expression language-javascript punctuation" style="color:#c0c0d0">.</span><span class="token javascript-expression language-javascript">cornerRadius</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">        </span><span class="token property" style="color:#f78c6c">color</span><span class="token punctuation" style="color:#c0c0d0">:</span><span class="token plain"> </span><span class="token javascript-expression language-javascript">Theme</span><span class="token javascript-expression language-javascript punctuation" style="color:#c0c0d0">.</span><span class="token javascript-expression language-javascript function" style="color:#82aaff">withAlpha</span><span class="token javascript-expression language-javascript punctuation" style="color:#c0c0d0">(</span><span class="token javascript-expression language-javascript">Theme</span><span class="token javascript-expression language-javascript punctuation" style="color:#c0c0d0">.</span><span class="token javascript-expression language-javascript">surfaceContainer</span><span class="token javascript-expression language-javascript punctuation" style="color:#c0c0d0">,</span><span class="token javascript-expression language-javascript"> root</span><span class="token javascript-expression language-javascript punctuation" style="color:#c0c0d0">.</span><span class="token javascript-expression language-javascript">bgOpacity</span><span class="token javascript-expression language-javascript punctuation" style="color:#c0c0d0">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">        </span><span class="token class-name" style="color:#82aaff">StyledText</span><span class="token plain"> </span><span class="token punctuation" style="color:#c0c0d0">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">            </span><span class="token property" style="color:#f78c6c">anchors.centerIn</span><span class="token punctuation" style="color:#c0c0d0">:</span><span class="token plain"> </span><span class="token javascript-expression language-javascript">parent</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">            </span><span class="token property" style="color:#f78c6c">text</span><span class="token punctuation" style="color:#c0c0d0">:</span><span class="token plain"> </span><span class="token javascript-expression language-javascript">root</span><span class="token javascript-expression language-javascript punctuation" style="color:#c0c0d0">.</span><span class="token javascript-expression language-javascript">displayText</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">            </span><span class="token property" style="color:#f78c6c">color</span><span class="token punctuation" style="color:#c0c0d0">:</span><span class="token plain"> </span><span class="token javascript-expression language-javascript">Theme</span><span class="token javascript-expression language-javascript punctuation" style="color:#c0c0d0">.</span><span class="token javascript-expression language-javascript">surfaceText</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">            </span><span class="token property" style="color:#f78c6c">font.pixelSize</span><span class="token punctuation" style="color:#c0c0d0">:</span><span class="token plain"> </span><span class="token javascript-expression language-javascript">Theme</span><span class="token javascript-expression language-javascript punctuation" style="color:#c0c0d0">.</span><span class="token javascript-expression language-javascript">fontSizeLarge</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">        </span><span class="token punctuation" style="color:#c0c0d0">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">    </span><span class="token punctuation" style="color:#c0c0d0">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token punctuation" style="color:#c0c0d0">}</span><br></div></code></pre></div></div>
<p>Users can right-click and drag to move or resize the widget. The <code>minWidth</code>/<code>minHeight</code> properties set the lower bounds.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-create-the-settings-panel">4. Create the settings panel<a href="https://duxlabs.dev/blog/desktop-widgets-1-2#4-create-the-settings-panel" class="hash-link" aria-label="Direct link to 4. Create the settings panel" title="Direct link to 4. Create the settings panel" translate="no">​</a></h3>
<p>Save as <code>MySettings.qml</code>:</p>
<div class="language-qml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#e4e4e7;--prism-background-color:#2e2a3d"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-qml codeBlock_bY9V thin-scrollbar" style="color:#e4e4e7;background-color:#2e2a3d"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#e4e4e7"><span class="token keyword" style="color:#c792ea">import</span><span class="token plain"> QtQuick</span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token keyword" style="color:#c792ea">import</span><span class="token plain"> qs.Common</span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token keyword" style="color:#c792ea">import</span><span class="token plain"> qs.Modules.Plugins</span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token class-name" style="color:#82aaff">PluginSettings</span><span class="token plain"> </span><span class="token punctuation" style="color:#c0c0d0">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">    </span><span class="token property" style="color:#f78c6c">id</span><span class="token punctuation" style="color:#c0c0d0">:</span><span class="token plain"> </span><span class="token javascript-expression language-javascript">root</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">    </span><span class="token property" style="color:#f78c6c">pluginId</span><span class="token punctuation" style="color:#c0c0d0">:</span><span class="token plain"> </span><span class="token javascript-expression language-javascript string" style="color:#c3e88d">"myDesktopWidget"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">    </span><span class="token class-name" style="color:#82aaff">StringSetting</span><span class="token plain"> </span><span class="token punctuation" style="color:#c0c0d0">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">        </span><span class="token property" style="color:#f78c6c">settingKey</span><span class="token punctuation" style="color:#c0c0d0">:</span><span class="token plain"> </span><span class="token javascript-expression language-javascript string" style="color:#c3e88d">"displayText"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">        </span><span class="token property" style="color:#f78c6c">label</span><span class="token punctuation" style="color:#c0c0d0">:</span><span class="token plain"> </span><span class="token javascript-expression language-javascript string" style="color:#c3e88d">"Display Text"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">        </span><span class="token property" style="color:#f78c6c">description</span><span class="token punctuation" style="color:#c0c0d0">:</span><span class="token plain"> </span><span class="token javascript-expression language-javascript string" style="color:#c3e88d">"Text shown in the widget"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">        </span><span class="token property" style="color:#f78c6c">placeholder</span><span class="token punctuation" style="color:#c0c0d0">:</span><span class="token plain"> </span><span class="token javascript-expression language-javascript string" style="color:#c3e88d">"Enter text"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">        </span><span class="token property" style="color:#f78c6c">defaultValue</span><span class="token punctuation" style="color:#c0c0d0">:</span><span class="token plain"> </span><span class="token javascript-expression language-javascript string" style="color:#c3e88d">"Hello!"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">    </span><span class="token punctuation" style="color:#c0c0d0">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">    </span><span class="token class-name" style="color:#82aaff">SliderSetting</span><span class="token plain"> </span><span class="token punctuation" style="color:#c0c0d0">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">        </span><span class="token property" style="color:#f78c6c">settingKey</span><span class="token punctuation" style="color:#c0c0d0">:</span><span class="token plain"> </span><span class="token javascript-expression language-javascript string" style="color:#c3e88d">"backgroundOpacity"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">        </span><span class="token property" style="color:#f78c6c">label</span><span class="token punctuation" style="color:#c0c0d0">:</span><span class="token plain"> </span><span class="token javascript-expression language-javascript string" style="color:#c3e88d">"Background Opacity"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">        </span><span class="token property" style="color:#f78c6c">defaultValue</span><span class="token punctuation" style="color:#c0c0d0">:</span><span class="token plain"> </span><span class="token javascript-expression language-javascript number" style="color:#f78c6c">80</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">        </span><span class="token property" style="color:#f78c6c">minimum</span><span class="token punctuation" style="color:#c0c0d0">:</span><span class="token plain"> </span><span class="token javascript-expression language-javascript number" style="color:#f78c6c">0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">        </span><span class="token property" style="color:#f78c6c">maximum</span><span class="token punctuation" style="color:#c0c0d0">:</span><span class="token plain"> </span><span class="token javascript-expression language-javascript number" style="color:#f78c6c">100</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">        </span><span class="token property" style="color:#f78c6c">unit</span><span class="token punctuation" style="color:#c0c0d0">:</span><span class="token plain"> </span><span class="token javascript-expression language-javascript string" style="color:#c3e88d">"%"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain">    </span><span class="token punctuation" style="color:#c0c0d0">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#e4e4e7"><span class="token plain"></span><span class="token punctuation" style="color:#c0c0d0">}</span><br></div></code></pre></div></div>
<p>Display settings (position, size, which monitors) are injected automatically - you don't need to handle those yourself.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-load-it">5. Load it<a href="https://duxlabs.dev/blog/desktop-widgets-1-2#5-load-it" class="hash-link" aria-label="Direct link to 5. Load it" title="Direct link to 5. Load it" translate="no">​</a></h3>
<ol>
<li class="">Open <strong>Settings → Plugins</strong></li>
<li class="">Click <strong>Scan for Plugins</strong></li>
<li class="">Toggle your plugin on</li>
<li class="">Open <strong>Settings → Widgets</strong> and enable the widget on your desired display</li>
</ol>
<p>That's it. For settings panels, timers, graphs, and more - check out the full <a class="" href="https://duxlabs.dev/docs/dms/plugin-development#desktop-plugins">plugin development guide</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="get-involved">Get Involved<a href="https://duxlabs.dev/blog/desktop-widgets-1-2#get-involved" class="hash-link" aria-label="Direct link to Get Involved" title="Direct link to Get Involved" translate="no">​</a></h2>
<p>We hope to see the plugin registry grow with new desktop widgets. Some ideas that would be great as desktop widgets:</p>
<ul>
<li class="">Media controls (mpris, spotify, etc)</li>
<li class="">Todo lists</li>
<li class="">Stock/Crypto tickers</li>
<li class="">News feeds</li>
</ul>
<p>Submit plugins to the <a href="https://github.com/duxlabs-dev/dux-plugin-registry" target="_blank" rel="noopener noreferrer" class="">plugin registry</a> - we hope to feature some of them in the next DMS release.</p>
<hr>
<p>Desktop widgets land in <strong>DMS 1.2</strong>. Keep an eye on the repo and <a href="https://discord.gg/ppWTpKmPgT" target="_blank" rel="noopener noreferrer" class="">join the Discord</a> if you want to get started early.</p>]]></content:encoded>
            <category>Announcement</category>
        </item>
        <item>
            <title><![CDATA[DMS 1.0 "The Dark Knight" Released]]></title>
            <link>https://duxlabs.dev/blog/v1-release</link>
            <guid>https://duxlabs.dev/blog/v1-release</guid>
            <pubDate>Wed, 10 Dec 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[DMS 1.0 is here! Read about the first major release of DankMaterialShell!]]></description>
            <content:encoded><![CDATA[<div class="blogHero_SgTz"><div class="confetti_AaHS" aria-hidden="true"><div style="position:absolute;top:12%;left:2%;transform:rotate(-15deg) scale(0.62)"><span class="bat_ke0U bat1_CHCj batAnim1_DvGa" style="color:#805AD5"></span></div><div style="position:absolute;top:45%;left:1%;transform:rotate(8deg) scale(0.7)"><span class="bat_ke0U bat3_KwqW batAnim3_wjd5" style="color:#9F7AEA"></span></div><div style="position:absolute;top:75%;left:3%;transform:rotate(-22deg) scale(0.58)"><span class="bat_ke0U bat4_f04E batAnim2_CWBZ" style="color:#B794F4"></span></div><div style="position:absolute;top:8%;left:12%;transform:rotate(5deg) scale(0.75)"><span class="bat_ke0U bat2_AsEp batAnim2_CWBZ" style="color:#6B46C1"></span></div><div style="position:absolute;top:32%;left:15%;transform:rotate(-10deg) scale(0.65)"><span class="bat_ke0U bat7_N0u9 batAnim1_DvGa" style="color:#805AD5"></span></div><div style="position:absolute;top:58%;left:10%;transform:rotate(18deg) scale(0.55)"><span class="bat_ke0U bat1_CHCj batAnim3_wjd5" style="color:#9F7AEA"></span></div><div style="position:absolute;top:82%;left:14%;transform:rotate(-8deg) scale(0.68)"><span class="bat_ke0U bat3_KwqW batAnim1_DvGa" style="color:#B794F4"></span></div><div style="position:absolute;top:5%;left:28%;transform:rotate(12deg) scale(0.52)"><span class="bat_ke0U bat4_f04E batAnim2_CWBZ" style="color:#805AD5"></span></div><div style="position:absolute;top:2%;left:45%;transform:rotate(-6deg) scale(0.6)"><span class="bat_ke0U bat2_AsEp batAnim3_wjd5" style="color:#6B46C1"></span></div><div style="position:absolute;top:8%;left:68%;transform:rotate(20deg) scale(0.48)"><span class="bat_ke0U bat1_CHCj batAnim1_DvGa" style="color:#9F7AEA"></span></div><div style="position:absolute;top:88%;left:32%;transform:rotate(-18deg) scale(0.55)"><span class="bat_ke0U bat3_KwqW batAnim3_wjd5" style="color:#B794F4"></span></div><div style="position:absolute;top:92%;left:55%;transform:rotate(10deg) scale(0.62)"><span class="bat_ke0U bat7_N0u9 batAnim1_DvGa" style="color:#805AD5"></span></div><div style="position:absolute;top:85%;left:72%;transform:rotate(-12deg) scale(0.5)"><span class="bat_ke0U bat4_f04E batAnim2_CWBZ" style="color:#6B46C1"></span></div><div style="position:absolute;top:10%;left:82%;transform:rotate(-14deg) scale(0.72)"><span class="bat_ke0U bat2_AsEp batAnim3_wjd5" style="color:#B794F4"></span></div><div style="position:absolute;top:35%;left:78%;transform:rotate(8deg) scale(0.58)"><span class="bat_ke0U bat1_CHCj batAnim2_CWBZ" style="color:#805AD5"></span></div><div style="position:absolute;top:55%;left:84%;transform:rotate(-20deg) scale(0.65)"><span class="bat_ke0U bat3_KwqW batAnim1_DvGa" style="color:#9F7AEA"></span></div><div style="position:absolute;top:78%;left:80%;transform:rotate(15deg) scale(0.6)"><span class="bat_ke0U bat7_N0u9 batAnim3_wjd5" style="color:#6B46C1"></span></div><div style="position:absolute;top:18%;left:94%;transform:rotate(22deg) scale(0.65)"><span class="bat_ke0U bat4_f04E batAnim1_DvGa" style="color:#B794F4"></span></div><div style="position:absolute;top:48%;left:96%;transform:rotate(-5deg) scale(0.72)"><span class="bat_ke0U bat2_AsEp batAnim2_CWBZ" style="color:#805AD5"></span></div><div style="position:absolute;top:70%;left:93%;transform:rotate(16deg) scale(0.55)"><span class="bat_ke0U bat1_CHCj batAnim3_wjd5" style="color:#9F7AEA"></span></div></div><div class="heroContent_Vb6I"><h1 class="heroTitle_slXM"><p>DMS <span class="gradientText_Wk93">1.0</span></p></h1><p class="heroSubtitle_QTDW">The Dark Knight</p></div></div>
<p>We're excited to announce DankMaterialShell (DMS) 1.0! ~ DMS is a Desktop Shell for Wayland Compositors built with <a href="https://quickshell.org/" target="_blank" rel="noopener noreferrer" class="">Quickshell</a> &amp; GO.</p>
<p>What started as a small hobby project has grown into a full desktop shell and application suite with thousands of users and dozens of contributors - with first class support for <a href="https://github.com/niri-wm/niri" target="_blank" rel="noopener noreferrer" class="">niri</a>, <a href="https://hypr.land/" target="_blank" rel="noopener noreferrer" class="">Hyprland</a>, <a href="https://swaywm.org/" target="_blank" rel="noopener noreferrer" class="">Sway</a>, <a href="https://mangowc.vercel.app/" target="_blank" rel="noopener noreferrer" class="">MangoWC</a>, and <a href="https://labwc.github.io/" target="_blank" rel="noopener noreferrer" class="">LabWC</a>. As well as general support for all compositors implementing select wayland protocols.</p>
<!-- -->
<p>This release marks more than just a version number, it's a commitment to stability and predictability. Going forward, DMS will follow a milestone/roadmap-based release cycle, with bug-fix releases as needed in-between major versions.</p>
<p>DMS has come a long way since its inception, and we're excited to pivot towards a more structured development process - which represents a step towards making DMS a mainstream Linux desktop project.</p>
<div class="statsGrid_XJbL" style="grid-template-columns:repeat(2, 1fr);max-width:600px"><div class="statCard_Y5TQ"><span class="statNumber_IsKm">2,300+</span><span class="statLabel_UlEO">Commits</span></div><div class="statCard_Y5TQ"><span class="statNumber_IsKm">2.4k+</span><span class="statLabel_UlEO">GitHub Stars</span></div><div class="statCard_Y5TQ"><span class="statNumber_IsKm">75+</span><span class="statLabel_UlEO">Contributors</span></div><div class="statCard_Y5TQ"><span class="statNumber_IsKm">26</span><span class="statLabel_UlEO">Community Plugins</span></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-new">What's New<a href="https://duxlabs.dev/blog/v1-release#whats-new" class="hash-link" aria-label="Direct link to What's New" title="Direct link to What's New" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="omega-bar">OMEGA Bar<a href="https://duxlabs.dev/blog/v1-release#omega-bar" class="hash-link" aria-label="Direct link to OMEGA Bar" title="Direct link to OMEGA Bar" translate="no">​</a></h3>
<p>Add up to <strong>4</strong> bar configurations, each with their own set of widgets, layout, and style. Configure which monitor each bar appears on and independently control each bar with new <a class="" href="https://duxlabs.dev/docs/dms/keybinds-ipc#bar">IPCs</a>.</p>
<figure style="text-align:center"><img src="https://duxlabs.dev/img/blog/v1/omegabar_light.png" alt="Omega Bars" class="themedComponent_mlkZ themedComponent--light_NVdE" style="max-width:600px;width:100%"><img src="https://duxlabs.dev/img/blog/v1/omegabar_dark.png" alt="Omega Bars" class="themedComponent_mlkZ themedComponent--dark_xIcU" style="max-width:600px;width:100%"><figcaption>Multiple bar configurations with independent widgets and styles</figcaption></figure>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="comprehensive-keyboard-shortcuts-niri">Comprehensive Keyboard Shortcuts (niri)<a href="https://duxlabs.dev/blog/v1-release#comprehensive-keyboard-shortcuts-niri" class="hash-link" aria-label="Direct link to Comprehensive Keyboard Shortcuts (niri)" title="Direct link to Comprehensive Keyboard Shortcuts (niri)" translate="no">​</a></h3>
<p>Configure global keyboard shortcuts - available to niri users. Requires quickshell version from DankLinux repositories or quickshell-git from AUR.</p>
<figure style="text-align:center"><img src="https://duxlabs.dev/img/blog/v1/keybinds_light.png" alt="Keyboard Shortcuts" class="themedComponent_mlkZ themedComponent--light_NVdE" style="max-width:600px;width:100%"><img src="https://duxlabs.dev/img/blog/v1/keybinds_dark.png" alt="Keyboard Shortcuts" class="themedComponent_mlkZ themedComponent--dark_xIcU" style="max-width:600px;width:100%"><figcaption>Keyboard shortcuts configuration with conflict detection</figcaption></figure>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="printer-management-cups">Printer Management (CUPS)<a href="https://duxlabs.dev/blog/v1-release#printer-management-cups" class="hash-link" aria-label="Direct link to Printer Management (CUPS)" title="Direct link to Printer Management (CUPS)" translate="no">​</a></h3>
<p>Manage printers directly from DMS Settings with CUPS integration. Add, remove, and configure printers with ease. A new control center widget allows viewing printers and managing print jobs.</p>
<figure style="text-align:center"><img src="https://duxlabs.dev/img/blog/v1/printers_light.png" alt="Printer Management" class="themedComponent_mlkZ themedComponent--light_NVdE" style="max-width:600px;width:100%"><img src="https://duxlabs.dev/img/blog/v1/printers_dark.png" alt="Printer Management" class="themedComponent_mlkZ themedComponent--dark_xIcU" style="max-width:600px;width:100%"><figcaption>CUPS printer management with status monitoring and job control</figcaption></figure>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="comprehensive-network-management">Comprehensive Network Management<a href="https://duxlabs.dev/blog/v1-release#comprehensive-network-management" class="hash-link" aria-label="Direct link to Comprehensive Network Management" title="Direct link to Comprehensive Network Management" translate="no">​</a></h3>
<p>Comprehensive network view with support for NetworkManager, IWD, and systemd-networkd. Import VPN profiles, manage connections, and connect to Wi-Fi networks.</p>
<figure style="text-align:center"><img src="https://duxlabs.dev/img/blog/v1/network_light.png" alt="Network Management" class="themedComponent_mlkZ themedComponent--light_NVdE" style="max-width:600px;width:100%"><img src="https://duxlabs.dev/img/blog/v1/network_dark.png" alt="Network Management" class="themedComponent_mlkZ themedComponent--dark_xIcU" style="max-width:600px;width:100%"><figcaption>Network settings with WiFi and VPN management</figcaption></figure>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="polkit-agent">Polkit Agent<a href="https://duxlabs.dev/blog/v1-release#polkit-agent" class="hash-link" aria-label="Direct link to Polkit Agent" title="Direct link to Polkit Agent" translate="no">​</a></h3>
<p>DMS now includes its own Polkit agent for handling privilege escalation requests. No more need for external polkit agents like <code>polkit-gnome</code>, <code>mate-polkit</code>, or <code>kde-polkit</code>.</p>
<figure style="text-align:center"><img src="https://duxlabs.dev/img/blog/v1/polkit_light.png" alt="Polkit Agent" class="themedComponent_mlkZ themedComponent--light_NVdE" style="max-width:600px;width:100%"><img src="https://duxlabs.dev/img/blog/v1/polkit_dark.png" alt="Polkit Agent" class="themedComponent_mlkZ themedComponent--dark_xIcU" style="max-width:600px;width:100%"><figcaption>Native polkit authentication dialog for privilege escalation</figcaption></figure>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="file-type-associations">File-Type Associations<a href="https://duxlabs.dev/blog/v1-release#file-type-associations" class="hash-link" aria-label="Direct link to File-Type Associations" title="Direct link to File-Type Associations" translate="no">​</a></h3>
<p>Set default applications for different file types and protocols directly from DMS Settings. Easily manage which apps open specific file formats and choose your preferred applications for handling various file types and links. See the <a class="" href="https://duxlabs.dev/docs/dms/overview#desktop-integration">desktop integration documentation</a>.</p>
<figure style="text-align:center"><img src="https://duxlabs.dev/img/blog/v1/apppicker_light.png" alt="App Picker" class="themedComponent_mlkZ themedComponent--light_NVdE" style="max-width:600px;width:100%"><img src="https://duxlabs.dev/img/blog/v1/apppicker_dark.png" alt="App Picker" class="themedComponent_mlkZ themedComponent--dark_xIcU" style="max-width:600px;width:100%"><figcaption>Open with dialog for selecting default applications</figcaption></figure>
<p>Special thanks to <a href="https://github.com/devnullvoid" target="_blank" rel="noopener noreferrer" class="">@devnullvoid</a> for the contribution.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dank-color-picker">Dank Color Picker<a href="https://duxlabs.dev/blog/v1-release#dank-color-picker" class="hash-link" aria-label="Direct link to Dank Color Picker" title="Direct link to Dank Color Picker" translate="no">​</a></h3>
<p>The color picker is not new, but the eye dropper/color picker tool is now built-in to DMS - no more need for third-party tools! It is now integrated into DMS and available as a standalone tool for Wayland compositors. See the <a href="https://duxlabs.dev/docs/dms/cli-color-picker" target="_blank" rel="noopener noreferrer" class="">CLI color picker documentation</a>.</p>
<figure style="text-align:center"><img src="https://duxlabs.dev/img/blog/v1/colorpick_light.png" alt="Color Picker" class="themedComponent_mlkZ themedComponent--light_NVdE" style="max-width:600px;width:100%"><img src="https://duxlabs.dev/img/blog/v1/colorpick_dark.png" alt="Color Picker" class="themedComponent_mlkZ themedComponent--dark_xIcU" style="max-width:600px;width:100%"><figcaption>Pick colors from anywhere on your screen with multiple output formats</figcaption></figure>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dank-screenshot">Dank Screenshot<a href="https://duxlabs.dev/blog/v1-release#dank-screenshot" class="hash-link" aria-label="Direct link to Dank Screenshot" title="Direct link to Dank Screenshot" translate="no">​</a></h3>
<p>DMS now ships with its own screenshot tool - no need for grim, slurp, or grimblast anymore. Capture a region, a single screen, all screens, or currently focused window (Hyprland/MangoWC/DWL only). Save to clipboard, file, stdout, or mix and match. Get notified when it's done. Supports PNG, JPEG, and PPM formats. See the <a href="https://duxlabs.dev/docs/dms/cli-screenshot" target="_blank" rel="noopener noreferrer" class="">CLI screenshot documentation</a>.</p>
<p>Compatible with many Wayland compositors including Hyprland, Sway, MangoWC, and niri.</p>
<figure style="text-align:center"><img src="https://duxlabs.dev/img/blog/v1/screenshot_light.png" alt="Screenshot Tool" class="themedComponent_mlkZ themedComponent--light_NVdE" style="max-width:600px;width:100%"><img src="https://duxlabs.dev/img/blog/v1/screenshot_dark.png" alt="Screenshot Tool" class="themedComponent_mlkZ themedComponent--dark_xIcU" style="max-width:600px;width:100%"><figcaption>Region selection with live dimensions across multiple monitors</figcaption></figure>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dms-plugin-system">DMS Plugin System<a href="https://duxlabs.dev/blog/v1-release#dms-plugin-system" class="hash-link" aria-label="Direct link to DMS Plugin System" title="Direct link to DMS Plugin System" translate="no">​</a></h3>
<p>DMS features a powerful plugin system that allows developers and enthusiasts to extend the shell with custom functionality. The plugin ecosystem now includes 26 community-created plugins, with 6 new additions since the v0.6.2 release. From system utilities to creative tools, the plugin system makes it possible to add custom widgets, integrate with external services, or build entirely new features on top of DMS.</p>
<p>Explore the <a href="https://danklinux.com/plugins" target="_blank" rel="noopener noreferrer" class="">full plugins directory</a> to discover community contributions including wallpaper engines, system monitors, media controls, container management, and more. New plugins are being added regularly as the community continues to build amazing extensions.</p>
<figure style="text-align:center"><img src="https://duxlabs.dev/img/blog/v1/dms_plugins.png" alt="DMS Plugin System" style="max-width:600px;width:100%;border-radius:8px"><figcaption>26 community plugins extending DMS functionality</figcaption></figure>
<p>Special thanks to <a href="https://github.com/rochacbruno" target="_blank" rel="noopener noreferrer" class="">rochacbruno</a> for developing and iterating on the plugin system, as well as maintaining the <a href="https://github.com/duxlabs-dev/dux-plugin-registry" target="_blank" rel="noopener noreferrer" class="">plugin registry</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="packages-for-ubuntu-debian-opensuse-fedora-centos-and-arch-linux">Packages for Ubuntu, Debian, OpenSUSE, Fedora, CentOS, and Arch Linux<a href="https://duxlabs.dev/blog/v1-release#packages-for-ubuntu-debian-opensuse-fedora-centos-and-arch-linux" class="hash-link" aria-label="Direct link to Packages for Ubuntu, Debian, OpenSUSE, Fedora, CentOS, and Arch Linux" title="Direct link to Packages for Ubuntu, Debian, OpenSUSE, Fedora, CentOS, and Arch Linux" translate="no">​</a></h2>
<div class="distroMashup_Rv17 noZoom_fWwu"><div class="distroOrbit_K6U6"><img src="https://duxlabs.dev/img/path32.svg" alt="DMS" class="distroCenterLogo_utrf"><div class="distroLogo_J6TQ"><img src="https://duxlabs.dev/img/distros/arch.svg" alt="Arch Linux"></div><div class="distroLogo_J6TQ"><img src="https://duxlabs.dev/img/distros/fedora.svg" alt="Fedora"></div><div class="distroLogo_J6TQ"><img src="https://duxlabs.dev/img/distros/suse.svg" alt="openSUSE"></div><div class="distroLogo_J6TQ"><img src="https://duxlabs.dev/img/distros/debian.svg" alt="Debian"></div><div class="distroLogo_J6TQ"><img src="https://duxlabs.dev/img/distros/ubuntu.svg" alt="Ubuntu"></div></div></div>
<p>DMS is now available through the <a class="" href="https://duxlabs.dev/docs/packaging">DankLinux Repository</a> with official packages for Ubuntu, Debian, OpenSUSE, and Fedora/CentOS via PPA, OBS, and COPR. Arch Linux users can grab it from the Arch User Repository (AUR).</p>
<p>This includes not only DMS itself but also core dependencies that may be used with or without DMS including:</p>
<ul>
<li class=""><strong>niri</strong> - Ubuntu, Debian, and OpenSUSE (includes <strong>xwayland-satellite</strong>)</li>
<li class=""><strong>quickshell</strong> - Ubuntu, Debian, OpenSUSE, and Fedora</li>
<li class=""><strong>dgop</strong> - All supported distributions</li>
<li class=""><strong>dsearch</strong> - All supported distributions</li>
<li class=""><strong>dms-greeter</strong> - AUR, Fedora, and Ubuntu (more via DankInstaller)</li>
<li class=""><strong>matugen</strong> - Ubuntu, Debian, OpenSUSE, and Fedora</li>
<li class=""><strong>cliphist</strong> - All supported distributions</li>
<li class=""><strong>ghostty</strong> - Fedora, Debian and Ubuntu</li>
</ul>
<p><em>Development packages/nightly builds are also available via the same repositories</em></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="available-on-nixpkgs">Available on nixpkgs<a href="https://duxlabs.dev/blog/v1-release#available-on-nixpkgs" class="hash-link" aria-label="Direct link to Available on nixpkgs" title="Direct link to Available on nixpkgs" translate="no">​</a></h3>
<div class="noZoom_fWwu"><a href="https://search.nixos.org/options?channel=unstable&amp;query=dms-" style="display:inline-block;margin:1rem 0"><img src="https://duxlabs.dev/img/distros/nixpkgs-light.svg" alt="Packaged for Nixpkgs" class="themedComponent_mlkZ themedComponent--light_NVdE" style="max-width:240px"><img src="https://duxlabs.dev/img/distros/nixpkgs-dark.svg" alt="Packaged for Nixpkgs" class="themedComponent_mlkZ themedComponent--dark_xIcU" style="max-width:240px"></a></div>
<p>DMS is now available on nixpkgs unstable. This simplifies installation significantly for NixOS users and those using Nix package manager and represents a major step towards broader adoption. Check the available options on <a href="https://search.nixos.org/options?channel=unstable&amp;query=dms-" target="_blank" rel="noopener noreferrer" class="">search.nixos.org</a>.</p>
<p>Special thanks to <a href="https://github.com/LuckShiba" target="_blank" rel="noopener noreferrer" class="">@LuckShiba</a> for creating the nixpkgs package and <a href="https://github.com/marcusramberg" target="_blank" rel="noopener noreferrer" class="">@marcusramberg</a> for approving!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="more-than-just-a-shell">More than just a Shell<a href="https://duxlabs.dev/blog/v1-release#more-than-just-a-shell" class="hash-link" aria-label="Direct link to More than just a Shell" title="Direct link to More than just a Shell" translate="no">​</a></h2>
<p>DMS has become more than just a desktop shell. It is a comprehensive suite of tools that provide core desktop features in a cohesive, integrated way - or as completely standalone utilities to enrich non-DMS desktops.</p>
<ul>
<li class=""><strong>DankMaterialShell (qml)</strong> - The quickshell-based part of the shell</li>
<li class=""><strong>DankMaterialShell (go)</strong> - A comprehensive backend service and suite of tools<!-- -->
<ul>
<li class=""><strong>Dank16</strong> - A contrast-aware color palette generator for Base16-style themes</li>
<li class=""><strong>Matugen</strong> - A custom matugen runner that enriches matugen templates with Dank16 and custom colors</li>
<li class=""><strong>Brightness</strong> - A complete management CLI and socket service for backlight, LED, and ddc/ci brightness control.</li>
<li class=""><strong>Networking</strong> - Native dbus integration with NetworkManager, IWD, and systemd-networkd for comprehensive network management - including VPNs, WiFi, and Ethernet.</li>
<li class=""><strong>Keybinds</strong> - A complete keybinds system with pluggable providers for reading and writing keybinds for cheatsheets and management interfaces.</li>
<li class=""><strong>Color Picker</strong> - A CLI color picker with multiple output formats and an eye dropper tool for Wayland.</li>
<li class=""><strong>Screenshot</strong> - A complete screenshot tool with region selection, window capture, and multiple output formats.</li>
<li class=""><strong>Plugins</strong> - A plugin system for extending the shell and launcher with custom functionality.</li>
</ul>
</li>
<li class=""><strong>dgop</strong> - A stateless system monitoring tool with a unique cursor-based approach. CLI and fully documented (With OpenAPI 3.1) REST API.</li>
<li class=""><strong>dsearch</strong> - A blazingly fast, indexed filesystem search server with incremental indexes. Fully configurable - choose depth, folders, exclusions, metadata, content, and more. CLI, Unix Socket, and Rest API.</li>
</ul>
<p><strong>TL;DR</strong> <em>DMS</em> replaces many tools commonly used for Wayland desktops. No <code>brightnessctl</code>, <code>ddcutil</code>, <code>grimblast</code>, <code>nmcli</code>, <code>iwctl</code>, <code>grim</code>, <code>slurp</code>, <code>wofi</code>, <code>fuzzel</code>, <code>swayidle</code>, <code>hyprlock</code>, <code>mate/gnome/kde polkit</code>, <code>mako/dunst</code>, <code>hyprpicker</code>, <code>sddm</code>, or (a bunch of other stuff) needed anymore. Fully optional, and completely standalone from DMS itself.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bug-fixes-and-improvements">Bug Fixes and Improvements<a href="https://duxlabs.dev/blog/v1-release#bug-fixes-and-improvements" class="hash-link" aria-label="Direct link to Bug Fixes and Improvements" title="Direct link to Bug Fixes and Improvements" translate="no">​</a></h2>
<details style="border:1px solid rgba(128, 90, 213, 0.3);border-radius:8px;padding:1rem;margin:1.5rem 0;background:linear-gradient(135deg, rgba(128, 90, 213, 0.08) 0%, rgba(107, 70, 193, 0.04) 100%);backdrop-filter:blur(8px)" class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary style="cursor:pointer;font-weight:600;font-size:1.1em;margin-bottom:1rem;user-select:none;padding:0.25rem 0.5rem;border-radius:4px;transition:all 0.2s ease;display:flex;align-items:center;gap:0.5rem;list-style:none" id="bug-fixes-summary">|- View Details (300+ commits) -|</summary><div><div class="collapsibleContent_i85q"><p>Since the last v0.6.2 release, DMS has received extensive bug fixes and stability improvements across all components:</p><p><strong>Screenshot &amp; Color Picker</strong></p><ul>
<li class="">Handle 24-bit frames from compositor and RGB888 bit flipping</li>
<li class="">Color space and scaling fixes</li>
<li class="">Handle transformed and multi-monitor displays</li>
<li class="">Save button display fixes with eye dropper</li>
<li class="">Fallback to niri picker when on niri</li>
</ul><p><strong>Bar &amp; Dock</strong></p><ul>
<li class="">Center section positioning and border thickness fixes</li>
<li class="">Privacy indicator background color alignment</li>
<li class="">Transparency handling improvements (&gt;95% opacity, window-rules)</li>
<li class="">Opacity binding and early-return fixes</li>
<li class="">Maximize detection, scroll handling, and widget background options</li>
<li class="">IPC reliability when screens change</li>
<li class="">Auto-hide flickering and popout interaction fixes</li>
</ul><p><strong>Display &amp; Monitors</strong></p><ul>
<li class="">Workspace overview truncation and scaling (Hyprland)</li>
<li class="">Physical vs. logical resolution display</li>
<li class="">Icon vertical alignment in monitor widgets</li>
</ul><p><strong>Audio &amp; Media</strong></p><ul>
<li class="">Audio slider binding in control center</li>
<li class="">Output device switching IPC and OSD</li>
<li class="">Media control column positioning (bar awareness)</li>
<li class="">Media OSD suppression on new players</li>
<li class="">Player button control popup display</li>
</ul><p><strong>Network &amp; VPN</strong></p><ul>
<li class="">VPN icon consistency and lock screen status</li>
<li class="">VPN password prompting fixes</li>
<li class="">Binding loop fixes</li>
</ul><p><strong>Keyboard &amp; Input</strong></p><ul>
<li class="">Alt+Shift and KDL parsing for keybinds</li>
<li class="">Keybind tab issues (niri)</li>
<li class="">Capslock detection for devices without LED</li>
<li class="">Window close on Esc prevention</li>
<li class="">Context menu keyboard navigation</li>
</ul><p><strong>Brightness &amp; Gamma</strong></p><ul>
<li class="">Non-automation toggling fixes</li>
<li class="">Night mode on startup</li>
<li class="">DDC device erasure and OSD behavior</li>
<li class="">Per-display pinned device IPCs</li>
<li class="">Udev monitor integration for brightness events</li>
</ul><p><strong>Settings &amp; System</strong></p><ul>
<li class="">Weather setting (greeter)</li>
<li class="">Mango config override (greeter)</li>
<li class="">Launcher tab sizing</li>
<li class="">Settings window scrollable areas</li>
<li class="">Custom themes and font family handling</li>
</ul><p><strong>Notifications &amp; UI</strong></p><ul>
<li class="">Keyboard navigation in notification popout</li>
<li class="">Button widget binding loops</li>
<li class="">ProcessList context menu visibility</li>
<li class="">Excessive repaints in modals</li>
<li class="">DnD tooltip display</li>
</ul><p><strong>Lock Screen &amp; Power</strong></p><ul>
<li class="">VPN icon consistency</li>
<li class="">Single-display lock screen option</li>
<li class="">Hold-style confirmation for power actions</li>
<li class="">Profile OSD and DBus activation</li>
</ul><p><strong>Wallpaper &amp; Themes</strong></p><ul>
<li class="">Per-monitor wallpaper display</li>
<li class="">Wallpaper cycling</li>
<li class="">Privacy widget background colors</li>
</ul><p><strong>Build &amp; Distribution</strong></p><ul>
<li class="">NixOS fprintd unlock, TUI startup crash, and systemd service PATH</li>
<li class="">DMS CLI versioning in all builds</li>
<li class="">IPC argument handling</li>
<li class="">OpenSUSE package directory and hash versioning</li>
<li class="">Hyprland configuration syntax</li>
<li class="">NixOS nativeBuildInputs</li>
</ul><p><strong>Plugin System</strong></p><ul>
<li class="">Plugin reactivity and tooltip updates</li>
<li class="">Plugin popout binding and reload IPCs</li>
</ul><p>And many more targeted fixes across the entire codebase to ensure stability and reliability across all supported compositors (Hyprland, Sway, niri, MangoWC, LabWC, and DWL).</p></div></div></details>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="resources">Resources<a href="https://duxlabs.dev/blog/v1-release#resources" class="hash-link" aria-label="Direct link to Resources" title="Direct link to Resources" translate="no">​</a></h2>
<a href="https://duxlabs.dev/docs/getting-started" class="getStartedLink_PqsM"><p>Get Started with DMS <span>→</span></p></a>
<div class="linksRow__lWC"><a href="https://github.com/duxlabs-dev/dux-shell" class="supportLink_QXe2">GitHub</a><span class="linkDivider_nR6g">•</span><a href="https://duxlabs.dev/docs/" class="supportLink_QXe2">Documentation</a><span class="linkDivider_nR6g">•</span><a href="https://plugins.danklinux.com/" class="supportLink_QXe2">Plugins</a><span class="linkDivider_nR6g">•</span><a href="https://discord.gg/ppWTpKmPgT" class="supportLink_QXe2">Discord</a><span class="linkDivider_nR6g">•</span><a href="https://github.com/sponsors/AvengeMedia" class="supportLink_QXe2">Sponsor on GitHub</a><span class="linkDivider_nR6g">•</span><a href="https://ko-fi.com/duxlabs" class="supportLink_QXe2">Support on Ko-fi</a></div>
<div class="niriThanks_a_Wh"><img src="https://duxlabs.dev/img/niri.svg" alt="niri"><span>Special thanks to <a href="https://github.com/YaLTeR">YaLTeR</a> for collaborating with the DMS team, for <a href="https://github.com/niri-wm/niri">niri</a> - the compositor that inspired DMS, and for hosting DMS on the <a href="https://discord.gg/ppWTpKmPgT">niri Discord</a>.</span></div>
<div class="thankYouHero_s11M"><div class="confetti_AaHS" aria-hidden="true"></div><div class="heroContent_Vb6I"><h2 class="thankYouTitle_Hwrz"><p>Thank <span class="gradientText_Wk93">You</span></p></h2><p class="thankYouText_GDon">To everyone who has supported DMS through feedback, contributions, sponsorships, donations, and packaging.</p><p class="thankYouTagline_hCtO">Here's to many more releases ahead!</p></div></div>]]></content:encoded>
            <category>Release</category>
            <category>Announcement</category>
        </item>
    </channel>
</rss>