diff --git a/src-tauri/src/cmd.rs b/src-tauri/src/cmd.rs
index 7994fb4424b97f6108c0249788de950b42158a5a..12aee41d3abd30d23f7e2a20d1293cd5c2e5b448 100644
--- a/src-tauri/src/cmd.rs
+++ b/src-tauri/src/cmd.rs
@@ -1,7 +1,7 @@
-use crate::clash;
-use crate::import;
 use tauri::api::process::kill_children;
 
+use crate::utils::{clash, import};
+
 #[tauri::command]
 pub fn cmd_restart_sidebar() {
   kill_children();
diff --git a/src-tauri/src/config/operate.rs b/src-tauri/src/config/operate.rs
index 1048eec20e10cb831df2459b4d565636d809ed69..b5c944f2c7847ce62f3dca0a77e62da4d0e5d945 100644
--- a/src-tauri/src/config/operate.rs
+++ b/src-tauri/src/config/operate.rs
@@ -3,7 +3,7 @@ use serde_yaml::{Mapping, Value};
 use std::{fs, path::PathBuf};
 
 use super::{profiles::ProfilesConfig, ClashController};
-use crate::init::app_home_dir;
+use crate::utils::app_home_dir;
 
 /// read data from yaml as struct T
 pub fn read_yaml<T: DeserializeOwned>(path: PathBuf) -> T {
diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs
index eb8a69d09034273c27b445b1a6153453140cc675..742cf33b7a4607f937141abaffa67b1210173f49 100644
--- a/src-tauri/src/main.rs
+++ b/src-tauri/src/main.rs
@@ -5,12 +5,9 @@
 
 extern crate tauri;
 
-mod clash;
 mod cmd;
 mod config;
-mod import;
-mod init;
-mod sysopt;
+mod utils;
 
 use tauri::{
   CustomMenuItem, Manager, SystemTray, SystemTrayEvent, SystemTrayMenu, SystemTrayMenuItem,
@@ -63,7 +60,7 @@ fn main() -> std::io::Result<()> {
     .expect("error while running tauri application");
 
   // init app config
-  init::init_app(app.package_info());
+  utils::init::init_app(app.package_info());
   // clash::run_clash_bin();
 
   // 通过clash config初始化menu和tray
diff --git a/src-tauri/src/clash.rs b/src-tauri/src/utils/clash.rs
similarity index 95%
rename from src-tauri/src/clash.rs
rename to src-tauri/src/utils/clash.rs
index c727ffde4e0da287c9a2c77329450376b03f6fd5..d028b7940b3a3df7694f76dc80e1cfacab8cff3c 100644
--- a/src-tauri/src/clash.rs
+++ b/src-tauri/src/utils/clash.rs
@@ -1,6 +1,6 @@
 extern crate log;
 
-use crate::init::app_home_dir;
+use crate::utils::app_home_dir;
 use tauri::api::process::{Command, CommandEvent};
 
 /// Run the clash bin
diff --git a/src-tauri/src/utils/dirs.rs b/src-tauri/src/utils/dirs.rs
new file mode 100644
index 0000000000000000000000000000000000000000..51674720138a99602498d3531f6d9301c15cb59e
--- /dev/null
+++ b/src-tauri/src/utils/dirs.rs
@@ -0,0 +1,18 @@
+use std::path::{Path, PathBuf};
+use tauri::{
+  api::path::{home_dir, resource_dir},
+  PackageInfo,
+};
+
+/// get the verge app home dir
+pub fn app_home_dir() -> PathBuf {
+  home_dir()
+    .unwrap()
+    .join(Path::new(".config"))
+    .join(Path::new("clash-verge"))
+}
+
+/// get the resources dir
+pub fn app_resources_dir(package_info: &PackageInfo) -> PathBuf {
+  resource_dir(package_info).unwrap().join("resources")
+}
diff --git a/src-tauri/src/import.rs b/src-tauri/src/utils/import.rs
similarity index 99%
rename from src-tauri/src/import.rs
rename to src-tauri/src/utils/import.rs
index 1471bee0cc764209bca5f8ae9fc0f3886706e2bd..19311f5fcc628fce9583efe4539762f6370b6771 100644
--- a/src-tauri/src/import.rs
+++ b/src-tauri/src/utils/import.rs
@@ -1,7 +1,7 @@
 extern crate reqwest;
 
 use crate::config::{read_profiles, save_profiles, ProfileExtra, ProfileItem};
-use crate::init::app_home_dir;
+use crate::utils::app_home_dir;
 use std::fs::File;
 use std::io::Write;
 use std::time::{SystemTime, UNIX_EPOCH};
diff --git a/src-tauri/src/init.rs b/src-tauri/src/utils/init.rs
similarity index 90%
rename from src-tauri/src/init.rs
rename to src-tauri/src/utils/init.rs
index f6abd9c99993c67a5660725697defa1c5baf10f8..519435c2a04cd1793cfbc4b2d2a728a18d865cbc 100644
--- a/src-tauri/src/init.rs
+++ b/src-tauri/src/utils/init.rs
@@ -7,18 +7,11 @@ use log4rs::config::{Appender, Config, Root};
 use log4rs::encode::pattern::PatternEncoder;
 use std::fs;
 use std::io::Write;
-use std::path::{Path, PathBuf};
+use std::path::PathBuf;
 use std::time::{SystemTime, UNIX_EPOCH};
-use tauri::api::path::{home_dir, resource_dir};
 use tauri::PackageInfo;
 
-/// get the verge app home dir
-pub fn app_home_dir() -> PathBuf {
-  home_dir()
-    .unwrap()
-    .join(Path::new(".config"))
-    .join(Path::new("clash-verge"))
-}
+use crate::utils::{app_home_dir, app_resources_dir};
 
 /// initialize this instance's log file
 fn init_log(log_dir: &PathBuf) {
@@ -96,7 +89,7 @@ pub fn init_app(package_info: &PackageInfo) {
   let log_dir = app_dir.join("logs");
   let profiles_dir = app_dir.join("profiles");
 
-  let res_dir = resource_dir(package_info).unwrap().join("resources");
+  let res_dir = app_resources_dir(package_info);
 
   if !app_dir.exists() {
     fs::create_dir(&app_dir).unwrap();
diff --git a/src-tauri/src/utils/mod.rs b/src-tauri/src/utils/mod.rs
new file mode 100644
index 0000000000000000000000000000000000000000..064253fb15a63c0c9010a7fd457441ecc8111245
--- /dev/null
+++ b/src-tauri/src/utils/mod.rs
@@ -0,0 +1,7 @@
+mod dirs;
+pub use self::dirs::*;
+
+pub mod clash;
+pub mod import;
+pub mod init;
+pub mod sysopt;
diff --git a/src-tauri/src/sysopt.rs b/src-tauri/src/utils/sysopt.rs
similarity index 100%
rename from src-tauri/src/sysopt.rs
rename to src-tauri/src/utils/sysopt.rs