diff --git a/buildroot/share/PlatformIO/scripts/STM32F103RC_fysetc.py b/buildroot/share/PlatformIO/scripts/STM32F103RC_fysetc.py
index 5a09dd3d14c..668475dc010 100644
--- a/buildroot/share/PlatformIO/scripts/STM32F103RC_fysetc.py
+++ b/buildroot/share/PlatformIO/scripts/STM32F103RC_fysetc.py
@@ -10,7 +10,7 @@ Import("env")
 env.AddPostAction(
 	join("$BUILD_DIR", "${PROGNAME}.elf"),
 	env.VerboseAction(" ".join([
-		"$OBJCOPY", "-O ihex", "$TARGET", # TARGET=.pio/build/fysetc_STM32F1/firmware.elf
+		"$OBJCOPY", "-O ihex", "$TARGET",
 		"\"" + join("$BUILD_DIR", "${PROGNAME}.hex") + "\"", # Note: $BUILD_DIR is a full path
 	]), "Building $TARGET"))
 
diff --git a/buildroot/share/PlatformIO/scripts/mks_encrypt.py b/buildroot/share/PlatformIO/scripts/mks_encrypt.py
deleted file mode 100644
index bd3548ab36a..00000000000
--- a/buildroot/share/PlatformIO/scripts/mks_encrypt.py
+++ /dev/null
@@ -1,29 +0,0 @@
-#
-# buildroot/share/PlatformIO/scripts/mks_encrypt.py
-#
-# Apply encryption and save as 'build.firmware' for these environments:
-#  - env:mks_robin
-#  - env:mks_robin_e3
-#  - env:flsun_hispeedv1
-#  - env:mks_robin_nano35
-#
-Import("env")
-
-from SCons.Script import DefaultEnvironment
-board = DefaultEnvironment().BoardConfig()
-
-if 'encrypt' in board.get("build").keys():
-
-	import marlin
-
-	# Encrypt ${PROGNAME}.bin and save it with the name given in build.encrypt
-	def encrypt(source, target, env):
-		marlin.encrypt_mks(source, target, env, board.get("build.encrypt"))
-
-	marlin.add_post_action(encrypt);
-
-else:
-
-	import sys
-	print("You need to define output file via board_build.encrypt = 'filename' parameter", file=sys.stderr)
-	env.Exit(1);
diff --git a/buildroot/share/PlatformIO/scripts/stm32_bootloader.py b/buildroot/share/PlatformIO/scripts/offset_and_rename.py
similarity index 83%
rename from buildroot/share/PlatformIO/scripts/stm32_bootloader.py
rename to buildroot/share/PlatformIO/scripts/offset_and_rename.py
index f3b1b273a28..b42b2f35317 100644
--- a/buildroot/share/PlatformIO/scripts/stm32_bootloader.py
+++ b/buildroot/share/PlatformIO/scripts/offset_and_rename.py
@@ -1,5 +1,5 @@
 #
-# stm32_bootloader.py
+# offset_and_rename.py
 #
 # - If 'build.offset' is provided, either by JSON or by the environment...
 # 	- Set linker flag LD_FLASH_OFFSET and relocate the VTAB based on 'build.offset'.
@@ -36,6 +36,17 @@ if 'offset' in board_keys:
 		if "-Wl,--defsym=LD_MAX_DATA_SIZE" in flag:
 			env["LINKFLAGS"][i] = "-Wl,--defsym=LD_MAX_DATA_SIZE=" + str(maximum_ram_size - 40)
 
+#
+# For build.encrypt rename and encode the firmware file.
+#
+if 'encrypt' in board_keys:
+
+	# Encrypt ${PROGNAME}.bin and save it with the name given in build.encrypt
+	def encrypt(source, target, env):
+		marlin.encrypt_mks(source, target, env, board.get("build.encrypt"))
+
+	marlin.add_post_action(encrypt);
+
 #
 # For build.rename simply rename the firmware file.
 #
diff --git a/ini/avr.ini b/ini/avr.ini
index cd10f134990..88f54a723cb 100644
--- a/ini/avr.ini
+++ b/ini/avr.ini
@@ -53,8 +53,7 @@ board    = megaatmega1280
 [mega_extended_optimized]
 extends             = common_avr8
 board_build.variant = MARLIN_MEGA_EXTENDED
