Files
nixos_stuff/Droidnix
2026-03-11 14:53:53 +01:00
..
2026-03-11 14:53:53 +01:00
2026-03-11 14:53:53 +01:00
2026-03-07 23:37:54 +01:00
2026-03-09 19:37:59 +01:00
2026-03-11 14:53:53 +01:00
2026-03-11 14:53:53 +01:00

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

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. Generated folders (system, hyprland, mangowc): NixOS and Home Manager configurations, generated from Org files.

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. Run the setup script: ./setup_droidnix.sh.
  3. Edit .assets/system/conf/base.conf to choose your window manager (wm = "hyprland" or wm = "mangowc").
  4. 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
  5. Build and switch: sudo nixos-rebuild switch --flake .#<hostname>.

—

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"; # Define the system explicitly
      user = import ./assets/flake/users/henrov.nix;
      machines = [
        "traveldroid"
        "maindroid"
      ];
    in
    {
      nixosConfigurations = lib.genAttrs machines (
        machine:
        lib.nixosSystem {
          inherit system;
          modules = [
            # Import machine-specific configurations
            ./assets/flake/machines/${machine}/top.nix

            # Home Manager and theme modules
            home-manager.nixosModules.home-manager
            {
              home-manager.useGlobalPkgs = true;
              home-manager.useUserPackages = true;
              home-manager.extraSpecialArgs = { inherit user inputs; flakeRoot = ./.;  };
            }
            inputs.catppuccin.nixosModules.catppuccin

            # Let's start importing the whole generated tree
            ./generated/top.nix
          ];
          specialArgs = { 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/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 code defines the machine to build. Just search and replace traveldroid to provision another machine.

{ config, pkgs, lib, user, inputs, flakeRoot,... }:

{
  imports = [
    ./boot.nix
    ./hardware-configuration.nix
  ];

  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/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
  };
  };
}

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
  ];
}

generated/hyprland/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"))
      (name: {
        text = builtins.readFile "${flakeRoot}/assets/hyprland/conf/${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;
    };

    # Merge dynamic Hyprland configs with existing xdg.configFile
    xdg.configFile = {
      # Your existing manual configs (if any)
    }
    // 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
    ./login-tuigreeter.nix
    # ./login-lightdm.nix
  ];
  # .. put any code here
}

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, ... }:
{
  # Enable essential services for a Wayland session
  services.dbus.enable = true;
  services.pipewire = {
    enable = true;
    alsa.enable = true;
    pulse.enable = true;
    wireplumber.enable = true;
  };

  # XDG Desktop Portal settings for better application integration
  xdg.portal = {
    enable = true;
    config.system.default = [ "hyprland" "gtk" ];
  };

  # Environment variables for a Wayland session
  environment.sessionVariables = {
    XDG_SESSION_TYPE = "wayland";
    XDG_CURRENT_DESKTOP = "Hyprland";
    XCURSOR_SIZE = "24";
  };

  # Home Manager Wayland configurations
  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/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/hyprland/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, ... }:

{
  # Install Wofi and its dependencies
  environment.systemPackages = with pkgs; [
    wofi
  ];

  # Home Manager configuration for Wofi
  home-manager.users.henrov = {
    # Ensure the config and theme directories exist
    home.file = {
      ".config/wofi".source = "${flakeRoot}/.assets/hyprland/conf/wofi";
      ".config/wofi/config".text = lib.readFile "${flakeRoot}/.assets/hyprland/conf/wofi/wofi.conf";
      ".config/wofi/style.css".source = "${flakeRoot}/.assets/hyprland/conf/wofi/theming.css";
    };

    # Environment variables for Wofi
    home.sessionVariables = {
      WOFI_CONFIG = "$HOME/.config/wofi/config";
      WOFI_STYLE = "$HOME/.config/wofi/style.css";
    };
  };

  # Systemd service to ensure Wofi is available (optional)
  systemd.user.services.wofi = {
    description = "Wofi Application Launcher";
    wantedBy = [ "default.target" ];
    serviceConfig.Type = "oneshot";
    serviceConfig.ExecStart = "${pkgs.wofi}/bin/wofi --show drun";
  };
}

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

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

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_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

{ config, pkgs, lib, user, inputs, flakeRoot,... }:
{
  # .. 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
}