diff --git a/apps/desktop-client/build/icon.icns b/apps/desktop-client/build/icon.icns
new file mode 100644
index 0000000..0c4baab
Binary files /dev/null and b/apps/desktop-client/build/icon.icns differ
diff --git a/apps/desktop-client/build/icon.ico b/apps/desktop-client/build/icon.ico
new file mode 100644
index 0000000..daa925f
Binary files /dev/null and b/apps/desktop-client/build/icon.ico differ
diff --git a/apps/desktop-client/build/icon.png b/apps/desktop-client/build/icon.png
new file mode 100644
index 0000000..c361203
Binary files /dev/null and b/apps/desktop-client/build/icon.png differ
diff --git a/apps/desktop-client/electron.vite.config.ts b/apps/desktop-client/electron.vite.config.ts
index c4fbfc3..2d864a8 100644
--- a/apps/desktop-client/electron.vite.config.ts
+++ b/apps/desktop-client/electron.vite.config.ts
@@ -94,6 +94,9 @@ export default defineConfig({
resolve: {
alias: {
'@renderer': resolve(rootDir, 'src/renderer'),
+ // Single source of truth for the brand mark; lives in public/ so the
+ // main process and electron-builder can read the same file.
+ '@brand-logo': resolve(rootDir, 'public/logo.svg'),
...workspaceAliases,
},
},
diff --git a/apps/desktop-client/package.json b/apps/desktop-client/package.json
index 1b992f6..5f888a7 100644
--- a/apps/desktop-client/package.json
+++ b/apps/desktop-client/package.json
@@ -5,7 +5,7 @@
"description": "省心推客户端 — 连接和管理您的媒体账号,轻松发布和监控内容表现。",
"author": {
"name": "Liang Xu",
- "email": "liangxu@qq.com",
+ "email": "liangxu0920@qq.com",
"url": "https://shengxintui.com"
},
"type": "module",
@@ -13,6 +13,7 @@
"scripts": {
"dev": "electron-vite dev --inspect=9229",
"build": "electron-vite build",
+ "gen:icons": "node scripts/generate-brand-icons.cjs",
"obfuscate": "node scripts/obfuscate.cjs",
"build:obf": "pnpm run build && pnpm run obfuscate",
"package:mac": "pnpm run build:obf && electron-builder --mac --arm64 --universal",
diff --git a/apps/desktop-client/public/logo.svg b/apps/desktop-client/public/logo.svg
new file mode 100644
index 0000000..d14a919
--- /dev/null
+++ b/apps/desktop-client/public/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/apps/desktop-client/scripts/generate-brand-icons.cjs b/apps/desktop-client/scripts/generate-brand-icons.cjs
new file mode 100644
index 0000000..af95b35
--- /dev/null
+++ b/apps/desktop-client/scripts/generate-brand-icons.cjs
@@ -0,0 +1,210 @@
+#!/usr/bin/env node
+/*
+ * Generates every brand icon asset the desktop client needs from the single
+ * source of truth: public/logo.svg.
+ *
+ * Outputs:
+ * build/icon.icns macOS app icon (electron-builder)
+ * build/icon.png Linux app icon + Windows/icns fallback (1024x1024)
+ * build/icon.ico Windows app icon
+ * src/main/brand-icons.ts base64 icons consumed by the main process
+ * (tray + dock + window + Windows overlay)
+ *
+ * Re-run after changing public/logo.svg:
+ * node scripts/generate-brand-icons.cjs
+ *
+ * Requires `rsvg-convert`, `sips` and `iconutil` (preinstalled on macOS via
+ * librsvg + the system toolchain).
+ */
+const { execFileSync } = require('node:child_process')
+const fs = require('node:fs')
+const os = require('node:os')
+const path = require('node:path')
+
+const APP_DIR = path.resolve(__dirname, '..')
+const LOGO_PATH = path.join(APP_DIR, 'public', 'logo.svg')
+const BUILD_DIR = path.join(APP_DIR, 'build')
+const OUT_TS = path.join(APP_DIR, 'src', 'main', 'brand-icons.ts')
+
+// Brand palette — keep in sync with the renderer (#1677ff is Ant Design blue).
+const BRAND_BLUE = '#1677ff'
+const DANGER_RED = '#ff4d4f'
+const LOGO_FILL = '#dfdfdf' // the fill baked into logo.svg
+
+const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'brand-icons-'))
+const cleanup = () => fs.rmSync(tmpDir, { recursive: true, force: true })
+
+function rsvg(args) {
+ return execFileSync('rsvg-convert', args)
+}
+
+/** Extract the inner markup (the elements) and viewBox from logo.svg. */
+function readLogo() {
+ const raw = fs.readFileSync(LOGO_PATH, 'utf8')
+ const viewBox = (raw.match(/viewBox="([^"]+)"/) || [])[1]
+ const inner = (raw.match(/