diff --git a/nix/overlay/default.nix b/nix/overlay/default.nix
index b79766713a0704b4a2112d1be27075a10d9b2308..93eb8413b298806c9990a0cef1aef7951cb74d1a 100644
--- a/nix/overlay/default.nix
+++ b/nix/overlay/default.nix
@@ -5,4 +5,5 @@
   esp-llvm = super.callPackage ./esp-llvm.nix {};
   esp-gdb = super.callPackage ./esp-gdb.nix {};
   run-clang-tidy = super.callPackage ./run-clang-tidy {};
+  mpremote = super.python310Packages.callPackage ./mpremote {};
 })
diff --git a/nix/overlay/mpremote/default.nix b/nix/overlay/mpremote/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..fac5e999366f610ea21395699526bbf3a163a2b5
--- /dev/null
+++ b/nix/overlay/mpremote/default.nix
@@ -0,0 +1,22 @@
+{ python3
+, fetchPypi
+}:
+python3.pkgs.buildPythonApplication rec {
+  pname = "mpremote";
+  version = "1.20.0";
+  format = "pyproject";
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-XDQnYqBHkTCd1JvOY8cKB1qnxUixwAdiYrlvnMw5jKI=";
+  };
+  doCheck = false;
+  nativeBuildInputs = with python3.pkgs; [
+    hatchling
+    hatch-requirements-txt
+    hatch-vcs
+  ];
+  propagatedBuildInputs = with python3.pkgs; [
+    pyserial
+    importlib-metadata
+  ];
+}
diff --git a/nix/pkgs.nix b/nix/pkgs.nix
index d15655e1d5b6d3bf7ba49177259b8c1b8ee113ff..d4fd1febf876d86dfa459a7828c4883c1fcae1f6 100644
--- a/nix/pkgs.nix
+++ b/nix/pkgs.nix
@@ -35,5 +35,6 @@ in with nixpkgs; rec {
     emscripten
     ncurses5
     esp-gdb
+    mpremote
   ];
 }