diff --git a/default.nix b/default.nix
index bc050e091e25ceb6564716d7fb43937bb59f570b..85b6eee15297c9a515dfd51000dda863d6a1577a 100644
--- a/default.nix
+++ b/default.nix
@@ -2,10 +2,10 @@
 }:
 with pkgs;
 let
-  firmware = subdir:
-    callPackage ./nix/firmware.nix { inherit subdir; };
+  firmwareBuilder = callPackage ./nix/firmware.nix {};
   openocd = callPackage ./nix/openocd.nix { };
 in
+with firmwareBuilder;
 {
   openocd = stdenv.mkDerivation {
     name = "openocd-card10";
@@ -20,12 +20,14 @@ in
         --add-flags "-f $out/share/openocd/scripts/target/max32665.cfg"
     '';
   };
-  ble = firmware "ble";
-  bmatest = firmware "bmatest";
-  bmetest = firmware "bmetest";
-  ecgtest = firmware "ecgtest";
-  Hello_World = firmware "Hello_World";
-  Hello_World_FreeRTOS = firmware "Hello_World_FreeRTOS";
-  imutest = firmware "imutest";
-  ips = firmware "ips";
+
+  bootloader = firmware "bootloader";
+  ble = loadable "ble";
+  bmatest = loadable "bmatest";
+  bmetest = loadable "bmetest";
+  ecgtest = loadable "ecgtest";
+  Hello_World = loadable "Hello_World";
+  Hello_World_FreeRTOS = loadable "Hello_World_FreeRTOS";
+  imutest = loadable "imutest";
+  ips = loadable "ips";
 }
diff --git a/nix/firmware.nix b/nix/firmware.nix
index 2e0f2cff643c35c51e412af833ca6d921ee78ee9..9217f297c5974d396d50ed700da3508a7d9e961f 100644
--- a/nix/firmware.nix
+++ b/nix/firmware.nix
@@ -1,22 +1,43 @@
-{ pkgsCross, python3, callPackage, subdir }:
+{ pkgsCross, python3, callPackage }:
 
 let
   crc16 = callPackage ./python-crc16.nix {};
-in
-pkgsCross.arm-embedded.stdenv.mkDerivation {
-  name = "firmware-${subdir}";
-  src = ./..;
-  buildInputs = [ crc16 ];
-  hardeningDisable= [ "all" ];
-  buildPhase = ''
-    cd ${subdir}
-    make clean
-    make -j ''$NIX_BUILD_CORES APP=1
-    make -j ''$NIX_BUILD_CORES build/max32665.bin
-    ${python3}/bin/python ../bootloader/crc_patch.py build/max32665.bin
-  '';
-  installPhase = ''
-    mkdir -p $out/lib
-    cp build/max32665.bin $out/lib/card10.bin
-  '';
+in rec {
+  firmware = subdir:
+    pkgsCross.arm-embedded.stdenv.mkDerivation {
+      name = "${subdir}";
+      src = ./..;
+      buildInputs = [ ];
+      hardeningDisable= [ "all" ];
+      buildPhase = ''
+        cd ${subdir}
+        make clean
+        make -j ''$NIX_BUILD_CORES
+        make -j ''$NIX_BUILD_CORES build/max32665.elf
+      '';
+      installPhase = ''
+        mkdir -p $out/lib
+        cp build/max32665.elf $out/lib/card10.elf
+      '';
+    };
+
+  loadable = subdir:
+    pkgsCross.arm-embedded.stdenv.mkDerivation {
+      name = "loadable-${subdir}";
+      src = ./..;
+      buildInputs = [ crc16 ];
+      hardeningDisable= [ "all" ];
+      buildPhase = ''
+        cd ${subdir}
+        make clean
+        make -j ''$NIX_BUILD_CORES APP=1
+        make -j ''$NIX_BUILD_CORES build/max32665.bin
+        ${python3}/bin/python ../bootloader/crc_patch.py build/max32665.bin
+      '';
+      installPhase = ''
+        mkdir -p $out/lib
+        cp build/max32665.elf $out/lib/card10.elf
+        cp build/max32665.bin $out/lib/card10.bin
+      '';
+    };
 }