Skip to content

13 · Desktop、Web、Mobile 与 CLI

四类客户端共享 Relay 协议,但能力并不对称。Desktop 是完整的本地主权运行时;Web 是浏览器受限版;Mobile 聚焦通信、配对、媒体与 Push;CLI 是可脚本化、也最适合 Agent 调用的稳定表面。Admin Web 则单独承载社区运维。

1. 能力矩阵

表面技术强项主要约束
DesktopTauri 2 + React 19 + Rust密钥、本地文件/Git、Agent sidecar、语音/媒体、系统通知/更新native 后端复杂、跨 OS 差异
WebReact 19 + Vite + isomorphic-git无安装访问、基础协作和浏览器 Git浏览器密钥/文件/进程权限受限
MobileFlutter + Riverpod设备配对、相机/媒体、Push、移动通信Agent/本地开发工具能力有限
CLIRust + ClapJSON、stdin、自动化、Agent 可调用、Git/Repo 工具体验偏脚本,需明确认证环境
Admin WebReact + Vite社区成员、配置和运维表面与普通用户 UI/权限分离

2. Desktop 双层架构

text
React frontend
  ├─ TanStack Router / Query
  ├─ channel/message/thread/DM/project UI
  └─ Tauri invoke/events


Tauri Rust backend
  ├─ keychain / identity / backup / pairing
  ├─ native WebSocket + event sync
  ├─ managed Agent/ACP/MCP processes
  ├─ local Git / terminal / repo paths
  ├─ media validation/transcode/download
  ├─ huddle audio/STT/TTS
  ├─ updater / deep link / notifications
  └─ local migration / archive / secure store

前端不直接获得私钥或任意 shell 权限,而是调用细粒度 Tauri commands。sidecar bundle 包含 buzz-acpbuzz-agentbuzz-dev-mcpgit-credential-nostrbuzz CLI。

3. Desktop 为什么复杂

desktop/src-tauri 的模块量甚至像第二个后端,因为它承担服务器不能替用户完成的工作:

  • OS keyring 与加密 identity backup。
  • Agent 进程发现、配置、恢复、日志、升级与团队快照。
  • 本地 repo clone/branch/diff/push/terminal。
  • 相机/媒体转码和本地文件导出。
  • 实时音频、jitter buffer、STT/TTS、PTT 与防睡眠。
  • 历史本地数据迁移到 Relay/新模型。

这让 Desktop 成为能力最强表面,也形成高耦合热点。命令接口、状态机和本地存储 schema 必须像服务端 API 一样治理。

4. Desktop 前端状态

React 侧用 TanStack Query 管服务器状态、Router 管页面、virtualization 管长消息列表,Tiptap/Markdown/Diff 组件渲染内容。Event sync 将 WebSocket 增量写入 query/cache;用户动作通过 Tauri 或 SDK 发布 event。

关键不是“React 组件树”,而是两种状态的分界:

  • Relay 权威:频道成员、事件、workflow、repo metadata。
  • 本地权威:私钥、repo path、Agent 进程、OS 权限、临时音频设备。

混淆两者会导致重启后错误恢复,或 UI cache 被误当权限依据。

5. Web

Web 与 Desktop 共享 React/TanStack/nostr-tools 的主要交互范式,但没有 Tauri native shell。它使用浏览器 storage、WebSocket/HTTP 和 isomorphic-git/LightningFS 覆盖可行的 Git 工作流。

不能把 Desktop command 在浏览器里简单 polyfill:密钥安全、shell、任意本地 repo、长期 Agent sidecar 和系统级音频处理都需要不同产品边界。

6. Mobile

Flutter 客户端使用 Riverpod/Hooks,依赖覆盖:

  • Nostr/WebSocket/HTTP 与 secure storage。
  • QR scanner、ECDH 相关 crypto,用于 NIP-AB pairing。
  • image picker、camera、video、file selector、photo manager。
  • badge、app links、share、open file。
  • Markdown/code rendering。

Mobile 目录有独立测试和 iOS/Android release 脚本。README 把 mobile 标为“being wired up”,但代码体量显示它已不是占位;更准确的状态是主要交互已建设、发行与所有桌面能力对齐仍在推进。

7. CLI 是 Agent 的稳定 ABI

CLI 顶层命令覆盖 agents、messages、channels、canvas、reactions、emoji、DM、users、workflows、feed/social、notes、repos/protection、patch/PR/issues、upload/media、memory/pack、moderation。

重要工程特征:

  • 默认输出 JSON,便于 jq、脚本和 LLM 工具解析。
  • 统一错误类别与退出码,区分 user/auth/server。
  • 支持 NIP-98 私钥签名与 token。
  • 大正文支持 stdin,避开 shell interpolation。
  • 参数类型在 Clap 层先校验 UUID/enum 等。

Agent prompt 中常被建议使用 buzz messages get 等命令补上下文,因此 CLI 命令稳定性直接影响 Agent 行为。

8. Admin Web

Admin Web 独立 package,避免把社区高权限操作混入普通客户端 bundle。它应只通过 admin scope/API 工作;前端隐藏按钮不是权限控制,Relay 仍执行 scope、role 与 tenant gate。

9. 跨端协议一致性

buzz-sdkbuzz-core 与 conformance tests 是 Rust 侧真相;TS/Dart 客户端需要对齐:

  • kind 数值和 lifecycle。
  • tag marker/coordinate 规范化。
  • event ID 序列化与 Schnorr 签名。
  • channel/DM privacy 预期。
  • reconnect/since/EOSE 行为。

多语言复制常量是漂移风险,适合通过 fixtures、生成物或 conformance suite 缩短反馈。

10. 源码入口

独立源码研究笔记 · 非 Buzz 官方文档