{
  pkgs,
  config,
  lib,
  ...
}: let
  # generate shell command options for kmscon fom an attrset
  generateOptions = with builtins; (
    opts:
      toString (
        attrValues (
          mapAttrs (name: value: "--${name} ${toString value}") opts
        )
      )
  );
  # generate a hexadecimal number lookup table to get integers from them
  hexLookupTable = with lib; (listToAttrs (genList (i: {
      name = let
        r = toHexString i;
      in (
        # pad with 0 in front if only 1 digit
        if (stringLength r) == 1
        then "0${r}"
        else r
      );
      value = toString i;
    })
    256));
  # "parse" hex color strings and convert them to kmscon options
  hexToOpt = with lib; (color:
    concatStringsSep "," [
      (getAttr (substring 1 2 (toUpper color)) hexLookupTable)
      (getAttr (substring 3 2 (toUpper color)) hexLookupTable)
      (getAttr (substring 5 2 (toUpper color)) hexLookupTable)
    ]);
in {
  # TODO: global colorscheme vars for everything
  console.colors = [
    "282828"
    "cc241d"
    "98971a"
    "d79921"
    "458588"
    "b16286"
    "689d6a"
    "a89984"
    "928374"
    "fb4934"
    "b8bb26"
    "fabd2f"
    "83a598"
    "d3869b"
    "8ec07c"
    "ebdbb2"
  ];

  services.kmscon = {
    enable = true;
    fonts = [
      {
        name = "FiraCode Nerd Font";
        package = pkgs.nerdfonts.override {fonts = ["FiraCode"];};
      }
    ];
    extraConfig = "font-size=14";
    # extraOptions = "--term xterm-256color";
    extraOptions = generateOptions {
      xkb-layout = config.services.xserver.xkb.layout;
      xkb-variant = config.services.xserver.xkb.variant;

      palette = "custom";
      palette-foreground = hexToOpt "#ebdbb2";
      palette-background = hexToOpt "#282828";
      palette-black = hexToOpt "#282828";
      palette-red = hexToOpt "#cc241d";
      palette-green = hexToOpt "#98971a";
      palette-yellow = hexToOpt "#d79921";
      palette-blue = hexToOpt "#458588";
      palette-magenta = hexToOpt "#b16286";
      palette-cyan = hexToOpt "#689d6a";
      palette-light-grey = hexToOpt "#a89984";
      palette-dark-grey = hexToOpt "#928374";
      palette-light-red = hexToOpt "#fb4934";
      palette-light-green = hexToOpt "#b8bb26";
      palette-light-yellow = hexToOpt "#fabd2f";
      palette-light-blue = hexToOpt "#83a598";
      palette-light-magenta = hexToOpt "#d3869b";
      palette-light-cyan = hexToOpt "#8ec07c";
      palette-white = hexToOpt "#ebdbb2";
    };
    hwRender = true;
  };
}
