diff --git a/Cargo.lock b/Cargo.lock
index 94f63148..ca4d1d4f 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2759,6 +2759,7 @@ dependencies = [
"installer",
"serde",
"serde_json",
+ "shlex",
"tauri",
"tauri-build",
"tauri-plugin-opener",
diff --git a/installer-gui/src-tauri/Cargo.toml b/installer-gui/src-tauri/Cargo.toml
index 4e849d8f..2d26f67b 100644
--- a/installer-gui/src-tauri/Cargo.toml
+++ b/installer-gui/src-tauri/Cargo.toml
@@ -21,4 +21,5 @@ tauri-plugin-opener = "2"
serde = { version = "1", features = ["derive"] }
serde_json = "1"
anyhow = "1.0.100"
+shlex = "1"
installer = { path = "../../installer" }
diff --git a/installer-gui/src-tauri/src/lib.rs b/installer-gui/src-tauri/src/lib.rs
index 4e2b6354..da3da7b4 100644
--- a/installer-gui/src-tauri/src/lib.rs
+++ b/installer-gui/src-tauri/src/lib.rs
@@ -1,10 +1,11 @@
+use anyhow::Context;
use tauri::Emitter;
async fn run_installer(app_handle: tauri::AppHandle, args: String) -> anyhow::Result<()> {
+ let args_vec = shlex::split(&args).context("Failed to parse arguments: unclosed quote")?;
tauri::async_runtime::spawn_blocking(move || {
installer::run_with_callback(
- // TODO: we should split using something similar to shlex in python
- args.split_whitespace(),
+ args_vec.iter().map(|s| s.as_str()),
Some(Box::new(move |output| {
app_handle
.emit("installer-output", output)
diff --git a/installer-gui/src/routes/+page.svelte b/installer-gui/src/routes/+page.svelte
index f5e9fb9c..d525ad0f 100644
--- a/installer-gui/src/routes/+page.svelte
+++ b/installer-gui/src/routes/+page.svelte
@@ -81,6 +81,9 @@