GitHub Explorer
📰 公众号已发布 2026-07-27

GitHub推荐:1年3万 Star:bitchat 如何让手机在断网时继续通信

GitHub: https://github.com/permissionlesstech/bitchat

一句话总结

bitchat 把 BLE Mesh 的离线短距通信、Nostr 的在线中继、Tor 匿名网络和 Noise 加密握手组合成一套无账号、无手机号、无中心服务器的多传输聊天系统,目标是在互联网或传统通信基础设施失效时仍然让手机彼此传递消息。

值得关注的理由

  • 12.8 个月获得 32,183 个 Star:这是一个从 2025 年 7 月创建、在一年内从实验性应用快速成长为可上架 iOS/macOS 的隐私通信项目,近期仍保持高频开发。
  • 它解决的是普通 IM 不覆盖的断网场景:Signal、Session、SimpleX 等主要运行在 IP 网络之上;Meshtastic 则需要专用 LoRa 硬件。bitchat 直接利用手机自带的 BLE,把「没有网络」从不可用条件变成可转发的通信环境。
  • 真正值得学习的是组合方式:项目不是简单给聊天应用加一个 BLE 适配器,而是将传输抽象、消息去重、有限 TTL、确定性 Fanout、Store-and-Forward、Noise XX、Nostr 私有信封和 Tor fail-closed 连接成了一个逐步演化的协议栈。

项目展示

bitchat 官方图标

官方 README 目前只有应用图标,没有产品截图或演示 GIF。应用分发页面可查看产品截图和版本历史:https://apps.apple.com/us/app/bitchat-mesh/id6748219622。

项目画像

维度数据
GitHubhttps://github.com/permissionlesstech/bitchat
Star / Fork32,183 / 5,051
代码行数115,483 行;Swift 98.1%,JSON 0.7%,Shell 0.4%,Python 0.4%,Rust 0.3%
文件数量537
项目年龄12.8 个月(首次提交:2025-07-02)
开发阶段密集开发;近 30 天 101 个 commit,近 90 天 172 个 commit
贡献模式一个核心作者 + 少数高贡献协作者 + 社区贡献;共 54 位贡献者
热度定位大众热门;隐私通信和离线通信赛道的现象级项目
LicenseThe Unlicense(公共领域式授权)
质量评级代码:优秀;文档:优秀;测试:充分;CI/CD:完善
最新版本v1.7.0;22 个 tag,19 个 Release

代码规模来自 tokei 统计。依赖统计脚本未从常规 Package.swift、Podfile 或 Cartfile 字段得到统一数量,但仓库包含 Package.resolved、自管 localPackages、Tor XCFramework 等依赖资产,不能简单视为「无依赖」。

作者视角:为什么存在这个项目

创始人/作者背景

仓库由 permissionlesstech 组织维护,核心提交者是 jack;Phase 1 的公开资料将其与 jackjackbits、Jack Dorsey 以及 permissionless tech, llc 联系起来。组织账号创建于 2025 年,旗下还有 Android 姊妹项目 permissionlesstech/bitchat-android,后者约有 6,994 个 Star。

这类背景解释了项目为什么不从「又一个互联网聊天应用」切入,而是把无中心、抗审查、隐私和基础设施独立性放在产品定义的最前面。需要保持边界:仓库贡献集中度和公开项目关联可以说明维护结构,但不能据此推断组织的完整商业计划;仓库自身也没有披露成熟的专业第三方安全审计或 Bug Bounty 计划。

问题判断

作者看到的不是「聊天消息如何更快送达」,而是通信基础设施失效后,用户是否还拥有通信能力。README 和 WHITEPAPER.md 将集会、抗议、灾区和无网络地区列为核心使用场景:在这些场景中,手机号注册、中心服务器、稳定互联网连接和专用网络设备都可能成为失败点。

时机也很关键:手机 BLE 已经普及,但传统聊天产品几乎都把 BLE 仅当作配件连接能力,而不是消息网络;与此同时,Nostr、Tor 和现代 Noise 加密库提供了可拼装的互联网匿名传输与安全握手。bitchat 的机会在于把这些成熟组件重新放进一个「手机即节点」的通信模型里。

