{"id":50731381,"url":"https://github.com/beixiyo/electron-starter","last_synced_at":"2026-06-10T09:01:16.927Z","repository":{"id":359472374,"uuid":"1242332145","full_name":"beixiyo/electron-starter","owner":"beixiyo","description":"Opinionated Electron starter — React + TypeScript + Vite, pnpm monorepo. Includes macOS Fn/Globe key system (Hold / Double Press / Combo via IOHIDManager), window manager, IPC scaffolding, OAuth, and more.","archived":false,"fork":false,"pushed_at":"2026-06-08T07:00:48.000Z","size":1976,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-08T09:03:53.795Z","etag":null,"topics":["electron","electron-vite","macos","monorepo","pnpm","react","typescript","vite"],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/beixiyo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-18T10:30:34.000Z","updated_at":"2026-06-08T07:00:52.000Z","dependencies_parsed_at":null,"dependency_job_id":"ae089ceb-39b8-4e39-b0c3-b79a6e762a00","html_url":"https://github.com/beixiyo/electron-starter","commit_stats":null,"previous_names":["beixiyo/electron-starter"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/beixiyo/electron-starter","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beixiyo%2Felectron-starter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beixiyo%2Felectron-starter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beixiyo%2Felectron-starter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beixiyo%2Felectron-starter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/beixiyo","download_url":"https://codeload.github.com/beixiyo/electron-starter/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beixiyo%2Felectron-starter/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34144680,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-10T02:00:07.152Z","response_time":89,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["electron","electron-vite","macos","monorepo","pnpm","react","typescript","vite"],"created_at":"2026-06-10T09:01:15.366Z","updated_at":"2026-06-10T09:01:16.912Z","avatar_url":"https://github.com/beixiyo.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Electron Mono-Repo 模板\n\n## 系统要求\n\n| 功能 | 最低 macOS 版本 | 说明 |\n|------|----------------|------|\n| 会议检测（audio-monitor） | 14.2 Sonoma | Core Audio Taps API |\n| 录音 — 系统音频 | 14.0 | ScreenCaptureKit |\n| 录音 — 麦克风 | **15.0** Sequoia | `SCStreamConfiguration.captureMicrophone` |\n\n\u003e Windows / Linux 不涉及 native 二进制，相关功能静默跳过\n\n---\n\n## Env 配置\n\nhttps://cn.electron-vite.org/guide/env-and-mode\n\n- `packages/electron/env/.env.development`\n- `packages/electron/env/.env.production`\n\n```bash\n# Electron Env\nVITE_ELECTRON_API_BASE_URL=xxx\nVITE_ELECTRON_WS_BASE_URL=xxx\n\nVITE_ELECTRON_APPLE_CLIENT_ID=xxx\nVITE_ELECTRON_APPLE_REDIRECT_URI=xxx\nVITE_ELECTRON_APPLE_SCOPE=xxx\nVITE_ELECTRON_APPLE_STATE=xxx\n\nVITE_ELECTRON_GOOGLE_CLIENT_ID=xxx\nVITE_ELECTRON_GOOGLE_REDIRECT_URI=xxx\n\n\n# Web Env\nVITE_WEB_API_BASE_URL=xxx\nVITE_WEB_WS_BASE_URL=xxx\n\nVITE_WEB_APPLE_CLIENT_ID=xxx\nVITE_WEB_APPLE_REDIRECT_URI=xxx\nVITE_WEB_APPLE_SCOPE=xxx\nVITE_WEB_APPLE_STATE=xxx\n\nVITE_WEB_GOOGLE_CLIENT_ID=xxx\nVITE_WEB_GOOGLE_REDIRECT_URI=xxx\n\n\n# ASR Env\nMAIN_VITE_ASR_APPID=xxx\nMAIN_VITE_ASR_TOKEN=xxx\nMAIN_VITE_ASR_CLUSTER=xxx\n```\n\n---\n\n## 启动开发\n\n```bash\npnpm i\npnpm build\n\n# macOS：编译 Swift native 二进制（audio-monitor / audio-recorder / fn-listener / focus-check）\nbash packages/app/scripts/build-native.sh\n\ncd packages/electron\npnpm dev\n```\n\nVSCode 开发直接按下 **F5**\n\n---\n\n## Native 二进制\n\n`packages/app/resources/` 下有多个 Swift 源码，通过统一脚本编译为 Universal Binary（arm64 + x86_64）：\n\n```bash\nbash packages/app/scripts/build-native.sh\n```\n\n| 二进制 | 源码 | 功能 |\n|--------|------|------|\n| `audio-monitor` | `audio-monitor.swift` | 轮询 Core Audio，检测哪些进程正在使用音频设备 |\n| `audio-recorder` | `audio-recorder.swift` | ScreenCaptureKit 录制系统音频 + 麦克风，stdin/stdout JSON 通信 |\n| `fn-listener` | `fn-listener.swift` | 监听 Fn 键事件 |\n| `focus-check` | `focus-check.swift` | 检查前台应用焦点状态 |\n\n所有二进制通过 `NativeBridge` 类（`main/native-bridge.ts`）统一管理生命周期和事件通信。\n\n\u003e 产物（无扩展名的二进制文件）已在 `.gitignore` 中排除，每次拉取后需重新编译\n\n---\n\n## 错误排查\n\n### node-gyp: `No module named 'distutils'`\n\nPython 3.12+ 移除了内置的 `distutils` 模块，导致旧版 `node-gyp`（如 `@electron/rebuild` 内置的 v9.x）编译原生模块时报错：\n\n```\nModuleNotFoundError: No module named 'distutils'\n```\n\n**修复方式**（按系统选择）：\n\n```bash\n# macOS (Homebrew)\nbrew install python-setuptools\n\n# 其他系统\npip3 install setuptools\n```\n\n---\n\n### Arch Linux: `libcrypt.so.1` 缺失（仅 electron-builder 26+）\n\nelectron-builder 26+ 内置的 fpm（Ruby 预编译）依赖 `libcrypt.so.1`，但 Arch Linux 已升级为 `libcrypt.so.2`，导致 deb/snap 打包失败：\n\n```\nruby: error while loading shared libraries: libcrypt.so.1: cannot open shared object file\n```\n\n**修复**：安装兼容库（Arch 官方 core 仓库）：\n\n```bash\nsudo pacman -S libxcrypt-compat\n```\n\n\u003e **注意**：electron-builder 25.x 使用旧版 fpm，不受此问题影响。\n\n### electron-builder 26 + pnpm monorepo: `Cannot find module`\n\nelectron-builder v26 重写了模块收集器（纯 JS 替代旧 `app-builder` 二进制），对 pnpm monorepo 的 symlink 结构支持存在**已知 bug**（[#8986](https://github.com/electron-userland/electron-builder/issues/8986)、[#9654](https://github.com/electron-userland/electron-builder/issues/9654)），导致 ASAR 中缺失 node_modules，运行时报错：\n\n```\nError: Cannot find module '@electron-toolkit/utils'\nError: Cannot find module 'uiohook-napi'\n```\n\n**修复**：降级到 electron-builder **25.1.8**（旧收集器能正确跟踪 pnpm symlink）：\n\n```bash\npnpm -F app add -D electron-builder@25.1.8\n```\n\n---\n\n## 打包\n\n```bash\n# 打包产物在 packages/app/dist/dist\npnpm -F app build:win\npnpm -F app build:mac\npnpm -F app build:linux\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbeixiyo%2Felectron-starter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbeixiyo%2Felectron-starter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbeixiyo%2Felectron-starter/lists"}