diff --git a/src-tauri/src/cmds.rs b/src-tauri/src/cmds.rs
index eeaabd5c6cc981678ed3fc8d0bdde01d06d0e29d..577036f91683e94f14e642c7e566e5ba60c0d35d 100644
--- a/src-tauri/src/cmds.rs
+++ b/src-tauri/src/cmds.rs
@@ -180,17 +180,10 @@ pub fn view_profile(index: usize, profiles_state: State<'_, ProfilesState>) -> R
     };
   }
 
-  // use `open` command
-  if let Ok(open) = which::which("open") {
-    return match Command::new(open).arg(path).spawn() {
-      Ok(_) => Ok(()),
-      Err(_) => Err("failed to open file by `open`".into()),
-    };
+  match open_command().arg(path).spawn() {
+    Ok(_) => Ok(()),
+    Err(_) => Err("failed to open file by `open`".into()),
   }
-
-  // recommand to use vscode
-  // todo: support other editors
-  return Err("please install VScode".into());
 }
 
 /// restart the sidecar
@@ -279,3 +272,35 @@ pub async fn patch_verge_config(
   let mut verge = verge_state.0.lock().unwrap();
   verge.patch_config(payload)
 }
+
+/// open app config dir
+#[tauri::command]
+pub fn open_app_dir() -> Result<(), String> {
+  let app_dir = app_home_dir();
+
+  match open_command().arg(app_dir).spawn() {
+    Ok(_) => Ok(()),
+    Err(_) => Err("failed to open logs dir".into()),
+  }
+}
+
+/// open logs dir
+#[tauri::command]
+pub fn open_logs_dir() -> Result<(), String> {
+  let log_dir = app_home_dir().join("logs");
+
+  match open_command().arg(log_dir).spawn() {
+    Ok(_) => Ok(()),
+    Err(_) => Err("failed to open logs dir".into()),
+  }
+}
+
+/// get open/explorer command
+fn open_command() -> Command {
+  let open = if cfg!(target_os = "windows") {
+    "explorer"
+  } else {
+    "open"
+  };
+  Command::new(open)
+}
diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs
index c8a905cf9bfb72f4bb9afb0314791c24e1fcfe2b..31dcdc8aa8aa73cda3f071c328da783cd026d637 100644
--- a/src-tauri/src/main.rs
+++ b/src-tauri/src/main.rs
@@ -74,6 +74,8 @@ fn main() -> std::io::Result<()> {
       cmds::restart_sidecar,
       cmds::get_sys_proxy,
       cmds::get_cur_proxy,
+      cmds::open_app_dir,
+      cmds::open_logs_dir,
       // clash
       cmds::get_clash_info,
       cmds::patch_clash_config,
diff --git a/src/components/setting/setting-verge.tsx b/src/components/setting/setting-verge.tsx
index 14c0791a6a85f60f2f1b4e8ed28ef5e1fb56968a..fab9847f62b14ac06975b0074853238f9d9ebb82 100644
--- a/src/components/setting/setting-verge.tsx
+++ b/src/components/setting/setting-verge.tsx
@@ -1,11 +1,17 @@
 import useSWR, { useSWRConfig } from "swr";
-import { ListItemText, Switch, Typography } from "@mui/material";
-import { getVergeConfig, patchVergeConfig } from "../../services/cmds";
+import { IconButton, ListItemText, Switch, Typography } from "@mui/material";
+import {
+  getVergeConfig,
+  openAppDir,
+  openLogsDir,
+  patchVergeConfig,
+} from "../../services/cmds";
 import { SettingList, SettingItem } from "./setting";
 import { CmdType } from "../../services/types";
 import { version } from "../../../package.json";
 import GuardState from "./guard-state";
 import PaletteSwitch from "./palette-switch";
+import { ArrowForward } from "@mui/icons-material";
 
 interface Props {
   onError?: (err: Error) => void;
@@ -55,6 +61,27 @@ const SettingVerge = ({ onError }: Props) => {
         </GuardState>
       </SettingItem>
 
+      <SettingItem>
+        <ListItemText primary="Open App Dir" />
+        <IconButton
+          color="inherit"
+          size="small"
+          onClick={() => {
+            console.log("click");
+            openAppDir().then(console.log).catch(console.log);
+          }}
+        >
+          <ArrowForward />
+        </IconButton>
+      </SettingItem>
+
+      <SettingItem>
+        <ListItemText primary="Open Logs Dir" />
+        <IconButton color="inherit" size="small" onClick={openLogsDir}>
+          <ArrowForward />
+        </IconButton>
+      </SettingItem>
+
       <SettingItem>
         <ListItemText primary="Version" />
         <Typography sx={{ py: "6px" }}>v{version}</Typography>
diff --git a/src/services/cmds.ts b/src/services/cmds.ts
index 5f9cf0858dfa5134d2d2e71d1b8b113877f5ea48..9ef9c131fef51eff7801349fcfb373c716ef5bd3 100644
--- a/src/services/cmds.ts
+++ b/src/services/cmds.ts
@@ -63,3 +63,11 @@ export async function patchVergeConfig(payload: CmdType.VergeConfig) {
 export async function getSystemProxy() {
   return invoke<any>("get_sys_proxy");
 }
+
+export async function openAppDir() {
+  return invoke<void>("open_app_dir");
+}
+
+export async function openLogsDir() {
+  return invoke<void>("open_logs_dir");
+}