解法哲学

项目的核心取舍可以概括为「offline-first、privacy-by-default、协议可审计优先」:

  • 不要求账号、手机号或中心服务器;身份从本地密钥派生。
  • BLE Mesh 用于近距离离线通信,Nostr relay 用于有网络时的远距离补充,而不是让 Nostr 取代离线传输。
  • 私有消息默认使用 Noise XX 或自定义的 BitChat Private Envelope;公开 Mesh 频道则保留更轻量的公开语义。
  • 本地存储、Panic Mode、临时 Nostr 密钥和 Tor 选项服务于隐私边界。
  • 项目明确没有选择直接兼容 NIP-17/44/59 的私信封。这样可隐藏稳定发送者信息,但代价是失去与标准 Nostr 客户端的互操作性。

这不是「功能越多越好」的路线:作者愿意牺牲生态兼容性,换取在特定威胁模型下更少的身份泄露;但压缩与加密的侧信道问题被社区提出后,Issue #283 以 not planned 关闭,说明带宽效率与理论隐私之间的取舍仍有争议。

战略意图

从代码和仓库布局看,bitchat 更像一个旗舰应用和协议试验场,而不只是单一 iOS App:

  • Android 端单独维护,但追求二进制协议兼容;
  • Nostr、Tor、Cashu、gateway、courier 和 walkie-talkie 等能力把项目从「BLE 聊天」推向多传输通信平台;
  • Unlicense 降低了社区分叉和商业集成门槛,符合基础设施型协议希望广泛传播的策略;
  • 目前没有足够公开信息证明它采用 open-core、托管服务或企业版商业化模式,因此不应把潜在生态价值当成已验证的商业模式。

核心价值提炼

创新之处

以下评分分别表示新颖度、实用性和可迁移性,满分均为 5 分。

  1. 把人群本身当作 Store-and-Forward 网络

    • 每个节点不只是即时转发器,还可以暂存离线消息;Courier 机制用 rotating recipient tag、信任等级配额和有限 copy budget,把「熟人暂时离线」转化为无服务器邮箱问题。
    • 价值在于:不需要部署固定基础设施,也能在移动人群中获得概率性的延迟送达。
    • 新颖度:4/5;实用性:4/5;可迁移性:4/5。
  2. GCS Gossip Reconciliation + since-cursor

    • 项目没有在每次同步时交换完整消息列表,而是使用 Golomb-Coded Set 压缩集合,并在构建时锁定 modulo,使对端能够从 cursor 继续查询缺失消息。
    • 这比简单 Bloom Filter 更接近一个可增量同步的协议:通信量受控,同时允许节点恢复错过的消息。
    • 新颖度:4/5;实用性:5/5;可迁移性:5/5。
  3. Capability announce 与 authenticated peer state 分离

    • 广播中的能力声明只说明「我可能支持什么」,不直接成为可信身份绑定。只有解密并验证 authenticated peer state 后,fingerprint 和签名密钥才会被 pin;降级路径需要明确授权。
    • 这是一个很实用的 P2P 安全原则:不要把未经认证的 capability 当成状态事实。
    • 新颖度:3/5;实用性:5/5;可迁移性:5/5。
  4. 以消息 ID 播种的确定性 Fanout

    • BLEFanoutSelector 根据消息 ID、邻居集合和连接绑定选择确定性子集,避免每个节点向所有邻居重复广播;在稠密图中限制 TTL,在稀疏链路中保留更深转发。
    • 它把可复现的纯函数决策放进原本容易失控的 BLE 热路径,既控制泛洪,又方便单元测试。
    • 新颖度:3/5;实用性:5/5;可迁移性:5/5。
  5. 协议迁移中的主动反降级状态机

    • 私有媒体传输区分 encrypted、awaiting capability proof、legacy requires consent 和 blocked downgrade 等状态;旧版本兼容不是默认放行,而是需要当前会话证明或用户同意。
    • 这比「检测版本后选择旧格式」更安全,适合任何需要长期兼容的加密协议。
    • 新颖度:4/5;实用性:5/5;可迁移性:3/5。
  6. 客户端内嵌 Tor 并对代理路径做 fail-closed 约束

    • localPackages/Tor 使用 Arti Rust 实现和 XCFramework,应用只暴露本地 SOCKS5 端口,并配合来源 Manifest 和 provenance 校验。
    • 这样用户不需要自己运行 torrc,但在 Tor 开启时也不会悄悄把流量退回直连;代价是体积、构建和供应链维护成本显著增加。
    • 新颖度:3/5;实用性:4/5;可迁移性:4/5。

