Files
nixos/Droidnix/README.org
T
2026-03-26 17:28:49 +00:00

84 KiB
Raw Blame History

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/assets/
    • generated/<host>/modules/
    • generated/hosts/

Generated Structure

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

First Setup

  1. Clone this repository.
  2. Run the setup script: ./setup_droid.
  3. Edit .assets/traveldroid/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.

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

    import-tree.url = "github:vic/import-tree";

    stylix = {
      url = "github:nix-community/stylix";
      inputs.nixpkgs.follows = "nixpkgs";
    };

    zen-browser = {
      url = "github:youwen5/zen-browser-flake";
      inputs.nixpkgs.follows = "nixpkgs";
    };

    hyprland.url = "github:hyprwm/Hyprland";
  };

  outputs = { self, nixpkgs, home-manager, import-tree, stylix, hyprland, zen-browser, ... }:
    let
      system = "x86_64-linux";
      flakeRoot = self;
    in {
      nixosConfigurations = {
        traveldroid = nixpkgs.lib.nixosSystem {
          inherit system;

          modules = [
            ./generated/hosts/traveldroid/host.nix
          ];

          specialArgs = {
            inherit flakeRoot;
            inherit home-manager import-tree stylix hyprland zen-browser;
          };
        };
      };
    };
}

generated/hosts/traveldroid/host.nix

{ lib, config, pkgs, flakeRoot, import-tree, home-manager, ... }:

let
  hostname = "traveldroid";

  modulesPath = "${flakeRoot}/generated/modules/${hostname}";
  usersPath   = "${flakeRoot}/generated/users";

  hostModules = import-tree modulesPath;
  globalUsers = import-tree usersPath;

  allModules = hostModules.imports ++ globalUsers.imports;

in
{
  #################################
  # Core system config
  #################################

  networking.hostName = hostname;
  system.stateVersion = "26.05";

  #################################
  # Imports
  #################################

  imports =
    [
      ./boot.nix
      ./hardware-configuration.nix

      # REQUIRED for Home Manager
      home-manager.nixosModules.home-manager
    ]
    ++ allModules;

  #################################
  # Home Manager integration
  #################################

  home-manager.useGlobalPkgs = true;
  home-manager.useUserPackages = true;

# Install dconf for the system/user
 environment.systemPackages = [
   pkgs.dconf
 ];

# Ensure Home Manager writes dconf safely
    programs.dconf.enable = true;
}

generated/hosts/traveldroid/hardware-configuration.nix

  1. Boot into NixOS Live ISO or your installed system.
  2. Open a terminal.
  3. Run: <code>sudo nixos-generate-config root /mnt</code> (Omit root /mnt if already running NixOS.)
{
  hostname,
  pkgs,
  lib,
  modulesPath,
  user,
  config,
  ...
}:
{
  imports = [
    # (modulesPath + "/installer/scan/not-detected.nix")
    #../../hardware/hardware.nix
  ];

  boot.initrd.availableKernelModules = [
    "xhci_pci"
    "nvme"
    "usb_storage"
    "sd_mod"
    "rtsx_usb_sdmmc"
  ];
  boot.initrd.kernelModules = [ ];
  boot.kernelModules = [ "kvm-intel" ];
  boot.extraModulePackages = [ ];

  fileSystems."/" = {
    device = "/dev/disk/by-uuid/69433a14-fbaf-401b-af85-cd1bbf02b4e2";
    fsType = "ext4";
  };

  fileSystems."/boot" = {
    device = "/dev/disk/by-uuid/811D-0676";
    fsType = "vfat";
    options = [
      "fmask=0077"
      "dmask=0077"
    ];
  };

  swapDevices = [
    { device = "/dev/disk/by-uuid/b6c557c2-7682-460b-a5e7-8f6f2f429a3a"; }
  ];

  nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
  hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
}

generated/hosts/traveldroid/boot.nix

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

{
  boot.loader = {
    systemd-boot.enable = true;
    efi.canTouchEfiVariables = true;
    efi.efiSysMountPoint = "/boot";
    timeout = 5;
  };

  boot.kernelPackages = pkgs.linuxPackages_latest;

  boot.kernelParams = [
    "quiet"
    "splash"
    "udev.log_level=3"
    "rd.systemd.show_status=false"
  ];

  boot.consoleLogLevel = 0;
  #boot.initrd.systemd.enable = true;
  boot.initrd.availableKernelModules = [
    "xhci_pci"
    "nvme"
    "usb_storage"
    "sd_mod"
    "rtsx_usb_sdmmc"
  ];
  boot.kernelModules = [ "kvm-intel" ];

  boot.plymouth = {
	    enable = true;
	   /* theme = "rings";
	    themePackages = [
	      (pkgs.adi1090x-plymouth-themes.override {
	        selected_themes = [ "rings" ];
	      })
			    ];*/
	  };



  hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
  nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
}

Following are the imported modules

generated/traveldroid/modules/apps

generated/modules/traveldroid/apps/packages.nix

This installs a list of apps

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

let
  #################################
  # Read package list from config file
  #################################
  packagesConfPath = "${flakeRoot}/assets/traveldroid/conf/packages.conf";
  raw = builtins.readFile packagesConfPath;

  rawLines = lib.splitString "\n" raw;

  # Guard against splitting into characters accidentally
  _guard = assert !(builtins.stringLength raw > 1 && builtins.length rawLines == builtins.stringLength raw); true;

  # Clean each line: remove CRs, comments, trim whitespace
  cleanLine = line:
    let
      noCR = lib.replaceStrings [ "\r" ] [ "" ] line;
      noInlineComment = lib.head (lib.splitString "#" noCR);
    in
      lib.strings.trim noInlineComment;

  # Filter out empty lines
  entries = builtins.filter (l: l != "") (map cleanLine rawLines);

  # Resolve attribute paths in pkgs
  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  : ${packagesConfPath}
          Hint           : check the attribute name on search.nixos.org/packages
        '')
      else
        found;

  # Final system-wide package list
  packages = builtins.seq _guard (map resolvePkg entries);

in {
  #################################
  # Allow unfree packages globally
  #################################
  nixpkgs.config = { allowUnfree = true; };

  #################################
  # System packages
  #################################
  environment.systemPackages = packages;
}

generated/modules/traveldroid/apps/kitty.nix

This file sets up Kitty terminal

{ lib, pkgs, config, ... }:

let
  #################################
  # Determine default username
  #################################
  username   = config.defaultUser or "henrov";
  moduleName = "kitty";

  #################################
  # Paths to assets
  #################################
  assetPath    = ../../../assets/traveldroid/conf/${moduleName};
  programFiles = builtins.readDir assetPath;

  # Convert asset files into a nix attribute set
  files = lib.genAttrs (builtins.attrNames programFiles) (name: {
    source = "${assetPath}/${name}";
  });

in
{
  #################################
  # System-wide packages
  #################################
  environment.systemPackages = [
    pkgs.kitty
  ];

  #################################
  # Home Manager user configuration
  #################################
  _module.args.hmUsers = {
    ${username} = {

      # Enable Kitty through Home Manager
      programs.kitty.enable = true;

      # Extra user-specific config snippet
      programs.kitty.extraConfig = ''
        # Include the Catppuccin-Mocha theme
        include themes/Catppuccin-Mocha.conf
      '';

      # Map all asset files into ~/.config/kitty/
      home.file = lib.mkMerge (
        map (name: { ".config/${moduleName}/${name}" = { source = files.${name}.source; }; })
            (builtins.attrNames files)
      );
    };
  };
}

generated/modules/traveldroid/apps/starship.nix

This file sets up starship prompt

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

let
  # Default username fallback
  username = config.defaultUser or "henrov";

  # Path to the starship config in assets
  starshipConfSrc = "${flakeRoot}/assets/traveldroid/conf/starship.toml";
in
{
  #################################
  # Enable Starship system-wide
  #################################
  environment.systemPackages = [ pkgs.starship ];

  #################################
  # Home Manager user configuration
  #################################
  _module.args.hmUsers = {
    ${username} = {
      programs.starship = {
        enable = true;
      };

      # Copy the starship.toml from assets to ~/.config/starship.toml
      home.file = {
        ".config/starship.toml" = { source = starshipConfSrc; };
      };
    };
  };
}

generated/modules/traveldroid/apps/thunar.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, config, lib, ... }:

let
  # Resolve the default username from host config
  username = config.defaultUser or "henrov";
in
{
  ############################
  # System-level packages
  ############################
  environment.systemPackages = with pkgs; [
    thunar                  # main file manager
    thunar-archive-plugin    # zip, tar, rar, 7z support
    thunar-volman            # auto-mount removable drives
    gvfs                     # support for external drives and network shares
    xarchiver                # optional GUI archive manager
  ];

  ############################
  # Home Manager user-level configuration
  ############################
  # Direct assignment to the user avoids recursiveUpdate issues
  home-manager.users."${username}" = {
    home.stateVersion = "26.05";  # required

    home.sessionVariables = {
      FILE_MANAGER = "thunar";
      USERNAME     = username;
    };
  };
}

generated/modules/traveldroid/apps/wofi.nix

This is the install for Wofi, the launcher

{ lib, config, pkgs, flakeRoot, home-manager, ... }:

let
  programName = "wofi";
  username = config.defaultUser or "henrov";
  assetPath = "${flakeRoot}/assets/traveldroid/conf/${programName}";

  # Read all files in the asset directory if it exists
  assetFiles =
    if builtins.pathExists assetPath then
      builtins.attrNames (builtins.readDir assetPath)
    else
      [];

  # Convert files to Home Manager xdg config entries
  wofiFiles = lib.genAttrs assetFiles (f: {
    name =
      if f == "wofi.conf" then ".config/wofi/config"
      else if f == "theming.css" then ".config/wofi/style.css"
      else ".config/wofi/${f}";
    value = { source = "${assetPath}/${f}"; };
  });
in
{
  # Install Wofi via system packages
  environment.systemPackages = [
    pkgs.wofi
  ];

  # Home Manager configuration
  _module.args.hmUsers = {
    ${username} = {
      home.packages = [ pkgs.wofi ];

      # Deploy all files to ~/.config/wofi/
      home.file = lib.mkMerge wofiFiles;
    };
  };
}

generated/modules/traveldroid/apps/zenbrowser.nix

This installs zen browser

{ config, pkgs, lib, zen-browser, ... }:

let
  # Grab the Zen Browser package for this host system
  zenBrowser = zen-browser.packages.${pkgs.stdenv.hostPlatform.system}.default;
in
{
  environment.systemPackages =  [
    zenBrowser
  ];
}

generated/modules/traveldroid/apps/zsh.nix

This sets up the zsh in the terminal

