diff --git a/Droidnix/README.html b/Droidnix/README.html new file mode 100644 index 000000000..7e2354f04 --- /dev/null +++ b/Droidnix/README.html @@ -0,0 +1,2707 @@ + + + + + + + +Droidnix: A Dendritic NixOS + Home Manager Configuration NixOS Configuration Structure + + + + + + + + +
+

Droidnix: A Dendritic NixOS + Home Manager Configuration NixOS Configuration Structure

+
+

Table of Contents

+
+ +
+
+
+

Shortcuts

+ +
+
+

Introduction   intro

+
+
+
+

What is Droidnix

+
+

+Droidnix is a modular, declarative NixOS + Home Manager configuration system. It allows users to choose between Hyprland and Mangowc as their window manager, with shared and WM-specific configurations managed via Emacs Org and Nix Flakes. The project is designed for reproducibility, maintainability, and cross-machine compatibility. +

+
+
+

Installed components:

+
+
+
    +
  • Core
  • +
  • Hyprland
  • +
  • Mangowc
  • +
+
+
+

Goals, project Structure, import hierarchy

+
+

+This project uses a modular NixOS configuration with Hyprland and MangoWC support, designed for literate programming and cross-device reusability. +The Droidnix repository is organized into two main parts: +

+
    +
  1. .assets/: Static, non-generated files (e.g., configs, scripts, themes).
  2. +
  3. Generated folders (system, hyprland, mangowc): NixOS and Home Manager configurations, generated from Org files.
  4. +
+
+
+
+
+
+

Root Level

+
+
    +
  • flake.nix is the entry point and imports: +
      +
    • generated/system/
    • +
    • generated/hyprland/
    • +
    • generated/mangowc/
    • +
    • Machine-specific configurations from assets/machines/
    • +
  • +
+
+
+
+

Generated Structure

+
+

+The generated/ directory contains all generated configurations, divided into three main groups: system, hyprland, and mangowc. +

+
+
+

System (generated/system/)

+
+

+This directory contains system-wide configurations that are independent of the window manager. +

+
+
+

Applications (applications/)

+
+
    +
  • file_management/: Configurations for file managers and storage solutions.
  • +
  • gaming/: Settings for gaming-related software.
  • +
  • office_productivity/: Configurations for office software.
  • +
  • media_playback_editing/: Settings for media playback and editing software.
  • +
  • terminal_shell/: Configurations for terminal emulators and shells.
  • +
+
+
+
+

Development (development/)

+
+
    +
  • databases/: Settings for local databases.
  • +
  • devops_ci_cd/: Configurations for DevOps tools.
  • +
  • programming_languages/: Settings for programming languages and their runtimes.
  • +
  • virtualization/: Configurations for virtualization and containerization tools.
  • +
  • web_development/: Settings for web development.
  • +
+
+
+
+

System Management (system_management/)

+
+
    +
  • backups/: Settings for backup software.
  • +
  • bluetooth/: Configurations for Bluetooth devices and services.
  • +
  • power_management/: Settings for power management.
  • +
  • audio/: Configurations for audio.
  • +
  • hardware_sensors/: Settings for hardware monitoring.
  • +
  • logging_monitoring/: Configurations for system logging and monitoring.
  • +
  • login_manager/: Settings for the login manager.
  • +
  • monitor_setup/: Configurations for display settings.
  • +
  • networking/: Settings for networking.
  • +
  • printers_scanners/: Configurations for printers and scanners.
  • +
  • disk_management/: Settings for disk management.
  • +
  • security/: Security-related configurations.
  • +
  • system_updates/: Settings for system updates and package management.
  • +
+
+
+
+
+

Hyprland (generated/hyprland/)

+
+

+This directory contains configurations specific to Hyprland. +

+ +
    +
  • animations_effects/: Settings for window animations and visual effects.
  • +
  • decorations/: Configurations for window decorations.
  • +
  • keyboard_binds/: Keyboard shortcuts for Hyprland.
  • +
  • notifications/: Settings for notifications.
  • +
  • statusbar_tray/: Configurations for the status bar and system tray.
  • +
  • task_launcher/: Settings for task launchers.
  • +
  • task_window_workspace_switcher/: Configurations for switching between windows and workspaces.
  • +
  • window_rules/: Rules for window behavior.
  • +
+
+
+
+

MangoWC (generated/mangowc/)

+
+

+This directory contains configurations specific to MangoWC. +

+ +
    +
  • animations_effects/: Settings for animations and effects in MangoWC.
  • +
  • decorations/: Configurations for window decorations.
  • +
  • keyboard_binds/: Keyboard shortcuts for MangoWC.
  • +
  • notifications/: Settings for notifications.
  • +
  • statusbar_tray/: Configurations for the status bar and system tray.
  • +
  • task_launcher/: Settings for task launchers.
  • +
  • task_window_workspace_switcher/: Configurations for switching between windows and workspaces.
  • +
  • window_rules/: Rules for window behavior.
  • +
+ +

+File Structure and Imports +

+
    +
  • Every top.nix file imports all .nix files in its directory.
  • +
  • Machine-specific configurations are stored in assets/machines/.
  • +
  • Themes and overrides are modular and reusable across setups.
  • +
+ +

+Design Principles +

+
    +
  • Modularity: Each component is self-contained and reusable.
  • +
  • Consistency: Every directory follows the same import pattern.
  • +
  • Scalability: Easy to add new machines or configurations.
  • +
