From d3a3b12e37780355c2ab0426c3d617d28df7f703 Mon Sep 17 00:00:00 2001 From: "Finn@MiBook" Date: Fri, 24 Jul 2026 12:13:49 +0200 Subject: [PATCH 1/9] docs: design for DankMaterialShell (niri) profile Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_018Sv2QAunLcLo3tS1YsfLgN --- .../2026-07-24-dank-material-shell-design.md | 234 ++++++++++++++++++ 1 file changed, 234 insertions(+) create mode 100644 docs/superpowers/specs/2026-07-24-dank-material-shell-design.md diff --git a/docs/superpowers/specs/2026-07-24-dank-material-shell-design.md b/docs/superpowers/specs/2026-07-24-dank-material-shell-design.md new file mode 100644 index 0000000..23c20e4 --- /dev/null +++ b/docs/superpowers/specs/2026-07-24-dank-material-shell-design.md @@ -0,0 +1,234 @@ +# DankMaterialShell (niri) Profile — Design + +**Date:** 2026-07-24 +**Branch:** `feat/dank-material-shell` +**Status:** Approved (brainstorming) + +## Summary + +Add a `my.profiles.dank` NixOS profile that provides a complete +[DankMaterialShell](https://danklinux.com) (DMS) desktop running on the +**niri** Wayland compositor, selectable at the SDDM login screen **alongside** +the existing KDE session on **mibook** (user `finn`). + +DMS's keybind, spawn, and declarative-settings integration is delivered only +through home-manager modules, so this work also introduces home-manager into the +flake — as its own opt-in profile (`my.profiles.home-manager`) that the `dank` +profile enables as a dependency. Everything stays declarative inside the flake; +there is no separate home-manager entrypoint. + +## Background / Research + +DMS is a Quickshell-based Wayland desktop **shell** (bar, launcher, control +center, lock screen, notifications) — not a compositor. Its repository +(`github:AvengeMedia/DankMaterialShell`) ships a flake with: + +- `nixosModules.dank-material-shell` — system side: installs the `dms-shell` + package + `quickshell`, a `dms` systemd **user** service, `dgop` (system + monitoring), matugen (dynamic theming), and enables polkit / + power-profiles-daemon / accounts-daemon / geoclue2. Configured via + `programs.dank-material-shell.*`. +- `homeModules.dank-material-shell` — home side: declarative + `~/.config/DankMaterialShell/settings.json`, the `dms` user service, plugin + management, and the `programs.quickshell` HM program. +- `homeModules.niri` — niri-specific integration: generates niri keybinds wired + to `dms ipc` (launcher, clipboard, notifications, media/brightness keys, power + menu, lock) and `spawn-at-startup` for `dms run`. + +`homeModules.niri` builds on **niri-flake**'s home-manager API +(`programs.niri.settings`, `config.lib.niri.actions`); DMS does **not** bundle +niri-flake, so it must be added as its own input. quickshell ≥ 0.3.0 is +recommended and is available in nixos-unstable → use `pkgs.unstable.quickshell`. + +### Key repo facts + +- This repo is flake-parts based, pins `nixpkgs/nixos-26.05`, and exposes + `pkgs.unstable` via an overlay in `machines/configuration.nix`. +- `inputs` and `self` are already threaded into every NixOS module via + `_module.args` (set in `machines/configuration.nix`), so `modules/` files may + take `inputs` / `self` as arguments and `imports = [ inputs.... ]`. +- The repo currently uses **no home-manager**; compositor profiles (e.g. + `hyprland`) install packages via `users.users.finn.packages`. +- mibook currently runs the KDE desktop (`my.profiles.kde-desktop`). + +## Scope + +- **In:** mibook only; niri+DMS as a session parallel to KDE; home-manager + scoped to user `finn`; a reusable `my.profiles.home-manager` module. +- **Out:** enabling on jupiter (headless server); Dank Greeter as the login + manager (SDDM stays); declarative DMS `settings.json` content (DMS is + configured through its own GUI at runtime; the HM `settings` option remains + available for later use but is left empty); any change to `configuration.nix`. + +## Design + +### 1. New flake inputs (`flake.nix`) + +```nix +home-manager = { + url = "github:nix-community/home-manager"; + inputs.nixpkgs.follows = "nixpkgs"; +}; +niri.url = "github:sodiboo/niri-flake"; +dank.url = "github:AvengeMedia/DankMaterialShell"; +``` + +Notes: +- `dank` tracks nixos-unstable internally (its own `nixpkgs`), which is expected + for the DMS package build. +- `niri-flake` provides both the compositor session (nixosModule) and the HM + `programs.niri.settings` API that DMS's niri module extends. +- `home-manager` follows the repo `nixpkgs` (nixos-26.05). + +`machines/configuration.nix` is **not** modified — the existing +`_module.args.inputs = self.inputs` line already makes these inputs reachable +from any module. + +### 2. Home-manager profile (`modules/environments/home-manager/default.nix`) + +A new opt-in `my.profiles.home-manager` profile. Because module `imports` cannot +be gated on an option value, the home-manager NixOS module is imported +unconditionally (harmless — it only adds options and does nothing until +`home-manager.users.*` is populated); only the global settings are guarded by +`mkIf cfg.enable`: + +```nix +{ config, lib, inputs, self, ... }: +let + cfg = config.my.profiles.home-manager; +in +{ + imports = [ inputs.home-manager.nixosModules.home-manager ]; + + options.my.profiles.home-manager.enable = + lib.mkEnableOption "home-manager integration"; + + config = lib.mkIf cfg.enable { + home-manager.useGlobalPkgs = true; # HM shares the system pkgs (+ unstable overlay) + home-manager.useUserPackages = true; + home-manager.extraSpecialArgs = { inherit inputs self; }; + }; +} +``` + +Registered by adding `./environments/home-manager` to +`modules/environments/default.nix`. + +> Placement note: the profile lives under `modules/environments/` (where +> `my.profiles.*` modules live) to match the namespace, even though its function +> is infrastructural. + +### 3. Dank profile (`modules/environments/dank/default.nix`) + +Standard profile pattern; enables the home-manager profile as a dependency and +splits configuration between the system module (session + daemons) and the +home-manager module (keybinds / spawn / settings): + +```nix +{ config, lib, pkgs, inputs, ... }: +let + cfg = config.my.profiles.dank; +in +{ + imports = [ inputs.dank.nixosModules.dank-material-shell ]; + + options.my.profiles.dank.enable = lib.mkEnableOption "DankMaterialShell on niri"; + + config = lib.mkIf cfg.enable { + # dependency: pull in home-manager integration + my.profiles.home-manager.enable = true; + + # --- system side: niri session + DMS daemons/packages --- + programs.niri.enable = true; # niri-flake nixosModule → Wayland session in SDDM + + programs.dank-material-shell = { + enable = true; + systemd.enable = true; + quickshell.package = pkgs.unstable.quickshell; # >= 0.3.0 from unstable + # enableSystemMonitoring / enableVPN / enableDynamicTheming / enableAudioWavelength + # / enableCalendarEvents all default true — left on. + }; + + # --- home side: DMS + niri keybinds for finn --- + home-manager.users.finn = { + imports = [ + inputs.niri.homeModules.niri + inputs.dank.homeModules.dank-material-shell + inputs.dank.homeModules.niri + ]; + + programs.dank-material-shell = { + enable = true; + systemd.enable = true; + quickshell.package = pkgs.unstable.quickshell; + niri.enableKeybinds = true; # Mod+Space launcher, Mod+V clipboard, media/brightness, power, lock… + niri.enableSpawn = true; # spawn `dms run` at niri startup + }; + + home.stateVersion = "26.05"; # match nixpkgs release; required by HM + }; + }; +} +``` + +Registered by adding `./environments/dank` to +`modules/environments/default.nix`. + +Open validation point (resolve during implementation, not a blocker): +- Confirm the exact HM output name for the niri integration + (`homeModules.niri` vs `homeModules.dankMaterialShell.niri`) and that + `programs.niri.enable` is the correct niri-flake nixosModule option; adjust to + match the pinned input revisions. +- Confirm whether `programs.dank-material-shell.quickshell.package` needs to be + set on both the system and HM sides or only one; set consistently. + +### 4. Enable on mibook (`machines/mibook/environments.nix`) + +Add to the `my.profiles` block: + +```nix +dank.enable = true; +``` + +KDE (`kde-desktop.enable = true`) stays; both sessions are offered by SDDM. + +### 5. Documentation + +No homepage dashboard entry (DMS is not a web service). CLAUDE.md is left +unchanged unless, after implementation, the home-manager pattern warrants a short +note — decided at the end, not up front (YAGNI). + +## Data / control flow + +1. `nixos-rebuild` builds the mibook toplevel; niri-flake registers a `niri` + Wayland session, DMS nixosModule installs packages + the `dms` user service + template, home-manager renders finn's niri config (with DMS keybinds) and DMS + config. +2. At login, SDDM lists **KDE** and **niri**. Selecting niri starts the + compositor; `spawn-at-startup` launches `dms run`, bringing up the DMS shell. +3. Keybinds invoke `dms ipc …` (launcher, clipboard, notifications, media, + brightness, power, lock). DMS is further configured via its own GUI, persisted + under `~/.config/DankMaterialShell/`. + +## Risks / open questions + +- **unstable/stable skew:** the repo pins nixos-26.05 while `dank` and + `niri-flake` track nixos-unstable, and quickshell comes from `pkgs.unstable`. + Qt6/quickshell version mismatch between the DMS package and the stable base is + the most likely failure. Mitigation: validate with a full toplevel build and, + if it fails, align quickshell/qt sourcing (e.g. take the DMS package's own + quickshell) before switching. +- **HM output/option names** may differ from the researched revision — pin the + inputs first, then read the resolved module options and adjust (see §3 open + validation point). +- **First HM activation** for finn: ensure `home.stateVersion` is set so the + build doesn't error. + +## Verification + +1. `nix flake check` succeeds. +2. `nix build '.#nixosConfigurations.mibook.config.system.build.toplevel'` + succeeds. +3. `sudo nixos-rebuild test --flake '.#mibook'`, then log into the **niri** + session: DMS bar appears, `Mod+Space` opens the launcher, KDE session still + works. -- 2.52.0 From 826a612d9d30ee1e6e9b399d713676c8643d4de9 Mon Sep 17 00:00:00 2001 From: "Finn@MiBook" Date: Fri, 24 Jul 2026 12:19:05 +0200 Subject: [PATCH 2/9] docs: implementation plan for DankMaterialShell (niri) profile Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_018Sv2QAunLcLo3tS1YsfLgN --- .../plans/2026-07-24-dank-material-shell.md | 285 ++++++++++++++++++ 1 file changed, 285 insertions(+) create mode 100644 docs/superpowers/plans/2026-07-24-dank-material-shell.md diff --git a/docs/superpowers/plans/2026-07-24-dank-material-shell.md b/docs/superpowers/plans/2026-07-24-dank-material-shell.md new file mode 100644 index 0000000..e714434 --- /dev/null +++ b/docs/superpowers/plans/2026-07-24-dank-material-shell.md @@ -0,0 +1,285 @@ +# DankMaterialShell (niri) Profile Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Add a `my.profiles.dank` NixOS profile that runs DankMaterialShell (DMS) on the niri Wayland compositor as a login session parallel to KDE on mibook, backed by a new opt-in `my.profiles.home-manager` module. + +**Architecture:** Three flake inputs (`home-manager`, `niri` = niri-flake, `dank` = DankMaterialShell) are added to `flake.nix`. A `my.profiles.home-manager` module unconditionally imports the home-manager NixOS module and, when enabled, sets global HM settings. A `my.profiles.dank` module enables `my.profiles.home-manager` as a dependency, turns on niri (system session) + the DMS nixosModule (daemons/packages), and configures `home-manager.users.finn` with the DMS + niri-flake HM modules for keybinds/spawn. mibook enables `dank`. + +**Tech Stack:** Nix flakes, flake-parts, NixOS modules, home-manager (as NixOS module), niri-flake, DankMaterialShell flake, quickshell (from `pkgs.unstable`). + +## Global Constraints + +- Do **not** modify `machines/configuration.nix`. `inputs` and `self` are already threaded into every module via `_module.args`; consume them as module arguments. +- Base channel is pinned `nixpkgs/nixos-26.05`; `pkgs.unstable` overlay is available everywhere. quickshell must come from `pkgs.unstable.quickshell` (needs ≥ 0.3.0). +- home-manager scoped to user `finn` only; `home.stateVersion = "26.05"`. +- Follow the existing profile pattern exactly: `let cfg = config.my.profiles.; in { options.my.profiles..enable = lib.mkEnableOption "..."; config = lib.mkIf cfg.enable { ... }; }`. +- Format every new/edited `.nix` file with `nixfmt-rfc-style` before committing. +- Commit messages end with the repo's trailer lines (Co-Authored-By + Claude-Session) as seen in recent history. +- KDE (`my.profiles.kde-desktop`) stays enabled on mibook; do not remove it. + +--- + +### Task 1: Add flake inputs + +**Files:** +- Modify: `flake.nix:4-15` (the `inputs = { ... }` block) + +**Interfaces:** +- Produces: flake inputs `inputs.home-manager`, `inputs.niri`, `inputs.dank`, reachable from any NixOS module (via the existing `_module.args.inputs = self.inputs`). Later tasks consume `inputs.home-manager.nixosModules.home-manager`, `inputs.niri.homeModules.niri`, `inputs.dank.nixosModules.dank-material-shell`, `inputs.dank.homeModules.dank-material-shell`, `inputs.dank.homeModules.niri`. + +- [ ] **Step 1: Add the three inputs** + +In `flake.nix`, inside the `inputs = { ... }` block, after the `nixos-generators` entry and before the closing `};`, add: + +```nix + home-manager = { + url = "github:nix-community/home-manager"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + niri.url = "github:sodiboo/niri-flake"; + dank.url = "github:AvengeMedia/DankMaterialShell"; +``` + +- [ ] **Step 2: Resolve the lock file** + +Run: `nix flake lock` +Expected: completes without error; `flake.lock` gains `home-manager`, `niri`, `niri-flake`-transitive, and `dank` (DankMaterialShell) nodes. If it reports a bad URL, re-check the `github:owner/repo` strings. + +- [ ] **Step 3: Verify inputs expose the expected outputs** + +Run: `nix eval --raw '.#nixosConfigurations.mibook.pkgs.system'` first to confirm the flake still evaluates (expected: `x86_64-linux`). +Then run: `nix flake show 'github:AvengeMedia/DankMaterialShell' --allow-import-from-derivation 2>/dev/null | grep -E 'dank-material-shell|nixosModules|homeModules'` +Expected: output lists `nixosModules.dank-material-shell` and `homeModules.dank-material-shell` and `homeModules.niri`. If the niri output name differs (e.g. `dankMaterialShell.niri`), note the actual name — Task 3 Step 1 must use whatever this shows. + +- [ ] **Step 4: Format and commit** + +```bash +nixfmt-rfc-style flake.nix +git add flake.nix flake.lock +git commit -m "chore: add home-manager, niri-flake, and DankMaterialShell flake inputs + +Co-Authored-By: Claude Opus 4.8 +Claude-Session: https://claude.ai/code/session_018Sv2QAunLcLo3tS1YsfLgN" +``` + +--- + +### Task 2: `my.profiles.home-manager` module + +**Files:** +- Create: `modules/environments/home-manager/default.nix` +- Modify: `modules/environments/default.nix` (add `./home-manager` to `imports`) + +**Interfaces:** +- Consumes: `inputs.home-manager.nixosModules.home-manager` (Task 1). +- Produces: option `my.profiles.home-manager.enable`. When enabled, sets `home-manager.useGlobalPkgs = true`, `home-manager.useUserPackages = true`, `home-manager.extraSpecialArgs = { inherit inputs self; }`. Also makes the `home-manager.users.` option available (from the unconditional import) so Task 3 can populate `home-manager.users.finn`. + +- [ ] **Step 1: Create the module** + +Create `modules/environments/home-manager/default.nix`: + +```nix +{ + config, + lib, + inputs, + self, + ... +}: +let + cfg = config.my.profiles.home-manager; +in +{ + imports = [ inputs.home-manager.nixosModules.home-manager ]; + + options.my.profiles.home-manager.enable = + lib.mkEnableOption "home-manager integration"; + + config = lib.mkIf cfg.enable { + home-manager.useGlobalPkgs = true; + home-manager.useUserPackages = true; + home-manager.extraSpecialArgs = { inherit inputs self; }; + }; +} +``` + +- [ ] **Step 2: Register the module** + +In `modules/environments/default.nix`, add `./home-manager` to the `imports` list (place it after `./hyprland`): + +```nix + ./hyprland + ./home-manager +``` + +- [ ] **Step 3: Verify it evaluates disabled (no behavior change)** + +Run: `nix build '.#nixosConfigurations.mibook.config.system.build.toplevel' --dry-run` +Expected: evaluates and shows a build plan with no errors. Because `my.profiles.home-manager.enable` defaults to false, importing the HM module must not change the build outcome. + +- [ ] **Step 4: Verify the option exists and defaults false** + +Run: `nix eval '.#nixosConfigurations.mibook.config.my.profiles.home-manager.enable'` +Expected: `false` + +- [ ] **Step 5: Format and commit** + +```bash +nixfmt-rfc-style modules/environments/home-manager/default.nix modules/environments/default.nix +git add modules/environments/home-manager/default.nix modules/environments/default.nix +git commit -m "feat(home-manager): add opt-in my.profiles.home-manager module + +Co-Authored-By: Claude Opus 4.8 +Claude-Session: https://claude.ai/code/session_018Sv2QAunLcLo3tS1YsfLgN" +``` + +--- + +### Task 3: `my.profiles.dank` module + +**Files:** +- Create: `modules/environments/dank/default.nix` +- Modify: `modules/environments/default.nix` (add `./dank` to `imports`) + +**Interfaces:** +- Consumes: `my.profiles.home-manager.enable` (Task 2); `inputs.dank.nixosModules.dank-material-shell`, `inputs.dank.homeModules.dank-material-shell`, `inputs.dank.homeModules.niri`, `inputs.niri.homeModules.niri` (Task 1); `pkgs.unstable.quickshell`. +- Produces: option `my.profiles.dank.enable`. + +- [ ] **Step 1: Create the module** + +Create `modules/environments/dank/default.nix`. Use the exact `homeModules`/`nixosModules` output names confirmed in Task 1 Step 3 — the block below assumes `dank-material-shell` and `niri`: + +```nix +{ + config, + lib, + pkgs, + inputs, + ... +}: +let + cfg = config.my.profiles.dank; +in +{ + imports = [ inputs.dank.nixosModules.dank-material-shell ]; + + options.my.profiles.dank.enable = lib.mkEnableOption "DankMaterialShell on niri"; + + config = lib.mkIf cfg.enable { + # Dependency: declarative user config comes from home-manager. + my.profiles.home-manager.enable = true; + + # System side: niri Wayland session + DMS daemons/packages. + programs.niri.enable = true; + + programs.dank-material-shell = { + enable = true; + systemd.enable = true; + quickshell.package = pkgs.unstable.quickshell; + }; + + # Home side: DMS shell + niri keybinds/spawn for finn. + home-manager.users.finn = { + imports = [ + inputs.niri.homeModules.niri + inputs.dank.homeModules.dank-material-shell + inputs.dank.homeModules.niri + ]; + + programs.dank-material-shell = { + enable = true; + systemd.enable = true; + quickshell.package = pkgs.unstable.quickshell; + niri.enableKeybinds = true; + niri.enableSpawn = true; + }; + + home.stateVersion = "26.05"; + }; + }; +} +``` + +- [ ] **Step 2: Register the module** + +In `modules/environments/default.nix`, add `./dank` to the `imports` list (after `./home-manager`): + +```nix + ./home-manager + ./dank +``` + +- [ ] **Step 3: Verify it evaluates disabled** + +Run: `nix eval '.#nixosConfigurations.mibook.config.my.profiles.dank.enable'` +Expected: `false` +Run: `nix build '.#nixosConfigurations.mibook.config.system.build.toplevel' --dry-run` +Expected: evaluates without error (dank disabled → no behavior change yet). + +- [ ] **Step 4: Format and commit** + +```bash +nixfmt-rfc-style modules/environments/dank/default.nix modules/environments/default.nix +git add modules/environments/dank/default.nix modules/environments/default.nix +git commit -m "feat(dank): add DankMaterialShell (niri) profile + +Co-Authored-By: Claude Opus 4.8 +Claude-Session: https://claude.ai/code/session_018Sv2QAunLcLo3tS1YsfLgN" +``` + +--- + +### Task 4: Enable on mibook and build the full toplevel + +**Files:** +- Modify: `machines/mibook/environments.nix:7-17` (the `my.profiles = { ... }` block) + +**Interfaces:** +- Consumes: `my.profiles.dank.enable` (Task 3). + +- [ ] **Step 1: Enable the profile** + +In `machines/mibook/environments.nix`, inside the `my.profiles = { ... }` block, add: + +```nix + dank.enable = true; +``` + +- [ ] **Step 2: Build the full toplevel (the real test)** + +Run: `nix build '.#nixosConfigurations.mibook.config.system.build.toplevel'` +Expected: builds successfully. This exercises the DMS package, quickshell from unstable, niri, and the home-manager generation for finn. + +If it fails on a **quickshell/Qt6 version mismatch** (see spec risks): drop `quickshell.package = pkgs.unstable.quickshell;` from **both** the system and HM `programs.dank-material-shell` blocks in `modules/environments/dank/default.nix` and rebuild, letting DMS's module pick its own default quickshell. If it fails on an **unknown HM option** (e.g. `niri.enableKeybinds`), run `nix eval '.#nixosConfigurations.mibook.config.home-manager.users.finn.programs.dank-material-shell' --apply builtins.attrNames 2>&1 | head` to list the real option names and adjust. Re-run the build until it passes. + +- [ ] **Step 3: Run flake check** + +Run: `nix flake check` +Expected: passes (all nixosConfigurations evaluate). If `nix flake check` is slow or pulls DMS's own checks, `nix build '.#nixosConfigurations.mibook.config.system.build.toplevel'` from Step 2 passing is the authoritative gate. + +- [ ] **Step 4: Format and commit** + +```bash +nixfmt-rfc-style machines/mibook/environments.nix +git add machines/mibook/environments.nix modules/environments/dank/default.nix +git commit -m "feat(mibook): enable DankMaterialShell (niri) session + +Co-Authored-By: Claude Opus 4.8 +Claude-Session: https://claude.ai/code/session_018Sv2QAunLcLo3tS1YsfLgN" +``` + +- [ ] **Step 5: Manual acceptance (human, on hardware)** + +Run: `sudo nixos-rebuild test --flake '.#mibook'` +Then log out, pick the **niri** session at SDDM, log in as finn. +Expected: DMS bar/shell appears; `Mod+Space` opens the launcher; `Mod+V` opens the clipboard; the KDE session is still selectable and works. Note this step cannot be automated — it requires the physical machine. + +--- + +## Notes for the implementer + +- **Order matters:** Task 1 must land first (inputs must resolve before any module can import them). Tasks 2→3→4 are strictly sequential. +- **Output-name drift is the top risk.** The DMS flake has renamed outputs over time (there are deprecated aliases like `dankMaterialShell.niri`). Task 1 Step 3 pins down the real names against the locked revision; use those, not the names in this plan, if they differ. +- **No unit-test framework here.** Nix evaluation + a successful `toplevel` build *is* the test. Do not fabricate a test harness. +- Do not touch `machines/configuration.nix`, `machines/jupiter/*`, or the KDE profile. -- 2.52.0 From 06bc35f26d72d3c55177b891a0c60d51cc8cb040 Mon Sep 17 00:00:00 2001 From: "Finn@MiBook" Date: Fri, 24 Jul 2026 12:22:08 +0200 Subject: [PATCH 3/9] chore: add home-manager, niri-flake, and DankMaterialShell flake inputs Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_018Sv2QAunLcLo3tS1YsfLgN --- flake.lock | 236 ++++++++++++++++++++++++++++++++++++++++++++++++++--- flake.nix | 6 ++ 2 files changed, 230 insertions(+), 12 deletions(-) diff --git a/flake.lock b/flake.lock index 92acc7f..88410f3 100644 --- a/flake.lock +++ b/flake.lock @@ -1,5 +1,41 @@ { "nodes": { + "dank": { + "inputs": { + "dank-qml-common": "dank-qml-common", + "flake-compat": "flake-compat", + "nixpkgs": "nixpkgs" + }, + "locked": { + "lastModified": 1784830217, + "narHash": "sha256-6MvMw45RSORjINmFd3Lfz9VX9sH8+xTb5WNZiWIKbDw=", + "owner": "AvengeMedia", + "repo": "DankMaterialShell", + "rev": "8af71036cca800064f3fb22dd201109ade6c5ee9", + "type": "github" + }, + "original": { + "owner": "AvengeMedia", + "repo": "DankMaterialShell", + "type": "github" + } + }, + "dank-qml-common": { + "flake": false, + "locked": { + "lastModified": 1784647395, + "narHash": "sha256-kcLSJC8XBzmWoSBc90Zn81qrNsqWMkwQ1m/zZixOw30=", + "owner": "AvengeMedia", + "repo": "dank-qml-common", + "rev": "1919595f0dde4f5bf5ac0baa1902ff6d070971d5", + "type": "github" + }, + "original": { + "owner": "AvengeMedia", + "repo": "dank-qml-common", + "type": "github" + } + }, "flake-compat": { "flake": false, "locked": { @@ -16,6 +52,22 @@ "type": "github" } }, + "flake-compat_2": { + "flake": false, + "locked": { + "lastModified": 1767039857, + "narHash": "sha256-vNpUSpF5Nuw8xvDLj2KCwwksIbjua2LZCqhV1LNRDns=", + "owner": "NixOS", + "repo": "flake-compat", + "rev": "5edf11c44bc78a0d334f6334cdaf7d60d732daab", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "flake-compat", + "type": "github" + } + }, "flake-parts": { "inputs": { "nixpkgs-lib": "nixpkgs-lib" @@ -79,12 +131,88 @@ "type": "github" } }, + "home-manager": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1784877405, + "narHash": "sha256-W649GocILahx7Vb/JMx834217+OLKBrq014VmC/8+NM=", + "owner": "nix-community", + "repo": "home-manager", + "rev": "32de400b6ac9f43042bca706f4a64f6ad08117e8", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "home-manager", + "type": "github" + } + }, + "niri": { + "inputs": { + "niri-stable": "niri-stable", + "niri-unstable": "niri-unstable", + "nixpkgs": "nixpkgs_2", + "nixpkgs-stable": "nixpkgs-stable", + "xwayland-satellite-stable": "xwayland-satellite-stable", + "xwayland-satellite-unstable": "xwayland-satellite-unstable" + }, + "locked": { + "lastModified": 1784874881, + "narHash": "sha256-u4jhSIf/Un0qZB+Cn3hTTaHSI20XeAxYbA5o4faqdJs=", + "owner": "sodiboo", + "repo": "niri-flake", + "rev": "ef7a2a3d719af46b906c22a3ebfb7d65627b2cd2", + "type": "github" + }, + "original": { + "owner": "sodiboo", + "repo": "niri-flake", + "type": "github" + } + }, + "niri-stable": { + "flake": false, + "locked": { + "lastModified": 1756556321, + "narHash": "sha256-RLD89dfjN0RVO86C/Mot0T7aduCygPGaYbog566F0Qo=", + "owner": "YaLTeR", + "repo": "niri", + "rev": "01be0e65f4eb91a9cd624ac0b76aaeab765c7294", + "type": "github" + }, + "original": { + "owner": "YaLTeR", + "ref": "v25.08", + "repo": "niri", + "type": "github" + } + }, + "niri-unstable": { + "flake": false, + "locked": { + "lastModified": 1784570726, + "narHash": "sha256-9EMn69JBcFWFgUM7f0VBAX+jBby5b9H3M59U75+5yI4=", + "owner": "YaLTeR", + "repo": "niri", + "rev": "7f26c3ee804fb6ed458ef7fb0e3c794f14e0b3bc", + "type": "github" + }, + "original": { + "owner": "YaLTeR", + "repo": "niri", + "type": "github" + } + }, "nix": { "inputs": { - "flake-compat": "flake-compat", + "flake-compat": "flake-compat_2", "flake-parts": "flake-parts_2", "git-hooks-nix": "git-hooks-nix", - "nixpkgs": "nixpkgs", + "nixpkgs": "nixpkgs_3", "nixpkgs-23-11": "nixpkgs-23-11", "nixpkgs-regression": "nixpkgs-regression" }, @@ -140,7 +268,7 @@ }, "nixos-hardware": { "inputs": { - "nixpkgs": "nixpkgs_2" + "nixpkgs": "nixpkgs_4" }, "locked": { "lastModified": 1784723954, @@ -158,15 +286,18 @@ }, "nixpkgs": { "locked": { - "lastModified": 1783148766, - "narHash": "sha256-H9+N+GFtsbVC8ZniHliChM7ndizxtqVZs6bnGOLM3WQ=", - "rev": "a50de1b7d8a586adc18d2395c19de7d6058e6030", - "type": "tarball", - "url": "https://releases.nixos.org/nixos/26.05/nixos-26.05.4193.a50de1b7d8a5/nixexprs.tar.xz" + "lastModified": 1783224372, + "narHash": "sha256-8i/87eeoqiGE4yOTjwSA3Eh/ziJRQEmd/unYU+K27sk=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "d407951447dcd00442e97087bf374aad70c04cea", + "type": "github" }, "original": { - "type": "tarball", - "url": "https://channels.nixos.org/nixos-26.05/nixexprs.tar.xz" + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" } }, "nixpkgs-23-11": { @@ -216,6 +347,22 @@ "type": "github" } }, + "nixpkgs-stable": { + "locked": { + "lastModified": 1782847189, + "narHash": "sha256-twXPFqFsrrY5r28Zh7Homgcp2gUMBgQ6WDS98Q/3xFI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "b6018f87da91d19d0ab4cf979885689b469cdd41", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-25.11", + "repo": "nixpkgs", + "type": "github" + } + }, "nixpkgs-unstable": { "locked": { "lastModified": 1784796856, @@ -231,6 +378,35 @@ } }, "nixpkgs_2": { + "locked": { + "lastModified": 1784796856, + "narHash": "sha256-wWFrV5/Qbm+lyt5x20E/bSbfJiGKMo4RCxZV8cl/WZI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e2587caef70cea85dd97d7daab492899902dbf5d", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { + "locked": { + "lastModified": 1783148766, + "narHash": "sha256-H9+N+GFtsbVC8ZniHliChM7ndizxtqVZs6bnGOLM3WQ=", + "rev": "a50de1b7d8a586adc18d2395c19de7d6058e6030", + "type": "tarball", + "url": "https://releases.nixos.org/nixos/26.05/nixos-26.05.4193.a50de1b7d8a5/nixexprs.tar.xz" + }, + "original": { + "type": "tarball", + "url": "https://channels.nixos.org/nixos-26.05/nixexprs.tar.xz" + } + }, + "nixpkgs_4": { "locked": { "lastModified": 1767892417, "narHash": "sha256-8bW3q88CEg2u4hSP66Vf4lpbLonHz7hqDNBMcCY7E9U=", @@ -243,7 +419,7 @@ "url": "https://channels.nixos.org/nixos-unstable/nixexprs.tar.xz" } }, - "nixpkgs_3": { + "nixpkgs_5": { "locked": { "lastModified": 1784707089, "narHash": "sha256-DUedXhD2Rg8q4Xyd07Sb90eZGy4gg6W+Vl/WbLNwAZo=", @@ -259,13 +435,49 @@ }, "root": { "inputs": { + "dank": "dank", "flake-parts": "flake-parts", + "home-manager": "home-manager", + "niri": "niri", "nix": "nix", "nixos-generators": "nixos-generators", "nixos-hardware": "nixos-hardware", - "nixpkgs": "nixpkgs_3", + "nixpkgs": "nixpkgs_5", "nixpkgs-unstable": "nixpkgs-unstable" } + }, + "xwayland-satellite-stable": { + "flake": false, + "locked": { + "lastModified": 1755491097, + "narHash": "sha256-m+9tUfsmBeF2Gn4HWa6vSITZ4Gz1eA1F5Kh62B0N4oE=", + "owner": "Supreeeme", + "repo": "xwayland-satellite", + "rev": "388d291e82ffbc73be18169d39470f340707edaa", + "type": "github" + }, + "original": { + "owner": "Supreeeme", + "ref": "v0.7", + "repo": "xwayland-satellite", + "type": "github" + } + }, + "xwayland-satellite-unstable": { + "flake": false, + "locked": { + "lastModified": 1784679892, + "narHash": "sha256-Mb7jpqnrcYCfNSItIkkHpuR3YxWFxPuIBfcwNKlRBkk=", + "owner": "Supreeeme", + "repo": "xwayland-satellite", + "rev": "8d135d3b2854b30fd01ea6cd6c27e523dd50a839", + "type": "github" + }, + "original": { + "owner": "Supreeeme", + "repo": "xwayland-satellite", + "type": "github" + } } }, "root": "root", diff --git a/flake.nix b/flake.nix index 362e14f..6e75cc6 100644 --- a/flake.nix +++ b/flake.nix @@ -11,6 +11,12 @@ url = "github:nix-community/nixos-generators"; inputs.nixpkgs.follows = "nixpkgs"; }; + home-manager = { + url = "github:nix-community/home-manager"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + niri.url = "github:sodiboo/niri-flake"; + dank.url = "github:AvengeMedia/DankMaterialShell"; }; -- 2.52.0 From 4d42d581268326a1a6a3a1b7a76cbf4027144640 Mon Sep 17 00:00:00 2001 From: "Finn@MiBook" Date: Fri, 24 Jul 2026 12:32:29 +0200 Subject: [PATCH 4/9] feat(home-manager): add opt-in my.profiles.home-manager module Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_018Sv2QAunLcLo3tS1YsfLgN --- modules/environments/default.nix | 1 + modules/environments/home-manager/default.nix | 21 +++++++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 modules/environments/home-manager/default.nix diff --git a/modules/environments/default.nix b/modules/environments/default.nix index eb0d299..fc731bf 100644 --- a/modules/environments/default.nix +++ b/modules/environments/default.nix @@ -8,6 +8,7 @@ ./development ./home-assistant ./hyprland + ./home-manager ./zsh ./paperless ./prowlarr diff --git a/modules/environments/home-manager/default.nix b/modules/environments/home-manager/default.nix new file mode 100644 index 0000000..77f4a85 --- /dev/null +++ b/modules/environments/home-manager/default.nix @@ -0,0 +1,21 @@ +{ + config, + lib, + inputs, + self, + ... +}: +let + cfg = config.my.profiles.home-manager; +in +{ + imports = [ self.inputs.home-manager.nixosModules.home-manager ]; + + options.my.profiles.home-manager.enable = lib.mkEnableOption "home-manager integration"; + + config = lib.mkIf cfg.enable { + home-manager.useGlobalPkgs = true; + home-manager.useUserPackages = true; + home-manager.extraSpecialArgs = { inherit inputs self; }; + }; +} -- 2.52.0 From 87b14accac1e9126dcb722c4ce4a9c5b3a89c987 Mon Sep 17 00:00:00 2001 From: "Finn@MiBook" Date: Fri, 24 Jul 2026 13:17:11 +0200 Subject: [PATCH 5/9] docs(plan): use self.inputs in top-level imports to avoid module recursion Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_018Sv2QAunLcLo3tS1YsfLgN --- docs/superpowers/plans/2026-07-24-dank-material-shell.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/superpowers/plans/2026-07-24-dank-material-shell.md b/docs/superpowers/plans/2026-07-24-dank-material-shell.md index e714434..8798ca3 100644 --- a/docs/superpowers/plans/2026-07-24-dank-material-shell.md +++ b/docs/superpowers/plans/2026-07-24-dank-material-shell.md @@ -11,6 +11,7 @@ ## Global Constraints - Do **not** modify `machines/configuration.nix`. `inputs` and `self` are already threaded into every module via `_module.args`; consume them as module arguments. +- **Top-level `imports` must reference flake modules via `self.inputs.*`, not `inputs.*`.** `self` is a specialArg (available during `imports` resolution); `inputs` comes from `_module.args` (config-derived) and using it in an `imports` list causes infinite recursion. Inside the `config` body (including nested `home-manager.users..imports`), either `inputs` or `self.inputs` is fine. - Base channel is pinned `nixpkgs/nixos-26.05`; `pkgs.unstable` overlay is available everywhere. quickshell must come from `pkgs.unstable.quickshell` (needs ≥ 0.3.0). - home-manager scoped to user `finn` only; `home.stateVersion = "26.05"`. - Follow the existing profile pattern exactly: `let cfg = config.my.profiles.; in { options.my.profiles..enable = lib.mkEnableOption "..."; config = lib.mkIf cfg.enable { ... }; }`. @@ -91,7 +92,7 @@ let cfg = config.my.profiles.home-manager; in { - imports = [ inputs.home-manager.nixosModules.home-manager ]; + imports = [ self.inputs.home-manager.nixosModules.home-manager ]; options.my.profiles.home-manager.enable = lib.mkEnableOption "home-manager integration"; @@ -156,13 +157,14 @@ Create `modules/environments/dank/default.nix`. Use the exact `homeModules`/`nix lib, pkgs, inputs, + self, ... }: let cfg = config.my.profiles.dank; in { - imports = [ inputs.dank.nixosModules.dank-material-shell ]; + imports = [ self.inputs.dank.nixosModules.dank-material-shell ]; options.my.profiles.dank.enable = lib.mkEnableOption "DankMaterialShell on niri"; -- 2.52.0 From 25200103403c434f10dd30397f1eb74dc07f9862 Mon Sep 17 00:00:00 2001 From: "Finn@MiBook" Date: Fri, 24 Jul 2026 13:20:14 +0200 Subject: [PATCH 6/9] feat(dank): add DankMaterialShell (niri) profile Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_018Sv2QAunLcLo3tS1YsfLgN --- modules/environments/dank/default.nix | 49 +++++++++++++++++++++++++++ modules/environments/default.nix | 1 + 2 files changed, 50 insertions(+) create mode 100644 modules/environments/dank/default.nix diff --git a/modules/environments/dank/default.nix b/modules/environments/dank/default.nix new file mode 100644 index 0000000..cab6ae9 --- /dev/null +++ b/modules/environments/dank/default.nix @@ -0,0 +1,49 @@ +{ + config, + lib, + pkgs, + inputs, + self, + ... +}: +let + cfg = config.my.profiles.dank; +in +{ + imports = [ self.inputs.dank.nixosModules.dank-material-shell ]; + + options.my.profiles.dank.enable = lib.mkEnableOption "DankMaterialShell on niri"; + + config = lib.mkIf cfg.enable { + # Dependency: declarative user config comes from home-manager. + my.profiles.home-manager.enable = true; + + # System side: niri Wayland session + DMS daemons/packages. + programs.niri.enable = true; + + programs.dank-material-shell = { + enable = true; + systemd.enable = true; + quickshell.package = pkgs.unstable.quickshell; + }; + + # Home side: DMS shell + niri keybinds/spawn for finn. + home-manager.users.finn = { + imports = [ + inputs.niri.homeModules.niri + inputs.dank.homeModules.dank-material-shell + inputs.dank.homeModules.niri + ]; + + programs.dank-material-shell = { + enable = true; + systemd.enable = true; + quickshell.package = pkgs.unstable.quickshell; + niri.enableKeybinds = true; + niri.enableSpawn = true; + }; + + home.stateVersion = "26.05"; + }; + }; +} diff --git a/modules/environments/default.nix b/modules/environments/default.nix index fc731bf..9baff0b 100644 --- a/modules/environments/default.nix +++ b/modules/environments/default.nix @@ -9,6 +9,7 @@ ./home-assistant ./hyprland ./home-manager + ./dank ./zsh ./paperless ./prowlarr -- 2.52.0 From 6c95ed3ebb1c45b5285c49dc86719aaaa651a1f1 Mon Sep 17 00:00:00 2001 From: "Finn@MiBook" Date: Fri, 24 Jul 2026 14:09:59 +0200 Subject: [PATCH 7/9] feat(dank): enable DMS/niri session on mibook, pin HM to release-26.05, drop redundant keybinds - Pin home-manager input to release-26.05 to match nixpkgs (was resolving to HM master / 26.11, causing a Home Manager version mismatch warning). - Drop niri.enableKeybinds = true from the dank HM config; keybinds are already provided by the imported DMS niri homeModule (includes), and using both together triggered the "enableKeybinds and includes.enable" warning. - Enable my.profiles.dank on mibook (machines/mibook/environments.nix). - Rebuild confirmed exit 0 with both target warnings resolved. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_018Sv2QAunLcLo3tS1YsfLgN --- flake.lock | 7 ++++--- flake.nix | 2 +- machines/mibook/environments.nix | 1 + modules/environments/dank/default.nix | 3 +-- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/flake.lock b/flake.lock index 88410f3..073aff5 100644 --- a/flake.lock +++ b/flake.lock @@ -138,15 +138,16 @@ ] }, "locked": { - "lastModified": 1784877405, - "narHash": "sha256-W649GocILahx7Vb/JMx834217+OLKBrq014VmC/8+NM=", + "lastModified": 1784350909, + "narHash": "sha256-ZWyzLbS1yKUTeFJLmdVuWNnHttL333/ldJbEE+KzCrM=", "owner": "nix-community", "repo": "home-manager", - "rev": "32de400b6ac9f43042bca706f4a64f6ad08117e8", + "rev": "4ce190229c73d44536caa7072f6308fb2d8feeb3", "type": "github" }, "original": { "owner": "nix-community", + "ref": "release-26.05", "repo": "home-manager", "type": "github" } diff --git a/flake.nix b/flake.nix index 6e75cc6..36e7d94 100644 --- a/flake.nix +++ b/flake.nix @@ -12,7 +12,7 @@ inputs.nixpkgs.follows = "nixpkgs"; }; home-manager = { - url = "github:nix-community/home-manager"; + url = "github:nix-community/home-manager/release-26.05"; inputs.nixpkgs.follows = "nixpkgs"; }; niri.url = "github:sodiboo/niri-flake"; diff --git a/machines/mibook/environments.nix b/machines/mibook/environments.nix index 8581e93..2ade63f 100644 --- a/machines/mibook/environments.nix +++ b/machines/mibook/environments.nix @@ -6,6 +6,7 @@ in { my.profiles = { kde-desktop.enable = true; + dank.enable = true; zsh.enable = true; apps = { desktop_apps = true; diff --git a/modules/environments/dank/default.nix b/modules/environments/dank/default.nix index cab6ae9..0e08f04 100644 --- a/modules/environments/dank/default.nix +++ b/modules/environments/dank/default.nix @@ -27,7 +27,7 @@ in quickshell.package = pkgs.unstable.quickshell; }; - # Home side: DMS shell + niri keybinds/spawn for finn. + # Home side: DMS shell + niri spawn for finn (keybinds come via includes). home-manager.users.finn = { imports = [ inputs.niri.homeModules.niri @@ -39,7 +39,6 @@ in enable = true; systemd.enable = true; quickshell.package = pkgs.unstable.quickshell; - niri.enableKeybinds = true; niri.enableSpawn = true; }; -- 2.52.0 From 87e5204d85371860ad15756971afab4b3c14e723 Mon Sep 17 00:00:00 2001 From: "Finn@MiBook" Date: Fri, 24 Jul 2026 14:10:45 +0200 Subject: [PATCH 8/9] docs(plan): pin home-manager to release-26.05 and drop redundant niri keybinds Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_018Sv2QAunLcLo3tS1YsfLgN --- docs/superpowers/plans/2026-07-24-dank-material-shell.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/superpowers/plans/2026-07-24-dank-material-shell.md b/docs/superpowers/plans/2026-07-24-dank-material-shell.md index 8798ca3..7cc25b5 100644 --- a/docs/superpowers/plans/2026-07-24-dank-material-shell.md +++ b/docs/superpowers/plans/2026-07-24-dank-material-shell.md @@ -35,7 +35,7 @@ In `flake.nix`, inside the `inputs = { ... }` block, after the `nixos-generators ```nix home-manager = { - url = "github:nix-community/home-manager"; + url = "github:nix-community/home-manager/release-26.05"; inputs.nixpkgs.follows = "nixpkgs"; }; niri.url = "github:sodiboo/niri-flake"; @@ -181,7 +181,7 @@ in quickshell.package = pkgs.unstable.quickshell; }; - # Home side: DMS shell + niri keybinds/spawn for finn. + # Home side: DMS shell + niri spawn for finn (keybinds come via includes). home-manager.users.finn = { imports = [ inputs.niri.homeModules.niri @@ -193,7 +193,9 @@ in enable = true; systemd.enable = true; quickshell.package = pkgs.unstable.quickshell; - niri.enableKeybinds = true; + # niri.enableKeybinds intentionally omitted: DMS's niri `includes.enable` + # (default true) already brings in the generated binds.kdl plus theming; + # setting enableKeybinds too triggers an upstream "not recommended" warning. niri.enableSpawn = true; }; -- 2.52.0 From e6bd69d8803375b83801e37930810c7afa43e029 Mon Sep 17 00:00:00 2001 From: "Finn@MiBook" Date: Mon, 27 Jul 2026 09:15:07 +0200 Subject: [PATCH 9/9] config: Disable Dank --- machines/mibook/environments.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/machines/mibook/environments.nix b/machines/mibook/environments.nix index 2ade63f..7da7055 100644 --- a/machines/mibook/environments.nix +++ b/machines/mibook/environments.nix @@ -6,7 +6,7 @@ in { my.profiles = { kde-desktop.enable = true; - dank.enable = true; + dank.enable = false; zsh.enable = true; apps = { desktop_apps = true; -- 2.52.0