-extra_scripts       = ${common.extra_scripts}
-                      pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py
+extra_scripts       = ${env:mega2560ext.extra_scripts}
 upload_speed        = 57600
 build_flags         = ${common.build_flags} -fno-tree-scev-cprop -fno-split-wide-types -Wl,--relax -mcall-prologues
 
diff --git a/ini/stm32f1.ini b/ini/stm32f1.ini
index 58f1fc10586..d5f0741d41e 100644
--- a/ini/stm32f1.ini
+++ b/ini/stm32f1.ini
@@ -34,6 +34,11 @@ src_filter    = ${common.default_src_filter} +<src/HAL/STM32> +<src/HAL/shared/b
 extra_scripts = ${common.extra_scripts}
   pre:buildroot/share/PlatformIO/scripts/stm32_serialbuffer.py
 
+[stm32f1_variant]
+extra_scripts        = ${common_stm32.extra_scripts}
+  pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py
+  buildroot/share/PlatformIO/scripts/offset_and_rename.py
+
 [common_STM32F103RC]
 platform             = ${common_stm32.platform}
 extends              = common_stm32
@@ -41,9 +46,7 @@ board                = genericSTM32F103RC
 monitor_speed        = 115200
 board_build.core     = stm32
 board_build.variant  = MARLIN_F103Rx
-extra_scripts        = ${common_stm32.extra_scripts}
-  pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py
-  buildroot/share/PlatformIO/scripts/stm32_bootloader.py
+extra_scripts        = ${stm32f1_variant.extra_scripts}
 
 #
 # STM32F103RE
@@ -113,10 +116,7 @@ build_flags          = ${common_stm32.build_flags}
   -DENABLE_HWSERIAL3 -DTIMER_SERIAL=TIM5
 build_unflags        = ${common_stm32.build_unflags}
  -DUSBCON -DUSBD_USE_CDC
-extra_scripts        = ${common_stm32.extra_scripts}
-  pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py
-  buildroot/share/PlatformIO/scripts/stm32_bootloader.py
-  buildroot/share/PlatformIO/scripts/mks_encrypt.py
+extra_scripts        = ${stm32f1_variant.extra_scripts}
 lib_deps             =
 
 #
@@ -134,7 +134,6 @@ board_build.encrypt         = Robin_e3.bin
 board_upload.offset_address = 0x08005000
 debug_tool                  = stlink
 extra_scripts               = ${common_STM32F103RC.extra_scripts}
-  buildroot/share/PlatformIO/scripts/mks_encrypt.py
 
 #
 # Creality (STM32F103RET6)
@@ -150,10 +149,8 @@ board_build.variant  = MARLIN_F103Rx
 board_build.offset   = 0x7000
 board_upload.offset_address = 0x08007000
 build_unflags        = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC
-extra_scripts        = ${common_stm32.extra_scripts}
-  pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py
+extra_scripts        = ${stm32f1_variant.extra_scripts}
   pre:buildroot/share/PlatformIO/scripts/random-bin.py
-  buildroot/share/PlatformIO/scripts/stm32_bootloader.py
 debug_tool           = jlink
 upload_protocol      = jlink
 
@@ -174,9 +171,7 @@ board_build.variant  = MARLIN_F103Rx
 board_build.offset   = 0x7000
 board_upload.offset_address = 0x08007000
 build_unflags        = ${common_stm32.build_unflags}
-extra_scripts        = ${common_stm32.extra_scripts}
-  pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py
-  buildroot/share/PlatformIO/scripts/stm32_bootloader.py
+extra_scripts        = ${stm32f1_variant.extra_scripts}
 debug_tool           = jlink
 upload_protocol      = jlink
 
@@ -207,10 +202,7 @@ board_build.offset   = 0x7000
 board_build.encrypt  = Robin_mini.bin
 board_upload.offset_address = 0x08007000
 build_unflags        = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC
-extra_scripts        = ${common_stm32.extra_scripts}
-  pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py
-  buildroot/share/PlatformIO/scripts/stm32_bootloader.py
-  buildroot/share/PlatformIO/scripts/mks_encrypt.py
+extra_scripts        = ${stm32f1_variant.extra_scripts}
 
 #
 # MKS Robin Nano V1.2 and V2
@@ -228,10 +220,7 @@ board_upload.offset_address = 0x08007000
 build_unflags        = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC
 debug_tool           = jlink
 upload_protocol      = jlink
-extra_scripts        = ${common_stm32.extra_scripts}
-  pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py
-  buildroot/share/PlatformIO/scripts/stm32_bootloader.py
-  buildroot/share/PlatformIO/scripts/mks_encrypt.py
+extra_scripts        = ${stm32f1_variant.extra_scripts}
 
 #
 # Mingda MPX_ARM_MINI
@@ -245,9 +234,7 @@ board_build.variant  = MARLIN_F103Zx
 board_build.offset   = 0x10000
 build_flags          = ${common_stm32.build_flags} -DENABLE_HWSERIAL3 -DTIMER_SERIAL=TIM5
 build_unflags        = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC
-extra_scripts        = ${common_stm32.extra_scripts}
-  pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py
-  buildroot/share/PlatformIO/scripts/stm32_bootloader.py
+extra_scripts        = ${stm32f1_variant.extra_scripts}
 
 #
 # Malyan M200 (STM32F103CB)
@@ -272,6 +259,4 @@ board_build.core     = stm32
 board_build.variant  = MARLIN_F103Rx
 board_build.offset   = 0x5000
 board_upload.offset_address = 0x08005000
-extra_scripts        = ${common_stm32.extra_scripts}
-  pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py
-  buildroot/share/PlatformIO/scripts/stm32_bootloader.py
+extra_scripts        = ${stm32f1_variant.extra_scripts}
diff --git a/ini/stm32f4.ini b/ini/stm32f4.ini
index ced410624f9..ada6605e073 100644
--- a/ini/stm32f4.ini
+++ b/ini/stm32f4.ini
@@ -29,6 +29,11 @@ board         = armed_v1
 build_flags   = ${common_stm32.build_flags}
   -O2 -ffreestanding -fsigned-char -fno-move-loop-invariants -fno-strict-aliasing
 
+[stm32f4_variant]
+extra_scripts        = ${common.extra_scripts}
+  pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py
+  buildroot/share/PlatformIO/scripts/offset_and_rename.py
+
 #
 # STM32F401VE
 # 'STEVAL-3DP001V1' STM32F401VE board - https://www.st.com/en/evaluation-tools/steval-3dp001v1.html
@@ -40,8 +45,7 @@ board             = marlin_STEVAL_STM32F401VE
 build_flags       = ${common_stm32.build_flags}
   -DARDUINO_STEVAL -DSTM32F401xE
   -DDISABLE_GENERIC_SERIALUSB -DUSBD_USE_CDC_COMPOSITE -DUSE_USB_FS
-extra_scripts     = ${common.extra_scripts}
-  pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py
+extra_scripts     = ${stm32f4_variant.extra_scripts}
 
 #
 # STM32F401RC
@@ -51,8 +55,7 @@ platform          = ${common_stm32.platform}
 extends           = common_stm32
 board             = marlin_FYSETC_CHEETAH_V20
 build_flags       = ${common_stm32.build_flags} -DSTM32F401xC -DVECT_TAB_OFFSET=0xC000
-extra_scripts     = ${common.extra_scripts}
-  pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py
+extra_scripts     = ${stm32f4_variant.extra_scripts}
 
 #
 # FLYF407ZG
@@ -65,8 +68,7 @@ board_build.variant = MARLIN_FLY_F407ZG
 upload_protocol     = dfu
 build_flags         = ${common_stm32.build_flags}
   -DVECT_TAB_OFFSET=0x8000
-extra_scripts       = ${common.extra_scripts}
-  pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py
+extra_scripts       = ${stm32f4_variant.extra_scripts}
 
 #
 # FYSETC S6 (STM32F446RET6 ARM Cortex-M4)