+ +
+.
+├── assets
+│   ├── system
+│   │   ├── conf
+│   │   │   └── base.conf
+│   │   ├── cursors
+│   │   │   └── Bibata_Cursor-main
+│   │   ├── emacs
+│   │   │   └── setup_emacs.sh
+│   │   ├── icons
+│   │   │   └── papirus-icon-theme-master
+│   │   ├── neovim
+│   │   │   └── setup_nvim_literate_nixos.sh
+│   │   ├── nixos_conf
+│   │   │   └── wallpaperstuff
+│   │   │       ├── pictures
+│   │   │       └── videos
+│   │   ├── scripts
+│   │   │   ├── copy_stuff.sh
+│   │   │   └── end_script.sh
+│   │   └── themes
+│   │       └── Catppuccin-Mocha-Standard-Blue-Dark
+│   ├── copy_stuff
+│   │   ├── Droidnix
+│   │   │   ├── hypr
+│   │   │   │   ├── conf.d
+│   │   │   │   └── scripts
+│   │   │   └── wallpaperstuff
+│   │   │       ├── pictures
+│   │   │       └── videos
+│   │   └── kitty
+│   │       ├── kitty.conf
+│   │       └── themes
+│   │           └── Catppuccin-Mocha.conf
+│   ├── hyprland
+│   │   ├── conf
+│   │   ├── scripts
+│   │   └── themes
+│   ├── machines
+│   │   ├── maindroid
+│   │   └── traveldroid
+│   │       ├── configuration.nix
+│   │       ├── hardware-configuration.nix
+│   │       └── home.nix
+│   └── mangowc
+│       ├── conf
+│       ├── scripts
+│       └── themes
+├── generated
+│   ├── hyprland
+│   │   ├── animations_effects
+│   │   │   ├── top.nix
+│   │   │   └── placeholder.nix
+│   │   ├── decorations
+│   │   │   ├── top.nix
+│   │   │   └── placeholder.nix
+│   │   ├── keyboard_binds
+│   │   │   ├── top.nix
+│   │   │   └── placeholder.nix
+│   │   ├── notifications
+│   │   │   ├── top.nix
+│   │   │   └── placeholder.nix
+│   │   ├── statusbar_tray
+│   │   │   ├── top.nix
+│   │   │   └── placeholder.nix
+│   │   ├── task_launcher
+│   │   │   ├── top.nix
+│   │   │   └── placeholder.nix
+│   │   ├── task_window_workspace_switcher
+│   │   │   ├── top.nix
+│   │   │   └── placeholder.nix
+│   │   └── window_rules
+│   │       ├── top.nix
+│   │       └── placeholder.nix
+│   ├── mangowc
+│   │   ├── animations_effects
+│   │   │   ├── top.nix
+│   │   │   └── placeholder.nix
+│   │   ├── decorations
+│   │   │   ├── top.nix
+│   │   │   └── placeholder.nix
+│   │   ├── keyboard_binds
+│   │   │   ├── top.nix
+│   │   │   └── placeholder.nix
+│   │   ├── notifications
+│   │   │   ├── top.nix
+│   │   │   └── placeholder.nix
+│   │   ├── statusbar_tray
+│   │   │   ├── top.nix
+│   │   │   └── placeholder.nix
+│   │   ├── task_launcher
+│   │   │   ├── top.nix
+│   │   │   └── placeholder.nix
+│   │   ├── task_window_workspace_switcher
+│   │   │   ├── top.nix
+│   │   │   └── placeholder.nix
+│   │   └── window_rules
+│   │       ├── top.nix
+│   │       └── placeholder.nix
+│   └── system
+│       ├── applications
+│       │   ├── file_management
+│       │   │   ├── top.nix
+│       │   │   └── placeholder.nix
+│       │   ├── gaming
+│       │   │   ├── top.nix
+│       │   │   └── placeholder.nix
+│       │   ├── office_productivity
+│       │   │   ├── top.nix
+│       │   │   └── placeholder.nix
+│       │   ├── media_playback_editing
+│       │   │   ├── top.nix
+│       │   │   └── placeholder.nix
+│       │   ├── terminal_shell
+│       │   │   ├── top.nix
+│       │   │   └── placeholder.nix
+│       │   └── accessibility
+│       │       ├── top.nix
+│       │       └── placeholder.nix
+│       ├── development
+│       │   ├── databases
+│       │   │   ├── top.nix
+│       │   │   └── placeholder.nix
+│       │   ├── devops_ci_cd
+│       │   │   ├── top.nix
+│       │   │   └── placeholder.nix
+│       │   ├── programming_languages
+│       │   │   ├── top.nix
+│       │   │   └── placeholder.nix
+│       │   ├── virtualization
+│       │   │   ├── top.nix
+│       │   │   └── placeholder.nix
+│       │   └── web_development
+│       │       ├── top.nix
+│       │       └── placeholder.nix
+│       └── system_management
+│           ├── backups
+│           │   ├── top.nix
+│           │   └── placeholder.nix
+│           ├── bluetooth
+│           │   ├── top.nix
+│           │   └── placeholder.nix
+│           ├── power_management
+│           │   ├── top.nix
+│           │   └── placeholder.nix
+│           ├── audio
+│           │   ├── top.nix
+│           │   └── placeholder.nix
+│           ├── hardware_sensors
+│           │   ├── top.nix
+│           │   └── placeholder.nix
+│           ├── logging_monitoring
+│           │   ├── top.nix
+│           │   └── placeholder.nix
+│           ├── login_manager
+│           │   ├── top.nix
+│           │   └── placeholder.nix
+│           ├── monitor_setup
+│           │   ├── top.nix
+│           │   └── placeholder.nix
+│           ├── networking
+│           │   ├── top.nix
+│           │   └── placeholder.nix
+│           ├── printers_scanners
+│           │   ├── top.nix
+│           │   └── placeholder.nix
+│           ├── disk_management
+│           │   ├── top.nix
+│           │   └── placeholder.nix
+│           ├── security
+│           │   ├── top.nix
+│           │   └── placeholder.nix
+│           └── system_updates
+│               ├── top.nix
+│               └── placeholder.nix
+├── flake.nix
+├── README.html
+└── README.org
+
+
+
+
+

First Setup

+
+
    +
  1. Clone this repository.
  2. +
  3. Run the setup script: ./setup_droidnix.sh.
  4. +
  5. Edit .assets/system/conf/base.conf to choose your window manager (wm = "hyprland" or wm = "mangowc").
  6. +
  7. Tangle this Org file to generate Nix configurations: C-c C-v t in Emacs or use this: emacs README.org --batch -f org-babel-tangle && emacs --batch --eval "(setq org-html-htmlize-output-type nil)" README.org -f org-html-export-to-html
  8. +
  9. Build and switch: sudo nixos-rebuild switch --flake .#<hostname>.
  10. +
+ +

+— +

+
+
+
+
+

The Assets Folder   assets

+
+

+The .assets/ folder contains all static files, such as configs, scripts, and themes. These files are not generated and can be edited directly. +

+
+
+

.assets/system/

+
+

+This folder contains files shared across both window managers, such as wallpapers, shell configs, and system scripts. +

+ +
    +
  • conf/base.conf: Defines the window manager choice and other global settings.
  • +
  • scripts/: System-wide scripts (e.g., utilities, helpers).
  • +
+
+
+
+

.assets/hyprland/

+
+

+Hyprland-specific assets, including configs, themes, and scripts. +

+ +
    +
  • conf/: Hyprland configuration files (e.g., hyprland.conf).
  • +
  • themes/: Hyprland-specific theme scripts.
  • +
  • scripts/: Hyprland-specific scripts.
  • +
+
+
+
+

.assets/mangowc/

+
+

+Mangowc-specific assets, including configs, themes, and scripts. +

+ +
    +
  • conf/: Mangowc configuration files.
  • +
  • themes/: Mangowc-specific theme scripts.
  • +
  • scripts/: Mangowc-specific scripts.
  • +
+
+
+
+

.assets/machines/

+
+

+Machine-specific NixOS configurations (e.g., configuration.nix for maindroid and traveldroid). +

+ +

+— +

+
+
+
+
+

The Actual Code   code

+
+

+This section contains the Org blocks for tangling Nix code into the generated folders. +

+
+
+

flake.nix

+
+

+The Nix flake definition for Droidnix. +