可复用的模式与技巧

  1. Composition Root + 依赖注入:用 AppRuntime 统一拥有生命周期,再把 feature-scoped model 注入 SwiftUI,避免 View 自己创建网络服务和存储服务。
  2. 将状态服务拆成纯策略函数:把 BLE Fanout、Outbound Packet Policy、Freshness Policy、Link Registry 等决策从 BLEService 中抽出来,纯函数可独立测试。
  3. Single-Writer 状态模型:ConversationStore 作为消息状态的单一写入者,并维护 indexByMessageID 增量索引,避免多个数组和桥接层互相同步。
  4. 有限 TTL + LRU 去重 + split-horizon:限制消息生命周期、重复包缓存和入链路回传,构成移动 Mesh 中控制广播爆炸的基础组合。
  5. Decrypt-or-pin 两层信任模型:公开能力只用于协商,只有经过当前加密会话验证的状态才可以写入长期身份绑定。
  6. 原子持久化和延迟加载保护:在 iOS 首次解锁前区分「内存中存在」和「磁盘 snapshot 可读」,避免用不完整状态覆盖旧快照。
  7. 来源清单与构建产物证明:对 vendored XCFramework 做来源哈希和 provenance 记录,适合任何需要提交二进制依赖的安全敏感客户端。

关键设计决策

1. 双传输而非单一网络

  • 问题:BLE 能断网工作,却只有短距离;Nostr 能远距离传递,却依赖网络和 relay。
  • 方案:用统一 Transport 抽象对 BLE 和 Nostr 建模,并让路由器依据 canDeliverPromptly、canDeliverSecurely 等能力选择路径。
  • Trade-off:需要处理不同传输的延迟、顺序、容量和安全语义,抽象接口也更大;换来的则是在网络环境变化时保留消息可达性。
  • 可迁移性:高。任何同时支持本地直连和云端补偿的应用都可以采用该模式。

2. 自定义 Nostr 私有信封

  • 问题:直接使用标准 Nostr 私信格式可能暴露稳定 sender ID,且难以表达离线 Mesh 场景的身份语义。
  • 方案:复用 Nostr kind 编号作为外层 transport,内部使用 XChaCha20-Poly1305、临时 gift-wrap 密钥、时间戳抖动和自定义封装。
  • Trade-off:提升身份隐藏和项目自身协议控制力,但牺牲标准客户端互操作,形成生态锁定;密码协议也因此需要更高强度的独立审计。
  • 可迁移性:中。封装思想可迁移,但自定义密码协议不应未经审计直接复制。

3. Mesh 中的确定性子集广播与路由回退

  • 问题:全量洪泛在高密度人群中会产生重复包、耗电和拥塞;纯 source route 又容易因节点移动失效。
  • 方案:根据拓扑密度和消息 ID 选择 Fanout,优先 source-based routing,路径失效时回退到受 TTL 约束的洪泛。
  • Trade-off:协议复杂度和调试难度增加,且拓扑变化下仍可能有延迟或丢包;换来更好的广播规模控制和移动性容错。
  • 可迁移性:高,适合局域 Mesh、事件广播和移动节点网络。

4. Courier 的信任配额和有限副本

  • 问题:没有中心邮箱时,离线收件人如何拿回消息,同时避免陌生节点无限复制或占满存储。
  • 方案:recipient tag 随时间轮换,依据 Favorite/Verified 等信任层分配存储槽位,并使用 copy budget 限制扩散。
  • Trade-off:送达是 best-effort,不能提供传统服务器队列的强确认;换来基础设施独立和更小的滥用面。
  • 可迁移性:高,可用于机会网络、灾害通信和延迟容忍消息系统。