{ config, pkgs, lib, ... }:
{
  programs.zsh = {
    enable = true;
    enableCompletion = true;
  #  autocd = true;
  #  dotDir = "${config.xdg.configHome}/zsh";
    ohMyZsh = {
      enable = true;
      theme = "";
      plugins = [
        "git"
        "sudo"
        "extract"
        "colored-man-pages"
        "command-not-found"
        "history"
        "docker"
        "kubectl"
      ];
    };
    autosuggestions.enable = true;
    syntaxHighlighting.enable = true;
  };
}

generated/modules/traveldroid/apps/emacs/emacs.nix

This installs emacs

{ lib, pkgs, flakeRoot, home-manager, config, ... }:

let
  username = config.defaultUser or "henrov";

  emacsPkg = pkgs.emacs-pgtk.override { withTreeSitter = true; };

  emacsExtraPackages = epkgs: [
    epkgs.manualPackages.treesit-grammars.with-all-grammars
    epkgs.nerd-icons
    epkgs.doom-modeline
    epkgs.diminish
    epkgs.eldoc
    epkgs.pulsar
    epkgs.which-key
    epkgs.expreg
    epkgs.vundo
    epkgs.puni
    epkgs.avy
    epkgs.consult
    epkgs.vertico
    epkgs.marginalia
    epkgs.crux
    epkgs.magit
    epkgs.nerd-icons-corfu
    epkgs.corfu
    epkgs.cape
    epkgs.orderless
    epkgs.yasnippet
    epkgs.yasnippet-snippets
    epkgs.rg
    epkgs.exec-path-from-shell
    epkgs.eat
    epkgs.rust-mode
    epkgs.rustic
    epkgs.nix-mode
    epkgs.hcl-mode
    epkgs.shell-pop
    epkgs.envrc
    epkgs.nixpkgs-fmt
    epkgs.f
    epkgs.gptel
    epkgs.catppuccin-theme
    epkgs.eldoc-box
    epkgs.sideline
    epkgs.sideline-flymake
    epkgs.sideline-eglot
  ];

  # Emacs config files
  earlyInitFile = "${flakeRoot}/assets/traveldroid/conf/emacs/early-init.el";
  initFile      = "${flakeRoot}/assets/traveldroid/conf/emacs/init.el";

in
{
  _module.args.hmUsers = {
    ${username} = {
      home.packages = [ emacsPkg ];

      home.sessionVariables = {
        EDITOR = "emacs";
        XDG_SCREENSHOTS_DIR = "~/screenshots";
      };

      programs.emacs = {
        enable = true;
        package = emacsPkg;
        extraPackages = emacsExtraPackages;
      };

      home.file = {
        ".emacs.d/early-init.el" = { source = earlyInitFile; };
        ".emacs.d/init.el"       = { source = initFile; };
      };
    };
  };
}

generated/modules/traveldroid/desktop

generated/modules/traveldroid/desktop/fonts.nix

This file installs and configures fonts

{ lib, pkgs, config, ... }:

{
    fonts.packages = with pkgs; [
      nerd-fonts.iosevka
      nerd-fonts.fira-code
      nerd-fonts.jetbrains-mono
    ];
}

generated/modules/traveldroid/desktop/gtk.nix

Setting up GTK

{ pkgs, config, lib, ... }:

let
  username = config.defaultUser or "henrov";
in
{
  environment.systemPackages = with pkgs; [
    gtk3
    gtk4
  ];

  home-manager.users."${username}" = {
    gtk = {
      enable = true;
    };
  };
}

generated/modules/traveldroid/desktop/hyprland.nix

Setting up Hyprland

{ lib, config, pkgs, flakeRoot, home-manager, inputs, ... }:

let
  username = config.defaultUser or "henrov";
  assetPath = "${flakeRoot}/assets/traveldroid/conf/hypr/";

  # Read all files in the asset directory
  assetFiles = builtins.attrNames (builtins.readDir assetPath);

  # Convert files to Home Manager xdg config entries
  hyprFiles = lib.genAttrs assetFiles (f: {
    # Destination path in home directory
    name = ".config/hypr/${f}";
    # Source file path
    value = { source = "${assetPath}/${f}"; };
  });

  # Determine Hyprland package
  hyprlandPkg =
    pkgs.hyprland or
    pkgs.hyprland-git or
    inputs.hyprland.packages.${pkgs.system}.default;
in
{
  environment.systemPackages = [ hyprlandPkg ];

  _module.args.hmUsers = {
    ${username} = {
      home.packages = [ hyprlandPkg ];

      # Merge all files in the asset folder into ~/.config/hypr/
      home.file = lib.mkMerge hyprFiles;

      # Optional: Hyprland settings
      settings.general."col.active_border" = "0xff97cbcd 0xff89b4fa";
    };
  };
}

generated/modules/traveldroid/desktop/wallpaper.nix

Setting up wallpaper engine + wallpaper gui

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

let
  username    = config.defaultUser or "henrov";
  homeDir     = "/home/${username}";
  wallpaperDst = "${homeDir}/Wallpapers";
  scriptSrc   = "${flakeRoot}/assets/traveldroid/Wallpapers/set-wallpapers-per-workspace.sh";