+
+
{
+  description = "Droidnix: A dendritic NixOS + Home Manager configuration";
+
+  inputs = {
+    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
+    home-manager = {
+      url = "github:nix-community/home-manager";
+      inputs.nixpkgs.follows = "nixpkgs";
+    };
+    emacs-overlay = {
+      url = "github:nix-community/emacs-overlay";
+      inputs.nixpkgs.follows = "nixpkgs";
+    };
+    catppuccin = {
+      url = "github:catppuccin/nix";
+      inputs.nixpkgs.follows = "nixpkgs";
+    };
+    zen-browser = {
+      url = "github:youwen5/zen-browser-flake";
+      inputs.nixpkgs.follows = "nixpkgs";
+    };
+    hyprland.url = "github:hyprwm/Hyprland";
+  };
+
+  outputs =
+    inputs@{
+      self,
+      nixpkgs,
+      home-manager,
+      emacs-overlay,
+      catppuccin,
+      zen-browser,
+      hyprland,
+      ...
+    }:
+    let
+      lib = nixpkgs.lib;
+      system = "x86_64-linux";
+      user = import ./assets/flake/users/henrov.nix;
+      machines = [
+        "traveldroid"
+        "maindroid"
+      ];
+      flakeRoot = ./.; # Define flakeRoot here
+    in
+    {
+      nixosConfigurations = lib.genAttrs machines (
+        machine:
+        lib.nixosSystem {
+          inherit system;
+          modules = [
+            # Import machine-specific configurations
+            ./assets/flake/machines/traveldroid/top.nix
+
+            # Catppuccin theme module
+            inputs.catppuccin.nixosModules.catppuccin
+
+            # Anchoring all the other nixes
+            ./generated/top.nix
+
+            # Home Manager module
+            inputs.home-manager.nixosModules.home-manager
+            {
+              home-manager.useGlobalPkgs = true;
+              home-manager.useUserPackages = true;
+              home-manager.extraSpecialArgs = { inherit user inputs flakeRoot; };
+            }
+          ];
+          specialArgs = { inherit user inputs flakeRoot; };
+        }
+      );
+
+      homeConfigurations = lib.genAttrs (map (machine: "${user.username}@${machine}") machines) (
+        userMachine:
+        home-manager.lib.homeManagerConfiguration {
+          inherit system;
+          configuration = import ./user.nix { inherit inputs user flakeRoot; };
+          extraSpecialArgs = { inherit user inputs flakeRoot; };
+        }
+      );
+
+      devShells.${system}.default = import ./assets/flake/terminal_shell/devshell.nix {
+        inherit (nixpkgs.legacyPackages.${system}) mkShell;
+      };
+    };
+}
+
+
+
+
+
+
+

First the nix-files that flake really needs and that do not fit wel in the hierarchical structure

+
+
+
+

assets/flake/users/top.nix

+
+

+The ./generated/top.nix file acts as an anchor or entry point for the entire chain of imports in the pyramid structure. +

+
+
{ config, pkgs, lib, ... }:
+{
+  imports = [
+    ./user.nix
+  ];
+}
+
+
+
+
+
+

assets/flake/users/user.nix

+
+

+This is the default user, just search and replace henrov another name if you want to change +

+
+
{
+  config,
+  pkgs,
+  lib,
+  inputs,
+  ...
+}:
+
+let
+  user = import ./henrov.nix;
+in
+{
+  home-manager.users.${user.username} = {
+    home.stateVersion = "25.11";
+    home.username = user.username;
+    home.homeDirectory = user.homeDirectory;
+    home.packages = with pkgs; [
+      direnv
+      git-extras
+    ];
+  };
+}
+
+
+
+
+
+

assets/flake/users/henrov.nix

+
+

+This is the default user, just search and replace henrov another name if you want to change +

+
+
{
+  username = "henrov";
+  hashedPassword = "$6$ISAmsPLyFi7idYXr$VmZsq.zMsyh1irSkyDNqtorNXG0oEHbbMVqTii1t8bymvrQ5ZQmbdi4OiBNeNYe/huHGrojXM.3TST2fTLz0T.";
+  homeDirectory = "/home/henrov";
+  stateVersion = "25.11";
+  locale = "nl_NL.UTF-8";
+}
+
+
+
+
+
+

assets/flake/terminal_shell/devshell.nix

+
+

+This code defines a Nix shell environment (also called a "devShell") that you can enter using the nix develop command. When you enter this shell, Nix will provide the tools and dependencies listed in buildInputs. +

+
+
{ mkShell, ... }:
+mkShell {
+  buildInputs = with import <nixpkgs> {}; [
+    nil
+    nixfmt-rfc-style
+  ];
+}
+
+
+
+
+
+

assets/flake/machines/traveldroid/top.nix

+
+

+This is the top of the machine hierarchy +

+
+
{
+  config,
+  pkgs,
+  lib,
+  user,
+  inputs,
+  flakeRoot,
+  ...
+}:
+
+{
+  imports = [
+    ./boot.nix
+    ./hardware-configuration.nix
+    ./machine.nix
+    ./dbus.nix
+    ./audio.nix
+    ./xdg.nix
+    inputs.home-manager.nixosModules.home-manager
+  ];
+}
+
+
+
+
+
+

assets/flake/machines/traveldroid/boot.nix

+
+

+This file has most of the settings the control how the computer boots up. +

+
+
{ pkgs, ... } :
+{
+  boot = {
+  initrd = {
+  verbose = false;   # its a lot of logs. dont need it, unless we do.
+  kernelModules = [ ]; # no kernel modules on boot
+  };
+
+  extraModulePackages = [ ];       # no extra packages on boot either
+  kernelPackages = pkgs.linuxPackages_latest;  # latest greatest linux kernel
+  kernelParams = [ "silent" ];       # quiet those logs
+
+  consoleLogLevel = 0;         # quiten more logs
+  plymouth.enable = true;        # graphical boot animation instead
+
+  supportedFilesystems = [ "ntfs" ];     # should see the ntfs (windows)
+
+  loader = {
+  systemd-boot.enable = true;      # systemd-boot
+  systemd-boot.configurationLimit = 10;
+  efi.canTouchEfiVariables = true;     # allow editing efi to edit the boot loader
+  timeout = 5;           # grub timeout to make a selection
+  };
+  };
+}
+
+
+
+
+
+

assets/flake/machines/traveldroid/machine.nix

+
+

+This is the top if the machine hierarchy +

+
+
{
+  config,
+  pkgs,
+  lib,
+  user,
+  inputs,
+  flakeRoot,
+  ...
+}:
+
+{
+  options = {
+    wm = lib.mkOption {
+      type = lib.types.str;
+      default = "hyprland";
+      description = "Type of window manager to use";
+    };
+  };
+
+  config = {
+    # Minimal settings that must be defined here
+    networking.hostName = "traveldroid";
+    wm.type = "hyprland";
+
+    # User configuration
+    users.users.${user.username} = {
+      isNormalUser = true;
+      extraGroups = [
+        "wheel"
+        "networkmanager"
+      ];
+      hashedPassword = user.hashedPassword;
+      home = user.homeDirectory;
+    };
+    # Optional: Enable auto-login for testing
+    services.getty.autologinUser = user.username;
+  };
+}
+
+
+
+
+
+

assets/flake/machines/traveldroid/dbus.nix

+
+

+This sets the dbus implementation +

+
+
{ config, pkgs, lib, ... }:
+{
+  services.dbus = lib.mkForce {
+    enable = false; # Force this to be false
+  };
+
+  # Configure dbus-broker via its configuration file
+  environment.etc."dbus-broker/launch.conf".text = ''
+    [General]
+    LogLevel=warning
+    MaxConnectionsPerUser=2048
+  '';
+}
+
+
+
+
+
+

assets/flake/machines/traveldroid/bluetooth.nix

+
+

+This sets the bluetooth implementation +

+
+
{ config, pkgs, ... }:
+{
+  # Enable Bluetooth hardware and daemon
+  hardware.bluetooth = {
+    enable = true;
+    powerOnBoot = true;
+    packages = with pkgs; [ bluez ];
+  };
+
+  # Enable Bluetooth audio support in PipeWire
+  services.pipewire = {
+    config.pulse = {
+      bluez5.enable = true;
+    };
+  };
+
+  # Optional: Additional Bluetooth settings
+  hardware.bluetooth.extraConfig = ''
+    AutoEnable=true
+    DiscoverableTimeout=0
+    PairableTimeout=0
+  '';
+
+  # Install a graphical Bluetooth manager (optional)
+  environment.systemPackages = with pkgs; [
+    blueman
+  ];
+}
+
+
+
+
+
+

