diff --git a/firmware-updater/src/cli.rs b/firmware-updater/src/cli.rs
index 6b151141e994b362108217eed36283040b3f06d3..cf855176f2009701f63b7cdfb4b75d529f78c657 100644
--- a/firmware-updater/src/cli.rs
+++ b/firmware-updater/src/cli.rs
@@ -43,6 +43,9 @@ pub struct FlashArgs {
     /// Do not program (verify only)
     #[clap(short, long, conflicts_with = "no_verify")]
     pub no_program: bool,
+    /// Do not try to initially read the current firmware version
+    #[clap(long)]
+    pub skip_firmware_version_check: bool,
     /// I²C bus to use
     #[clap(short, long, default_value = "8")]
     pub i2c_bus: u8,
diff --git a/firmware-updater/src/main.rs b/firmware-updater/src/main.rs
index 5008987756d388ab53180fcd9f4b2238067773b5..da22922955e0ebd0a0816bd96b1c8d8b6a7b21e2 100644
--- a/firmware-updater/src/main.rs
+++ b/firmware-updater/src/main.rs
@@ -6,6 +6,7 @@ use elf::ParseError;
 use elf_loader::Firmware;
 use indicatif::{HumanBytes, MultiProgress, ProgressBar, ProgressFinish, ProgressStyle};
 use rppal::i2c::{self, I2c};
+use semver::Version;
 use std::{borrow::Cow, fmt::Debug, sync::LazyLock, thread, time::Duration};
 use tele0592::{device, Bootloader as _, Device as _};
 
@@ -123,13 +124,21 @@ fn cmd_flash(args: &FlashArgs) -> Result<()> {
     let firmware = check_success(&bar, || Firmware::load(&args.firmware))?;
 
     // Switch to bootloader mode
-    let bar = bars.add(msg("Checking running program"));
-    let (mut i2c, program) = check_success(&bar, || {
-        let mut i2c = I2c::with_bus(args.i2c_bus)?;
-        let program = bootloader::active_program(&mut i2c)?;
-        Ok::<_, Error>((i2c, program))
-    })?;
-    bar.set_message(format!("Checking running program: {program}"));
+    let mut i2c = I2c::with_bus(args.i2c_bus)?;
+    let program = if args.skip_firmware_version_check {
+        ActiveProgram::Controller {
+            version: Version::parse("0.0.0").unwrap(),
+            bootloader: true,
+        }
+    } else {
+        let bar = bars.add(msg("Checking running program"));
+        let program = check_success(&bar, || {
+            let program = bootloader::active_program(&mut i2c)?;
+            Ok::<_, Error>(program)
+        })?;
+        bar.set_message(format!("Checking running program: {program}"));
+        program
+    };
     match program {
         ActiveProgram::Bootloader { .. } => {}
         ActiveProgram::Controller {