{
  pkgs,
  nixvim,
  river-shifttags,
  other-transcode,
  kitty-unstable,
  nix-doom-emacs-unstraightened,
  ...
}: let
  username = "khais";
in {
  imports = [
    ./stylix.nix
    ./wm
    ./direnv.nix
    nix-doom-emacs-unstraightened
  ];
  home = {
    packages = with pkgs; [
      # system tools & bragging
      htop
      neofetch
      ripgrep
      usbutils
      wget
      curl
      ncdu
      trashy
      unzip
      parallel
      # remote working
      remmina
      # communication
      discord
      # passwords
      bitwarden-desktop
      # editors
      nixvim
      # make clipboard yanking work in neovim
      # https://superuser.com/a/1803183
      wl-clipboard
      # wm river utils
      playerctl
      brightnessctl
      river-shifttags
      wlr-randr
      # dev tools
      gitu
      lnav
      # music
      cmus
      # music collection tools
      picard
      kid3
      # audio
      audacity
      k3b
      # video
      mpv
      other-transcode
      # file sending
      magic-wormhole
      # drawing apps
      krita
      inkscape
      # office apps
      libreoffice-fresh
      hunspellDicts.fr-moderne
      hunspellDicts.de-de
      hunspellDicts.en-us
      # nixos tools
      nh
      nix-output-monitor
      alejandra
      # archiving
      archivebox
    ];

    file = {
      # konsole configuration
      ".local/share/konsole/Nixos.profile".source = ./konsole/Nixos.profile;
      ".config/nixpkgs/config.nix".text = ''
        { allowUnfree = true; }
      '';
    };

    sessionVariables = {
      EDITOR = "nvim";
    };

    inherit username;
    homeDirectory = "/home/${username}";

    stateVersion = "23.11";
  };

  nixpkgs.config.allowUnfree = true;

  programs.git = {
    enable = true;
    userEmail = "khais.colin@gmail.com";
    userName = "Khaïs COLIN";
    # better diffs
    diff-so-fancy.enable = true;
    # set editor
    extraConfig.core.editor = "nvim";
    # always show diff in commits
    extraConfig.commit.verbose = true;
  };

  programs.jujutsu = {
    enable = true;
    settings = {
      user = {
        email = "khais.colin@gmail.com";
        name = "Khaïs COLIN";
      };
      ui = {
        editor = "nvim";
        diff-editor = ["nvim" "-c" "DiffEditor $left $right $output"];
        merge-editor = ["nvim" "-c" "DiffEditor $left $right $output"];
      };
    };
  };

  programs.zsh = {
    enable = true;
    enableVteIntegration = true;
    prezto = {
      enable = true;
    };
    shellAliases = {
      gc = "git commit -v";
      ga = "git add";
      gst = "git status";
      gp = "git push";
      gd = "git diff";
      gds = "git diff --staged";

      vim = "nvim";
      vi = "nvim";

      # progress cp
      # https://serverfault.com/questions/43014/copying-a-large-directory-tree-locally-cp-or-rsync
      pcp = "rsync --info=progress2 --archive --hard-links --acls --xattrs --human-readable --sparse --stats";
    };
    initExtra = ''
      # enable jj completion
      source <(jj util completion zsh)
    '';
  };

  programs.kitty = {
    package = kitty-unstable;
    enable = true;
    keybindings = {
      "super+shift+enter" = "new_os_window_with_cwd";
    };
    settings = {
      text_fg_override_threshold = 10;
    };
  };
  programs.fuzzel.enable = true;

  programs.zellij.enable = true;

  programs.ssh = {
    enable = true;
    matchBlocks = {
      "quasar" = {
        hostname = "109.199.126.230";
        user = "root";
      };
    };
  };

  # default connection to qemu for virt-manager
  dconf.settings = {
    "org/virt-manager/virt-manager/connections" = {
      autoconnect = ["qemu:///system"];
      uris = ["qemu:///system"];
    };
  };

  programs.beets = {
    enable = true;
    settings = {
      directory = "/pile/Music";
      library = "/pile/beets.db";
      import = {
        move = false;
        copy = true;
        incremental = false;
        write = true;
      };
      plugins = ["lyrics" "web" "info" "edit"];
    };
  };

  programs.yt-dlp = {
    enable = true;
    settings = {
      embed-thumbnail = true;
      embed-subs = true;
      sub-langs = "all";
    };
  };

  programs.doom-emacs = {
    enable = true;
    doomDir = ./doom.d;
    extraBinPackages = with pkgs; [ccls];
  };
}
