diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs
index 6e401b3174258d2787013f8b6847607a19bb4f0e..62707b61eee255e010703e991b4f179edac04bcc 100644
--- a/src-tauri/src/main.rs
+++ b/src-tauri/src/main.rs
@@ -10,7 +10,7 @@ mod utils;
 
 use crate::{
   core::VergeConfig,
-  utils::{resolve, server},
+  utils::{dirs, resolve, server},
 };
 use tauri::{
   api, CustomMenuItem, Manager, SystemTray, SystemTrayEvent, SystemTrayMenu, SystemTrayMenuItem,
@@ -22,6 +22,11 @@ fn main() -> std::io::Result<()> {
     return Ok(());
   }
 
+  #[cfg(target_os = "windows")]
+  unsafe {
+    dirs::init_portable_flag();
+  }
+
   let tray_menu = SystemTrayMenu::new()
     .add_item(CustomMenuItem::new("open_window", "Show"))
     .add_item(CustomMenuItem::new("system_proxy", "System Proxy"))
diff --git a/src-tauri/src/utils/dirs.rs b/src-tauri/src/utils/dirs.rs
index bd3058eab17804050216676b4f733d3ff6d6650b..a900fe3c964d6f07f165112fae88caddd1deda30 100644
--- a/src-tauri/src/utils/dirs.rs
+++ b/src-tauri/src/utils/dirs.rs
@@ -1,5 +1,6 @@
 use std::env::temp_dir;
-use std::path::{Path, PathBuf};
+use std::path::PathBuf;
+use tauri::utils::platform::current_exe;
 use tauri::{
   api::path::{home_dir, resource_dir},
   Env, PackageInfo,
@@ -15,12 +16,40 @@ static VERGE_CONFIG: &str = "verge.yaml";
 static PROFILE_YAML: &str = "profiles.yaml";
 static PROFILE_TEMP: &str = "clash-verge-runtime.yaml";
 
+/// portable flag
+#[allow(unused)]
+static mut PORTABLE_FLAG: bool = false;
+
+/// initialize portable flag
+pub unsafe fn init_portable_flag() {
+  #[cfg(target_os = "windows")]
+  {
+    let exe = current_exe().unwrap();
+    let dir = exe.parent().unwrap();
+    let dir = PathBuf::from(dir).join(".config/PORTABLE");
+
+    if dir.exists() {
+      PORTABLE_FLAG = true;
+    }
+  }
+}
+
 /// get the verge app home dir
 pub fn app_home_dir() -> PathBuf {
-  home_dir()
-    .unwrap()
-    .join(Path::new(".config"))
-    .join(Path::new(APP_DIR))
+  #[cfg(target_os = "windows")]
+  unsafe {
+    if !PORTABLE_FLAG {
+      home_dir().unwrap().join(".config").join(APP_DIR)
+    } else {
+      let app_exe = current_exe().unwrap();
+      let app_exe = dunce::canonicalize(app_exe).unwrap();
+      let app_dir = app_exe.parent().unwrap();
+      PathBuf::from(app_dir).join(".config").join(APP_DIR)
+    }
+  }
+
+  #[cfg(not(target_os = "windows"))]
+  home_dir().unwrap().join(".config").join(APP_DIR)
 }
 
 /// get the resources dir