{
  config,
  pkgs,
  pkgs-small,
  nix-colors,
  username,
  ...
}:

let

in
{
  imports = [
    nix-colors.homeManagerModules.default
    ./modules/dunst.nix
    ./modules/waybar.nix
    ./modules/ranger.nix
    ./hyperland
  ];
  colorScheme = nix-colors.colorSchemes.gruvbox-material-dark-hard;

  # TODO please change the username & home directory to your own
  home.username = "${username}";
  home.homeDirectory = "/home/${username}";

  # Packages that should be installed to the user profile.
  home.packages = with pkgs; [
    pkgs-small.kitty
    eza
    git
    git-lfs
    obsidian
    jq
    direnv

    kdePackages.okular

    zip
    ant
    tmux

    nixd # Nix language server for vscode
    nixfmt-rfc-style

    signal-desktop

    teams-for-linux
    slack
    jetbrains-toolbox
    nextcloud-client

    pkgs-small.presenterm
    font-awesome
    nerd-fonts.jetbrains-mono
    nerd-fonts.caskaydia-cove
    nerd-fonts.fira-code

    (pkgs.appimageTools.wrapType2 {
      name = "atlassify";
      pname = "atlassify";
      version = "1.17.0";
      src = fetchurl {
        url = "https://github.com/setchy/atlassify/releases/download/v1.17.0/Atlassify-1.17.0.AppImage";
        hash = "sha256-mfcxrd9axnmQMofth1M5ov2a4ppFE0ga0Gxjwbx2v9o=";
      };
      extraPkgs =
        pkgs:
        (appimageTools.defaultFhsEnvArgs.multiPkgs pkgs)
        ++ [
          libsecret
        ];

    })

    (pkgs.stdenv.mkDerivation {
      pname = "flowkeeper";
      version = "0.9.1";

      src = pkgs.fetchurl {
        url = "https://github.com/flowkeeper-org/fk-desktop/releases/download/v0.9.1/Flowkeeper";
        sha256 = "sha256-HCEG7LSM7h2Yz6BbvQ0KdmfYnKZOG+TZxMvE5o8gYiA=";
      };

      dontUnpack = true;

      installPhase = ''
        install -Dm755 $src $out/bin/flowkeeper
      '';

      meta = {
        description = "Flowkeeper time tracker";
        platforms = pkgs.lib.platforms.linux;
      };
    })
  ];

  programs.ssh = {
    enable = true;
    extraConfig = ''
      Host *
          IdentityAgent "~/.1password/agent.sock"
    '';
  };

  programs.git = {
    enable = true;
    lfs.enable = true;
  };

  programs.bash = {
    enable = true;
    historyIgnore = [
      "l"
      "ls"
      "ll"
      "cd"
      "exit"
    ];
    historyControl = [ "erasedups" ];
    shellAliases = {
      grep = "grep --color=auto";
      ".." = "cd ..";
      "cdm" = "cd ~/mibex-plugins/monorepo";
    };
    initExtra = ''
      # Custom colored bash prompt
      PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
    '';
    profileExtra = ''
      # Include user's private bin if present
      if [ -d "$HOME/.local/bin" ] ; then
          PATH="$HOME/.local/bin:$PATH"
      fi
    '';
  };

  programs.atuin = {
    enable = true;
    settings = {
      auto_sync = true;
      sync_frequency = "5m";
      sync_address = "https://atuin.christianott.ch";
      search_mode = "fuzzy";
    };
  };

  programs.starship = {
    enable = true;
    enableBashIntegration = true;
  };

  # This value determines the home Manager release that your
  # configuration is compatible with. This helps avoid breakage
  # when a new home Manager release introduces backwards
  # incompatible changes.
  #
  # You can update home Manager without changing this value. See
  # the home Manager release notes for a list of state version
  # changes in each release.
  home.stateVersion = "23.11";

  # Let home Manager install and manage itself.
  # programs.home-manager.enable = true;
}