in
{
  ############################
  # Packages
  ############################
  environment.systemPackages = with pkgs; [
    swww
    waypaper
    jq
  ];

  ############################
  # Copy Wallpapers and Script
  ############################
  systemd.user.services.copyWallpapers = {
    description = "Copy Wallpapers and script to home";
    after = [ "network.target" ];
    serviceConfig.Type = "oneshot";
    serviceConfig.ExecStart = ''
      mkdir -p ${wallpaperDst}
      cp -r ${flakeRoot}/assets/traveldroid/Wallpapers/* ${wallpaperDst}/
      chown -R ${username}:${username} ${wallpaperDst}
      chmod +x ${wallpaperDst}/set-wallpapers-per-workspace.sh
    '';
    enable = true;
  };

  ############################
  # Auto-run script at login
  ############################
  systemd.user.services.wallpaperPerWorkspace = {
    description = "Set wallpapers per workspace on login";
    after = [ "copyWallpapers.service" ];
    wants = [ "copyWallpapers.service" ];
    serviceConfig.Type = "oneshot";
    serviceConfig.ExecStart = "${wallpaperDst}/set-wallpapers-per-workspace.sh";
    enable = true;
  };
}

generated/modules/traveldroid/desktop/stylix.nix

{ lib, config, pkgs, flakeRoot, stylix, ... }:

let
  username   = config.defaultUser or "henrov";
  moduleName = "stylix";

  assetPath  = "${flakeRoot}/assets/traveldroid/conf/${moduleName}";
  assetFiles = builtins.attrNames (builtins.readDir assetPath);

  # Same pattern as hyprland.nix (IMPORTANT)
  stylixFiles = lib.genAttrs assetFiles (f: {
    name = ".config/${moduleName}/${f}";
    value = { source = "${assetPath}/${f}"; };
  });

  stylixConfFile = "${assetPath}/stylix.conf";
  stylixConf =
    if builtins.pathExists stylixConfFile
    then builtins.readFile stylixConfFile
    else "";

  cursorName = "phinger-cursors-light";
  cursorSize = 24;
in
{
  #################################
  # Enable Stylix module
  #################################
  imports = [
    stylix.nixosModules.stylix
  ];

  #################################
  # System packages
  #################################
  environment.systemPackages = [
    pkgs.feh
    pkgs.st
  ];

  #################################
  # Stylix system config
  #################################
  stylix = {
    enable = true;

    base16Scheme = "${flakeRoot}/assets/traveldroid/theming/stylix/catppuccin-mocha.yaml";
    polarity = "dark";

    targets = {
      gtk.enable = true;
      qt.enable  = true;
    };

    #  Define FULL cursor set OR remove entirely
    cursor = {
      name    = cursorName;
      package = pkgs.phinger-cursors;
      size    = cursorSize;
    };
  };

  #################################
  # Home Manager
  #################################
  _module.args.hmUsers = {
    "${username}" = {
      home.file = lib.mkMerge [
        stylixFiles
        {
          ".config/${moduleName}/stylix.conf".text = stylixConf;
        }
      ];

      home.sessionVariables = {
        STYLIX_CONF      = "$HOME/.config/stylix/stylix.conf";
        XCURSOR_THEME    = cursorName;
        XCURSOR_SIZE     = toString cursorSize;
        HYPRCURSOR_THEME = cursorName;
        HYPRCURSOR_SIZE  = toString cursorSize;
      };

      gtk.theme.name = lib.mkForce "Catppuccin-Mocha-Standard-Blue-Dark";
    };
  };
}

generated/modules/traveldroid/desktop/waybar.nix

This file installs and configures waybar

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

let
  # Use the config option defaultUser directly, fallback to "henrov"
  username = config.defaultUser or "henrov";
  assetPath = "${flakeRoot}/assets/traveldroid/conf/waybar";
in
{
  # Install Waybar system-wide
  environment.systemPackages = [ pkgs.waybar ];

  # Home Manager user definition: only define what you need
  home-manager.users = {
    ${username} = {
      home.file = {
        ".config/waybar/config" = {
          source = "${assetPath}/config";
          force = true;  # <-- allow overwrite
        };
        ".config/waybar/style.css" = {
          source = "${assetPath}/style.css";
          force = true;  # <-- allow overwrite
        };
      };
    };
  };

  # Systemd user service for Waybar
  systemd.user.services.waybar = {
    description = "Waybar for Hyprland";
    after = [ "graphical-session.target" ];

    serviceConfig = {
      ExecStart = "${pkgs.waybar}/bin/waybar";
      Restart = "always";
      Environment = ''
        WAYLAND_DISPLAY=${config.environment.sessionVariables.WAYLAND_DISPLAY or "wayland-0"}
        XDG_CURRENT_DESKTOP=Hyprland
      '';
    };

    wantedBy = [ "default.target" ];
  };
}

generated/modules/traveldroid/desktop/wayland.nix

{ lib, config, pkgs, ... }:

{
  #################################
  # Core Wayland packages
  #################################
  environment.systemPackages = with pkgs; [
    wayland
    wl-clipboard      # optional but commonly used for copy/paste
  ];

  #################################
  # Optional: enable graphics stack
  #################################
  hardware.graphics.enable = true;

  #################################
  # Optional session variables for Wayland
  #################################
  environment.sessionVariables = {
    # Forces some apps to use Wayland
    NIXOS_OZONE_WL = "1";
  };
}

generated/modules/traveldroid/desktop/xdg.nix

This sets the XDG implementation

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

let
  #################################
  # Default username fallback
  #################################
  username = config.defaultUser or "henrov";

  #################################
  # Determine XDG portal package
  #################################
  xdgPortalHyprlandPkg =
    pkgs.xdg-desktop-portal-hyprland or
    inputs.xdgPortalHyprland.packages.${pkgs.system}.default;
in
{
  #################################
  # System-wide packages
  #################################
  environment.systemPackages = [
    xdgPortalHyprlandPkg
  ];

  #################################
  # Home Manager user config
  #################################
  _module.args.hmUsers = {
    ${username} = {
      home.packages = [
        xdgPortalHyprlandPkg
      ];

      # Enable XDG portal integration for Hyprland
      xdg.portal = {
        enable = true;
        extraPortals = [ xdgPortalHyprlandPkg ];
        config.hyprland = {
          "org.freedesktop.impl.portal.Screencast" = [ "hyprland" ];
        };
      };
    };
  };
}

generated/modules/traveldroid/system

generated/modules/traveldroid/system/bluetooth.nix

{ lib, config, pkgs, flakeRoot, home-manager, ... }:

let
  username = config.defaultUser or "henrov";
in
{
  ############################
  # Bluetooth daemon
  ############################
  hardware.bluetooth = {
    enable      = true;
    powerOnBoot = true;
    package     = pkgs.bluez; # singular, not a list
  };

  ############################
  # GUI Bluetooth manager
  ############################
  environment.systemPackages = with pkgs; [
    blueman
  ];

  ############################
  # Optional Home Manager integration
  ############################
  _module.args.hmUsers = lib.mkIf (home-manager != null) {
    ${username} = {
      # If you want a graphical tray or manager accessible in user session
      home.packages = [ pkgs.blueman ];

      # Example: could drop any config files for blueman here
      home.file = {};
    };
  };
}

generated/modules/traveldroid/system/dbus.nix

This sets the dbus implementation

{ config, pkgs, ... }:

{
  # Enable classic D-Bus service
  services.dbus.enable = true;

  # Use default dbus package (classic D-Bus)
  services.dbus.dbusPackage = pkgs.dbus;

  # Include some essential system packages so shell and tools exist
  environment.systemPackages = with pkgs; [
    bashInteractive
    coreutils
  ];

  # Do not attempt to wrap dbus-daemon-launch-helper manually
  # No extra security.wrappers needed
}

generated/modules/traveldroid/system/login-tuigreet.nix

This sets up tuigreeter which is not fancy but imo fits the aesthetic I am aiming for

{ config, pkgs, lib, ... }:

let
  tuigreetBin = "${pkgs.tuigreet}/bin/tuigreet";
  sessionsDir = "${pkgs.hyprland}/share/wayland-sessions";
in
{
  #################################
  # Greetd (tuigreet)
  #################################

  services.greetd = {
    enable = true;

    settings = {
      default_session = {
        command = ''
          ${tuigreetBin} \
            --time \
            --remember \
            --remember-session \
            --sessions ${sessionsDir} \
            --cmd "start-hyprland"
        '';
        user = "greeter";
      };
    };
  };

  #################################
  # Fix TTY / boot noise issues
  #################################

  systemd.services.greetd.serviceConfig = {
    Type = "idle";
    StandardInput = "tty";
    StandardOutput = "tty";
    StandardError = "journal";

    # Prevent boot log spam on tty
    TTYReset = true;
    TTYVHangup = true;
    TTYVTDisallocate = true;
  };
}

generated/modules/traveldroid/system/networking.nix

This sets the networking.

{ lib, config, pkgs, ... }:

{
  #################################
  # Networking core
  #################################
  networking = {
    # Let DHCP be default unless overridden elsewhere
    useDHCP = lib.mkDefault true;

    # Hostname comes from host.nix, do NOT redefine here

    #################################
    # NetworkManager (primary stack)
    #################################
    networkmanager = {
      enable = true;

      # Use iwd backend for WiFi
      wifi.backend = "iwd";
    };

    #################################
    # iwd (WiFi daemon)
    #################################
    wireless.iwd = {
      enable = true;
      # Allow user control via NM / CLI
      settings.General.EnableNetworkConfiguration = true;
    };

    #################################
    # Firewall
    #################################
    firewall = {
      enable = true;

      # KDE Connect support
      allowedTCPPortRanges = [
        { from = 1714; to = 1764; }
      ];

      allowedUDPPortRanges = [
        { from = 1714; to = 1764; }
      ];
    };
  };

  #################################
  # System packages
  #################################
  environment.systemPackages = [
    pkgs.networkmanager
  ];
}

generated/modules/traveldroid/system/nix.nix

{ lib, config, ... }:

{
    nix.settings = {
      experimental-features = [ "nix-command" "flakes" ];
      download-buffer-size = 536870912; # 512 MB
      cores = 2;
      max-jobs = 1;
    };
}

generated/users

generated/users/copy_2_home.nix

This copies stuff to the user home-folder

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

let
  username  = config.users.users.defaultUser or "henrov";
  homeDir   = "/home/${username}";
  assetPath = "${flakeRoot}/assets/copy_2_home";
in
{
  environment.systemPackages = [ pkgs.rsync ];

  systemd.services.copyAssets = {
    description = "Copy assets to ${username}'s home directory";
    wantedBy = [ "multi-user.target" ];

    # oneshot service runs once at boot
    serviceConfig.Type = "oneshot";

    # Always use /bin/sh -c for multi-line commands
    serviceConfig.ExecStart = ''
      /bin/sh -c '
        echo "Copying assets from ${assetPath} to ${homeDir}/Droidnix ..."

        if [ ! -d "${assetPath}" ]; then
          echo "ERROR: ${assetPath} does not exist"
          exit 1
        fi

        mkdir -p "${homeDir}/Droidnix"
        chown u+rwx ${username}:${username} "${homeDir}/Droidnix"

        ${pkgs.rsync}/bin/rsync -a --no-owner --no-group "${assetPath}/" "${homeDir}/"

        # Fix .config permissions
        mkdir -p "${homeDir}/.config"
        chown -R ${username}:${username} "${homeDir}/.config"
        chmod u+rwx "${homeDir}/.config"

        echo "Done copying assets."
      '
    '';
  };
}

generated/users/henrov.nix

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

{ lib, config, pkgs, ... }:

let
  username = "henrov";
in
{

  #################################
  # NixOS system user
  #################################
  users.users.${username} = {
    isNormalUser = true;
    home = "/home/${username}";
    hashedPassword = "$6$S7iShgBxB.77CwmP$i0njK.2r3OL5UEvgZbmwZ0rnpZ4QyJcv8p9uCmJ4AiVPSMXkQkIwMLzyAOnJ0q8.tPLIp/7EquEIZeK8qbmgw/";
    extraGroups = [ "wheel" "networkmanager" ];
  };

  #################################
  # Home Manager user definition
  #################################
  _module.args.hmUsers = {
    ${username} = {
      home.username      = username;
      home.homeDirectory = "/home/${username}";
      home.stateVersion  = "26.05";

      home.packages = [
        # add packages here
      ];

      home.file = {

      # Activation to ensure the directory is writable before symlinks
      home.activation.fixStylixPermissions = lib.hm.dag.entryAfter ["writeBoundary"] ''
        mkdir -p $HOME/.config
        chmod -R u+rwx $HOME/.config
      '';
    };
  };
};
}

These are all the prepared config files

.config/hypr/animations.conf

These are the config files for hypr

# ./assets/conf/desktop/hypr/animations.conf

animations {
    enabled = yes
    bezier = myBezier, 0.05, 0.9, 0.1, 1.05
    animation = windows, 1, 7, myBezier
    animation = windowsOut, 1, 7, default, popin 80%
    animation = border, 1, 10, default
    animation = borderangle, 1, 8, default
    animation = fade, 1, 7, default
    animation = workspaces, 1, 6, default
}

.config/hypr/behaviour.conf

These are the config files for hypr

# Keyboard and mouse settings
input {
    kb_layout = us
    kb_options = ctrl:nocaps
    sensitivity = -0.5
    accel_profile = adaptive
    scroll_factor = 0.5
}

# Scrolling modifier settings
input {
    scroll_main_mod = alt
    scroll_main_mod_invert = no
    scroll_per_border = yes
}

# Touchpad settings (applies to all touchpads)
input:touchpad:* {
    natural_scroll = yes
    scroll_factor = 0.5
}

# Focus settings
focus {
    follow_mouse = yes
    new_windows = smart
}

# Miscellaneous settings
misc {
    resize_step = 10 10
    anim_resize_friction = 0.1
}

.config/hypr/bindings.conf

These are the config files for hypr

$mainMod = SUPER

# use walker to show exec menu
# bind = $mainMod, Space , exec, walker
# bind = $mainMod, P, pseudo
# bind = $mainMod, T, togglesplit

# grimblast
# bind = $mainMod SHIFT, P, exec, grimblast -n -f copysave active
# bind = $mainMod SHIFT, A, exec, grimblast -n -f copysave area
# bind = $mainMod ALT, P, exec, grimblast -n -f copysave output
# bind = $mainMod CTRL, P, exec, grimblast -n -f copysave screen

# Terminal / launcher / kill / reload
bind = $mainMod, E, exec, thunar
bind = $mainMod, RETURN, exec, kitty
bind = $mainMod, Space, exec, wofi --show drun
bind = ALT, Space, exec, wofi --show drun
bind = $mainMod, Q, killactive,
bind = $mainMod SHIFT, Q, exit,
bind = $mainMod SHIFT, R, exec, hyprctl reload

# Switch windows
bind = ALT, TAB, cyclenext,
# bind = ALT SHIFT, TAB, cyclenext prev

# switch layouts


# Hyprscrolling
bind = $mainMod, period, layoutmsg, move +col
bind = $mainMod, comma,  layoutmsg, swapcol l
# Make / break a tab-group (stack)
bind = $mainMod, S, togglegroup
# Cycle tabs in the group
bind = $mainMod, L, changegroupactive, f
bind = $mainMod, H, changegroupactive, b
bind = $mainMod, T, exec, ~/.config/hypr/scripts/layout-selector.sh

# Focus movement
bind = $mainMod, H, movefocus, l
bind = $mainMod, L, movefocus, r
bind = $mainMod, K, movefocus, u
bind = $mainMod, J, movefocus, d
bind = $mainMod, left,  movefocus, l
bind = $mainMod, right, movefocus, r
bind = $mainMod, up,    movefocus, u
bind = $mainMod, down,  movefocus, d

# Move windows
bind = $mainMod SHIFT, H, movewindow, l
bind = $mainMod SHIFT, L, movewindow, r
bind = $mainMod SHIFT, K, movewindow, u
bind = $mainMod SHIFT, J, movewindow, d
bind = $mainMod SHIFT, left,  movewindow, l
bind = $mainMod SHIFT, right, movewindow, r
bind = $mainMod SHIFT, up,    movewindow, u
bind = $mainMod SHIFT, down,  movewindow, d

# Resize windows
bind = $mainMod CTRL, H, resizeactive, -30 0
bind = $mainMod CTRL, L, resizeactive,  30 0
bind = $mainMod CTRL, K, resizeactive,  0 -30
bind = $mainMod CTRL, J, resizeactive,  0  30

# Floating / fullscreen
bind = $mainMod, V, togglefloating,
bind = $mainMod, F, fullscreen, 0
bind = $mainMod SHIFT, F, fullscreen, 1

# Workspaces
bind = $mainMod, 1, workspace, 1
bind = $mainMod, 2, workspace, 2
bind = $mainMod, 3, workspace, 3
bind = $mainMod, 4, workspace, 4
bind = $mainMod, 5, workspace, 5
bind = $mainMod, 6, workspace, 6
bind = $mainMod, 7, workspace, 7
bind = $mainMod, 8, workspace, 8
bind = $mainMod, 9, workspace, 9
bind = $mainMod, 0, workspace, 10

bind = $mainMod SHIFT, 1, movetoworkspace, 1
bind = $mainMod SHIFT, 2, movetoworkspace, 2
bind = $mainMod SHIFT, 3, movetoworkspace, 3
bind = $mainMod SHIFT, 4, movetoworkspace, 4
bind = $mainMod SHIFT, 5, movetoworkspace, 5
bind = $mainMod SHIFT, 6, movetoworkspace, 6
bind = $mainMod SHIFT, 7, movetoworkspace, 7
bind = $mainMod SHIFT, 8, movetoworkspace, 8
bind = $mainMod SHIFT, 9, movetoworkspace, 9
bind = $mainMod SHIFT, 0, movetoworkspace, 10

# Cycle workspaces
bind = $mainMod, mouse_down, workspace, e+1
bind = $mainMod, mouse_up, workspace, e-1

# Mouse drag
bindm = $mainMod, mouse:272, movewindow
bindm = $mainMod, mouse:273, resizewindow

#########################
# Screenshots
#########################
bind = $mainMod SHIFT, s, exec, grim -g "$(slurp)" - | wl-copy
bind = , XF86Screenshot, exec, grim - | wl-copy

#########################
# Audio (pamixer)
#########################
bind = , XF86AudioRaiseVolume, exec, pamixer -i 5
bind = , XF86AudioLowerVolume, exec, pamixer -d 5
bind = , XF86AudioMute, exec, pamixer -t
bind = , XF86AudioMicMute, exec, pamixer --default-source -t

#########################
# Media (playerctl)
#########################
bind = , XF86AudioPlay, exec, playerctl play-pause
bind = , XF86AudioPause, exec, playerctl pause
bind = , XF86AudioNext, exec, playerctl next
bind = , XF86AudioPrev, exec, playerctl previous
bind = , XF86AudioStop, exec, playerctl stop

#########################
# Brightness (brightnessctl)
#########################
bind = , XF86MonBrightnessUp, exec, brightnessctl set +10%
bind = , XF86MonBrightnessDown, exec, brightnessctl set 10%-
bind = , XF86KbdBrightnessUp, exec, brightnessctl -d '*kbd_backlight*' set +10%
bind = , XF86KbdBrightnessDown, exec, brightnessctl -d '*kbd_backlight*' set 10%-

#########################
# Power / session
#########################
bind = , XF86Sleep, exec, systemctl suspend
bind = , XF86PowerOff, exec, systemctl poweroff
bind = , XF86WakeUp, exec, systemctl suspend
bind = $mainMod, L, exec, loginctl lock-session
# bind = $mainMod, X, exec, ~/.config/hypr/scripts/powermenu.sh

#########################
# Laptop lid settings
#########################
bindl = , switch:on:Lid Switch, exec, ~/.config/hypr/scripts/lid-action.sh
bindl = , switch:off:Lid Switch, exec, ~/.config/hypr/scripts/lid-restore.sh

#########################
# Start apps
#########################
bind = CTRL ALT, B, exec, flatpak run eu.betterbird.Betterbird
bind = CTRL ALT, S, exec, spotify
bind = $mainMod, Z, exec, zeditor
bind = $mainMod, W, exec, zen

.config/hypr/exec-once.conf

These are the config files for hypr

exec-once = dbus-update-activation-environment --systemd --all
exec-once = hypridle
exec-once = hyprpolkitagent
exec-once = systemd-run --user --scope --unit=elephant elephant
exec-once = bash -c "sleep 5 && waybar"

.config/hypr/hypridle.conf

These are the config files for hypr

general {
  lock_cmd = hyprlock
  after_sleep_cmd = hyprctl dispatch dpms on
  ignore_dbus_inhibit = false
}

listener {
  timeout = 600
  on-timeout = hyprlock
}

listener {
  timeout = 900
  on-timeout = hyprctl dispatch dpms off
  on-resume  = hyprctl dispatch dpms on
}

.config/hypr/hyprland.conf

These are the config files for hypr

source = ./theming.conf
source = ./animations.conf
source = ./bindings.conf
# source = ./behaviour.conf
source = ./exec-once.conf
source = ./layer-rules.conf
source = ./layout.conf
source = ./monitor-rules.conf
# source = ./window-rules.conf
# source = ./workspace-rules.conf


exec-once = /nix/store/c9cnbxhxbagj7gfpc1g5hl4x4f8dzayv-dbus-1.16.2/bin/dbus-update-activation-environment --systemd DISPLAY HYPRLAND_INSTANCE_SIGNATURE WAYLAND_DISPLAY XDG_CURRENT_DESKTOP XDG_SESSION_TYPE && systemctl --user stop hyprland-session.target && systemctl --user start hyprland-session.target
decoration {
  shadow {
    color=rgba(1e1e2e99)
  }
}

general {
  col.active_border=0xff97cbcd 0xff89b4fa
  col.inactive_border=rgb(45475a)
}

group {
  groupbar {
    col.active=rgb(89b4fa)
    col.inactive=rgb(45475a)
    text_color=rgb(cdd6f4)
  }
  col.border_active=rgb(89b4fa)
  col.border_inactive=rgb(45475a)
  col.border_locked_active=rgb(94e2d5)
}

misc {
  background_color=rgb(1e1e2e)
}

.config/hypr/hyprlock.conf

These are the config files for hypr

# ~/.config/hypr/hyprlock.conf

general {
  grace = 2
  ignore_empty_input = true
}

background {
  path = ~/.config/hypr/lock.png
  blur_passes = 2
  blur_size = 6
}

input-field {
  size = 320, 60
  outline_thickness = 2
  dots_size = 0.25
  dots_spacing = 0.20
  fade_on_empty = true
  placeholder_text = "Password"
  position = 0, -120
  halign = center
  valign = center
}

label {
  text = $TIME
  font_size = 72
  position = 0, 120
  halign = center
  valign = center
}

.config/hypr/layer-rules.conf

These are the config files for hypr

layerrule = blur on, ignore_alpha 1, match:namespace waybar
layerrule = xray 1, match:namespace waybar
layerrule = blur on, ignore_alpha 1, match:namespace walker
layerrule = xray 1, match:namespace walker
layerrule = blur on, ignore_alpha 1, match:namespace swaync-control-center
layerrule = blur on, ignore_alpha 1, match:namespace swaync-notification-window

.config/hypr/layout.conf

These are the config files for hypr

workspace_layouts = dwindle, master, scrolling, monocle

.config/hypr/monitor-rules.conf

These are the config files for hypr

# Default portable monitor rule
monitor=DP-1,3840x1080@144,1920x0,1

.config/hypr/scripts/layout-selector.sh

These are the config files for hypr/scripts

#!/usr/bin/env bash
# layout-selector.sh
# Select a workspace layout using Wofi, shows description, applies with layoutmsg

# Define layouts and descriptions
declare -A LAYOUTS=(
    [dwindle]="舘 Dwindle: Auto-tiling, windows shrink progressively"
    [master]="  Master: One main window, others stacked"
    [scrolling]=" Scrolling: Vertical list, scroll through windows"
    [monocle]="  Monocle: One window fills the screen"
    [floating]="  Floating: Free move & resize"
)
ORDER=(dwindle master scrolling monocle floating)

# Prepare Wofi menu: show "layoutname: description"
MENU_ITEMS=()
for key in "${ORDER[@]}"; do
    MENU_ITEMS+=("$key: ${LAYOUTS[$key]}")
done

# Show selection menu via Wofi
CHOICE=$(printf '%s\n' "${MENU_ITEMS[@]}" | wofi --dmenu --prompt "Select Layout")

# Exit if cancelled
[ -z "$CHOICE" ] && exit 0

# Extract layout name from selection (before colon)
LAYOUT_NAME="${CHOICE%%:*}"

# Apply layout via layoutmsg
hyprctl dispatch layoutmsg setlayout "$LAYOUT_NAME"

# Show OSD feedback
hyprctl dispatch oSD "Layout: $LAYOUT_NAME" 2000

.config/hypr/theming.conf

These are the config files for hypr

# Hyprland Catppuccin Mocha Theme (solid colors)

# Colors
$base       = #1e1e2e
$mantle     = #181825
$surface0   = #313244
$surface1   = #45475a
$surface2   = #585b70
$text       = #cdd6f4
$rosewater  = #f5e0dc
$lavender   = #b4befe
$red        = #f38ba8
$peach      = #fab387
$yellow     = #f9e2af
$green      = #a6e3a1
$teal       = #94e2d5
$blue       = #89b4fa
$mauve      = #cba6f7
$flamingo   = #f2cdcd
$inactive   = #595959aa

# General theming
general {
    gaps_in = 2
    gaps_out = 4
    border_size = 4
    layout = scrolling
    resize_on_border = true
    extend_border_grab_area = 20

    # Solid-color borders
    col.active_border = rgb(FFFF00)
    #col.active_border   = #a6e3a1
    #col.inactive_border = #595959aa
}

# Window decorations
decoration {
    rounding = 8
}

.config/hypr/window-rules.conf

These are the config files for hypr

# Floating and centering nm-connection-editor
windowrule = float, nm-connection-editor
windowrule = move center, nm-connection-editor
windowrule = size 900 700, nm-connection-editor

# Center all new windows by default
windowrule = center, ^(.*)

# Example: Float specific apps (uncomment to use)
windowrule = float, ^(pavucontrol)$

# Make Wofi windows blurred
windowrulev2 = floatclass:Wofi,blur:15
windowrulev2 = floatclass:Wofi,floating:true
windowrulev2 = floatclass:Wofi,opacity:0.9,blur:15

.config/hypr/workspace-rules.conf

These are the config files for hypr

# Workspace definitions (modern syntax)
workspace = 1
workspace = 2
workspace = 3
workspace = 4
workspace = 5

# Auto-launch apps on specific workspaces (use `exec` with `workspace` rule)
exec-once = kitty, workspace 1
exec-once = flatpak run app.betterbird.zen, workspace 2
exec-once = zen, workspace 3

# Force a specific layout for a workspace
workspace 1, layout:dwindle
workspace 2, layout:master
workspace 3, layout:msg

# Set workspace persistence
workspace 1, persistent:true
workspace 2, persistent:true

# Move specific apps to workspaces automatically
windowrule = move workspace 1, ^(kitty)$
windowrule = move workspace 2, ^(zen)$
windowrule = move workspace 3, ^(libreoffice)$

# Workspace behavior
workspace {
    cycle_move_empty = no
}

.config/mimeapps.list

These are the config files for .config

[Default Applications]
application/x-zerosize=dev.zed.Zed.desktop
x-scheme-handler/http=zen.desktop
x-scheme-handler/https=zen.desktop
x-scheme-handler/chrome=zen.desktop
text/html=zen.desktop
application/x-extension-htm=zen.desktop
application/x-extension-html=zen.desktop
application/x-extension-shtml=zen.desktop
application/xhtml+xml=zen.desktop
application/x-extension-xhtml=zen.desktop
application/x-extension-xht=zen.desktop

[Added Associations]
application/x-zerosize=xarchiver.desktop;dev.zed.Zed.desktop;
x-scheme-handler/http=zen.desktop;
x-scheme-handler/https=zen.desktop;
x-scheme-handler/chrome=zen.desktop;
text/html=zen.desktop;
application/x-extension-htm=zen.desktop;
application/x-extension-html=zen.desktop;
application/x-extension-shtml=zen.desktop;
application/xhtml+xml=zen.desktop;
application/x-extension-xhtml=zen.desktop;
application/x-extension-xht=zen.desktop;
application/x-shellscript=dev.zed.Zed.desktop;

.config/starship.toml

These are the config files for .config

"$schema" = 'https://starship.rs/config-schema.json'

format = """
[](red)\
$os\
$username\
[](bg:peach fg:red)\
$directory\
[](bg:yellow fg:peach)\
$git_branch\
$git_status\
[](fg:yellow bg:green)\
$c\
$rust\
$golang\
$nodejs\
$php\
$java\
$kotlin\
$haskell\
$python\
[](fg:green bg:sapphire)\
$conda\
[](fg:sapphire bg:lavender)\
$time\
[ ](fg:lavender)\
$cmd_duration\
$line_break\
$character"""

palette = 'catppuccin_mocha'

[os]
disabled = false
style = "bg:red fg:crust"

[os.symbols]
Windows = ""
Ubuntu = "󰕈"
SUSE = ""
Raspbian = "󰐿"
Mint = "󰣭"
Macos = "󰀵"
Manjaro = ""
Linux = "󰌽"
Gentoo = "󰣨"
Fedora = "󰣛"
Alpine = ""
Amazon = ""
Android = ""
AOSC = ""
Arch = "󰣇"
Artix = "󰣇"
CentOS = ""
Debian = "󰣚"
Redhat = "󱄛"
RedHatEnterprise = "󱄛"

[username]
show_always = true
style_user = "bg:red fg:crust"
style_root = "bg:red fg:crust"
format = '[ $user]($style)'

[directory]
style = "bg:peach fg:crust"
format = "[ $path ]($style)"
truncation_length = 3
truncation_symbol = "…/"

[directory.substitutions]
"Documents" = "󰈙 "
"Downloads" = " "
"Music" = "󰝚 "
"Pictures" = " "
"Developer" = "󰲋 "

[git_branch]
symbol = ""
style = "bg:yellow"
format = '[[ $symbol $branch ](fg:crust bg:yellow)]($style)'

[git_status]
style = "bg:yellow"
format = '[[($all_status$ahead_behind )](fg:crust bg:yellow)]($style)'

[nodejs]
symbol = ""
style = "bg:green"
format = '[[ $symbol( $version) ](fg:crust bg:green)]($style)'

[c]
symbol = " "
style = "bg:green"
format = '[[ $symbol( $version) ](fg:crust bg:green)]($style)'

[rust]
symbol = ""
style = "bg:green"
format = '[[ $symbol( $version) ](fg:crust bg:green)]($style)'

[golang]
symbol = ""
style = "bg:green"
format = '[[ $symbol( $version) ](fg:crust bg:green)]($style)'

[php]
symbol = ""
style = "bg:green"
format = '[[ $symbol( $version) ](fg:crust bg:green)]($style)'

[java]
symbol = " "
style = "bg:green"
format = '[[ $symbol( $version) ](fg:crust bg:green)]($style)'

[kotlin]
symbol = ""
style = "bg:green"
format = '[[ $symbol( $version) ](fg:crust bg:green)]($style)'

[haskell]
symbol = ""
style = "bg:green"
format = '[[ $symbol( $version) ](fg:crust bg:green)]($style)'

[python]
symbol = ""
style = "bg:green"
format = '[[ $symbol( $version)(\(#$virtualenv\)) ](fg:crust bg:green)]($style)'

[docker_context]
symbol = ""
style = "bg:sapphire"
format = '[[ $symbol( $context) ](fg:crust bg:sapphire)]($style)'

[conda]
symbol = "  "
style = "fg:crust bg:sapphire"
format = '[$symbol$environment ]($style)'
ignore_base = false

[time]
disabled = false
time_format = "%R"
style = "bg:lavender"
format = '[[  $time ](fg:crust bg:lavender)]($style)'

[line_break]
disabled = false

[character]
disabled = false
success_symbol = '[](bold fg:green)'
error_symbol = '[](bold fg:red)'
vimcmd_symbol = '[](bold fg:green)'
vimcmd_replace_one_symbol = '[](bold fg:lavender)'
vimcmd_replace_symbol = '[](bold fg:lavender)'
vimcmd_visual_symbol = '[](bold fg:yellow)'

[cmd_duration]
show_milliseconds = true
format = " in $duration "
style = "bg:lavender"
disabled = false
show_notifications = true
min_time_to_notify = 45000

[palettes.catppuccin_mocha]
rosewater = "#f5e0dc"
flamingo = "#f2cdcd"
pink = "#f5c2e7"
mauve = "#cba6f7"
red = "#f38ba8"
maroon = "#eba0ac"
peach = "#fab387"
yellow = "#f9e2af"
green = "#a6e3a1"
teal = "#94e2d5"
sky = "#89dceb"
sapphire = "#74c7ec"
blue = "#89b4fa"
lavender = "#b4befe"
text = "#cdd6f4"
subtext1 = "#bac2de"
subtext0 = "#a6adc8"
overlay2 = "#9399b2"
overlay1 = "#7f849c"
overlay0 = "#6c7086"
surface2 = "#585b70"
surface1 = "#45475a"
surface0 = "#313244"
base = "#1e1e2e"
mantle = "#181825"
crust = "#11111b"

[palettes.catppuccin_frappe]
rosewater = "#f2d5cf"
flamingo = "#eebebe"
pink = "#f4b8e4"
mauve = "#ca9ee6"
red = "#e78284"
maroon = "#ea999c"
peach = "#ef9f76"
yellow = "#e5c890"
green = "#a6d189"
teal = "#81c8be"
sky = "#99d1db"
sapphire = "#85c1dc"
blue = "#8caaee"
lavender = "#babbf1"
text = "#c6d0f5"
subtext1 = "#b5bfe2"
subtext0 = "#a5adce"
overlay2 = "#949cbb"
overlay1 = "#838ba7"
overlay0 = "#737994"
surface2 = "#626880"
surface1 = "#51576d"
surface0 = "#414559"
base = "#303446"
mantle = "#292c3c"
crust = "#232634"

[palettes.catppuccin_latte]
rosewater = "#dc8a78"
flamingo = "#dd7878"
pink = "#ea76cb"
mauve = "#8839ef"
red = "#d20f39"
maroon = "#e64553"
peach = "#fe640b"
yellow = "#df8e1d"
green = "#40a02b"
teal = "#179299"
sky = "#04a5e5"
sapphire = "#209fb5"
blue = "#1e66f5"
lavender = "#7287fd"
text = "#4c4f69"
subtext1 = "#5c5f77"
subtext0 = "#6c6f85"
overlay2 = "#7c7f93"
overlay1 = "#8c8fa1"
overlay0 = "#9ca0b0"
surface2 = "#acb0be"
surface1 = "#bcc0cc"
surface0 = "#ccd0da"
base = "#eff1f5"
mantle = "#e6e9ef"
crust = "#dce0e8"

[palettes.catppuccin_macchiato]
rosewater = "#f4dbd6"
flamingo = "#f0c6c6"
pink = "#f5bde6"
mauve = "#c6a0f6"
red = "#ed8796"
maroon = "#ee99a0"
peach = "#f5a97f"
yellow = "#eed49f"
green = "#a6da95"
teal = "#8bd5ca"
sky = "#91d7e3"
sapphire = "#7dc4e4"
blue = "#8aadf4"
lavender = "#b7bdf8"
text = "#cad3f5"
subtext1 = "#b8c0e0"
subtext0 = "#a5adcb"
overlay2 = "#939ab7"
overlay1 = "#8087a2"
overlay0 = "#6e738d"
surface2 = "#5b6078"
surface1 = "#494d64"
surface0 = "#363a4f"
base = "#24273a"
mantle = "#1e2030"
crust = "#181926"

.config/Thunar/accels.scm

These are the config files for Thunar

; thunar GtkAccelMap rc-file         -*- scheme -*-
; this file is an automated accelerator map dump
;
; (gtk_accel_path "<Actions>/ThunarBookmarks/8b0840406a9db6cc9e024618b73ff74d" "")
; (gtk_accel_path "<Actions>/ThunarStandardView/sort-by-type" "")
; (gtk_accel_path "<Actions>/ThunarStatusBar/toggle-last-modified" "")
; (gtk_accel_path "<Actions>/Thunarwindow/menu" "")
; (gtk_accel_path "<Actions>/ThunarActionManager/cut" "<Primary>x")
; (gtk_accel_path "<Actions>/ThunarStandardView/sort-by-size" "")
; (gtk_accel_path "<Actions>/ThunarWindow/file-menu" "")
; (gtk_accel_path "<Actions>/ThunarWindow/close-tab" "<Primary>w")
; (gtk_accel_path "<Actions>/ThunarWindow/switch-previous-tab-alt" "<Primary><Shift>ISO_Left_Tab")
; (gtk_accel_path "<Actions>/ThunarStatusBar/toggle-size" "")
; (gtk_accel_path "<Actions>/ThunarWindow/new-window" "<Primary>n")
; (gtk_accel_path "<Actions>/ThunarWindow/clear-directory-specific-settings" "")
; (gtk_accel_path "<Actions>/ThunarWindow/close-window" "<Primary>q")
; (gtk_accel_path "<Actions>/ThunarWindow/open-parent" "<Alt>Up")
; (gtk_accel_path "<Actions>/ThunarWindow/view-side-pane-menu" "")
; (gtk_accel_path "<Actions>/ThunarStatusBar/toggle-size-in-bytes" "")
; (gtk_accel_path "<Actions>/ThunarWindow/switch-previous-tab" "<Primary>Page_Up")
; (gtk_accel_path "<Actions>/ThunarActionManager/open" "<Primary>o")
; (gtk_accel_path "<Actions>/ThunarStandardView/sort-ascending" "")
; (gtk_accel_path "<Actions>/ThunarWindow/toggle-split-view" "F3")
; (gtk_accel_path "<Actions>/ThunarActionManager/copy-2" "<Primary>Insert")
; (gtk_accel_path "<Actions>/ThunarActionManager/trash-delete" "Delete")
; (gtk_accel_path "<Actions>/ThunarWindow/open-recent" "")
; (gtk_accel_path "<Actions>/ThunarWindow/view-configure-toolbar" "")
; (gtk_accel_path "<Actions>/ThunarStandardView/forward" "<Alt>Right")
; (gtk_accel_path "<Actions>/ThunarActionManager/restore" "")
; (gtk_accel_path "<Actions>/ThunarWindow/open-location-alt" "<Alt>d")
; (gtk_accel_path "<Actions>/ThunarWindow/zoom-out-alt" "<Primary>KP_Subtract")
; (gtk_accel_path "<Actions>/ThunarStandardView/select-by-pattern" "<Primary>s")
; (gtk_accel_path "<Actions>/ThunarWindow/open-file-menu" "F10")
; (gtk_accel_path "<Actions>/ThunarWindow/contents" "F1")
; (gtk_accel_path "<Actions>/ThunarWindow/show-highlight" "")
; (gtk_accel_path "<Actions>/ThunarStandardView/sort-descending" "")
; (gtk_accel_path "<Actions>/ThunarStandardView/sort-by-name" "")
; (gtk_accel_path "<Actions>/ThunarStandardView/select-all-files" "<Primary>a")
; (gtk_accel_path "<Actions>/ThunarActionManager/execute" "")
; (gtk_accel_path "<Actions>/ThunarStandardView/properties" "<Alt>Return")
; (gtk_accel_path "<Actions>/ThunarActionManager/cut-2" "")
; (gtk_accel_path "<Actions>/ThunarStandardView/sort-by-dtime" "")
; (gtk_accel_path "<Actions>/ThunarWindow/switch-next-tab" "<Primary>Page_Down")
; (gtk_accel_path "<Actions>/ThunarWindow/open-templates" "")
; (gtk_accel_path "<Actions>/ThunarActionManager/paste-2" "<Shift>Insert")
; (gtk_accel_path "<Actions>/ThunarStatusBar/toggle-filetype" "")
; (gtk_accel_path "<Actions>/ThunarWindow/close-all-windows" "<Primary><Shift>w")
; (gtk_accel_path "<Actions>/ThunarStandardView/create-document" "")
; (gtk_accel_path "<Actions>/ThunarWindow/detach-tab" "")
; (gtk_accel_path "<Actions>/ThunarWindow/cancel-search" "Escape")
; (gtk_accel_path "<Actions>/ThunarWindow/zoom-in-alt2" "<Primary>equal")
; (gtk_accel_path "<Actions>/ThunarStatusBar/toggle-hidden-count" "")
; (gtk_accel_path "<Actions>/ThunarShortcutsPane/sendto-shortcuts" "<Primary>d")
; (gtk_accel_path "<Actions>/ThunarActionManager/undo" "<Primary>z")
; (gtk_accel_path "<Actions>/ThunarStandardView/toggle-sort-order" "")
; (gtk_accel_path "<Actions>/ThunarWindow/view-location-selector-entry" "")
; (gtk_accel_path "<Actions>/ThunarActionManager/paste" "<Primary>v")
; (gtk_accel_path "<Actions>/ThunarWindow/zoom-in-alt1" "<Primary>KP_Add")
; (gtk_accel_path "<Actions>/ThunarWindow/view-menubar" "<Primary>m")
; (gtk_accel_path "<Actions>/ThunarStandardView/back" "<Alt>Left")
; (gtk_accel_path "<Actions>/ThunarWindow/open-desktop" "")
; (gtk_accel_path "<Actions>/ThunarWindow/view-as-detailed-list" "<Primary>2")
; (gtk_accel_path "<Actions>/ThunarActionManager/restore-show" "")
; (gtk_accel_path "<Actions>/ThunarWindow/sendto-menu" "")
; (gtk_accel_path "<Actions>/ThunarStatusBar/toggle-display-name" "")
; (gtk_accel_path "<Actions>/ThunarWindow/go-menu" "")
; (gtk_accel_path "<Actions>/ThunarWindow/zoom-out" "<Primary>minus")
; (gtk_accel_path "<Actions>/ThunarWindow/remove-from-recent" "")
; (gtk_accel_path "<Actions>/ThunarActionManager/open-with-other" "")
; (gtk_accel_path "<Actions>/ThunarStandardView/invert-selection" "<Primary><Shift>i")
; (gtk_accel_path "<Actions>/ThunarWindow/view-side-pane-shortcuts" "<Primary>b")
; (gtk_accel_path "<Actions>/ThunarWindow/reload-alt-2" "Reload")
; (gtk_accel_path "<Actions>/ThunarWindow/view-location-selector-menu" "")
; (gtk_accel_path "<Actions>/ThunarWindow/reload" "<Primary>r")
; (gtk_accel_path "<Actions>/ThunarWindow/edit-menu" "")
; (gtk_accel_path "<Actions>/ThunarActionManager/copy" "<Primary>c")
; (gtk_accel_path "<Actions>/ThunarWindow/bookmarks-menu" "")
; (gtk_accel_path "<Actions>/ThunarStandardView/forward-alt" "Forward")
; (gtk_accel_path "<Actions>/ThunarActionManager/move-to-trash" "")
; (gtk_accel_path "<Actions>/ThunarWindow/reload-alt-1" "F5")
; (gtk_accel_path "<Actions>/ThunarActionManager/delete-3" "<Shift>KP_Delete")
; (gtk_accel_path "<Actions>/ThunarStandardView/unselect-all-files" "Escape")
; (gtk_accel_path "<Actions>/ThunarWindow/contents/help-menu" "")
; (gtk_accel_path "<Actions>/ThunarStandardView/arrange-items-menu" "")
; (gtk_accel_path "<Actions>/ThunarStandardView/sort-by-mtime" "")
; (gtk_accel_path "<Actions>/ThunarWindow/open-computer" "")
; (gtk_accel_path "<Actions>/ThunarWindow/toggle-image-preview" "")
; (gtk_accel_path "<Actions>/ThunarWindow/toggle-side-pane" "F9")
; (gtk_accel_path "<Actions>/ThunarWindow/view-as-icons" "<Primary>1")
; (gtk_accel_path "<Actions>/ThunarActionManager/delete-2" "<Shift>Delete")
; (gtk_accel_path "<Actions>/ThunarWindow/zoom-in" "<Primary>plus")
; (gtk_accel_path "<Actions>/ThunarStandardView/rename" "F2")
; (gtk_accel_path "<Actions>/ThunarWindow/open-location" "<Primary>l")
; (gtk_accel_path "<Actions>/ThunarWindow/view-as-compact-list" "<Primary>3")
; (gtk_accel_path "<Actions>/ThunarWindow/view-menu" "")
; (gtk_accel_path "<Actions>/ThunarWindow/search" "<Primary>f")
; (gtk_accel_path "<Actions>/ThunarWindow/new-tab" "<Primary>t")
; (gtk_accel_path "<Actions>/ThunarWindow/zoom-reset" "<Primary>0")
; (gtk_accel_path "<Actions>/ThunarStandardView/back-alt2" "Back")
; (gtk_accel_path "<Actions>/ThunarActionManager/open-in-new-tab" "<Primary><Shift>p")
; (gtk_accel_path "<Actions>/ThunarWindow/view-location-selector-buttons" "")
; (gtk_accel_path "<Actions>/ThunarActionManager/redo" "<Primary><Shift>z")
(gtk_accel_path "<Actions>/ThunarWindow/open-trash" "<Primary><Shift>r")
; (gtk_accel_path "<Actions>/ThunarActionManager/open-in-new-window" "<Primary><Shift>o")
; (gtk_accel_path "<Actions>/ThunarWindow/view-statusbar" "")
; (gtk_accel_path "<Actions>/ThunarActionManager/open-location" "")
; (gtk_accel_path "<Actions>/ThunarStandardView/duplicate" "")
; (gtk_accel_path "<Actions>/ThunarActionManager/trash-delete-2" "KP_Delete")
; (gtk_accel_path "<Actions>/ThunarStandardView/back-alt1" "BackSpace")
; (gtk_accel_path "<Actions>/ThunarStandardView/create-folder" "<Primary><Shift>n")
; (gtk_accel_path "<Actions>/ThunarWindow/open-home" "<Alt>Home")
; (gtk_accel_path "<Actions>/ThunarWindow/switch-focused-split-view-pane" "")
; (gtk_accel_path "<Actions>/ThunarWindow/show-hidden" "<Primary>h")
; (gtk_accel_path "<Actions>/ThunarStandardView/set-default-app" "")
; (gtk_accel_path "<Actions>/ThunarWindow/empty-trash" "")
; (gtk_accel_path "<Actions>/ThunarWindow/preferences" "")
; (gtk_accel_path "<Actions>/ThunarActionManager/delete" "")
; (gtk_accel_path "<Actions>/ThunarWindow/open-network" "")
; (gtk_accel_path "<Actions>/ThunarWindow/view-side-pane-tree" "<Primary>e")
; (gtk_accel_path "<Actions>/ThunarWindow/open-file-system" "")
; (gtk_accel_path "<Actions>/ThunarWindow/search-alt" "Search")
; (gtk_accel_path "<Actions>/ThunarWindow/switch-next-tab-alt" "<Primary>Tab")
; (gtk_accel_path "<Actions>/ThunarActionManager/sendto-desktop" "")
; (gtk_accel_path "<Actions>/ThunarStandardView/make-link" "")
; (gtk_accel_path "<Actions>/ThunarWindow/zoom-reset-alt" "<Primary>KP_0")
; (gtk_accel_path "<Actions>/ThunarWindow/about" "")

.config/Thunar/uca.xml

These are the config files for Thunar

<?xml version="1.0" encoding="UTF-8"?>
<actions>
<action>
	<icon>utilities-terminal</icon>
	<name>Open Terminal Here</name>
	<submenu></submenu>
	<unique-id>1773690548549124-1</unique-id>
	<command>exo-open --working-directory %f --launch TerminalEmulator</command>
	<description>Example for a custom action</description>
	<range></range>
	<patterns>*</patterns>
	<startup-notify/>
	<directories/>
</action>
</actions>

.config/walker/config.toml

These are the config files for walker

# Walker UI layout/theme config (Catppuccin Mocha tuned)

theme = "frosted"
debug = true

[ui]
css = "home/henrov/themes/frosted/walker.css"

[ui.anchors]
top = true
left = true
right = true
bottom = false # don't stretch to full height; keeps it as a panel

[ui.window]
h_align = "fill"
v_align = "fill"

[ui.window.box]
h_align = "center"
# Single source of truth for the main content width
width = 520

[ui.window.box.margins]
top = 140

[ui.window.box.bar]
orientation = "horizontal"
position = "end"

[ui.window.box.bar.entry]
h_align = "fill"
h_expand = true

[ui.window.box.bar.entry.icon]
h_align = "center"
h_expand = false
pixel_size = 22
theme = "" # leave empty to inherit your system icon theme (Papirus etc.)

# --- AI scroll area (match main width, reduce hardcoding) ---
[ui.window.box.ai_scroll]
name = "aiScroll"
h_align = "fill"
v_align = "fill"
min_width = 520
width = 520
max_height = 260
height = 260

[ui.window.box.ai_scroll.margins]
top = 10

[ui.window.box.ai_scroll.list]
name = "aiList"
orientation = "vertical"
width = 520
spacing = 10

[ui.window.box.ai_scroll.list.item]
name = "aiItem"
h_align = "fill"
v_align = "fill"
x_align = 0
y_align = 0
wrap = true

# --- Main results list ---
[ui.window.box.scroll.list]
# Catppuccin Mocha accent (pick one):
# - teal: #94e2d5
# - blue: #89b4fa
marker_color = "#89b4fa"
max_height = 360
min_width = 520
max_width = 520
width = 520

[ui.window.box.scroll.list.margins]
top = 10

[ui.window.box.scroll.list.item.activation_label]
h_align = "fill"
v_align = "fill"
width = 22
x_align = 0.5
y_align = 0.5

[ui.window.box.scroll.list.item.icon]
pixel_size = 24
theme = "" # inherit system icon theme

# --- Search row (icons + input) ---
[ui.window.box.search.prompt]
name = "prompt"
icon = "edit-find"
theme = ""
pixel_size = 18
h_align = "center"
v_align = "center"

[ui.window.box.search.clear]
name = "clear"
icon = "edit-clear"
theme = ""
pixel_size = 18
h_align = "center"
v_align = "center"

[ui.window.box.search.input]
h_align = "fill"
h_expand = true
icons = true

[ui.window.box.search.spinner]
hide = true

.config/walker/themes/frosted/default.css

These are the config files for walker/themes/frosted

/* AUTO GENERATED. DO NOT EDIT. CHANGES WILL BE OVERWRITTEN. */

@define-color foreground rgba(255, 255, 255, 0.8);
@define-color background hsla(240, 12.7%, 13.9%, 0.98);
@define-color color1 hsl(172, 100%, 25.3%);
/* AUTO GENERATED. DO NOT EDIT. CHANGES WILL BE OVERWRITTEN. */

#window,
#box,
#aiScroll,
#aiList,
#search,
#password,
#input,
#prompt,
#clear,
#typeahead,
#list,
child,
scrollbar,
slider,
#item,
#text,
#label,
#bar,
#sub,
#activationlabel {
    all: unset;
}

#cfgerr {
    background: rgba(255, 0, 0, 0.4);
    margin-top: 20px;
    padding: 8px;
    font-size: 1.2em;
}

