diff --git a/src/pages/_layout.tsx b/src/pages/_layout.tsx
index 7756d80570d3b95d834a7d3ce5645f1f520026ff..4b52ace997ef6d651100f92510cb7f2f47ef8562 100644
--- a/src/pages/_layout.tsx
+++ b/src/pages/_layout.tsx
@@ -24,10 +24,6 @@ import useCustomTheme from "@/components/layout/use-custom-theme";
 import getSystem from "@/utils/get-system";
 import "dayjs/locale/zh-cn";
 
-declare global {
-  const WIN_PORTABLE: boolean;
-}
-
 dayjs.extend(relativeTime);
 
 const OS = getSystem();
diff --git a/src/services/types.d.ts b/src/services/types.d.ts
index de3541d754279b5d68fd18e7cf4e6ca08a47f384..749cffde821508b82d81c1ab2f61433b8e39ce7b 100644
--- a/src/services/types.d.ts
+++ b/src/services/types.d.ts
@@ -1,3 +1,22 @@
+type Platform =
+  | "aix"
+  | "android"
+  | "darwin"
+  | "freebsd"
+  | "haiku"
+  | "linux"
+  | "openbsd"
+  | "sunos"
+  | "win32"
+  | "cygwin"
+  | "netbsd";
+
+/**
+ * defines in `vite.config.ts`
+ */
+declare const WIN_PORTABLE: boolean;
+declare const OS_PLATFORM: Platform;
+
 /**
  * Some interface for clash api
  */
diff --git a/src/utils/get-system.ts b/src/utils/get-system.ts
index 8801617005940986c4a26490dc51cbf025597608..891770329f6420d78f448199cd5751d796931127 100644
--- a/src/utils/get-system.ts
+++ b/src/utils/get-system.ts
@@ -2,10 +2,11 @@
 // according to UA
 export default function getSystem() {
   const ua = navigator.userAgent;
+  const platform = OS_PLATFORM;
 
-  if (ua.includes("Mac OS X")) return "macos";
+  if (ua.includes("Mac OS X") || platform === "darwin") return "macos";
 
-  if (/win64|win32/i.test(ua)) return "windows";
+  if (/win64|win32/i.test(ua) || platform === "win32") return "windows";
 
   if (/linux/i.test(ua)) return "linux";
 
diff --git a/vite.config.ts b/vite.config.ts
index 4a51b767c86336fab1b9ed8f25d8186f07ee3ac7..0315d7692561a4c0edf95dc270e83916512aee72 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -24,6 +24,7 @@ export default defineConfig({
     },
   },
   define: {
+    OS_PLATFORM: `"${process.platform}"`,
     WIN_PORTABLE: !!process.env.VITE_WIN_PORTABLE,
   },
 });