内容
<p align="center">
<img src="assets/brand/kith-readme-banner-1280x640.png" alt="Kith — 您的设备圈,保持同步" width="820">
</p>
<p align="center">
<a href="https://github.com/muhamadjawdatsalemalakoum/kith/actions/workflows/ci.yml"><img src="https://github.com/muhamadjawdatsalemalakoum/kith/actions/workflows/ci.yml/badge.svg?branch=main" alt="持续集成"></a>
<a href="https://github.com/muhamadjawdatsalemalakoum/kith/releases"><img src="https://img.shields.io/github/v/release/muhamadjawdatsalemalakoum/kith?include_prereleases&label=下载" alt="下载"></a>
<img src="https://img.shields.io/badge/状态-阿尔法-orange" alt="状态:阿尔法">
<img src="https://img.shields.io/badge/许可证-MIT%20或%20Apache--2.0-blue" alt="许可证:MIT 或 Apache-2.0">
</p>
> *kith* — 自己的可信圈。 **Kith 让您的设备圈保持同步。**
Kith 是一个 **无服务器、端到端加密、无账号** 的桌面应用程序,用于保持您自己的设备同步 — 您的 **记忆/笔记**、**已保存的标签页** 和 **文件** — 直接在设备之间,没有可以读取它们的服务器,因为根本没有服务器。通过配对码链接设备,而不是账号。而且因为它支持 **MCP**,您的 AI 助手可以读取和添加到相同的数据中。
基于 [iroh](QUIC 传输,主线-DHT 发现)和 [Automerge](CRDT)构建。
## 您将获得什么
一个单一的桌面应用程序(Windows · macOS · Linux),具有:
- **🧠 记忆** — 在所有链接的设备上同步的笔记和事实。
- **🔖 标签页** — 保存链接/页面,并在所有设备上都有它们。
- **📁 文件** — 直接将文件发送到您的设备:端到端加密,无大小限制,无云存储,实时进度和直接-vs-中继徽章。
- **🌐 空间** — 同时运行多个独立的、端到端加密的世界:一个 **个人** 空间供您自己使用,或一个 **团队** 空间,具有设备角色(管理员/作者/读者),适用于可信圈。每个空间都有自己的密钥、成员和审计日志;可以将任何空间导出为加密文件进行备份或移动。
- **🔗 设备** — 使用一次性代码(SPAKE2)链接另一台计算机。无需账号。
- **🤖 代理** — 将 Claude Desktop / Cursor 指向 Kith,借助 MCP;您的 AI 可以在本地使用您的记忆、标签页和文件 — 仅限于 **活动空间**,因此注入提示的代理无法访问另一个空间。
## 安装
从 [发布页面](https://github.com/muhamadjawdatsalemalakoum/kith/releases) **下载** 您所在平台的构建版本(Windows `.exe`,macOS `.dmg`,Linux `.AppImage`/`.deb`/`.rpm`)。目前,构建版本未签名(阿尔法),因此您的操作系统可能会警告您开发人员未经验证 — 在 Windows 上选择 *更多信息 → 运行任何方式*;在 macOS 上使用 *系统设置 → 隐私和安全 → 打开任何方式*。
**或从源代码构建** (需要 [Rust 工具链](https://rustup.rs) + [Tauri 先决条件](https://v2.tauri.app/start/prerequisites/)):
```sh
cargo run -p kith # 构建并启动桌面应用程序
cargo tauri build # 构建安装程序(需要:cargo install tauri-cli)
```
## 连接您的 AI(MCP)
相同的 `kith` 二进制文件同时作为本地 MCP 服务器。在应用程序中,打开 **代理** 以复制预制的配置文件,或将以下内容添加到您的 MCP 客户端(例如 Claude Desktop 的 `claude_desktop_config.json`)并重启:
```json
{ "mcpServers": { "kith": { "command": "/path/to/kith", "args": ["serve"] } } }
```
然后,您的代理获得 `memory.*`、`tabs.*` 和 `files.*` 工具 — 在 **相同** 的加密副本上操作,整个过程在您的机器上进行。有 Kith 应用程序打开时,`kith serve` 自动桥接到它(一个共享引擎);应用程序关闭时,它独立运行。
## 工作原理
- **扁平网格,无中心节点。** 每个设备都是一个平等的对等节点,持有完整的加密副本。更改直接通过 [iroh] QUIC(TLS 1.3)在您的设备之间传播。
- **CRDT 状态 + 门控大文件。** 可变状态是一个 [Automerge] 文档(无冲突,离线容忍);文件通过内容寻址、BLAKE3 验证的大文件传输。**同步和文件传输都由相互的组密钥握手控制** — 非成员在交换任何字节之前被拒绝。
- **无账号。** 设备通过短配对码(SPAKE2 派生组密钥)链接;配对是相互的,因此双方都了解对方并收敛。
- **空间、角色和撤销。** 一个设备运行多个独立的加密空间在一个连接上。一个团队空间的成员资格基于 **设备身份(EndpointId)**,而不是简单的密钥占有:一个签名的、哈希链的成员资格日志,具有 `管理员`/`作者`/`读者` 角色,通过密码学强制执行诚实对等节点(读者的写入被拒绝;非成员即使具有泄露的密钥也被拒绝)。删除设备会旋转一个 **纪元密钥**,使其无法跟随未来的更改。
- **自托管。** 默认情况下,无服务器(公共 DHT + n0 的免费中继作为备用);运行您自己的中继 + 发现以获得完全控制(参见 [`infra/`](infra/))。
- **诚实的无服务器。** “没有可以读取您数据的服务器” — 不是零基础设施:中继仅转发密文。如果您的所有设备都关闭,更新是 **待处理,而不是丢失**。
参见 [docs/PAIRING.md](docs/PAIRING.md) 以了解链接流程,[docs/PRIVACY.md](docs/PRIVACY.md) 以了解确切存储了什么。
## 仓库布局
```
mesh-engine/ 底层:每个设备的身份,主线-DHT 发现,中继
备用(或自托管),SPAKE2 配对,N 个隔离的加密空间,
EndpointId 成员资格 + 签名角色,纪元密钥撤销 + 审计日志,
CRDT 同步 + 多流大文件传输,密钥链密钥 + 加密
导出。 唯一触及 iroh / automerge 的 crate。
mesh-mcp/ 一个小型 MCP 主机 — 实现一个特征,应用程序的数据 + 操作
变得可读/可写,供任何 AI 代理使用,无服务器在环中。
apps/memory/ 代理内存:便携式、供应商中立的内存(内存模式)。
apps/tabs/ centraltabs:跨设备标签页/链接同步。
apps/files/ kith-files:基于大文件原语的文件共享。
apps/desktop/ ★ kith:Tauri 桌面应用程序(GUI)+ `kith serve` 统一 MCP 服务器
运行所有三个应用程序在一个共享引擎上。
```
引擎是产品;应用程序很薄,共享一个 `Mesh`(一个身份,一个配对,一个副本)。参见 [ROADMAP.md](ROADMAP.md) 以了解不变性和下一步。
## 安全状态 — 阿尔法(本地测试;未独立审计)
当前强制执行,每个都有测试:
- ✅ **传输** 端到端加密(iroh QUIC / TLS 1.3)。
- ✅ **空间隔离** — 一个空间的编辑永远不会到达另一个空间,空间成员无法与另一个空间同步或获取大文件(`two_spaces_isolated`,`cross_space_blob_isolation`)。
- ✅ **成员资格根植于 EndpointId + 强制执行角色** — 团队空间的签名、哈希链成员资格日志将其根管理员绑定到空间 ID;非成员即使具有泄露的组密钥也被拒绝,读者的写入被诚实对等节点拒绝,因为每个更改都带有作者的 Ed25519 签名(`non_member_endpointid_rejected_even_with_group_key`,`reader_write_rejected`,`membership_change_requires_admin`)。
- ✅ **通过纪元重新密钥撤销** — 删除设备会旋转管理员签名的纪元密钥,仅分发给剩余成员,并重新密钥存储的数据,从而在 **删除后为未来数据提供保密性**(`revoked_device_cannot_sync_new_epoch`,`remaining_members_get_new_key_and_converge`,`removed_device_cannot_fetch_blob`)。
- ✅ **篡改证据审计日志** — 哈希链成员资格日志记录生命周期,如果被修改则无法加载(`audit_log_hash_chain_detects_tampering`)。
- ✅ **密钥在 OS 密钥链中** (Windows 凭证管理器 / macOS 密钥链;Linux 上使用强化文件作为备用),以及 **加密、密码保护的空间导出** 作为无账号恢复路径(`keychain_roundtrip`,`space_export_import_roundtrip`)。
- ✅ **无账号、相互配对** 通过 SPAKE2;副本使用 XChaCha20-Poly1305 加密存储。
诚实的顾虑(从阿尔法到“广泛信任”的路径):
- 加密尚未经过独立审计(并且 `spake2 0.4` 自身未经审计)。没有编码通过可以替代审查,在信任具有敏感数据的多人空间之前。
- 撤销提供删除后对 **未来** 数据的保密性 — 它不是 **前向保密性**,适用于已同步的数据,也不是 **追溯性擦除**。
- 角色强制执行针对 **诚实** 对等节点(假设诚实多数以确保活跃度);删除的设备保留其已获得的任何数据,并通过最长有效链来协调管理员编辑,而不是完全的组密钥协议。
- 在 Linux 上(无编译的密钥链后端),密钥会退回到强化密钥文件。
- 吞吐量针对“足够好 + 可恢复”进行调优,而不是 FASP/Aspera 类;BBR 未应用(上游限制 — 参见 [`docs/throughput.md`](docs/throughput.md))。
- 现实 NAT 打孔和实时 DHT/中继行为通过手动验证,而不是在 CI 中。
参见 [SECURITY.md](SECURITY.md) 以报告问题。
## 许可证
在 [MIT](LICENSE-MIT) **或** [Apache-2.0](LICENSE-APACHE) 下双重许可,由您选择。
[iroh]: https://iroh.computer
[Automerge]: https://automerge.org