assets/flake/machines/traveldroid/audio.nix

+
+

+This sets audiosystem for this machine +

+
+
{ config, pkgs, ... }:
+{
+  services.pipewire = {
+    enable = true;
+    alsa.enable = true;    # ALSA compatibility
+    pulse.enable = true;   # PulseAudio compatibility
+    wireplumber.enable = true; # Session manager for PipeWire
+  };
+
+  # Realtime privileges for pro audio (optional)
+  security.rtkit.enable = true;
+}
+
+
+
+
+
+

assets/flake/machines/traveldroid/xdg.nix

+
+

+This sets the XDG implementation +

+
+
{ config, pkgs, ... }:
+{
+  xdg.portal = {
+    enable = true;
+    config.system.default = [ "hyprland" "gtk" ];
+  };
+}
+
+
+
+
+
+
+
+

Now we reach the top of the hierarchy which will call all other imports

+
+
+
+

generated/top.nix

+
+

+The ./generated/top.nix file acts as an anchor or entry point for the entire chain of imports in the pyramid structure. +

+
+
{ config, pkgs, lib, ... }:
+{
+  imports = [
+    ./system/top.nix
+    ./hyprland/top.nix
+    # ./mangowc/top.nix
+  ];
+}
+
+
+ + +

+This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder +

+
+
{ config, pkgs, lib, user, inputs, flakeRoot,... }:
+{
+  imports = [
+    ./hyprland.nix
+    ./animations_effects/top.nix
+    ./decorations/top.nix
+    ./keyboard_binds/top.nix
+    ./notifications/top.nix
+    ./statusbar_tray/top.nix
+    ./task_launcher/top.nix
+    ./task_window_workspace_switcher/top.nix
+    ./window_rules/top.nix
+  ];
+}
+
+
+
+
+
+

generated/hyprland/hyprland.nix

+
+

+The ./generated/top.nix file acts as an anchor or entry point for the entire chain of imports in the pyramid structure. +

+
+
{
+  config,
+  pkgs,
+  lib,
+  user,
+  flakeRoot,
+  ...
+}:
+
+let
+  hyprlandConfigDir = "${config.home-manager.users.${user.username}.xdg.configHome}/hypr";
+  # Dynamically read all files in assets/hyprland/conf/
+  hyprlandConfs =
+    lib.genAttrs (builtins.attrNames (builtins.readDir "${flakeRoot}/assets/hyprland/conf/hypr"))
+      (name: {
+        text = builtins.readFile "${flakeRoot}/assets/hyprland/conf/hypr/${name}";
+      });
+in
+{
+  # NixOS: Enable Hyprland (optional)
+  programs.hyprland = {
+    enable = true;
+  };
+
+  # Home Manager: Hyprland-specific configurations
+  home-manager.users.${user.username} = {
+    # Use config.home-manager.users.${user.username} instead of userConfig
+    home.stateVersion = config.home-manager.users.${user.username}.stateVersion or "23.11"; # Default fallback
+    home.username = user.username; # Use the 'user' argument
+    home.homeDirectory =
+      config.home-manager.users.${user.username}.homeDirectory or "/home/${user.username}";
+
+    wayland.windowManager.hyprland = {
+      enable = true;
+    };
+
+    # Ensure the Hyprland config directory exists
+    xdg.configFile = {
+      "hypr/.keep" = {
+        text = "";
+      };
+    } // hyprlandConfs;
+  };
+}
+
+
+
+
+
+

generated/mangowc/top.nix

+
+

+This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder +

+
+
{ config, pkgs, lib, user, inputs, flakeRoot,... }:
+{
+  imports = [
+    ./animations_effects/top.nix
+    ./decorations/top.nix
+    ./keyboard_binds/top.nix
+    ./notifications/top.nix
+    ./statusbar_tray/top.nix
+    ./task_launcher/top.nix
+    ./task_window_workspace_switcher/top.nix
+    ./window_rules/top.nix
+  ];
+  # .. put any code here
+}
+
+
+
+
+
+

generated/system/top.nix

+
+

+This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder +

+
+
{ config, pkgs, lib, user, inputs, flakeRoot,... }:
+{
+  imports = [
+    ./applications/top.nix
+    ./core/top.nix
+    ./development/top.nix
+    ./system_management/top.nix
+  ];
+  # .. put any code here
+}
+
+
+
+
+
+

generated/system/applications/top.nix

+
+

+This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder +

+
+
{ config, pkgs, lib, user, inputs, flakeRoot,... }:
+{
+  imports = [
+    ./packages.nix
+    ./flatpaks.nix
+    ./accessibility/top.nix
+    ./file_management/top.nix
+    ./gaming/top.nix
+    ./media_playback_editing/top.nix
+    ./office_productivity/top.nix
+    ./terminal_shell/top.nix
+  ];
+  nixpkgs.config.allowUnfree = true;
+}
+
+
+
+
+
+

generated/system/applications/packages.nix

+
+

+This will import all packages listed in ./assets/system/apps/packlages.conf +

+
+
{ config, lib, pkgs, flakeRoot, inputs, ... }:
+let
+  packagesConfPath = "${flakeRoot}/assets/system/apps/packages.conf";
+  raw = builtins.readFile packagesConfPath;
+  # IMPORTANT: explicit "\n" so we never accidentally split into characters
+  rawLines = lib.splitString "\n" raw;
+  # Guard: if we accidentally split into characters, rawLines length ~= stringLength raw
+  _guard = assert !(
+  builtins.stringLength raw > 1 &&
+  builtins.length rawLines == builtins.stringLength raw
+  ); true;
+  cleanLine = l:
+  let
+  noCR = lib.replaceStrings [ "\r" ] [ "" ] l;
+  noInlineComment = lib.head (lib.splitString "#" noCR);
+  in
+  lib.strings.trim noInlineComment;
+  entries =
+  builtins.filter (l: l != "")
+  (map cleanLine rawLines);
+  resolvePkg = name:
+  let
+  parts = lib.splitString "." name;
+  found = lib.attrByPath parts null pkgs;
+  in
+  if found == null then
+    throw ''
+    packages.nix: package not found in pkgs
+    Token    : ${builtins.toJSON name}
+    packages.conf   : ${toString packagesConfPath}
+    Hint     : check the attribute name on search.nixos.org/packages
+    ''
+  else
+    found;
+  packages = builtins.seq _guard (map resolvePkg entries);
+  zenBrowser =
+  inputs.zen-browser.packages.${pkgs.stdenv.hostPlatform.system}.default;
+in
+{
+  environment.systemPackages =
+  packages
+  ++ [ zenBrowser ];
+}
+
+
+
+
+
+
+

generated/system/applications/flatpaks.nix

+
+

+This will import all packages listed in ./assets/system/apps/flatpaks.conf +