@@ -77,8 +79,7 @@ extends           = common_stm32
 platform_packages = tool-stm32duino
 board             = marlin_fysetc_s6
 build_flags       = ${common_stm32.build_flags} -DVECT_TAB_OFFSET=0x10000 -DHAL_PCD_MODULE_ENABLED
-extra_scripts     = ${common.extra_scripts}
-  pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py
+extra_scripts     = ${stm32f4_variant.extra_scripts}
 debug_tool        = stlink
 upload_protocol   = dfu
 upload_command    = dfu-util -a 0 -s 0x08010000:leave -D "$SOURCE"
@@ -93,9 +94,7 @@ board                       = marlin_fysetc_s6_8000
 board_build.offset          = 0x8000
 board_upload.offset_address = 0x08008000
 build_flags                 = ${common_stm32.build_flags} -DHAL_PCD_MODULE_ENABLED
-extra_scripts               = ${common.extra_scripts}
-  pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py
-  buildroot/share/PlatformIO/scripts/stm32_bootloader.py
+extra_scripts               = ${stm32f4_variant.extra_scripts}
 upload_command              = dfu-util -a 0 -s 0x08008000:leave -D "$SOURCE"
 
 #
@@ -110,8 +109,7 @@ board             = marlin_blackSTM32F407VET6
 build_flags       = ${common_stm32.build_flags}
   -DARDUINO_BLACK_F407VE
   -DUSBD_USE_CDC_COMPOSITE -DUSE_USB_FS
-extra_scripts     = ${common.extra_scripts}
-  pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py
+extra_scripts     = ${stm32f4_variant.extra_scripts}
 
 #
 # Anet ET4-MB_V1.x/ET4P-MB_V1.x (STM32F407VGT6 ARM Cortex-M4)
@@ -126,15 +124,12 @@ board                = marlin_STM32F407VGT6_CCM
 board_build.core     = stm32
 board_build.variant  = MARLIN_F4x7Vx
 board_build.encrypt  = firmware.srec
-# Just openblt.py (not stm32_bootloader.py) generates the file
 board_build.offset   = 0x10000
 board_upload.offset_address = 0x08010000
 build_unflags        = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC -DUSBD_VID=0x0483
 debug_tool           = jlink
 upload_protocol      = jlink
-extra_scripts        = ${common.extra_scripts}
-  pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py
-  buildroot/share/PlatformIO/scripts/stm32_bootloader.py
+extra_scripts        = ${stm32f4_variant.extra_scripts}
   buildroot/share/PlatformIO/scripts/openblt.py
 
 #
@@ -146,8 +141,7 @@ extends           = common_stm32
 board             = marlin_BigTree_SKR_Pro
 build_flags       = ${common_stm32.build_flags}
   -DSTM32F407_5ZX -DVECT_TAB_OFFSET=0x8000
-extra_scripts     = ${common.extra_scripts}
-  pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py
+extra_scripts     = ${stm32f4_variant.extra_scripts}
 #upload_protocol   = stlink
 #upload_command    = "$PROJECT_PACKAGES_DIR/tool-stm32duino/stlink/ST-LINK_CLI.exe" -c SWD -P "$BUILD_DIR/firmware.bin" 0x8008000 -Rst -Run
 debug_tool        = stlink
@@ -183,8 +177,7 @@ board_build.variant = MARLIN_BIGTREE_E3_RRF
 build_flags         = ${common_stm32.build_flags}
   -DSTM32F407_5VX -DVECT_TAB_OFFSET=0x8000
   -DSERIAL_RX_BUFFER_SIZE=255 -DSERIAL_TX_BUFFER_SIZE=255
-extra_scripts       = ${common.extra_scripts}
-  pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py
+extra_scripts       = ${stm32f4_variant.extra_scripts}
 
 #
 # Bigtreetech GTR V1.0 (STM32F407IGT6 ARM Cortex-M4)
@@ -193,8 +186,7 @@ extra_scripts       = ${common.extra_scripts}
 platform          = ${common_stm32.platform}
 extends           = common_stm32
 board             = marlin_BigTree_GTR_v1
