diff --git a/src-tauri/src/cmd.rs b/src-tauri/src/cmd.rs
index 7fe8b437ccc67c0c9265a6b4a21019f4dfaa61c1..d7c3475cae2862c51a084ff8d66b8abb474ff508 100644
--- a/src-tauri/src/cmd.rs
+++ b/src-tauri/src/cmd.rs
@@ -84,6 +84,7 @@ pub fn get_profiles(lock: State<'_, ProfileLock>) -> Option<ProfilesConfig> {
 }
 
 #[tauri::command]
+/// update the profile config
 pub fn set_profiles(
   current: usize,
   profile: ProfileItem,
@@ -131,3 +132,30 @@ pub fn set_profiles(
 
   Ok(())
 }
+
+#[tauri::command]
+/// change to target profile
+pub fn put_profiles(current: usize, lock: State<'_, ProfileLock>) -> Result<(), String> {
+  match lock.0.lock() {
+    Ok(_) => {}
+    Err(_) => return Err(format!("can not get file locked")),
+  };
+
+  let mut profiles = read_profiles();
+
+  let items_len = match &profiles.items {
+    Some(p) => p.len(),
+    None => 0,
+  };
+
+  if current >= items_len {
+    Err(format!(
+      "failed to change profile to the index `{}`",
+      current
+    ))
+  } else {
+    profiles.current = Some(current as u32);
+    save_profiles(&profiles);
+    Ok(())
+  }
+}
diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs
index 1a47948a45a80a641925d911bd0807741563f333..920ce8230ca83e6252787a05baabcb55a6297f6c 100644
--- a/src-tauri/src/main.rs
+++ b/src-tauri/src/main.rs
@@ -61,7 +61,8 @@ fn main() -> std::io::Result<()> {
       cmd::get_clash_info,
       cmd::import_profile,
       cmd::get_profiles,
-      cmd::set_profiles
+      cmd::set_profiles,
+      cmd::put_profiles,
     ])
     .build(tauri::generate_context!())
     .expect("error while running tauri application");