#window {
    color: @foreground;
}

#box {
    border-radius: 2px;
    background: @background;
    padding: 32px;
    border: 1px solid lighter(@background);
    box-shadow:
        0 19px 38px rgba(0, 0, 0, 0.3),
        0 15px 12px rgba(0, 0, 0, 0.22);
}

#search {
    box-shadow:
        0 1px 3px rgba(0, 0, 0, 0.1),
        0 1px 2px rgba(0, 0, 0, 0.22);
    background: lighter(@background);
    padding: 8px;
}

#prompt {
    margin-left: 4px;
    margin-right: 12px;
    color: @foreground;
    opacity: 0.2;
}

#clear {
    color: @foreground;
    opacity: 0.8;
}

#password,
#input,
#typeahead {
    border-radius: 2px;
}

#input {
    background: none;
}

#password {
}

#spinner {
    padding: 8px;
}

#typeahead {
    color: @foreground;
    opacity: 0.8;
}

#input placeholder {
    opacity: 0.5;
}

#list {
}

child {
    padding: 8px;
    border-radius: 2px;
}

child:selected,
child:hover {
    background: alpha(@color1, 0.4);
}

#item {
}

#icon {
    margin-right: 8px;
}

#text {
}

#label {
    font-weight: 500;
}

#sub {
    opacity: 0.5;
    font-size: 0.8em;
}