5. Android 独立实现而非跨端 UI 共享

  • 问题:iOS 和 Android 的 BLE 生命周期、后台限制与平台 API 差异很大。
  • 方案:两端各自实现客户端,但保持协议/fixture 级互测和二进制兼容。
  • Trade-off:重复实现和维护成本更高,功能容易出现端间差异;换来平台原生行为和更少的跨端框架约束。Issue #91 Cross Platform support 也体现了项目主动放弃 Flutter 同源方案的选择。
  • 可迁移性:中。适合底层平台差异大、协议稳定且需要原生性能的产品,不适合普通 CRUD 应用。

竞品格局与定位

竞品对比矩阵

维度bitchatBriarMeshtasticSignalSession/SimpleX
主要网络BLE Mesh + Nostr relay + TorBluetooth/Wi-Fi + TorLoRa 硬件 Mesh互联网中心化 relayIP 层去中心化/中继
是否需要手机号否否否通常需要否
断网能力手机之间可离线多跳有限离线通信强,但需要专用硬件无无手机无线电层
远距离能力有网络时经 Nostr/Tor 补足依赖其网络路径LoRa 公里级强强
密码与审计成熟度Noise/E2E,但未披露专业审计长期抗审查经验重点是 Mesh,不是 IM 隐私模型工业级、审计广泛洋葱路由与双棘轮等更成熟
平台/门槛iOS/macOS,Android 独立实现;无需硬件主要 Android需 LoRa 节点跨平台但依赖服务器和手机号跨平台但依赖 IP

差异化护城河

  • 技术护城河:BLE Mesh、离线 Store-and-Forward、Nostr 在线补偿和 Tor 的组合不是单个功能,而是一套跨传输协议栈;其中 Fanout、去重、Courier 和协议迁移需要在真实移动拓扑中长期打磨。
  • 产品护城河:直接使用已有 iPhone/Android,不需要先购买 LoRa 硬件,降低了灾害和临时集会场景的启动门槛。
  • 叙事与分发护城河:Jack Dorsey 的公开关联和 iOS App Store 分发让项目获得了远高于普通 Mesh 实验的曝光与用户反馈。
  • 但不是信任护城河:SECURITY.md 未披露专业第三方审计或 Bug Bounty,且自定义 Nostr 私信封和稳定 Peer ID 都使外部验证更重要。安全敏感用户不应仅凭 Star 数判断成熟度。

竞争风险

  • Briar 在抗审查经验、Tor 集成和长期威胁模型方面更成熟;如果目标用户主要是 Android 上的高风险通信,Briar 可能更稳妥。
  • Meshtastic 解决的是更远距离、更高自治性的物理网络问题。Issue #508 Meshtastic Hand off 说明用户已经在期待二者桥接;若专用硬件价格和部署门槛下降,bitchat 的「手机即节点」优势会减弱。
  • Signal、Session 和 SimpleX 在日常联系人网络、跨平台体验和密码协议信任上更强。bitchat 的竞争力集中在「网络不可靠或根本不存在」的窄场景,而不是替代所有日常 IM。
  • 单一作者风险:核心作者约占 79.5% 的提交,协议、BLE、Tor 和 UI 的关键改动集中度很高。项目的持续性、审计响应和安全修复速度存在 bus factor 风险。

生态定位

bitchat 填补的是「智能手机无线电层 + 互联网匿名层」之间的空白:它不是 Signal 的直接替代,也不是 Meshtastic 的硬件竞争版本,而是面向临时人群和断网环境的手机原生通信客户端。最准确的定位是:可在互联网正常时远程补足、互联网失效时退回近场 Mesh 的抗基础设施通信实验平台。