+
+
{
+  config,
+  pkgs,
+  lib,
+  flakeRoot,
+  ...
+}:
+let
+  moduleName = "install-flatpaks";
+  flatpakConfPath = "${flakeRoot}/assets/system/apps/flatpaks.conf";
+  raw = builtins.readFile flatpakConfPath;
+  # Explicit "\n" so we never accidentally split into characters
+  rawLines = lib.splitString "\n" raw;
+
+  # Guard: if we accidentally split into characters, rawLines length ~= stringLength raw
+  _guard =
+    assert !(builtins.stringLength raw > 1 && builtins.length rawLines == builtins.stringLength raw);
+    true;
+
+  cleanLine =
+    l:
+    let
+      noCR = lib.replaceStrings [ "\r" ] [ "" ] l;
+      noInlineComment = lib.head (lib.splitString "#" noCR);
+    in
+    lib.strings.trim noInlineComment;
+
+  entries = builtins.filter (l: l != "") (map cleanLine rawLines);
+
+  # Flatpak app IDs are reverse-DNS style like org.example.App (at least 2 dots).
+  # We'll validate and fail early with a clear message.
+  dotCount = s: builtins.length (lib.splitString "." s) - 1;
+
+  isValidId = s: (dotCount s) >= 2; # matches the error you're seeing: "at least 2 periods"
+
+  _validate = builtins.seq _guard (
+    builtins.map (
+      id:
+      if isValidId id then
+        true
+      else
+        throw ''
+          ${moduleName}: invalid Flatpak ID in flatpaks.conf (needs reverse-DNS with at least 2 dots)
+
+          Token    : ${builtins.toJSON id}
+          flatpaks.conf : ${toString flatpakConfPath}
+
+          Fix: remove stray tokens/headers, or comment them out with '#'.
+        ''
+    ) entries
+  );
+
+  # Use validated entries
+  flatpakApps = builtins.seq _validate entries;
+
+  syncFlatpaks = pkgs.writeShellScript "sync-flatpaks" ''
+    set -euo pipefail
+
+    # Use the deployed config path (matches environment.etc below)
+    CONF="/etc/flatpak/flatpaks.conf"
+    if [[ -f "$CONF" ]]; then
+    echo "flatpak-sync: using $CONF"
+    else
+    echo "flatpak-sync: WARNING: $CONF not found, using embedded list"
+    fi
+
+    if ! flatpak remotes --system --columns=name | grep -qx flathub; then
+    flatpak remote-add --system --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo
+    fi
+
+    desired_apps=(
+    ${lib.concatStringsSep "\n" (map (a: ''"${a}"'') flatpakApps)}
+    )
+
+    for app in "''${desired_apps[@]}"; do
+    if ! flatpak info --system "$app" >/dev/null 2>&1; then
+      flatpak install --system -y --noninteractive flathub "$app"
+    fi
+    done
+  '';
+in
+{
+  services.flatpak.enable = true;
+
+  xdg.portal = {
+    enable = true;
+  };
+
+  # Deploy the config file for runtime visibility/debugging
+  environment.etc."flatpak/flatpaks.conf".source = lib.mkForce flatpakConfPath;
+
+  systemd.services.flatpak-sync = {
+    description = "Install Flatpak apps listed in flatpaks.conf";
+    wantedBy = [ "multi-user.target" ];
+    wants = [ "network-online.target" ];
+    after = [ "network-online.target" ];
+
+    serviceConfig = {
+      Type = "oneshot";
+      ExecStart = syncFlatpaks;
+    };
+
+    restartTriggers = [ flatpakConfPath ];
+    path = [
+      pkgs.flatpak
+      pkgs.coreutils
+      pkgs.gnugrep
+      pkgs.gnused
+    ];
+  };
+}
+
+
+
+
+
+
+

generated/system/core/top.nix

+
+

+This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder +

+
+
{ config, pkgs, lib, user, inputs, flakeRoot,... }:
+{
+  imports = [
+    ./wayland.nix
+    ./eww.nix
+    ./waybar.nix
+    ./login-tuigreeter.nix
+    # ./login-lightdm.nix
+  ];
+  # .. put any code here
+}
+
+
+
+
+
+

generated/system/core/fonts.nix

+
+

+This file installs and configures eww +

+
+
{ config, pkgs, ... }:
+{
+  environment.systemPackages = with pkgs; [
+    (nerdfonts.override { fonts = [ "FiraCode" ]; })
+  ];
+}
+
+
+
+
+
+

generated/system/core/eww.nix

+
+

+This file installs and configures eww +

+
+
{ lib, config, pkgs, flakeRoot, user, ... }:
+let
+  ewwConfigDir = "${config.home-manager.users.${user.username}.xdg.configHome}/eww";
+  # Dynamically read all files in assets/system/conf/eww/
+  ewwConfs = lib.genAttrs (builtins.attrNames (builtins.readDir "${flakeRoot}/assets/system/conf/eww")) (name: {
+    text = builtins.readFile "${flakeRoot}/assets/system/conf/eww/${name}";
+  });
+in
+{
+  environment.systemPackages = with pkgs; [ eww ];
+
+  home-manager.users.${user.username} = {
+    home.file = {
+      "${ewwConfigDir}" = {
+        source = "${flakeRoot}/assets/system/conf/eww";
+        recursive = true;
+      };
+    };
+
+    home.sessionVariables = {
+      EWW_BIN = "${pkgs.eww}/bin/eww";
+    };
+
+    # Start eww with Hyprland/MangoWC
+    wayland.windowManager.hyprland.settings = lib.mkForce {
+      exec-once = [ "eww daemon" ];
+      exec = [ "eww open-many ${ewwConfigDir}/widgets" ]; # Adjust as needed
+    };
+    # For MangoWC, use:
+    # wayland.windowManager.mangowc.config = {
+    #   exec = [ "eww daemon" ];
+    #   exec-once = [ "eww open-many ${ewwConfigDir}/widgets" ];
+    # };
+  };
+}
+
+
+
+
+
+

generated/system/core/waybar.nix

+
+

+This file installs and configures waybar +

+
+
{ lib, pkgs, config, flakeRoot, ... }:
+let
+  username = "henrov";  # Replace with your actual username
+  waybar-config = pkgs.writeText "waybar-config" (builtins.readFile (flakeRoot + "/assets/system/conf/waybar/config"));
+  waybar-style = pkgs.writeText "waybar-style" (builtins.readFile (flakeRoot + "/assets/system/conf/waybar/style.css"));
+in
+{
+  programs.waybar = {
+    enable = true;
+    package = pkgs.waybar;
+  };
+
+  systemd.user.services.waybar = {
+    description = "Waybar (status bar for Wayland)";
+    wantedBy = [ "graphical-session.target" ];
+    after = [ "graphical-session.target" ];
+    serviceConfig = {
+      ExecStart = "${config.programs.waybar.package}/bin/waybar -c ${waybar-config} -s ${waybar-style}";
+      Restart = "on-failure";
+      RestartSec = "5s";
+    };
+  };
+
+  # Create symlinks for config and style
+  system.activationScripts.waybarSetup = lib.mkAfter ''
+    mkdir -p /home/${username}/.config/waybar
+    ln -sf ${waybar-config} /home/${username}/.config/waybar/config
+    ln -sf ${waybar-style} /home/${username}/.config/waybar/style.css
+    chown -R ${username}:users /home/${username}/.config/waybar
+  '';
+}
+
+
+
+
+
+

generated/system/core/login-tuigreeter.nix

+
+

+This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder +

+
+
{ pkgs, user, ... } :
+{
+environment.systemPackages = with pkgs; [
+tuigreet
+];
+services.greetd = {
+enable = true;
+settings = {
+  default_session = {
+  command = pkgs.lib.mkForce "${pkgs.tuigreet}/bin/tuigreet --remember --time --time-format '%I:%M %p | %a • %h | %F'";
+  };
+};
+};
+}
+
+
+
+
+
+

generated/system/core/wayland.nix

+
+

+This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder +

