diff --git a/src-tauri/src/cmds/some.rs b/src-tauri/src/cmds/some.rs
index cd76bef5a4520683e32d72a839c5885c5752f2cc..291be686adc3bf1372136b175fcbfd30fee20c63 100644
--- a/src-tauri/src/cmds/some.rs
+++ b/src-tauri/src/cmds/some.rs
@@ -17,7 +17,7 @@ use tauri::{api::process::kill_children, AppHandle, State};
 #[tauri::command]
 pub fn restart_sidecar(app_handle: AppHandle, clash_info: State<'_, ClashInfoState>) {
   kill_children();
-  let payload = run_clash_bin(&app_handle);
+  let payload = run_clash_bin(&app_handle, |_| {});
 
   if let Ok(mut arc) = clash_info.0.lock() {
     *arc = payload;
diff --git a/src-tauri/src/utils/clash.rs b/src-tauri/src/utils/clash.rs
index a09aeb9a97d2969c2e8c65dbd0037f78618e541b..010882e9168054d1452016561ef68c0361895383 100644
--- a/src-tauri/src/utils/clash.rs
+++ b/src-tauri/src/utils/clash.rs
@@ -16,7 +16,7 @@ use tauri::{
 };
 
 /// Run the clash bin
-pub fn run_clash_bin(app_handle: &AppHandle) -> ClashInfoPayload {
+pub fn run_clash_bin(app_handle: &AppHandle, cb: fn(info: ClashInfoPayload)) -> ClashInfoPayload {
   let app_dir = app_home_dir();
   let app_dir = app_dir.as_os_str().to_str().unwrap();
 
@@ -38,12 +38,13 @@ pub fn run_clash_bin(app_handle: &AppHandle) -> ClashInfoPayload {
     Ok((mut rx, _)) => {
       log::info!("Successfully execute clash sidecar");
       payload.controller = Some(read_clash_controller());
+      cb(payload.clone()); // callback when run sidecar successfully
 
       tauri::async_runtime::spawn(async move {
         while let Some(event) = rx.recv().await {
           match event {
-            CommandEvent::Stdout(line) => log::info!("{}", line),
-            CommandEvent::Stderr(err) => log::error!("{}", err),
+            CommandEvent::Stdout(line) => log::info!("[stdout]: {}", line),
+            CommandEvent::Stderr(err) => log::error!("[stderr]: {}", err),
             _ => {}
           }
         }
@@ -86,9 +87,7 @@ pub async fn put_clash_profile(payload: &ClashInfoPayload) -> Result<(), String>
   {
     let file_name = match profile.file {
       Some(file_name) => file_name.clone(),
-      None => {
-        return Err(format!("profile item should have `file` field"));
-      }
+      None => return Err(format!("profile item should have `file` field")),
     };
 
     let file_path = app_home_dir().join("profiles").join(file_name);
diff --git a/src-tauri/src/utils/resolve.rs b/src-tauri/src/utils/resolve.rs
index 4a13d057f82112bd54f52d05f51d89b8b2c51259..5cd160652d664625c12b971346992c7ee5dd44bc 100644
--- a/src-tauri/src/utils/resolve.rs
+++ b/src-tauri/src/utils/resolve.rs
@@ -11,14 +11,13 @@ pub fn resolve_setup(app: &App) {
   init::init_app(app.package_info());
 
   // run clash sidecar
-  let info = clash::run_clash_bin(&app.handle());
-
-  // update the profile
-  let info_ = info.clone();
-  tauri::async_runtime::spawn(async move {
-    if let Err(err) = clash::put_clash_profile(&info_).await {
-      log::error!("failed to put config for `{}`", err);
-    };
+  let info = clash::run_clash_bin(&app.handle(), |info_| {
+    // update the profile
+    tauri::async_runtime::spawn(async move {
+      if let Err(err) = clash::put_clash_profile(&info_).await {
+        log::error!("failed to put config for `{}`", err);
+      };
+    });
   });
 
   // resolve the verge config - enable system proxy
diff --git a/src-tauri/src/utils/server.rs b/src-tauri/src/utils/server.rs
index b860dd4f779efbeb1798a15602c1a8bcca8c6a5b..ea13ce604b46b9b9127e20afe26c28a24c8562ef 100644
--- a/src-tauri/src/utils/server.rs
+++ b/src-tauri/src/utils/server.rs
@@ -1,6 +1,7 @@
 extern crate warp;
 
 use port_scanner::local_port_available;
+use std::sync::{Arc, Mutex};
 use tauri::{AppHandle, Manager};
 use warp::Filter;
 
@@ -22,15 +23,16 @@ pub fn check_singleton() -> Result<(), ()> {
 /// The embed server only be used to implement singleton process
 /// maybe it can be used as pac server later
 pub fn embed_server(app: &AppHandle) {
-  let window = app.get_window("main").unwrap();
-
-  let commands = warp::path!("commands" / "visible").map(move || {
-    window.show().unwrap();
-    window.set_focus().unwrap();
-    return format!("ok");
-  });
+  let window = Arc::new(Mutex::new(app.get_window("main").unwrap()));
 
   tauri::async_runtime::spawn(async move {
+    let commands = warp::path!("commands" / "visible").map(move || {
+      let win = window.lock().unwrap();
+      win.show().unwrap();
+      win.set_focus().unwrap();
+      return format!("ok");
+    });
+
     warp::serve(commands)
       .bind(([127, 0, 0, 1], SERVER_PORT))
       .await;