{
  config,
  lib,
  ...
}: let
  inherit (builtins) map;
  inherit (lib.strings) concatStrings;
in {
  home = {
    sessionVariables = {
      STARSHIP_CACHE = "${config.xdg.cacheHome}/starship";
    };
  };

  programs.starship = let
    elemsConcatted = concatStrings (
      map (s: "\$${s}") [
        "hostname"
        "username"
        "directory"
        "shell"
        "nix_shell"
        "git_branch"
        "git_commit"
        "git_state"
        "git_status"
        "jobs"
        "cmd_duration"
      ]
    );
  in {
    enable = true;

    settings = {
      scan_timeout = 2;
      command_timeout = 2000; # nixpkgs makes starship implode with lower values
      add_newline = false;
      line_break.disabled = false;

      format = "${elemsConcatted}\n$character";

      hostname = {
        ssh_only = true;
        disabled = false;
        format = "@[$hostname](bold blue) "; # the whitespace at the end is actually important
      };

      # configure specific elements
      character = {
        error_symbol = "[îŠ…](bold red)";
        success_symbol = "[îŠ…](bold green)";
        vicmd_symbol = "[î˜«](bold yellow)";
        format = "$symbol [|](bold bright-black) ";
      };

      username = {
        format = "[$user]($style) in ";
      };

      directory = {
        truncation_length = 2;

        # removes the read_only symbol from the format, it doesn't play nicely with my folder icon
        format = "[ï�¼ ](bold green) [$path]($style) ";

        # the following removes tildes from the path, and substitutes some folders with shorter names
        substitutions = {
          "~/Dev" = "Dev";
          "~/Documents" = "Docs";
        };
      };

      # git
      git_commit.commit_hash_length = 7;
      git_branch.style = "bold purple";
      git_status = {
        style = "red";
        ahead = "â‡¡ ";
        behind = "â‡£ ";
        conflicted = "îœ§ ";
        renamed = "Â»";
        deleted = "âœ˜ ";
        diverged = "â‡† ";
        modified = "!";
        stashed = "â‰¡";
        staged = "+";
        untracked = "?";
      };

      # language configurations
      # the whitespaces at the end *are* necessary for proper formatting
      lua.symbol = "[î˜  ](blue) ";
      python.symbol = "[îœ¼ ](blue) ";
      rust.symbol = "[î�¨ ](red) ";
      nix_shell.symbol = "[ó±„… ](blue) ";
      golang.symbol = "[ó°Ÿ“ ](blue)";
      c.symbol = "[î˜� ](black)";
      nodejs.symbol = "[ó°�™ ](yellow)";

      package.symbol = "ğŸ“¦ ";
    };
  };
}