+
+
{ config, pkgs, lib, user, ... }:
+{
+  home-manager.users.${user.username} = {
+    xdg.portal = {
+      enable = true;
+      extraPortals = with pkgs; [ xdg-desktop-portal-hyprland ];
+      config.hyprland = {
+        "org.freedesktop.impl.portal.Screencast" = [ "hyprland" ];
+      };
+    };
+  };
+}
+
+
+
+
+
+

generated/system/development/top.nix

+
+

+This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder +

+
+
{ config, pkgs, lib, user, inputs, flakeRoot,... }:
+{
+  imports = [
+    ./databases/top.nix
+    ./devops_ci_cd/top.nix
+    ./programming_languages/top.nix
+    ./virtualization/top.nix
+    ./web_development/top.nix
+  ];
+  # .. put any code here
+}
+
+
+
+
+
+

generated/system/system_management/top.nix

+
+

+This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder +

+
+
{ config, pkgs, lib, user, inputs, flakeRoot,... }:
+{
+  imports = [
+    ./audio/top.nix
+    ./backups/top.nix
+    ./bluetooth/top.nix
+    ./disk_management/top.nix
+    ./hardware_sensors/top.nix
+    ./logging_monitoring/top.nix
+    ./login_manager/top.nix
+    ./monitor_setup/top.nix
+    ./networking/top.nix
+    ./power_management/top.nix
+    ./printers_scanners/top.nix
+    ./security/top.nix
+    ./system_updates/top.nix
+  ];
+  # .. put any code here
+}
+
+
+
+
+
+

generated/hyprland/animations_effects/top.nix

+
+

+This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder +

+
+
{ config, pkgs, lib, user, inputs, flakeRoot,... }:
+{
+  imports = [
+    # No subfolders to import
+  ];
+  # .. put any code here
+}
+
+
+
+
+
+

generated/hyprland/decorations/top.nix

+
+

+This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder +

+
+
{ config, pkgs, lib, user, inputs, flakeRoot,... }:
+{
+  imports = [
+    # No subfolders to import
+  ];
+  # .. put any code here
+}
+
+
+
+
+
+

generated/hyprland/keyboard_binds/top.nix

+
+

+This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder +

+
+
{
+  config,
+  pkgs,
+  lib,
+  user,
+  inputs,
+  flakeRoot,
+  ...
+}:
+let
+  bindingsContent = builtins.readFile (flakeRoot + "/assets/hyprland/conf/hypr/bindings.conf");
+in
+{
+  home-manager.users.${user.username} = {
+    wayland.windowManager.hyprland = {
+      enable = true;
+      extraConfig = bindingsContent;
+    };
+  };
+}
+
+
+
+
+
+

generated/hyprland/notifications/top.nix

+
+

+This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder +

+
+
{ config, pkgs, lib, user, inputs, flakeRoot,... }:
+{
+  imports = [
+    # No subfolders to import
+  ];
+  # .. put any code here
+}
+
+
+
+
+
+

generated/hyprland/statusbar_tray/top.nix

+
+

+This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder +

+
+
{ config, pkgs, lib, user, inputs, flakeRoot,... }:
+{
+  imports = [
+    # No subfolders to import
+  ];
+  # .. put any code here
+}
+
+
+
+
+
+

generated/hyprland/task_launcher/top.nix

+
+

+This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder +

+
+
{ config, pkgs, lib, user, inputs, flakeRoot,... }:
+{
+  imports = [
+    ./wofi.nix
+  ];
+  # .. put any code here
+}
+
+
+
+
+
+

generated/system/task_launcher/wofi.nix

+
+

+This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder +

+
+
{
+  lib,
+  config,
+  pkgs,
+  flakeRoot,
+  user,
+  ...
+}:
+
+let
+  wofiConfigDir = "${config.home-manager.users.${user.username}.xdg.configHome}/wofi";
+  # Dynamically read all files in assets/hyprland/conf/wofi/
+  wofiConfs =
+    lib.genAttrs (builtins.attrNames (builtins.readDir "${flakeRoot}/assets/system/conf/wofi"))
+      (name: {
+        text = builtins.readFile "${flakeRoot}/assets/system/conf/wofi/${name}";
+      });
+in
+{
+  environment.systemPackages = with pkgs; [
+    wofi
+  ];
+
+  home-manager.users.${user.username} = {
+    home.file = {
+      # Map the files to their target paths in ~/.config/wofi/
+      "${wofiConfigDir}/config" = wofiConfs."wofi.conf"; # Use the actual filename
+      "${wofiConfigDir}/style.css" = wofiConfs."theming.css"; # Use the actual filename
+    };
+
+    home.sessionVariables = {
+      WOFI_CONFIG = "${wofiConfigDir}/config";
+      WOFI_STYLE = "${wofiConfigDir}/style.css";
+    };
+  };
+}
+
+
+
+
+
+

generated/hyprland/task_window_workspace_switcher/top.nix

+
+

+This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder +

+
+
{ config, pkgs, lib, user, inputs, flakeRoot,... }:
+{
+  imports = [
+    # No subfolders to import
+  ];
+  # .. put any code here
+}
+
+
+
+
+
+

generated/hyprland/window_rules/top.nix

+
+

+This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder +

+
+
{ config, pkgs, lib, user, inputs, flakeRoot,... }:
+{
+  imports = [
+    # No subfolders to import
+  ];
+  # .. put any code here
+}
+
+
+
+
+
+

generated/mangowc/animations_effects/top.nix

+
+

+This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder +

+
+
{ config, pkgs, lib, user, inputs, flakeRoot,... }:
+{
+  imports = [
+    # No subfolders to import
+  ];
+  # .. put any code here
+}
+
+
+
+
+
+

generated/mangowc/decorations/top.nix

+
+

+This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder +

+
+
{ config, pkgs, lib, user, inputs, flakeRoot,... }:
+{
+  imports = [
+    # No subfolders to import
+  ];
+  # .. put any code here
+}
+
+
+
+
+
+

generated/mangowc/keyboard_binds/top.nix

+
+

+This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder +

+
+
# Your code here...
+
+
+
+
+
+

generated/mangowc/notifications/top.nix

+
+

+This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder +

+
+
{ config, pkgs, lib, user, inputs, flakeRoot,... }:
+{
+  imports = [
+    # No subfolders to import
+  ];
+  # .. put any code here
+}
+
+
+
+
+
+

generated/mangowc/statusbar_tray/top.nix

+
+

+This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder +

+
+
{ config, pkgs, lib, user, inputs, flakeRoot,... }:
+{
+  imports = [
+    # No subfolders to import
+  ];
+  # .. put any code here
+}
+
+
+
+
+
+

generated/mangowc/task_launcher/top.nix

+
+

+This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder +

+
+
{ config, pkgs, lib, user, inputs, flakeRoot,... }:
+{
+  imports = [
+    # No subfolders to import
+  ];
+  # .. put any code here
+}
+
+
+
+
+
+

generated/mangowc/task_window_workspace_switcher/top.nix

+
+

+This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder +

+
+
{ config, pkgs, lib, user, inputs, flakeRoot,... }:
+{
+  imports = [
+    # No subfolders to import
+  ];
+  # .. put any code here
+}
+
+
+
+
+
+

generated/mangowc/window_rules/top.nix

+
+

+This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder +

+
+
{ config, pkgs, lib, user, inputs, flakeRoot,... }:
+{
+  imports = [
+    # No subfolders to import
+  ];
+  # .. put any code here
+}
+
+
+
+
+
+

generated/system/applications/accessibility/top.nix