#activationlabel {
}

#bar {
}

.barentry {
}

.activation #activationlabel {
}

.activation #text,
.activation #icon,
.activation #search {
    opacity: 0.5;
}

.aiItem {
    padding: 10px;
    border-radius: 2px;
    color: @foreground;
    background: @background;
}

.aiItem.user {
    padding-left: 0;
    padding-right: 0;
}

.aiItem.assistant {
    background: lighter(@background);
}

.config/walker/themes/frosted/style.css

These are the config files for walker/themes/frosted

/* Catppuccin Mocha Walker Theme — Frosted Glass */

@import "default.css";

/* --- Palette --- */
/* glass layers: low alpha + slightly cool tint */
@define-color base   rgba(220, 230, 255, 0.15);
@define-color mantle rgba(24, 24, 37, 0.55); /* was opaque */
@define-color crust  rgba(17, 17, 27, 0.80);

@define-color text       #cdd6f4;
@define-color subtext0   #a6adc8;
@define-color subtext1   #bac2de;

/* use these as “edge lights” more than solid fills */
@define-color surface0   rgba(49, 50, 68, 0.35);
@define-color surface1   rgba(69, 71, 90, 0.40);
@define-color surface2   rgba(88, 91, 112, 0.45);

@define-color overlay0   rgba(108, 112, 134, 0.70);
@define-color overlay1   rgba(127, 132, 156, 0.85);
@define-color overlay2   rgba(147, 153, 178, 0.90);

