wavever/buildby
wavever/buildby has 84 GitHub stars and 4 forks. GitHot measured -1 stars in 24 hours and -1 in 7 days. Last checked 2026-11-13 05:39 UTC. Last push 2026-11-03.
CLI tool to detect desktop app tech stacks, code signatures, and notarization status. 桌面应用技术栈、代码签名与公证状态识别 CLI 工具。
可以做什么
- 🔍 23 stacks detected — Electron, Tauri, Flutter, Qt, CEF, React Native, .NET, JVM, Unity, Godot… or Native.
- 🧬 Architecture & versions — arm64 / x86_64 / universal, plus Electron, Flutter, and Qt versions.
- 🔒 Trust check — developer, Team ID, Apple notarization, Hardened Runtime, Authenticode.
- ⚡ Fast & safe — pure-JS binary header parsing, no admin rights, cached batch scans.
实测星标增长
- 24小时
- -1
- 7天
- -1
- 15天
- 正在收集历史
- 1个月
- 正在收集历史
各周期内的星标净变化,周期相互重叠,并非每日新增。缺失的测量保持空白。星标代表关注度,不代表软件质量。
README.zh-CN.md
原文buildby
是 Electron?Tauri?还是原生 Swift?一条命令看穿任何桌面应用。
检测任意桌面应用的技术栈、CPU 架构、代码签名与公证状态 — macOS、Windows 与 Linux。
双应用并排对比(buildby vs / buildby pk)
十秒上手
npx @wavever/buildby # 浏览并搜索已安装应用
npx @wavever/buildby discord # 查看单个应用
npx @wavever/buildby vs "ChatGPT" "Discord" # 并排对比
喜欢的话:npm i -g @wavever/buildby,之后直接运行 buildby。
曾用包名
desktop-app-build-by(已弃用)。命令仍是buildby。详见 CHANGELOG.md。
从源码安装
git clone https://github.com/wavever/buildby.git
cd buildby
npm install
npm link
# 或直接从源码运行
node bin/buildby.js
亮点
- 🔍 识别 23 种技术栈 — Electron、Tauri、Flutter、Qt、CEF、React Native、.NET、JVM、Unity、Godot……或原生。
- 🧬 架构与版本 — arm64 / x86_64 / universal,以及 Electron、Flutter、Qt 的版本。
- 🔒 签名与信任 — 开发者、Team ID、Apple 公证、Hardened Runtime、Authenticode。
- ⚡ 又快又安全 — 纯 JS 解析二进制头,无需管理员权限,批量扫描有缓存。
- 📤 随处导出 —
--json、--md、--csv,方便脚本和报告。
截图
| 查看单个应用 | 扫描所有已安装应用 | 按技术栈过滤 |
|---|---|---|
![]() |
![]() |
![]() |
用法
应用浏览与搜索(默认模式)
在终端中直接运行 buildby 不传参数,默认启动应用浏览与搜索:
buildby # 默认浏览与搜索已安装应用
buildby -i # 指定搜索浏览模式
buildby interactive # 同一浏览模式的子命令
- 全键盘操作:使用方向键
↑/↓浏览应用,按Enter查看选中应用的完整详情。 - 即时输入过滤:随时键入文字即可实时模糊搜索匹配应用。
- 平滑视口滚动:丝滑无闪烁地滚动浏览系统内全部已安装应用,带分页与位置提示(
▲/▼及[当前/总数])。 - 快捷退出:按
q或Ctrl+C随时退出。
双应用对比(vs / pk)
并排对比两个应用的技术栈、芯片架构、体积差与代码签名:
# 直接指定两个应用进行对比
buildby vs "ChatGPT" "Amphetamine"
buildby pk "WeChat" "Discord"
buildby compare "Visual Studio Code" "Sublime Text"
# 或直接进入多选对比
buildby vs
# → 方向键浏览,按空格键勾选两个应用,回车即可开始并排对比!
查看单个应用
buildby wechat
buildby discord
buildby "visual studio code"
buildby "clash verge"
输出示例:
╭──────────────────────────────────────────────────────────────────────────╮
│ 📦 Discord (v0.0.335) macOS · arm64 │
│ 📂 /Applications/Discord.app │
├──────────────────────────────────────────────────────────────────────────┤
│ 跨平台 ⚡ Electron │
│ 使用 Web 技术(HTML/CSS/JS)构建的跨平台桌面应用 │
│ 🌐 https://www.electronjs.org │
├───────────────────────────────────┬──────────────────────────────────────┤
│ 📋 核心规格 │ 🔒 签名与安全 │
│ • 架构: Apple Silicon (arm64) │ • 签名: ✓ 已签名 │
│ • 体积: 375.4 MB │ • 开发者: Discord, Inc. (53Q6… │
│ • 版本: 0.0.335 │ • 公证: ✓ Apple 公证 │
│ • 标识: com.hnc.Discord │ • 强化运行: ✓ 已启用 │
├───────────────────────────────────┴──────────────────────────────────────┤
│ 🔍 判定依据 │
│ • Electron Framework.framework │
│ • app.asar │
╰──────────────────────────────────────────────────────────────────────────╯
签名与安全 部分仅在单应用查看时输出(
buildby <name>与--path)。--all与--<stack>模式为了保证批量扫描速度,会跳过这一部分。
扫描所有已安装应用
buildby --all
buildby -a
会扫描 /Applications(macOS)或 Program Files(Windows)等目录下的所有桌面应用,按技术栈分组,并展示适合截图分享的“桌面应用技术栈画像”。
--scan仍然保留为--all的兼容别名。
批量扫描会使用本地分析缓存。如果应用版本与主可执行文件指纹没有变化,BuildBy 会直接复用上一次分析结论,重复扫描几乎是瞬时完成。
buildby --all --no-cache # 强制重新分析
导出格式
Markdown 表格(--markdown / --md)
将检测结果导出为整洁的 GitHub Flavored Markdown (GFM) 表格,包含详细信息及顶部的技术栈分布汇总表:
buildby --all --md > apps.md
buildby discord --md
CSV 表格(--csv)
将应用清单导出为标准 RFC 4180 CSV 格式,方便导入 Excel、Numbers 或数据分析工具:
buildby --all --csv > apps.csv
JSON 输出(--json)
任意检测模式加上 --json 即可在 stdout 得到机器可读输出(update 是动作命令,没有 JSON 形式)。进度与错误信息走 stderr,因此 stdout 始终可以安全地管道传递。
buildby discord --json
buildby --all --json | jq '.summary.stacks'
buildby --electron --json | jq -r '.apps[].name'
JSON schema、字段说明与退出码
所有模式返回同一个信封结构,消费方无需按模式分支处理:
{
"schema": 1,
"buildbyVersion": "1.5.0",
"platform": "darwin",
"query": { "mode": "app", "value": "calibre" },
"apps": [
{
"name": "calibre",
"stack": "python",
"stackName": "Python (PyQt)",
"variant": "PyQt",
"category": "cross-platform",
"confidence": "high",
"evidence": ["Python.framework", "PyQt UI toolkit"],
"bundleId": "net.kovidgoyal.calibre",
"version": "7.22.0",
"sizeBytes": 1052946432
}
],
"summary": null
}
消费方须知:
stack才是稳定标识符 —— 请基于它判断,而不是stackName。stackName是展示用名称,variant承载子技术(如PyQt、Rust · AppKit)。evidence是给人看的,不属于稳定 API,请勿解析。- 体积为原始字节数;JSON 输出中不含任何本地化文案。
summary仅在--all下填充,其余模式为null。- 签名与公证信息仅在单应用模式采集(与报告行为一致),因此
--all下为null。 schema带版本号,请在依赖字段语义前先校验。
退出码(仅在 --json 下生效,不影响既有用法):
| 退出码 | 含义 |
|---|---|
0 |
至少匹配到一个应用 |
1 |
无匹配(payload 仍然合法,apps: []) |
2 |
错误 —— 平台不支持、路径不存在、分析失败 |
出错时 stdout 返回可解析的错误对象,而不是 apps:
{ "schema": 1, "error": { "code": "path_not_found", "message": "Path not found: /nope" } }
配置文件
BuildBy 会在首次运行时创建默认 JSON 配置,之后每次运行都会读取。批量扫描会遵守 cache 与 excludeApps。
配置路径与选项
- macOS / Linux / 其他:
$XDG_CONFIG_HOME/buildby/config.json或~/.config/buildby/config.json - Windows:
%APPDATA%\buildby\config.json
在 macOS 上,如果新路径还不存在,但旧的 ~/.buildby/config.json 已存在,BuildBy 会自动将旧配置复制到新的 XDG 路径。
也可以通过 BUILDBY_CONFIG=/path/to/config.json 指定自定义配置文件;如果该文件不存在,BuildBy 会自动写入默认值。
{
"cache": true,
"excludeApps": [
"Xcode",
"com.apple.Safari",
"/Applications/VMware Fusion.app"
]
}
cache: false 会默认禁用分析缓存。excludeApps 会让匹配的应用不参与 --all 与按技术栈过滤扫描;条目可以写应用名、Bundle ID 或完整路径。单应用查询仍然可以查看这些被排除的应用。
"checkForUpdates": false 会跳过命令前的更新提示。同样可以传 --no-update-check,或设置环境变量 BUILDBY_NO_UPDATE_CHECK=1。
输出语言
BuildBy 默认会跟随终端或系统语言。无需修改系统语言,也可以临时展示英文输出:
LC_ALL=en_US.UTF-8 buildby -a
也可以创建一个 alias:
alias buildby-en='LC_ALL=en_US.UTF-8 buildby'
按技术栈过滤
buildby -e # 所有 Electron 应用(--electron)
buildby -f # 所有 Flutter 应用(--flutter)
buildby -t # 所有 Tauri 应用(--tauri)
buildby -q # 所有 Qt 应用(--qt)
buildby -j # 所有 JVM 应用(--jvm)
buildby -c # 所有 CEF 应用(--cef)
buildby -d # 所有 .NET / MAUI / WPF 应用(--dotnet)
buildby -b # 所有 Chromium 应用(--chromium)
buildby -W # 所有 NW.js 应用(--nwjs)
buildby -r # 所有 React Native 桌面应用(--reactnative)
buildby -w # 所有 wxWidgets / wxPython 应用(--wxwidgets)
buildby -u # 所有 Unity 应用(--unity)
buildby -n # 所有原生应用(--native)
指定自定义路径
buildby --path /Applications/SomeApp.app
buildby --path "C:\Program Files\SomeApp"
更新
在终端中,buildby 在执行命令前会检查是否有新版本发布:
- 新版本提示:当发现新版本时,终端会弹出更新提示框。
- 全键盘选择:使用方向键
↑/↓或数字键1/2切换 立即升级并继续 或 稍后升级(跳过),按Enter确认(按q或Esc快速跳过)。 - 无感继续执行:选择升级后,
buildby会通过 npm 安装最新版本,并在安装完成后直接用新版本继续执行你原本输入的命令。 - 跳过检查:添加
--no-update-check、设置环境变量BUILDBY_NO_UPDATE_CHECK=1,或在config.json中配置"checkForUpdates": false。
buildby update # 检查新版本并直接安装
buildby update --check # 仅检查是否有新版本,不安装
update 通过 npm 查询最新版本,因此会沿用你自己的 registry 镜像、代理与认证配置。如果当前运行的是 git 检出或 npm link 的副本,它会提示所在路径并停止,不会覆盖你的工作目录。
由于
update是子命令,名字恰好叫 "update" 的应用无法再按名称检测。这种情况请用buildby --path。
支持检测的技术栈
| 栈 | 说明 | 主要检测方式 |
|---|---|---|
| ⚡ Electron | Node.js + Chromium | Electron Framework.framework、app.asar、提取框架主版本号 |
| 🐦 Flutter | Google 跨平台 UI 工具包 | FlutterMacOS.framework、flutter_windows.dll、提取 Flutter 版本 |
| 🌐 CEF | Chromium Embedded Framework | Chromium Embedded Framework.framework、libcef.dll |
| 🌐 Chromium | 直接基于 Chromium 构建 | .pak 资源包 + V8 快照(已排除 Qt WebEngine) |
| 🟩 NW.js | Node.js + Chromium(原 node‑webkit) | nwjs Framework.framework、app.nw |
| ⚛️ React Native | React Native 桌面端实现 | React.framework、Hermes.framework / hermes.dll |
| 🦀 Tauri | Rust + 系统 WebView | 二进制中的 Tauri crate 特征、v1/v2 变体 / Windows 上 WebView2Loader.dll |
| ⚡ Neutralinojs | 轻量级 HTML/JS 跨平台框架 | neutralino.js、neutralino.config.json、二进制特征 |
| 🐹 Wails | Go + 系统 WebView | 二进制中的 github.com/wailsapp/wails |
| 🔷 Qt | C++ 跨平台框架 | Qt*.framework(含嵌套目录)、Qt5Core.dll / Qt6Core.dll、提取 Qt 版本 |
| 🟫 GTK | GNOME 控件工具包 | libgtk-3/4.dylib、libgtk-3-0.dll |
| 🧩 wxWidgets | C++ 跨平台 GUI 库 | macOS 上 libwx*.dylib,Windows 上 wxmswXXu_*.dll 等 |
| 🧩 Sciter | 嵌入式 HTML/CSS 界面引擎 | sciter.dll、libsciter.dylib、二进制特征 |
| 🎵 JUCE | 音频应用与插件宿主 C++ 框架 | 二进制中的 JUCE v / juce:: 特征 |
| 🐍 Python | py2app / PyInstaller / 内置 CPython | __boot__.py、base_library.zip、Python.framework |
| ☕ JVM | Java/Kotlin/Scala | jbr/、libjvm.dylib、lib/ app/ Java/ 下的 .jar |
| 🟣 Compose Multiplatform | 基于 Skia 的 Kotlin UI 框架 | libskiko-macos-*.dylib、skiko-awt-runtime-*.jar |
| 🔵 .NET | Microsoft .NET / MAUI / WPF | MonoBundle/、coreclr.dll、.dll 组合特征 |
| 🦅 Avalonia | 跨平台 .NET UI 框架 | Avalonia*.dll、libAvalonia* |
| 🎮 Unity | Unity 游戏引擎 | UnityPlayer.dll、Data/ 目录结构 |
| 🎯 Unreal Engine | Epic 虚幻引擎 UE4 / UE5 | Content/Paks/*.pak、Contents/UE5/ |
| 🤖 Godot | Godot 游戏引擎 | *.pck 归档 + 二进制中的引擎特征 |
| 🖥️ Native | 平台原生技术 | 兜底分类;区分 Swift / Objective-C / Rust / Go / C++ / Win32 |
平台支持
| 平台 | 应用发现位置 | 检测方式 |
|---|---|---|
| macOS | /Applications、~/Applications |
Contents/Frameworks、进程内纯 JS Mach-O 解析器、Info.plist 元数据 |
| Windows | Program Files、Program Files (x86)、AppData/Local/Programs |
PE 二进制头探测、扫描 .exe / .dll、特定框架文件与目录结构 |
| Linux | /usr/share/applications、~/.local/share/applications、Flatpak、Snap |
.desktop 桌面规范解析、ELF 二进制头解析、动态库依赖 |
工作原理
检测完全基于 文件系统与二进制头解析,安全极速,不需要管理员权限:
- 扫描框架目录与动态库:读取应用目录或
Contents/Frameworks/下的 DLL / dylib,匹配各类已知框架的特征文件。 - 纯 JS 二进制头解析:使用内置流式解析器读取 Mach-O 动态库链接命令(
LC_LOAD_DYLIB)、Universal 通用二进制、PE 与 ELF CPU 芯片架构,避免启动外部子进程。 - 资源特征模式:查找
app.asar、flutter_assets、neutralino.js、app.nw等典型资源。 - 框架版本提取:从 Electron 资源包、Flutter 框架符号、Qt 动态库中自动提取运行时主版本号。
- JVM / 游戏引擎检测:识别打包的 JRE/JBR、.NET 运行时、Unity Data、Unreal Engine Pak 与 Godot pck 归档。
- 元数据提取:从
Info.plist、PE 版本资源与 Linux.desktop文件解析名称、版本号与 Bundle ID。 - 签名与公证:macOS 上调用
codesign与spctl,Windows 上调用 PowerShellGet-AuthenticodeSignature,提取开发者 / Team ID / 签发者,以及 Apple 公证或 Authenticode 信任状态。 - 智能分析缓存:根据应用版本与主程序指纹哈希缓存分析结果,重复扫描瞬间完成。
- 兜底策略:如果未匹配到任何跨平台框架特征,则将应用归类为原生技术栈(Native:Swift / Objective-C / Rust / Go / C++ / Win32)。
检测按照优先级顺序依次执行,特征越独特的框架越先匹配,以减少误报和重复分类。
环境要求
- Node.js >= 18
- macOS、Windows 或 Linux
- macOS 需要 Xcode Command Line Tools(自带
codesign与spctl,用于签名信息查询) - Windows 需要
powershell在PATH中(用于读取 Authenticode 签名) - Linux 需要标准 FreeDesktop / XDG 桌面环境
许可证
MIT