套利机会分析

  • 信息差:项目已不是低关注度潜力股,但大众讨论通常停留在「Jack Dorsey 做了一个离线聊天 App」。真正值得关注的内容是双传输路由、Courier、协议兼容边界、Tor 集成和安全威胁模型,这些是比 Star 数更有技术含量的选题。
  • 技术借鉴:普通实时应用可以借鉴 Transport 能力抽象、single-writer store、确定性 Fanout、有限 copy budget、原子持久化和 provenance manifest;不要直接复制未经审计的自定义密码封装。
  • 生态位:它把 BLE、Nostr、Tor 和机会网络连接起来,适合灾害通信、现场活动、无网络协作和隐私优先的实验性产品。
  • 趋势判断:离线优先、抗审查、端侧隐私和去中心化基础设施仍在增长;但 BLE 的距离、后台限制、电量和 iOS 生命周期是物理与平台约束,不会被产品叙事消除。更可能的长期形态是与 LoRa、网关或其他 Mesh 网络互补,而不是单独覆盖所有通信距离。

风险与不足

  1. 安全审计不足:项目公开了威胁模型和隐私评估,但没有披露专业第三方审计或 Bug Bounty。安全产品的文档完整度不能替代密码学审计。
  2. 自定义协议带来互操作和验证成本:Nostr 私信封不兼容标准 NIP-17/44/59,项目获得了身份隐藏控制力,也失去了标准客户端生态和成熟实现的复用。
  3. 稳定 Peer ID 的隐私代价:由 Noise 静态公钥派生的 8-byte ID 便于联系人识别,但可能长期可关联;白皮书已经承认这是隐私权衡。
  4. 压缩与加密的侧信道争议未彻底解决:Issue #283 Remove compression for privacy 反映出 LZ4 在加密前压缩可能引入理论侧信道,当前取舍偏向带宽效率。
  5. BLE 物理限制:短距离、后台运行限制、设备兼容性、耗电和节点流动都会影响实际送达率;Issue #508 暴露了用户对更远距离桥接的需求。
  6. 核心服务仍然很大:BLEService.swift 及其历史路径累计改动频繁,尽管策略已拆分,核心状态机仍有较高理解和回归测试成本。
  7. 依赖和构建供应链复杂:内嵌 Tor XCFramework、自管 Swift 包和 Rust 组件提高了匿名网络能力,也增加了二进制来源、版本更新、App Store 构建和供应链验证成本。
  8. 跨端重复实现:iOS/macOS 与 Android 分仓实现,协议可以互通,但业务行为、隐私修复和功能进度可能出现端间不一致。
  9. 治理集中:54 位贡献者中,核心作者占约 79.5% 提交;社区热度很高,但不等于协议治理和维护责任已经分散。

行动建议

  • 如果你要用它:把它当作断网/临时集会/灾害通信的补充工具,而不是 Signal 的日常替代。部署前先验证目标设备组合、后台 BLE 行为、实际多跳距离、Tor 连接和消息恢复;高风险场景应等待或自行完成独立安全审计,并明确接受 best-effort 送达和自定义协议的风险。
  • 如果你要学它:建议按以下顺序阅读:
    1. docs/ARCHITECTURE_V2.md:先看 Service / Protocol / Transport / Crypto 分层;
    2. bitchat/Protocols/BitchatProtocol.swift:理解封包、TTL、消息 ID 和版本兼容;
    3. bitchat/Services/BluetoothMeshService.swift 与 BLE policy 文件:理解连接、Fanout 和 Mesh 路由;
    4. bitchat/Services/NoiseEncryptionService.swift:理解 Noise XX 如何嵌入应用握手;
    5. ConversationStore 和 Courier 相关模块:学习单一写入者、增量索引与延迟容忍消息;
    6. SECURITY.md 与 docs/privacy-assessment.md:对照实现与威胁边界,不要只看功能代码。
  • 如果你要 fork 它:优先补充可重复的端到端安全测试和公开审计,明确 Peer ID 的可关联性,重新评估压缩前加密的侧信道,补全 Tor bridge/pluggable transport,并建立 iOS/Android 共享协议测试矩阵。若要扩展覆盖距离,与 Meshtastic 或其他 LoRa/网关网络做明确的协议桥接,比继续堆叠手机端功能更有价值。

知识入口

资源链接
DeepWikipermissionlesstech/bitchat
Zread.ai未收录(探测返回 Cloudflare 403)
关联论文无直接对应的论文
在线 Demo无 Web 沙箱;可通过 App Store 在 Apple 设备上体验

相关报告