diff --git a/plugins/colorschemes/palette.nix b/plugins/colorschemes/palette.nix
new file mode 100644
index 0000000000..099b82df8f
--- /dev/null
+++ b/plugins/colorschemes/palette.nix
@@ -0,0 +1,150 @@
+{
+  lib,
+  helpers,
+  config,
+  pkgs,
+  ...
+}:
+with lib; let
+  cfg = config.colorschemes.palette;
+in {
+  meta.maintainers = [maintainers.GaetanLepage];
+
+  options.colorschemes.palette =
+    helpers.extraOptionsOptions
+    // {
+      enable = mkEnableOption "palette.nvim";
+
+      package = helpers.mkPackageOption "palette.nvim" pkgs.vimPlugins.palette-nvim;
+
+      palettes = {
+        main = helpers.defaultNullOpts.mkStr "dark" ''
+          Palette for the main colors.
+        '';
+
+        accent = helpers.defaultNullOpts.mkStr "pastel" ''
+          Palette for the accent colors.
+        '';
+
+        state = helpers.defaultNullOpts.mkStr "pastel" ''
+          Palette for the state colors.
+        '';
+      };
+
+      customPalettes =
+        mapAttrs
+        (
+          name: colorNames:
+            helpers.defaultNullOpts.mkAttrsOf (
+              types.submodule {
+                options =
+                  genAttrs
+                  colorNames
+                  (
+                    colorName:
+                      mkOption {
+                        type = types.str;
+                        description = "Definition of color '${colorName}'";
+                      }
+                  );
+              }
+            )
+            "{}"
+            ''
+              Custom palettes for ${name} colors.
+            ''
+        ) {
+          main = [
+            "color0"
+            "color1"
+            "color2"
+            "color3"
+            "color4"
+            "color5"
+            "color6"
+            "color7"
+            "color8"
+          ];
+
+          accent = [
+            "accent0"
+            "accent1"
+            "accent2"
+            "accent3"
+            "accent4"
+            "accent5"
+            "accent6"
+          ];
+
+          state = [
+            "error"
+            "warning"
+            "hint"
+            "ok"
+            "info"
+          ];
+        };
+
+      italics = helpers.defaultNullOpts.mkBool true ''
+        Whether to use italics.
+      '';
+
+      transparentBackground = helpers.defaultNullOpts.mkBool false ''
+        Whether to use transparent background.
+      '';
+
+      caching = helpers.defaultNullOpts.mkBool true ''
+        Whether to enable caching.
+      '';
+
+      cacheDir =
+        helpers.defaultNullOpts.mkStr
+        ''{__raw = "vim.fn.stdpath('cache') .. '/palette'";}''
+        "Cache directory.";
+    };
+
+  config = mkIf cfg.enable {
+    assertions =
+      mapAttrsToList (
+        name: defaultPaletteNames: let
+          palette = cfg.palettes.${name};
+          allowedPaletteNames = (attrNames cfg.customPalettes.${name}) ++ defaultPaletteNames;
+        in {
+          assertion = isString palette -> elem palette allowedPaletteNames;
+          message = ''
+            Nixvim: `colorschemes.palette.palettes.${name}` (${palette}") is not part of the allowed ${name} palette names (${concatStringsSep " " allowedPaletteNames}).
+          '';
+        }
+      )
+      {
+        main = ["dark" "light"];
+        accent = ["pastel" "dark" "bright"];
+        state = ["pastel" "dark" "bright"];
+      };
+
+    colorscheme = "palette";
+
+    extraPlugins = [
+      cfg.package
+      # Annoyingly, lspconfig is required, otherwise this line is breaking:
+      # https://github.com/roobert/palette.nvim/blob/a808c190a4f74f73782302152ebf323660d8db5f/lua/palette/init.lua#L45https://github.com/roobert/palette.nvim/blob/a808c190a4f74f73782302152ebf323660d8db5f/lua/palette/init.lua#L45
+      # An issue has been opened upstream to warn the maintainer: https://github.com/roobert/palette.nvim/issues/2
+      pkgs.vimPlugins.nvim-lspconfig
+    ];
+
+    extraConfigLuaPre = let
+      setupOptions = with cfg;
+        {
+          inherit palettes;
+          custom_palettes = customPalettes;
+          inherit italics;
+          transparent_background = transparentBackground;
+          inherit caching;
+          cache_dir = cacheDir;
+        }
+        // cfg.extraOptions;
+    in ''
+      require('palette').setup(${helpers.toLuaObject setupOptions})
+    '';
+  };
+}
diff --git a/plugins/default.nix b/plugins/default.nix
index dfdde21566..c0c5668626 100644
--- a/plugins/default.nix
+++ b/plugins/default.nix
@@ -16,6 +16,7 @@
     ./colorschemes/one.nix
     ./colorschemes/onedark.nix
     ./colorschemes/oxocarbon.nix
+    ./colorschemes/palette.nix
     ./colorschemes/poimandres.nix
     ./colorschemes/rose-pine.nix
     ./colorschemes/tokyonight.nix
diff --git a/tests/test-sources/plugins/colorschemes/palette.nix b/tests/test-sources/plugins/colorschemes/palette.nix
new file mode 100644
index 0000000000..d8ae57fcfc
--- /dev/null
+++ b/tests/test-sources/plugins/colorschemes/palette.nix
@@ -0,0 +1,55 @@
+{
+  empty = {
+    colorschemes.palette.enable = true;
+  };
+
+  defaults = {
+    colorschemes.palette = {
+      enable = true;
+
+      palettes = {
+        main = "dark";
+        accent = "pastel";
+        state = "pastel";
+      };
+      customPalettes = {
+        main = {};
+        accent = {};
+        state = {};
+      };
+      italics = true;
+      transparentBackground = false;
+      caching = true;
+      cacheDir.__raw = "vim.fn.stdpath('cache') .. '/palette'";
+    };
+  };
+
+  example-custom-palette = {
+    colorschemes.palette = {
+      enable = true;
+
+      palettes = {
+        main = "dust_dusk";
+      };
+
+      customPalettes = {
+        main = {
+          dust_dusk = {
+            color0 = "#121527";
+            color1 = "#1A1E39";
+            color2 = "#232A4D";
+            color3 = "#3E4D89";
+            color4 = "#687BBA";
+            color5 = "#A4B1D6";
+            color6 = "#bdbfc9";
+            color7 = "#DFE5F1";
+            color8 = "#e9e9ed";
+          };
+        };
+      };
+
+      italics = true;
+      transparentBackground = false;
+    };
+  };
+}