Hoppscotch Desktop 深度解析:基于 Tauri V2 的跨平台桌面端安装、自托管连接与本地构建实战
本篇指南围绕 Hoppscotch Desktop(位于 packages/hoppscotch-desktop)展开,覆盖桌面端的应用安装(官方包与 Homebrew)、Hoppscotch Cloud 与自托管实例两种接入方式、WHITELISTED_ORIGINS 与 3200 端口等关键配置,以及如何用仓库自带的 webapp-bundler 将 selfhost 前端打包进桌面壳、本地构建并自托管的完整流程。读完后,你将能够在内网环境把桌面端对接到自己的 Hoppscotch 实例,并理解其底层由 Rust + Tauri 实现的目录结构、本地回环服务器与 deep link 认证机制。
一、Hoppscotch Desktop 是什么
Hoppscotch Desktop 是 Hoppscotch(开源 API 开发生态,可视为 Postman/Insomnia 的开源替代品)的跨平台桌面应用,基于 Tauri V2 构建。README 标注其当前处于 ALPHA 阶段,版本号为 26.6.0(见 tauri.conf.json 与 Cargo.toml)。
从 package.json 的依赖看,前端部分由 Vue 3 + TypeScript 组成,并复用了 workspace 内的 @hoppscotch/common 与 @hoppscotch/kernel 两个包;Rust 侧则通过 tauri-plugin-appload 和 tauri-plugin-relay(见 Cargo.toml,仓库内亦有 vendored 版本 plugin-workspace/tauri-plugin-appload 与 plugin-workspace/tauri-plugin-relay)分别承担“加载本地打包的 Web 应用”与“网络请求代理转发”的职责——这正是桌面端能够连接 Cloud 和自托管实例的关键。
二、安装方式
方式一:下载官方安装包
- 从 Hoppscotch 官网下载页获取最新版 Hoppscotch Desktop App;
- 打开下载的文件;
- 按照屏幕提示完成安装;
- 启动应用。
方式二:使用 Homebrew(macOS / Linux)
brew install --cask hoppscotch
应用标识为 io.hoppscotch.desktop(见 path.rs 中的 APP_ID 常量,与 tauri.conf.json 的 identifier 保持一致),这也是本地配置目录、日志目录命名的依据。
三、两种接入方式:Cloud 与 Self-Hosted
桌面端的核心价值在于:同一个客户端既可以使用 Hoppscotch Cloud,也可以连接你自己部署的 Community/Enterprise 自托管实例。
3.1 Hoppscotch Cloud(个人版)
- 打开 Hoppscotch Desktop App;
- 点击左上角的 Hoppscotch logo;
- 点击 “HOPPSCOTCH CLOUD”;
- 使用 Hoppscotch Cloud 账号登录,即可访问你的 workspace 与集合。
从源码结构看,Cloud 登录走的是浏览器回跳流程:Rust 侧在 lib.rs 的 setup_server 中,用 random_port 在 15000–25000 端口区间内挑选一个可用端口,启动一个只监听 127.0.0.1 的 axum 回环服务器(见 server.rs)。该服务器暴露 /device-token 端点,用户浏览器完成登录并被重定向回来后,access_token / refresh_token 以查询参数形式送达该端点,随后通过 Tauri 事件 hopp_auth://token 注入前端(见 server.rs)。配套的单元测试 server.rs 覆盖了 refresh_token 可选(如 device code 流程不返回该字段)等边界情况。前端通过 hopp_auth_port 命令(lib.rs)获取该端口以拼接回跳地址。
3.2 自托管实例(Community / Enterprise 版)
前提配置(重要):为了让桌面端被你的自托管实例认可,需要在 .env 中把部署域名对应的“桌面伪装 origin”加入 WHITELISTED_ORIGINS:
- macOS / Linux:
app://hoppscotch_mydomain_com - Windows:
http://app.hoppscotch_mydomain_com
以允许连接 https://hoppscotch.mydomain.com 为例:
WHITELISTED_ORIGINS=...existing_origins,app://hoppscotch_mydomain_com,http://app.hoppscotch_mydomain_com
注意域名编码规则:
app://前缀后跟的是把.和-替换为_的域名形式。path.rs 的注释还指出这种编码是有损的(test-org与test_org会映射到同一 bundle 名),因此桌面端在配置目录下维护registry.json注册表,把 webview 的app://主机名映射回原始服务器 URL。
连接步骤:
- 打开 Hoppscotch Desktop App;
- 点击左上角的 Hoppscotch logo;
- 点击 “Add an instance”;
- 输入你的自托管实例 URL;
- 点击 “Connect”。
Docker 部署注意:桌面端会请求前端容器内置的一个 3200 端口的服务。因此启动容器时需同时暴露 3000 与 3200:
docker run -p 3000:3000 -p 3200:3200 hoppscotch/hoppscotch-frontend
容器就绪后,可填入 [your-ip]:3200;如果使用子路径(subpath)部署,则直接填写实例的 base address 即可。
四、本地构建与自托管桌面端
README 提供了将 selfhost 前端“烘焙”进桌面壳的完整构建链,适合在内网 on-prem 环境分发。步骤如下([path-to-dist-directory] 指向第 1 步 pnpm generate 生成的 dist 目录):
1. 生成 selfhost web 应用
cd ../hoppscotch-selfhost-web
pnpm install
pnpm generate
2. 构建 webapp-bundler
cd crates/webapp-bundler
cargo build --release
3. 打包 web 应用为 bundle
cd target/release
./webapp-bundler --input [path-to-dist-directory] --output [path-to-hoppscotch-desktop]/bundle.zip --manifest [path-to-hoppscotch-desktop]/manifest.json
4. 启动开发服务器
cd hoppscotch-desktop
pnpm tauri dev
或进行生产构建:
cd src-tauri
pnpm tauri dev
4.1 webapp-bundler 的参数与产物
webapp-bundler 位于 crates/webapp-bundler/src/main.rs,它本质上是 selfhost-web 的 webapp-server 打包部分的 CLI 化实现。参数如下:
| 参数 | 说明 |
|---|---|
-i, --input |
待打包的目录(必须存在,指向 selfhost-web 的 dist) |
-o, --output |
输出的 bundle 文件路径(ZIP 格式) |
-m, --manifest |
可选,manifest JSON 的保存路径 |
-v, --version |
可选,自定义 bundle 版本;缺省时读取环境变量 WEBAPP_BUNDLE_VERSION,再缺省使用工具自身的 CARGO_PKG_VERSION |
从实现看(main.rs),它会用 walkdir + rayon 并行遍历输入目录,对每个文件计算 BLAKE3 哈希、大小与 MIME 类型,以 0o644 权限写入 ZIP;manifest 则包含文件清单、版本号与创建时间(created_at)。该 manifest 供 appload 插件在运行时校验/解压 bundle 使用。
4.2 一键脚本与 portable 特性
package.json 中提供了与上述步骤等价的自动化脚本,无需手工串接:
"prepare-web": "(cd ../hoppscotch-selfhost-web && pnpm install && pnpm generate) && (cd crates/webapp-bundler && cargo build --release && cd target/release && ./webapp-bundler --input ../../../../../hoppscotch-selfhost-web/dist --output ../../../../bundle.zip --manifest ../../../../manifest.json)",
"dev:full": "pnpm tauri dev",
"build:full": "pnpm tauri build",
"dev:portable": "pnpm tauri dev -- --no-default-features --features portable",
"build:portable": "pnpm tauri build -- --no-default-features --features portable"
注意 portable 变体通过 Cargo feature portable 切换(Cargo.toml)。从 path.rs 可以确认其语义差异:
- Standard 模式:配置目录遵循平台惯例(macOS 为
~/Library/Application Support/io.hoppscotch.desktop,Windows/Linux 为dirs::config_dir()/io.hoppscotch.desktop); - Portable 模式:所有数据(
hoppscotch-desktop-data、logs、hopp_bundle.zip、hopp_manifest.json)都落在当前工作目录,适合无安装权限的场景。
main.rs 启动时会打印 PORTABLE / STANDARD 模式,并在日志目录不可用时降级为“无日志启动”(main.rs)。
五、运行时架构要点(源码佐证)
理解以下几处实现,有助于排查自托管连接问题:
- 插件装配:lib.rs 中依次注册
window-state(记住窗口位置/尺寸,但排除main登录窗)、process、http、opener、updater、store、deep-link、dialog、shell、fs、appload、relay等插件。appload负责按 registry 从 bundle 加载对应实例的前端,relay负责代理前端发出的网络请求。 - Deep Link 认证:
tauri.conf.json注册了io.hoppscotch.desktop深链 scheme(tauri.conf.json),Rust 侧收到 URL 后发出scheme-request-received事件转发给前端(lib.rs)。 - Linux 剪贴板:
lib.rs中在 Linux 上专门构建原生 Edit 菜单(Undo/Redo/Cut/Copy/Paste/Select All),因为 webkit2gtk 依赖原生菜单项才能识别 Ctrl+C/V/X 快捷键(lib.rs)。 - 自动更新:updater 插件默认启用,端点为
https://releases.hoppscotch.com/hoppscotch-selfhost-desktop.json,并配置了 minisign 公钥做签名校验(tauri.conf.json);updater.rs提供check_for_updates、download_and_install_update、get_download_progress等命令(lib.rs)。自托管场景可自行调整该端点。 - 数据安全:应用启动时会执行版本变更备份检查(
backup.rs的perform_version_check_and_backup),配置目录下的数据按latest/backup组织(path.rs)。
六、最低系统要求
| 平台 | 系统要求 | 架构 |
|---|---|---|
| Windows | Windows 10 1803+ 或 Windows 11 | x64 |
| macOS | macOS 10.15 (Catalina) 或更新 | Intel x64 / Apple Silicon (ARM64) |
| Linux | 推荐 Ubuntu 24.04 或类似发行版;最低要求 GLIBC 2.38+ | x64 |
为什么推荐 Ubuntu 24.04 级别的发行版? 其自带的 webkit2gtk 2.44.0-2 版本在 WebKit、UI 库、Mesa 驱动与 Wayland 显示之间的交互上足够稳定。
Wayland 显示异常的处理:Wayland 下 WebKit 与底层图形驱动交互可能出现显示异常,可尝试以下环境变量:
WEBKIT_DISABLE_COMPOSITING_MODE=1 hoppscotch
# 或
WEBKIT_DISABLE_DMABUF_RENDERER=1 hoppscotch
# 或两者同时设置
其他注意事项:
- 旧发行版:AppImage 依赖 GLIBC 2.38+,旧系统会出现
GLIBC_2.38 not found之类的版本错误; - Tauri v2 依赖
libwebkit2gtk-4.1,该库默认仅在 Ubuntu 22.04+ 的软件源中可用; - 从源码构建请遵循仓库的构建流程(README 中的 Sources 一节给出了官方 build workflow 的参照)。
七、小结
Hoppscotch Desktop 以 Tauri V2 为壳,把 Hoppscotch 完整 Web 前端以 bundle 形式内置到本地(appload 插件 + webapp-bundler 产出的 bundle.zip + manifest),并通过 relay 插件代理网络通信,从而同时支持 Cloud 登录与自托管实例接入。对接自托管实例时的三个关键动作是:为部署域名配置 WHITELISTED_ORIGINS(区分 app:// 与 Windows 的 http://app. 两种 origin 形式)、Docker 部署时暴露 3200 端口、需要内网分发时按第四节流程本地构建。相关实现可继续深入阅读 src-tauri/src/lib.rs、src-tauri/src/server.rs 与 src-tauri/src/path.rs。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0622
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00