+
+

+This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder +

+
+
{ config, pkgs, lib, user, inputs, flakeRoot,... }:
+{
+  imports = [
+    # No subfolders to import
+  ];
+  # .. put any code here
+}
+
+
+
+
+
+

generated/system/applications/file_management/top.nix

+
+

+This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder +

+
+
{ config, pkgs, lib, user, inputs, flakeRoot,... }:
+{
+  imports = [
+    # No subfolders to import
+  ];
+  # .. put any code here
+}
+
+
+
+
+
+

generated/system/applications/gaming/top.nix

+
+

+This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder +

+
+
{ config, pkgs, lib, user, inputs, flakeRoot,... }:
+{
+  imports = [
+    # No subfolders to import
+  ];
+  # .. put any code here
+}
+
+
+
+
+
+

generated/system/applications/media_playback_editing/top.nix

+
+

+This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder +

+
+
{ config, pkgs, lib, user, inputs, flakeRoot,... }:
+{
+  imports = [
+    # No subfolders to import
+  ];
+  # .. put any code here
+}
+
+
+
+
+
+

generated/system/applications/office_productivity/top.nix

+
+

+This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder +

+
+
{ config, pkgs, lib, user, inputs, flakeRoot,... }:
+{
+  imports = [
+    # No subfolders to import
+  ];
+  # .. put any code here
+}
+
+
+
+
+
+

generated/system/applications/terminal_shell/top.nix

+
+

+This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder +

+
+
{ config, pkgs, lib, user, inputs, flakeRoot,... }:
+{
+  imports = [
+    ./kitty.nix
+    ./starship.nix
+    ./zsh.nix
+  ];
+  # .. put any code here
+}
+
+
+
+
+
+

generated/system/applications/terminal_shell/kitty.nix

+
+

+This file sets up Kitty terminal +

+
+
{ config, pkgs, lib, user, flakeRoot, ... }:
+let
+  kittyConfigDir = "${config.home-manager.users.${user.username}.xdg.configHome}/kitty";
+in
+{
+  home-manager.users.${user.username} = {
+    programs.kitty = {
+      enable = true;
+    };
+
+    # Copy the actual kitty.conf (not a symlink)
+    xdg.configFile."kitty/kitty.conf".text = lib.concatStringsSep "\n" [
+      (builtins.readFile "${flakeRoot}/assets/system/conf/kitty/kitty.conf")
+    ];
+
+    # Copy the theme file
+    xdg.configFile."kitty/Catppuccin-Mocha.conf".source = "${flakeRoot}/assets/system/conf/kitty/Catppuccin-Mocha.conf";
+  };
+}
+
+
+
+
+
+

generated/system/applications/terminal_shell/starship.nix

+
+

+This file sets up starship prompt +

+
+
{
+  lib,
+  config,
+  pkgs,
+  flakeRoot,
+  ...
+}:
+let
+  starshipConfig = lib.importTOML (flakeRoot + "/assets/system/conf/starship.toml");
+in
+{
+  programs.starship = {
+    enable = true;
+    settings = starshipConfig;
+  };
+}
+
+
+
+
+
+

generated/system/applications/terminal_shell/zsh.nix

+
+

+This sets up the zsh terminal +

+
+
{
+  lib,
+  config,
+  pkgs,
+  ...
+}:
+
+{
+  # --- NixOS Configuration ---
+  environment.systemPackages = with pkgs; [
+    zsh
+    git
+    docker
+  ];
+
+  # --- Home Manager Configuration ---
+  home-manager.users.henrov = {
+    programs.zsh = {
+      enable = true;
+      enableCompletion = true;
+
+      # Enable oh-my-zsh and use its plugins
+      oh-my-zsh = {
+        enable = true;
+        plugins = [
+          "git"
+          "docker"
+          "direnv"
+          "zsh-autosuggestions"
+          "zsh-syntax-highlighting"
+          "zsh-completions"
+          "zsh-history-substring-search"
+        ];
+        theme = "agnoster"; # Fallback, overridden below
+      };
+
+      # Source Nixpkgs-provided plugins explicitly
+      initContent = ''
+        # Source plugins installed by Nix
+        source ${pkgs.zsh-autosuggestions}/share/zsh-autosuggestions/zsh-autosuggestions.zsh
+        source ${pkgs.zsh-syntax-highlighting}/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
+        source ${pkgs.zsh-history-substring-search}/share/zsh-history-substring-search/zsh-history-substring-search.zsh
+
+        # Catppuccin Mocha theme for oh-my-zsh
+        local mocha_base="#1E1E2E"
+        local mocha_surface0="#313244"
+        local mocha_text="#CDD6F4"
+        local mocha_lavender="#B4BEFE"
+        local mocha_blue="#89B4FA"
+        local mocha_sapphire="#74C7EC"
+        local mocha_teal="#94E2D5"
+        local mocha_green="#A6E3A1"
+        local mocha_yellow="#F9E2AF"
+        local mocha_peach="#FAB387"
+        local mocha_maroon="#EBA0AC"
+        local mocha_red="#F38BA8"
+        local mocha_mauve="#CBA6F7"
+        local mocha_pink="#F5C2E7"
+        local mocha_flamingo="#F2CDCD"
+        local mocha_rosewater="#F5E0DC"
+
+        # Prompt
+        PROMPT='%{$fg[$mocha_blue]%}%n%{$reset_color%}@%{$fg[$mocha_peach]%}%m%{$reset_color%} %{$fg[$mocha_lavender]%}%~%{$reset_color%} %{$fg[$mocha_red]%}$%{$reset_color%} '
+        RPROMPT='%{$fg[$mocha_green]%}%T%{$reset_color%}'
+
+        # Git prompt
+        ZSH_THEME_GIT_PROMPT_PREFIX="%{$fg[$mocha_yellow]%}(%{$reset_color%}"
+        ZSH_THEME_GIT_PROMPT_SUFFIX="%{$fg[$mocha_yellow]%})%{$reset_color%}"
+        ZSH_THEME_GIT_PROMPT_DIRTY="%{$fg[$mocha_red]%}✗%{$reset_color%}"
+        ZSH_THEME_GIT_PROMPT_CLEAN="%{$fg[$mocha_green]%}✓%{$reset_color%}"
+        ZSH_THEME_GIT_PROMPT_AHEAD="%{$fg[$mocha_blue]%}⇡%{$reset_color%}"
+        ZSH_THEME_GIT_PROMPT_BEHIND="%{$fg[$mocha_blue]%}⇣%{$reset_color%}"
+        ZSH_THEME_GIT_PROMPT_UNTRACKED="%{$fg[$mocha_pink]%}?%{$reset_color%}"
+        ZSH_THEME_GIT_PROMPT_STAGED="%{$fg[$mocha_sapphire]%}+%{$reset_color%}"
+        ZSH_THEME_GIT_PROMPT_UNSTAGED="%{$fg[$mocha_red]%}!%{$reset_color%}"
+
+        # Virtualenv/pyenv
+        ZSH_THEME_VIRTUAL_ENV_PREFIX="(%{$fg[$mocha_teal]%}"
+        ZSH_THEME_VIRTUAL_ENV_SUFFIX="%{$reset_color%})"
+
+        # Right prompt with Git status
+        RPROMPT='$(git_prompt_info) %{$fg[$mocha_green]%}%T%{$reset_color%}'
+
+        # Set the custom theme
+        ZSH_THEME="catppuccin-mocha"
+      '';
+    };
+
+    # Home Manager packages (optional)
+    home.packages = with pkgs; [
+      direnv
+      git-extras
+    ];
+  };
+}
+
+
+
+
+
+
+