@define-color blue     #89b4fa;
@define-color lavender #b4befe;
@define-color mauve    #cba6f7;
@define-color green    #a6e3a1;
@define-color red      #f38ba8;
@define-color peach    #fab387;
@define-color yellow   #f9e2af;

/* --- Walker expected tokens --- */
@define-color foreground @text;

/* very transparent base to let compositor blur show through */
@define-color background: rgba(26, 26, 40, 0.75);

/* selection tint */
@define-color color1 @blue;

/* --- Reset --- */
#window,
#box,
#aiScroll,
#aiList,
#search,
#password,
#input,
#prompt,
#clear,
#typeahead,
#list,
child,
scrollbar,
slider,
#item,
#text,
#label,
#bar,
#sub,
#activationlabel {
    all: unset;
}

/* --- Error --- */
#cfgerr {
    background: alpha(@red, 0.35);
    margin-top: 20px;
    padding: 10px;
    border-radius: 10px;
    border: 1px solid alpha(@red, 0.3);
    font-size: 1.1em;
}

/* --- Window --- */
#window {
    color: @foreground;
}

/* --- Main container (frosted glass card) --- */
#box {
    border-radius: 18px;
    background: @background;

    border: 1px solid alpha(@text, 0.08);

    box-shadow:
        inset 0 1px 0 alpha(@text, 0.04),
        0 8px 18px alpha(@crust, 0.4);

    padding: 28px;
}