-extra_scripts     = ${common.extra_scripts}
-  pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py
+extra_scripts     = ${stm32f4_variant.extra_scripts}
 build_flags       = ${common_stm32.build_flags}
   -DSTM32F407IX -DVECT_TAB_OFFSET=0x8000
 
@@ -221,8 +213,7 @@ build_flags       = ${common_stm32.build_flags}
   -DHAVE_HWSERIAL3
   -DPIN_SERIAL2_RX=PD_6
   -DPIN_SERIAL2_TX=PD_5
-extra_scripts     = ${common.extra_scripts}
-  pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py
+extra_scripts     = ${stm32f4_variant.extra_scripts}
 
 #
 # BigTreeTech SKR V2.0 (STM32F407VGT6 ARM Cortex-M4) with USB Flash Drive Support
@@ -236,10 +227,8 @@ board_build.core     = stm32
 board_build.variant  = MARLIN_F4x7Vx
 board_build.offset   = 0x8000
 board_upload.offset_address = 0x08008000
-extra_scripts     = ${common.extra_scripts}
-  pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py
-  buildroot/share/PlatformIO/scripts/stm32_bootloader.py
-build_flags       = ${stm_flash_drive.build_flags}
+extra_scripts        = ${stm32f4_variant.extra_scripts}
+build_flags          = ${stm_flash_drive.build_flags}
   -DUSE_USBHOST_HS -DUSE_USB_HS_IN_FS -DUSBD_IRQ_PRIO=5 -DUSBD_IRQ_SUBPRIO=6
   -DHSE_VALUE=8000000U -DHAL_SD_MODULE_ENABLED
 
@@ -260,8 +249,7 @@ build_flags       = ${env:BIGTREE_SKR_2.build_flags} -DUSBD_USE_CDC_MSC
 platform          = ${common_stm32.platform}
 extends           = common_stm32
 board             = marlin_BigTree_Octopus_v1
-extra_scripts     = ${common.extra_scripts}
-    pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py
+extra_scripts     = ${stm32f4_variant.extra_scripts}
 build_flags       = ${common_stm32.build_flags}
   -DSTM32F446_5VX -DVECT_TAB_OFFSET=0x8000 -DUSE_USB_HS_IN_FS
 
@@ -286,9 +274,7 @@ board               = marlin_STM32F407ZGT6
 board_build.variant = MARLIN_LERDGE
 board_build.offset  = 0x10000
 board_build.encrypt = firmware.bin
-extra_scripts       = ${common.extra_scripts}
-                      pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py
-                      buildroot/share/PlatformIO/scripts/stm32_bootloader.py
+extra_scripts       = ${stm32f4_variant.extra_scripts}
                       buildroot/share/PlatformIO/scripts/lerdge.py
 build_flags         = ${common_stm32.build_flags}
   -DSTM32F4 -DSTM32F4xx -DTARGET_STM32F4
@@ -366,9 +352,7 @@ monitor_speed        = 500000
 board_build.core     = stm32
 board_build.variant  = MARLIN_F446VE
 board_build.offset   = 0x0000
-extra_scripts        = ${common.extra_scripts}
-  pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py
-  buildroot/share/PlatformIO/scripts/stm32_bootloader.py
+extra_scripts        = ${stm32f4_variant.extra_scripts}
 
 #
 # MKS Robin Pro V2
@@ -386,9 +370,7 @@ board_upload.offset_address = 0x08000000
 build_unflags        = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC
 debug_tool           = jlink
 upload_protocol      = jlink
-extra_scripts        = ${common.extra_scripts}
-  pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py
-  buildroot/share/PlatformIO/scripts/stm32_bootloader.py
+extra_scripts        = ${stm32f4_variant.extra_scripts}
 
 #
 # This SPI is used by Robin Nano V3
@@ -412,9 +394,7 @@ board_upload.offset_address = 0x0800C000
 build_unflags        = ${common_stm32.build_unflags}
 debug_tool           = jlink
 upload_protocol      = jlink
-extra_scripts        = ${common.extra_scripts}
-  pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py
-  buildroot/share/PlatformIO/scripts/stm32_bootloader.py
+extra_scripts        = ${stm32f4_variant.extra_scripts}
 
 #
 # MKS Robin Nano V3 with USB Flash Drive Support