generated/system/development/databases/top.nix

+
+

+This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder +

+
+
{ config, pkgs, lib, user, inputs, flakeRoot,... }:
+{
+  imports = [
+    # No subfolders to import
+  ];
+  # .. put any code here
+}
+
+
+
+
+
+

generated/system/development/devops_ci_cd/top.nix

+
+

+This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder +

+
+
{ config, pkgs, lib, user, inputs, flakeRoot,... }:
+{
+  imports = [
+    # No subfolders to import
+  ];
+  # .. put any code here
+}
+
+
+
+
+
+

generated/system/development/programming_languages/top.nix

+
+

+This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder +

+
+
{ config, pkgs, lib, user, inputs, flakeRoot,... }:
+{
+  imports = [
+    # No subfolders to import
+  ];
+  # .. put any code here
+}
+
+
+
+
+
+

generated/system/development/virtualization/top.nix

+
+

+This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder +

+
+
{ config, pkgs, lib, user, inputs, flakeRoot,... }:
+{
+  imports = [
+    # No subfolders to import
+  ];
+  # .. put any code here
+}
+
+
+
+
+
+

generated/system/development/web_development/top.nix

+
+

+This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder +

+
+
{ config, pkgs, lib, user, inputs, flakeRoot,... }:
+{
+  imports = [
+    # No subfolders to import
+  ];
+  # .. put any code here
+}
+
+
+
+
+
+

generated/system/system_management/audio/top.nix

+
+

+This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder +

+
+
{ config, pkgs, lib, user, inputs, flakeRoot,... }:
+{
+  imports = [
+    # No subfolders to import
+  ];
+  # .. put any code here
+}
+
+
+
+
+
+

generated/system/system_management/backups/top.nix

+
+

+This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder +

+
+
{ config, pkgs, lib, user, inputs, flakeRoot,... }:
+{
+  imports = [
+    # No subfolders to import
+  ];
+  # .. put any code here
+}
+
+
+
+
+
+

generated/system/system_management/bluetooth/top.nix

+
+

+This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder +

+
+
{ config, pkgs, lib, user, inputs, flakeRoot,... }:
+{
+  imports = [
+    # No subfolders to import
+  ];
+  # .. put any code here
+}
+
+
+
+
+
+

generated/system/system_management/disk_management/top.nix

+
+

+This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder +

+
+
{ config, pkgs, lib, user, inputs, flakeRoot,... }:
+{
+  imports = [
+    # No subfolders to import
+  ];
+  # .. put any code here
+}
+
+
+
+
+
+

generated/system/system_management/hardware_sensors/top.nix

+
+

+This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder +

+
+
{ config, pkgs, lib, user, inputs, flakeRoot,... }:
+{
+  imports = [
+    # No subfolders to import
+  ];
+  # .. put any code here
+}
+
+
+
+
+
+

generated/system/system_management/logging_monitoring/top.nix

+
+

+This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder +

+
+
{ config, pkgs, lib, user, inputs, flakeRoot,... }:
+{
+  imports = [
+    # No subfolders to import
+  ];
+  # .. put any code here
+}
+
+
+
+
+
+

generated/system/system_management/login_manager/top.nix

+
+

+This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder +

+
+
{ config, pkgs, lib, user, inputs, flakeRoot,... }:
+{
+  imports = [
+    # No subfolders to import
+  ];
+  # .. put any code here
+}
+
+
+
+
+
+

generated/system/system_management/monitor_setup/top.nix

+
+

+This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder +

+
+
{ config, pkgs, lib, user, inputs, flakeRoot,... }:
+{
+  imports = [
+    # No subfolders to import
+  ];
+  # .. put any code here
+}
+
+
+
+
+
+

generated/system/system_management/networking/top.nix

+
+

+This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder +

+
+
{ config, pkgs, lib, user, inputs, flakeRoot,... }:
+{
+  imports = [
+    # No subfolders to import
+  ];
+  # .. put any code here
+}
+
+
+
+
+
+

generated/system/system_management/power_management/top.nix

+
+

+This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder +

+
+
{ config, pkgs, lib, user, inputs, flakeRoot,... }:
+{
+  imports = [
+    # No subfolders to import
+  ];
+  # .. put any code here
+}
+
+
+
+
+
+

generated/system/system_management/printers_scanners/top.nix

+
+

+This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder +

+
+
{ config, pkgs, lib, user, inputs, flakeRoot,... }:
+{
+  imports = [
+    # No subfolders to import
+  ];
+  # .. put any code here
+}
+
+
+
+
+
+

generated/system/system_management/security/top.nix

+
+

+This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder +

+
+
{ config, pkgs, lib, user, inputs, flakeRoot,... }:
+{
+  imports = [
+    # No subfolders to import
+  ];
+  # .. put any code here
+}
+
+
+
+
+
+

generated/system/system_management/system_updates/top.nix

+
+

+This is top file of this level which contains just an import statement for all relevant files and/or the subfolder in this folder +

+
+
{ config, pkgs, lib, user, inputs, flakeRoot,... }:
+{
+  imports = [
+    # No subfolders to import
+  ];
+  # .. put any code here
+}
+
+
+
+
+
+
+
+

Author: Henro Veijer

+

Created: 2026-03-13 vr 20:31

+

Validate

+
+ + diff --git a/Droidnix/README.org b/Droidnix/README.org index 99588f608..955533c37 100644 --- a/Droidnix/README.org +++ b/Droidnix/README.org @@ -345,7 +345,7 @@ The Nix flake definition for Droidnix. description = "Droidnix: A dendritic NixOS + Home Manager configuration"; inputs = { - nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.11"; + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; home-manager = { url = "github:nix-community/home-manager"; inputs.nixpkgs.follows = "nixpkgs"; @@ -595,13 +595,11 @@ This is the top if the machine hierarchy ** =assets/flake/machines/traveldroid/dbus.nix= This sets the dbus implementation #+BEGIN_SRC nix :tangle assets/flake/machines/traveldroid/dbus.nix :noweb tangle :mkdirp yes :eval never-html -{ config, pkgs, ... }: +{ config, pkgs, lib, ... }: { - # Ensure dbus-broker is installed and used - environment.systemPackages = with pkgs; [ dbus-broker ]; - - # Disable the default dbus service - services.dbus.enable = false; + services.dbus = lib.mkForce { + enable = false; # Force this to be false + }; # Configure dbus-broker via its configuration file environment.etc."dbus-broker/launch.conf".text = '' diff --git a/Droidnix/assets/flake/machines/traveldroid/dbus.nix b/Droidnix/assets/flake/machines/traveldroid/dbus.nix index e4a2281bc..ce701fd6d 100644 --- a/Droidnix/assets/flake/machines/traveldroid/dbus.nix +++ b/Droidnix/assets/flake/machines/traveldroid/dbus.nix @@ -1,10 +1,8 @@ -{ config, pkgs, ... }: +{ config, pkgs, lib, ... }: { - # Ensure dbus-broker is installed and used - environment.systemPackages = with pkgs; [ dbus-broker ]; - - # Disable the default dbus service - services.dbus.enable = false; + services.dbus = lib.mkForce { + enable = false; # Force this to be false + }; # Configure dbus-broker via its configuration file environment.etc."dbus-broker/launch.conf".text = ''