/* --- Search “pill” --- */
#search {
    background: rgba(49, 50, 68, 0.22);
    padding: 10px 12px;
    border-radius: 14px;

    border: 1px solid alpha(@text, 0.1);
    box-shadow:
        inset 0 1px 0 alpha(@text, 0.06),
        0 6px 16px alpha(@crust, 0.35);
}

#prompt {
    margin-left: 6px;
    margin-right: 12px;
    color: alpha(@overlay1, 0.9);
}

#clear {
    color: alpha(@overlay2, 0.9);
}

/* --- Inputs --- */
#password,
#input,
#typeahead {
    border-radius: 10px;
}

#input {
    background: none;
}

#typeahead {
    color: alpha(@subtext1, 0.85);
}

#input placeholder {
    color: alpha(@overlay0, 0.75);
}

/* --- List items --- */
child {
    padding: 10px 12px;
    border-radius: 14px;
    background: @background;
    border: 1px solid alpha(@text, 0.05);
}

/* Hover / Selection: brighter glass + tinted glow */
child:selected,
child:hover {
    background: rgba(22, 22, 34, 0.8);
    border: 1px solid alpha(@text, 0.08);

    box-shadow:
        inset 0 1px 0 alpha(@text, 0.05),
        0 6px 14px alpha(@crust, 0.35);
}

/* --- Text --- */
#label {
    font-weight: 600;
}

#sub {
    color: alpha(@subtext0, 0.85);
    font-size: 0.85em;
}

/* --- Activation --- */
.activation #text,
.activation #icon,
.activation #search {
    opacity: 0.55;
}

/* --- AI Panel --- */
.aiItem {
    padding: 12px;
    border-radius: 14px;
    color: @foreground;

    /* glass tile */
    background: rgba(24, 24, 37, 0.3);
    border: 1px solid rgba(255, 255, 255, 0.05);
    box-shadow: inset 0 1px 0 alpha(@text, 0.05);
}

.aiItem.assistant {
    background: rgba(49, 50, 68, 0.22);
}

.config/waybar/config

These are the config files for waybar

