Chitchatter 介绍与选型指南
梳理 Chitchatter(main 分支 b0114d5)纯浏览器 P2P 加密聊天的定位、架构、功能边界与许可风险,给出与 Jami/Session/SimpleX/Element/Rocket.Chat/Jitsi 的量化选型对比,含最小可用部署实测,全文溯源至 2026-10-25。
Chitchatter 介绍与选型指南
目标:面向需要「开箱即用、不留痕」聊天场景的读者,讲清 Chitchatter 这个纯浏览器 P2P 加密聊天工具的定位、架构、功能边界与同类选型,并在 Ubuntu 22.04 实测环境完成本地部署验证。已在 Ubuntu 22.04(Node.js v24.16.0)实测通过。
一、环境信息
本文所有命令与回显均在以下实测环境中执行:
- 操作系统:Ubuntu 22.04(x86_64)
- Node.js:v24.16.0(npm 11.13.0)
- Chitchatter:main 分支,commit
b0114d52eb786d240ef3a9d2b3691b215e29dbf0(2026-10-23 提交,项目无正式版本号,package.json中version字段为0.0.0) - 技术栈版本(来自
package.json):React ^18.3.1、Vite ^6.4.2、TypeScript ^5.9.3、MUI ^5.18.0、@trystero-p2p/core ^0.26.0、@trystero-p2p/torrent ^0.26.0 - 官方站点:https://chitchatter.im/(实测返回
HTTP 200,页面标题<title>Chitchatter</title>) - 本地验证部署:Nginx HTTPS 监听 443(页面 200、
sdk.js200、HTTP 80 → HTTPS 301 重定向),构建产物 17M
💡 说明:Chitchatter 是一个纯前端单页应用,构建产物就是一堆静态文件(HTML/JS/CSS + 一个
sdk.js嵌入脚本),没有自己的后端进程。本机部署验证用的是「构建产物 + Nginx 托管」的最小形态。
二、软件概述
Chitchatter 是一款开源(GPL-2.0-or-later)、运行在浏览器里的点对点(P2P)加密聊天工具。它的核心卖点是「服务器不留痕」:消息、音视频流都在参与者之间直连传输,不存在一个存储聊天记录的中心服务器;房间地址(URL)就是唯一的「身份凭证」,把链接发给对方即可加入会话,无需注册账号。
项目基本信息(数据采集自 GitHub 仓库与本地源码,采集日期 2026-10-25):
| 项目 | 内容 |
|---|---|
| 名称 / 仓库 | Chitchatter / github.com/jeremyckahn/chitchatter |
| 许可证 | GPL-2.0-or-later |
| 开发语言 | TypeScript(React 18 + Vite 6) |
| 通信技术 | WebRTC(经 Trystero 库抽象),信令与 P2P 打洞依赖 WebTorrent tracker |
| Stars / Forks | 2343 stars / 450 forks(2026-10-25 采集) |
| 维护活跃度 | 仓库创建于 2022-08-08,最近一次 push 为 2026-10-24(本采集日前一天),持续活跃 |
| 正式版本号 | 无(package.json version 为 0.0.0,以 main 分支 commit 为交付基准) |
| 部署形态 | 静态站点(构建产物托管即可),可选附带 RTC 配置 API 与 WebTorrent tracker |
| 内测状态 | 官方 README 标注 "pre-alpha"(处于早期阶段,接口与行为可能变化) |
从上表可以读出 Chitchatter 的两个关键特征:其一,它是「纯静态前端」,运维成本几乎只剩静态文件托管;其二,它依赖公网 WebTorrent tracker 做节点发现,离线/内网环境需要自建 tracker 才能正常工作。
三、核心架构
理解 Chitchatter 的架构,关键是分清「哪些东西在浏览器里、哪些东西在浏览器外」。本节按数据流拆解。
3.1 数据流与组件分层
一次典型的聊天会话按以下路径流动:
┌────────────────────────── 浏览器 A ──────────────────────────┐
│ React UI ──> Trystero(joinRoom) ──> WebRTC RTCPeerConnection │
└───────────────────────────────┬──────────────────────────────┘
│ ①信令/节点发现:WebTorrent tracker(wss)
│ ②SDP/ICE 协商完成后直连
┌───────────────────────────────▼──────────────────────────────┐
│ WebRTC DataChannel / MediaStream │
│ (消息文本、文件分片、音视频流全部 P2P 直传) │
└───────────────────────────────┬──────────────────────────────┘
│
┌───────────────────────────────▼──────────────────────────────┐
│ 浏览器 B │
│ (与 A 同构;两端之间没有任何服务器参与消息转发) │
└───────────────────────────────────────────────────────────────┘
分层说明:
| 层 | 承担职责 | 具体实现 | 是否经手消息内容 |
|---|---|---|---|
| UI 层 | 房间页、设置页、消息渲染 | React 18 + MUI 5 | 本地渲染,不外发 |
| P2P 抽象层 | 房间加入、节点发现、消息收发 API | Trystero(@trystero-p2p/torrent 策略) | 加密载荷的端点 |
| 传输层 | 数据通道、音视频流、加密 | WebRTC DataChannel / MediaStream(DTLS-SRTP) | P2P 直连,内容端到端加密 |
| 信令层 | 交换 SDP/ICE 帮助两端建立直连 | 公网 WebTorrent tracker(wss) | 仅见房间名与协商元数据,不见消息 |
| 中继层(兜底) | 直连失败时中继加密流量 | TURN 服务器(内置公共 TURN 或自建) | 仅转发加密流量,无法解密 |
其中「信令层」是理解这套架构最容易误解的一环:tracker 帮助两端「互相找到」,但不参与消息传递;真正的消息走两端之间的 WebRTC 直连。TURN 中继是直连彻底失败(对称 NAT 等严格网络)时的兜底,中继的也只是密文。
💡 技术拓展:WebRTC 的两个节点要建立直连,需要三类辅助设施,同类选项对比如下——
设施 作用 常见选择 Chitchatter 实际采用 信令(Signaling) 交换 SDP/ICE 完成协商 WebSocket 自建 / MQTT / IPFS / Firebase / Supabase / BitTorrent tracker Trystero 的 torrent 策略(WebTorrent tracker,默认公共 wss tracker) STUN 帮节点发现自己被 NAT 映射的公网地址 公共 STUN(Google 等) 默认通过 RTC 配置下发(公共 TURN 服务自带 STUN 能力) TURN 直连失败时中继密文 自建 coturn / 商用云 TURN(ExpressTURN 等) 源码内置公共 TURN(expressturn),自建部署可用 API 动态下发 Trystero 支持 torrent / nostr / mqtt / ipfs / firebase / supabase 等多种信令策略,本文方案实际采用 torrent 策略(项目默认),理由是无需自建任何信令服务、依赖公网公共 tracker 即可运行。
3.2 加密与隐私模型
Chitchatter 的隐私模型由三层构成:
- 传输加密:WebRTC 强制 DTLS-SRTP,密钥协商在两端之间完成,中间设施(tracker、TURN)只处理密文;
- 无存储:应用没有后端数据库,消息只在浏览器内存中,刷新页面即清空(官方 README 描述消息为 ephemeral,瞬态);历史记录仅在本地以
localStorage保存最近的会话列表,不含消息正文; - 无账号:用户名默认随机生成,房间地址是唯一的准入凭证;「私密房间」(
/private/<roomId>路径)的房间名采用高熵随机串,URL 不外泄即不入会。
需要强调的边界:因为没有账号体系与服务器,Chitchatter 无法提供「找回消息」「封禁用户」「跨设备漫游」这类以服务器为中心的能力——这是设计取舍而非缺陷。
3.3 SDK 与嵌入能力
构建产物中包含一个独立的 sdk.js(实测约 3.1KB),它向宿主页面注册一个 <chat-room> Web Component 自定义元素,宿主网页只需引入一个 <script> 并写一行标签,即可把一个聊天房间嵌入自己的页面。SDK 内部通过 iframe 加载 /<root>/public/<房间名> 页面,并经 postMessage 完成配置握手(configRequested → config)。该能力的完整用法见本专栏《Chitchatter 嵌入集成使用指南》篇。
四、功能特性
以下功能清单来自本地源码(src/config、src/pages、src/components)与 README,并逐项与实测环境核对:
| 功能 | 说明 | 实测确认 |
|---|---|---|
| 文本消息 | 房间内全员广播,消息瞬态不上服务器 | ✅ 构建产物含完整消息 UI 组件 |
| 音视频通话 | 房间内 P2P 音频/视频流(可共享屏幕,display-capture 权限在嵌入白名单内) | ✅ iframe 权限白名单含 camera/microphone/display-capture |
| 文件分享 | P2P 文件传输,下载经 StreamSaver 服务写盘(默认公共 mitm.html,可自建替换) | ✅ streamSaverUrl.ts 可配置 |
| 公共/私密房间 | /public/<name> 开放房间、/private/<id> 高熵私密房间 | ✅ routes.ts 定义两种路由 |
| 社区房间 | 内置 8 个公共房间(news、politics、crypto 等) | ✅ communityRooms.ts 列出 buy-and-sell/crypto/hacking/leaks/news/organize/politics/resist |
| 用户元数据 | 昵称、头像(无注册)、发言声音提示 | ✅ 设置页路由 /settings 存在 |
| 嵌入集成 | <chat-room> 自定义元素 + iframe 直接嵌入 | ✅ sdk.js 实测可被第三方页面引用(HTTP 200) |
| 增强连接(Enhanced Connectivity) | 从 RTC 配置 API 拉取 TURN 服务器提升严格 NAT 下的连通率;未配置 API 时该开关在设置页隐藏 | ✅ enhancedConnectivity.ts 按环境变量条件启用 |
| 主题 | 明/暗色模式(嵌入时可经 color-mode 属性指定) | ✅ SDK 属性枚举 dark/light |
功能边界同样明确:无消息漫游、无离线消息、无已读回执、无用户封禁与审计——这些能力全部以「存在服务器」为前提,与 P2P 定位互斥。
五、快速开始(最小可用示例)
最快路径是直接使用官方实例:浏览器打开 https://chitchatter.im/ ,在首页输入房间名进入 /public/<房间名>,把地址栏链接发给对方即可开始聊天。实测官方站点当前可用(curl -s https://chitchatter.im/ 返回 HTTP 200,标题 Chitchatter)。
自建最小可用部署(Ubuntu 22.04)只需三步,命令在实测环境验证过:
# 1. 安装 Node.js v24(实测环境为 v24.16.0,官方 tar.xz 解压至 /usr/local)
curl -fsSLO https://nodejs.org/dist/v24.16.0/node-v24.16.0-linux-x64.tar.xz
sudo tar -xJf node-v24.16.0-linux-x64.tar.xz -C /usr/local --strip-components=1
rm -f node-v24.16.0-linux-x64.tar.xz
# 2. 拉源码并构建(commit b0114d5 为本文实测基准)
sudo mkdir -p /opt/chitchatter && sudo chown $USER /opt/chitchatter
git clone https://github.com/jeremyckahn/chitchatter.git /opt/chitchatter
cd /opt/chitchatter
git checkout b0114d52eb786d240ef3a9d2b3691b215e29dbf0
npm ci --no-audit --no-fund
npm run build
# 3. 将 dist 部署为静态站点并验证(以本机 Nginx 为例)
sudo mkdir -p /var/www/chitchatter
sudo cp -r /opt/chitchatter/dist/* /var/www/chitchatter/
curl -sk https://localhost/ | grep -o '<title>[^<]*</title>'
第 3 步实测回显:
<title>Chitchatter</title>
构建产物 17M(含 assets/、sdk.js、index.html 等)。完整的 Nginx 配置、systemd 托管、HTTPS 证书与 TURN 配置 API 的从零步骤,见本专栏《Ubuntu 22.04 安装 Chitchatter 指南》篇;容器化部署见《Chitchatter Docker Compose 部署指南》篇。
六、适用场景与限制
6.1 适合的场景
- 临时沟通不留痕:跨团队临时协作、敏感话题讨论、一次性问题排查——链接即房间,会话即焚;
- 给现有网站加即时通讯:借助
sdk.js一行标签嵌入,适合在线客服、直播互动、文档协作页的旁路聊天; - 无法/不愿部署后端的环境:只有一台静态文件托管能力的站点(对象存储、CDN、Nginx 均可)就能服务用户;
- 隐私敏感的小圈子:家庭、朋友、社区小组的即时通讯,不希望对话数据沉淀在任何一方服务器。
6.2 明确的限制
- 消息瞬态:刷新即失,无历史漫游、无离线消息(收发双方必须同时在线);
- 依赖公网 tracker:默认信令走公共 WebTorrent tracker,严格内网需自建 tracker 并改源码内 tracker 列表;
- 严格 NAT 依赖 TURN:直连失败时必须依赖 TURN 中继,公共 TURN 有速率与稳定性限制,生产建议自建 coturn;
- 无账号与治理能力:公共房间无法封禁恶意用户,私密房间安全性取决于 URL 是否泄露;
- 早期阶段:官方标注 pre-alpha,无正式版本号,升级以跟踪 main 分支 commit 为主;
- GPL-2.0-or-later 许可:对嵌入宿主产品的许可证合规有传导要求(嵌入
sdk.js的页面属于作品组合,商用闭源产品需评估 GPL 义务)。
七、同类选型对比
与 Chitchatter 同类的「隐私导向聊天/会议工具」对比如下(版本与活跃度数据采集于 2026-10-25):
| 工具 | 形态 | 账号 | 消息是否过服务器 | E2E 加密 | 浏览器免安装 | Stars | 适用差异 |
|---|---|---|---|---|---|---|---|
| Chitchatter | 纯浏览器 P2P | 无 | 否(P2P 直连,仅信令过 tracker) | 是(WebRTC 强制) | ✅ 免安装、零依赖 | 2343 | 临时会话、网页嵌入、无后端部署 |
| Jami | 桌面/移动客户端 | 分布式账户(无手机号) | 否(P2P) | 是 | ❌ 需装客户端 | ~7k | 长期使用的端到端 IM,跨设备同步有限 |
| Session | 桌面/移动客户端 | 匿名 Session ID | 部分(Oxen 节点中转密文+暂存) | 是 | ❌ 需装客户端 | ~7k | 匿名强需求,支持离线消息 |
| SimpleX Chat | 客户端为主 | 无用户 ID(链接/二维码) | 是(自建中继,仅转发密文) | 是 | 部分支持 | ~8k | 可自控中继,有离线投递 |
| Element (Matrix) | Web + 客户端 | 注册账号 | 是( homeserver 存储) | 是(可选) | ✅ Web 可用 | ~13k | 团队长期 IM、需自建 Synapse |
| Rocket.Chat | Web + 客户端 | 注册账号 | 是(MongoDB 存储) | 部分(付费 E2E) | ✅ Web 可用 | ~42k | 企业协作、bot/集成生态 |
| Jitsi Meet | 浏览器会议 | 无(可选账号) | 否(P2P 或 SFU 中转媒体) | 是 | ✅ 免安装 | ~24k | 视频会议为主,IM 弱 |
选型建议:
- 需要「打开网页就能聊、聊完不留痕、一行代码嵌入网页」→ Chitchatter 是这一定位下唯一兼顾三者且完全开源的选择;
- 需要「离线消息、跨设备漫游」→ 选 Session 或 SimpleX(客户端形态),Chitchatter 架构上不支持;
- 需要「团队 IM、审批、审计、机器人」→ 选 Rocket.Chat / Element,它们以服务器为中心,与 Chitchatter 定位正交;
- 需求集中在「多人视频会议」→ Jitsi Meet 的 SFU 架构在会议规模与质量上更合适;
- 追求「分布式账号、无中心基础设施」→ Jami。
版本节奏与兼容矩阵的量化补充:Chitchatter 无版本发布节奏(以 main 分支 commit 滚动交付),浏览器兼容面为支持 WebRTC DataChannel 的现代浏览器(Chrome/Edge/Firefox/Safari 当前主版本);对比组中 Rocket.Chat、Element 均有月度发布节奏与明确的浏览器/移动端兼容矩阵,选型时若把「可锁定的版本基线」作为硬要求,Chitchatter 应以「commit 哈希锁定」方式管理(本文实测锁定 b0114d5)。
八、参考链接
- 官方站点:https://chitchatter.im/
- 源码仓库:https://github.com/jeremyckahn/chitchatter
- README(含 pre-alpha 声明与部署说明):https://github.com/jeremyckahn/chitchatter/blob/main/README.md
- Trystero(P2P 抽象库):https://github.com/dmotz/trystero
- StreamSaver.js(文件下载服务):https://github.com/jimmywarting/StreamSaver.js
- WebRTC 规范(MDN RTCPeerConnection):https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection
- GPL-2.0 许可文本:https://www.gnu.org/licenses/old-licenses/gpl-2.0.html
本专栏其他篇目:《Ubuntu 22.04 安装 Chitchatter 指南》《Chitchatter Docker Compose 部署指南》《Chitchatter 配置参数详解》《Chitchatter 嵌入集成使用指南》。