{
  "layer": "top",
  "height": 34,

  //"modules-left":  ["hyprland/window"],

  "modules-center": ["hyprland/workspaces" ],

  "modules-right": [
    "idle_inhibitor",
    "pulseaudio",
    "network",
    //  "cpu",
    //  "memory",
    //  "temperature",
    "battery",
    "tray",
    "clock",
    "custom/notifications",
  ],

 /*
 "custom/notifications": {
    "tooltip": false,
    "return-type": "json",
    "exec-if": "which swaync-client",
    "exec": "swaync-client -swb",
    "format": "{icon}",
    "format-icons": {
      "notification": "",
      "none": "",
      "dnd-notification": "󰂠",
      "dnd-none": "󰪓",
    },
    "on-click": "swaync-client -t",
    "on-click-right": "swaync-client -d",
    "on-click-middle": "swaync-client -dn",
  },
*/

  "idle_inhibitor": {
    "tooltip": true,
    "format": "{icon}",
    "format-icons": {
      "activated": "  ",
      "deactivated": " 󰒲  ",
    },
    "tooltip-format-activated": "Staying awake",
    "tooltip-format-deactivated": "Might sleep....",
  },

  "pulseaudio": {
    "format": "{volume}% {icon}",
    "format-bluetooth": "{volume}% {icon}",
    "format-muted": "",
    "format-icons": {
      "headphones": "",
      "headset": "",
      "phone": "",
      "portable": "",
      "default": ["", ""],
    },
    "on-click": "pavucontrol",
  },

  "network": {
    "format-wifi": "  ({bandwidthDownBits})",
    "format-ethernet": "  ({bandwidthDownBits})",
    "format-disconnected": "Disconnected ⚠",
    "tooltip-format-wifi": "{essid} ({signalStrength}%)",
    "tooltip-format-ethernet": "{ifname}: {ipaddr}/{cidr}",
    "on-click": "impala",
    "on-click-right": "nm-connection-editor",
  },

  "cpu": {
    "format": "{usage}%  ",
    "tooltip": false,
  },

  "memory": {
    "format": "{percentage}%  ",
  },

  "temperature": {
    "format": "{temperatureC}°C ",
    "tooltip": false,
  },

  "tray": {
    "spacing": 10,
    "icon-size": 14,
  },

  "clock": {
    "format": "{:%a, %d %b %Y - %H:%M}",
    "tooltip": false,
    "on-click": "flatpak run eu.betterbird.Betterbird -calendar",
  },

  "battery": {
    "bat": "BAT0",
    "states": {
      "good": 95,
      "warning": 30,
      "critical": 15,
    },
    "format": "{capacity}% {icon}",
    "format-charging": "{capacity}% 󰂄",
    "format-plugged": "{capacity}%  ",
    "format-icons": ["󰁺", "󰁼", "󰁾", "󰂀", "󱈏 "],
  },
}

.config/waybar/style.css

These are the config files for waybar

/* --- Hyprland palette (ported) --- */
@define-color base     rgba(30, 30, 46, 1.0); /* 1e1e2eff */
@define-color inactive rgba(89, 89, 89, 0.667); /* 595959aa */
@define-color blue     rgba(51, 204, 255, 0.933); /* 33ccffee */
@define-color green    rgba(0, 255, 153, 0.933); /* 00ff99ee */

/* extra colors you referenced but didnt define */
@define-color text     rgba(255, 255, 255, 1.0);
@define-color surface1 rgba(255, 255, 255, 0.08);
@define-color subtext1 rgba(255, 255, 255, 0.35);
@define-color red      rgba(255, 0, 0, 0.90);
@define-color overlay1 rgba(255, 255, 255, 0.35);
@define-color yellow   rgba(255, 215, 0, 0.95);

* {
    font-family:
        Aporetic Sans Mono,
        Iosevka Nerd Font,
        Roboto,
        Helvetica,
        Arial,
        sans-serif;
    font-size: 13px;
}

window#waybar {
    background-color: transparent;
    color: @text;
    transition-property: background-color;
    border-bottom: 0px solid rgba(0, 0, 0, 0);
    transition-duration: 0.5s;
}

#workspaces button {
    padding: 0px 1px;
    min-width: 80px;
    background-color: transparent;
    color: @text;
    border: 2px solid @inactive;
    border-radius: 10px;
}

#custom-notifications.empty {
    color: @overlay1;
}

#custom-notifications.unread {
    color: @yellow;
}

#workspaces button:hover {
    background-color: @surface1;
    color: @text;
}

#workspaces button.active {
    padding: 0px 1px;
    min-width: 80px;
    color: @text;
    border-radius: 10px;
    font-weight: bold;
    border: 1px solid transparent;
    background:
        linear-gradient(rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0.15))
            padding-box,
        linear-gradient(45deg, @blue, @green) border-box;
}

#custom-hyprscroll_overflow.overflow {
    padding: 0px 1px;
    min-width: 80px;
    color: @text;
    border-radius: 10px;
    font-weight: bold;
    border: 1px dashed transparent;
    background:
        linear-gradient(rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0.05))
            padding-box,
        linear-gradient(45deg, @blue, @green) border-box;
}

#custom-hyprscroll_overflow.overflow {
    background:
        linear-gradient(rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0.05))
            padding-box,
        linear-gradient(45deg, @blue, @green) border-box;
}

#custom-hyprscroll_overflow.hidden {
    padding: 0;
    margin: 0;
    min-width: 0;
    border: 0;
    background: transparent;
    opacity: 0;
}

#clock,
#idle_inhibitor,
#battery,
#cpu,
#memory,
#temperature,
#network,
#pulseaudio,
#tray {
    margin: 0 5px;
    padding: 0 2px;
}

#idle_inhibitor.activated {
    background-color: @green;
}

#battery.charging {
    color: @green;
}

@keyframes blink {
    to {
        background-color: #ffffff;
        color: black;
    }
}

#battery.warning:not(.charging) {
    color: white;
    animation-name: blink;
    animation-duration: 0.5s;
    animation-timing-function: linear;
    animation-iteration-count: infinite;
    animation-direction: alternate;
}

#window,
#workspaces {
    margin: 0 4px;
}

.modules-left > widget:first-child > #workspaces {
    margin-left: 0;
}

.modules-right > widget:last-child > #workspaces {
    margin-right: 0;
}

#network.disconnected {
    background-color: @red;
}

#temperature.critical {
    background-color: @red;
}

/* =========================================================
 * Notifications
 * ========================================================= */
#custom-notifications {
    margin: 0 4px;
    padding: 0 4px;
    min-width: 0;
}

#custom-notifications.empty {
    color: @overlay1;
}
#custom-notifications.unread {
    color: @yellow;
}

/* =========================================================
 * Hyprscroll overflow indicator (custom/hyprscroll_overflow)
 * States: .ok, .overflow, .error
 * ========================================================= */

/* Default (no overflow): subtle pill, still hoverable for tooltip */
#custom-hyprscroll_overflow.ok {
    padding: 0px 1px;
    min-width: 80px;
    color: @subtext1;
    border-radius: 10px;

    /* subtle outline so you know it's there */
    border: 1px solid rgba(255, 255, 255, 0.12);
    background: rgba(255, 255, 255, 0.03);
}

/* Make it feel interactive (hover) */
#custom-hyprscroll_overflow.ok:hover {
    color: @text;
    background-color: @surface1;
    border: 1px solid rgba(255, 255, 255, 0.18);
}

/* Overflow state: you already have this; keep it.
   Optional: add hover tweak so it "pops" a bit. */
#custom-hyprscroll_overflow.overflow:hover {
    background:
        linear-gradient(rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0.1))
            padding-box,
        linear-gradient(45deg, @blue, @green) border-box;
}

/* Error state: clear but not screaming */
#custom-hyprscroll_overflow.error {
    padding: 0px 1px;
    min-width: 80px;
    color: @text;
    border-radius: 10px;

    border: 1px solid rgba(255, 0, 0, 0.55);
    background: rgba(255, 0, 0, 0.15);
    font-weight: bold;
}

/* Optional: if you keep .hidden in the script for any reason */
#custom-hyprscroll_overflow.hidden {
    padding: 0;
    margin: 0;
    min-width: 0;
    border: 0;
    background: transparent;
    opacity: 0;
}

.config/waypaper/config.ini

These are the config files for waypaper

[Settings]
language = en
backend = swww
folder = ~/Wallpapers/pictures
monitors = All
wallpaper = ~/Wallpapers/pictures/13.jpg
show_path_in_tooltip = True
fill = fill
sort = name
color = #ffffff
subfolders = False
all_subfolders = False
show_hidden = False
show_gifs_only = False
zen_mode = False
post_command =
number_of_columns = 3
swww_transition_type = any
swww_transition_step = 63
swww_transition_angle = 0
swww_transition_duration = 2
swww_transition_fps = 60
mpvpaper_sound = False
mpvpaper_options =
use_xdg_state = False
stylesheet = /home/henrov/.config/waypaper/style.css
keybindings = ~/.config/waypaper/keybindings.ini

.config/wofi/config

These are the config files for wofi

[global]
allow_images = true
allow_markup = true
show_drun = true:apps,false:others
show_run = true
show_files = false
show_windowed = false
show_dmenu = false
show_ssh = false
show_power = false

width = 800
height = 600
# Center on the active monitor
location=center
anchor=center

lines = 10
columns = 1
sort_order = last-used
sort_method = fuzzy
allow_scrolling = true
scroll_wrap = true
scroll_step = 10
cycle = true
hide_scroll = false
hide_search = false
show_labels = true
label_search = true
label_run = Run
label_files = Files
label_windowed = Windows
label_drun = Applications
label_dmenu = Commands
label_ssh = SSH
label_power = Power

prompt = >

.config/wofi/style.css

These are the config files for wofi

/* Catppuccin Mocha theme for Wofi with transparency and rounded corners */

@define-color base rgba(30, 30, 46, 0.9); /* Added transparency */
@define-color surface0 rgba(49, 50, 68, 0.95); /* Added transparency */
@define-color surface1 #45475A;
@define-color surface2 #585B70;
@define-color text #CDD6F4;
@define-color lavender #B4BEFE;
@define-color blue #89B4FA;
@define-color sapphire #74C7EC;
@define-color teal #94E2D5;
@define-color green #A6E3A1;
@define-color yellow #F9E2AF;
@define-color peach #FAB387;
@define-color maroon #EBA0AC;
@define-color red #F38BA8;
@define-color mauve #CBA6F7;
@define-color pink #F5C2E7;
@define-color flamingo #F2CDCD;
@define-color rosewater #F5E0DC;

* {
    background-color: transparent;
    color: @text;
    font-family: "JetBrainsMono Nerd Font", monospace;
    font-size: 12pt;
}

#main {
    background-color: @base;
    border: 1px solid @surface0;
    border-radius: 10px; /* Rounded corners */
    padding: 20px;
    box-shadow: 0 0 20px rgba(0, 0, 0, 0.3);
}

#input {
    background-color: @surface0;
    color: @text;
    border: 1px solid @surface1;
    border-radius: 10px; /* Rounded corners */
    padding: 5px 10px;
    margin-bottom: 10px;
}

#entry {
    background-color: rgba(
        200,
        200,
        200,
        0.2
    ); /* very light grey, very transparent */
    color: @text;
    border-radius: 10px;
    padding: 5px 10px;
    margin: 2px 0;
}

#entry:focus {
    background-color: @surface1;
    color: @lavender;
    border-radius: 10px; /* Rounded corners */
}

#entry:selected {
    background-color: @surface2;
    color: @text;
    border-radius: 10px; /* Rounded corners */
}

#scrollbar {
    background-color: @surface0;
    border-radius: 10px; /* Rounded corners */
    width: 8px;
}

#scrollbar.handle {
    background-color: @blue;
    border-radius: 10px; /* Rounded corners */
}