Nós
Nós 是一款没有服务器的通讯 App,支持 Android 和 iPhone。聊天、群组、照片、语音消息、文件和通话都经过端到端加密,通过节点上的邮箱传递,而节点任何人都可以运行,包括你自己的电脑。没有手机号码,没有账户,中间也没有任何公司。“Nós”在葡萄牙语中既是“我们”,也是“节点”:既指人,也指人们组成的网络。

快速上手
第一个屏幕提供创建账户、导入账户和无需账户直接体验。
- 创建账户:一个名称、可选的用户名和头像,以及一种强调色。“你的身份就是你的密钥。无需手机号码。”不会在任何地方注册任何信息:个人资料只存在于你的名片中,只发给你的联系人。
- 保存你的恢复短语:十二个单词,它们就是你的账户。轻点显示单词,把它们抄下来,然后轻点我已抄好。也可以选择稍后;在你确认之前,“聊天”中会一直显示横幅提醒。
- 无需账户直接体验会打开带有示例联系人、群组和消息的 App,这些内容只保存在内存中,不会发送到任何地方。此模式下通话、扫描和网络均不可用。通过横幅“你正在浏览示例聊天”可以退出并回到第一个屏幕。
底部的标签页是聊天、通话、联系人和设置。
添加联系人
没有人能通过手机号码或名称找到你。别人要通过你的名片联系你,而名片给谁由你决定。
- 我的名片(“联系人” › 二维码图标,或“发现” › “分享你的名片”)会显示一个二维码和分享链接。扫描二维码或打开链接的人可以向你打一次招呼。邀请链接 30 天内有效;隐私 › 邀请链接可以一次性全部作废。
- 扫描二维码可以读取别人的名片、要添加的节点、要关联的设备或安全码。改为输入链接可以粘贴同样的内容。
- 打开邀请链接会显示对方和添加联系人。添加时会交换你们的名片和印章,这样只有你们两人能向对方的邮箱写信。对方会立即把你加为联系人(“通过你的邀请加入”)。
- 在网络中搜索(“发现”)可以通过对方的密钥(64 个字符)、类似
[email protected]的地址(当对方的域名在/.well-known/nos/<name>提供响应时)找到对方,也可以打开邀请链接。只能找到打开了可通过密钥被发现的人;对方会收到一条请求。 - 介绍给某人(在联系人详细信息中)会把两位联系人的名片分别发给对方。每个人都会在请求中看到“由…介绍”,然后用打个招呼添加对方。
请求
通过密钥找到你的人,或经人介绍的人,会出现在请求中(“聊天”和“联系人”中会显示横幅)。在你轻点接受之前,他们无法给你发消息。忽略会忘掉他们;阻止还会让你的邮箱拒收他们的消息。
聊天
列表会显示每个聊天的最后一条消息、时间、送达标记、正在输入状态、草稿和未读数量。可以用全部、未读、群组和归档筛选;搜索栏按名称和文字筛选。按住聊天(或右键点按)可以置顶、静音、标记为已读、归档或删除聊天。+ 会打开添加联系人、给联系人发消息、新建群组和给自己的备忘(与你的其他设备同步)。

消息
- 输入并发送;在手机上,按 Enter 会换行,除非打开了设置 › 聊天 › 按 Enter 发送。
- 输入框中的 + 可以发送照片或视频、相机拍摄的照片、文件(最大 100 MB)或我的位置(在 OpenStreetMap 中打开)。
- 麦克风用来录制语音消息:轻点开始,然后发送或丢弃。语音消息播放时会显示波形。
- 按住消息(或右键点按)可以使用快速回应,以及回复、转发、存储或分享、编辑(你自己发的文字,48 小时内)、信息和删除(仅对你删除,或在 48 小时内对所有人删除)。连按两下会回应一颗心。
- 照片会立即显示一张小预览,并从节点下载;轻点可全屏幕打开。文件在轻点后下载。
送达状态
| 标记 | 含义 |
|---|---|
| 时钟 | 还在这部手机上等待(没有网络连接,或者没有邮箱响应)。会自动发出。 |
| 一个对勾 | 已在对方的某个邮箱中。会在那里等待,直到对方的手机取走。 |
| 两个对勾 | 对方的设备已收到并解密。 |
| 两个蓝色对勾 | 对方已读(双方都打开了已读回执时)。 |
| 警告 | 未送达(被阻止,或者无法联系到对方)。信息 › 再次发送可以重试。 |
消息的信息会显示它何时写好、何时发送到邮箱、何时送达和何时被阅读;在群组中,还会显示谁收到了、谁读了。
限时消息
在聊天的详细信息中,限时消息(1 小时、24 小时、7 天、90 天或关闭)会让新消息在该时间后从双方手机上消失。隐私 › 限时消息用来设定新聊天的计时。
群组
新建群组需要一个名称、可选的头像以及要添加的联系人(最多 64 名成员)。群组不保存在任何服务器上:每位成员都保存一份由管理员签名的成员列表,每条消息用发送者的密钥加密一次,然后投递到每位成员的邮箱。

- 群组顶部的标签页:聊天、媒体、文件、成员。
- 管理员可以添加成员、从群组中移除、设为管理员、为群组重新命名和更换头像。退出群组即可离开;聊天记录仍保留在设备上。
- 不是你联系人的成员仍然可以联系到你,你也能联系到他们,但仅限于该群组:每位成员都会为群组给自己的邮箱发放印章。
- 有人加入或离开时,发送者会启用新的密钥,因此已经离开的人无法读取之后的内容。
通话
在联系人的聊天中,电话和摄像头按钮分别发起语音通话和视频通话。通话直接在两台设备之间进行(WebRTC),并经过加密;信令以小型信封传递,一分钟后失效。通话中可以使用:静音、摄像头(打开或关闭视频)、翻转和结束。来电会显示接听和拒绝。
通话没有中继:当双方网络不允许直接连接时,通话就无法接通,App 会提示“无法直接连接”。通话标签页列出你的通话记录;轻点电话图标即可回拨。
联系人
列表会显示你的联系人及其用户名、在线(对方选择共享时)以及你的群组。联系人的详细信息中有发消息、通话、视频、验证安全码、备注名(只有你能看到)、媒体、限时消息、静音、介绍给某人、对方的设备、阻止、清空聊天和移除联系人。
安全码
每两位联系人之间共享一个 60 位数字的安全码。可以当面或在通话中核对,也可以用扫描对方的代码扫描对方手机上的代码:如果一致,就将对方标记为已验证(名称旁会显示一个徽章)。
阻止
阻止会作废你在所有邮箱上发给此人的印章:节点将不再接收对方的信封。对方不会收到通知。设置 › 隐私 › 已阻止可以查看和解除阻止。
通知
设置 › 通知有两种模式:
- 即时:你的邮箱会通过浏览器的推送服务发送一条空推送来唤醒这台设备。推送服务只知道何时唤醒设备,永远不知道发送了什么、由谁发送。通知只显示“新消息”;打开 App 时才会取回并解密消息。
- 纯净:完全不推送。打开 App 时才能看到新消息。
在 iPhone 上,通知需要先把 App 添加到主屏幕(Safari › 分享 › 添加到主屏幕),然后轻点打开通知。Android App 在打开期间检查新消息。App 打开时,其他聊天的新消息会以横幅显示。
设备
设置 › 设备列出你的设备。要添加设备,在新设备上打开 Nós,选择导入账户 › 关联到我的手机并为它命名,然后在你的手机上轻点关联设备,扫描新设备上显示的代码(或在手机上打开它的链接)。新设备会获得你的联系人和群组,并从此开始接收每一条消息;之前的消息仍留在原来的设备上。恢复短语保留在主设备上,移除设备也由主设备完成。
网络

节点负责保管邮箱:加密的信封会一直保存在那里,直到手机取走为止(最长 30 天)。节点无法阅读信封,也看不到是谁发的。每个人在不同的节点上最多有三个邮箱,都列在其名片中;一条消息会发到所有这些邮箱,第一次被取走后即被清除。
- 你的节点显示每个节点、它是否已连接,以及你在上面的邮箱。
- 连接:自动会使用你的节点,没有自己的节点时使用公共节点;手动只使用你添加的节点。
- 添加节点可以扫描或粘贴节点输出的链接。如果该节点还没有被认领,认领此节点会让它归你所有:它会以更高的配额为你和你的联系人提供服务(每人 500 MB 消息和 2 GB 媒体,保存 30 天),而公共配额为 50 MB 和 200 MB,媒体保存 7 天。
- 如果你没有自己的节点,App 会使用 leonardoaguiar.com 上的公共节点。
运行你自己的节点
nos-node 可在 macOS 和 Linux(arm64 和 x86_64)上运行:
curl -fsSL https://leonardoaguiar.com/apps/nos/install.sh | sh
nos-node run
nos-node address
nos-node address 会输出一个链接和一个二维码;在设置 › 网络 › 添加节点中打开它即可认领该节点。如果在家用路由器后面,请加上 --attach wss://leonardoaguiar.com/_/nos#f4eea0585b7f4cc4ecfab6a76082a724ee42c7b57d462377f6cf8344c785d00a 运行:它会与公共节点保持一条连接,由公共节点把 App 的请求中继给它,而公共节点除了加密的字节之外什么也看不到。在服务器上,请把它放在 TLS(nginx 或 Caddy)后面,并用 --url wss://… 传入它的公共地址。--public 还会为陌生人提供服务(需要工作量证明,配额较小);--stun 0.0.0.0:3478 会为直接通话响应 STUN 请求。节点把它的密钥、设置和数据保存在 ~/Library/Application Support/Nos Node(macOS)或 ~/.local/share/nos-node(Linux)。再次运行安装命令即可更新。
备份与恢复

- 恢复短语:显示恢复短语(请确保没有人在看)。
- 立即备份和每天备份会把加密备份(联系人、群组、聊天和这台设备的密钥,不含媒体)发送到你的邮箱,用由你的短语生成的密钥加密。存储备份文件会生成一个由你自己保管的
.nosbak文件。 - 导入账户 › 恢复短语会在节点上找到你的名片,打开你的邮箱,并取回最新的备份。如果没有备份,你的身份、个人资料和邮箱都能恢复,但联系人和聊天会是空的:用你的名片重新添加联系人即可。
- 导入账户 › 备份文件用对应的短语打开
.nosbak文件。
守护人
选择守护人会把你的短语拆分给 2 到 7 位联系人,只要其中达到你所选人数的守护人联合起来,就能把它恢复;人数不够则什么也得不到。每一份都会加密后发给对方。在新手机上,导入账户 › 请守护人帮忙会显示一个代码和一个链接,供你发给他们;每位守护人在 Nós 中打开它,确认确实是你本人,然后发送自己的那一份。收到足够的份数后,账户就会恢复。你守护的人列出选择了你的人。
重置账户会抹掉这台设备上的内容。没有短语也没有守护人,账户就无法恢复:其他任何人都没有它。
设置
| 页面 | 内容 |
|---|---|
| 个人资料 | 头像、显示名称、用户名、简介、强调色、我的名片。更改会立即同步给你的联系人。 |
| 隐私 | 介绍(联系人或没有人)、可通过密钥被发现、允许联系人分享你的名片、邀请链接、已读回执、正在输入提示、在线状态、新聊天的限时消息、已阻止。 |
| 通知 | 即时或纯净、显示发送者和内容、打开时显示横幅。 |
| 聊天 | 主题(跟随系统、浅色、深色)、文字大小、按 Enter 发送、归档所有聊天、清空所有聊天。 |
| 存储与数据 | 这台设备上照片、视频、语音消息和文件占用的空间,管理储存空间;自动下载照片、视频和文件(始终、仅限 Wi-Fi、永不),以及高质量照片。 |
| 设备 | 你的设备、关联设备、移除。 |
| 备份与恢复 | 短语、备份、守护人、你守护的人、重置账户。 |
| 网络 | 连接、你的节点、添加节点。 |
| 高级 | 你的密钥(文字和二维码)、这台设备的密钥、重新发布我的名片、立即发送等待中的消息。 |
没有“最后上线时间”:没有任何节点保存它。正在输入和在线状态是几秒钟就失效的极小信封,只发给你的联系人,而且两者都可以关闭。
协议
- 身份:十二个单词(BIP39)派生出身份密钥(Ed25519,其公钥部分就是你的密钥)、名片密钥、备份密钥、印章密钥以及每个邮箱的密钥。每台设备都有自己的 Olm 账户。
- 名片:一份签名记录,包含你的设备、邮箱和个人资料,其内容用只有联系人才拥有的名片密钥加密。节点以由该密钥派生的名称来保存它,因此只知道你密钥的陌生人无法找到它。
- 会话:一对一消息使用 Olm(双棘轮算法,来自 Matrix 的 vodozemac),以存放在你邮箱中的一次性密钥建立;群组使用 Megolm,每位成员一条发送链。
- 信封:按邮箱的密钥封装(X25519 和 XChaCha20-Poly1305),并填充到 1、4、16 或 48 KB。节点能看到邮箱名称、印章、有效期和大小档位;看不到任何关于发送者的信息。
- 印章:由邮箱所有者为每位联系人签发的令牌,指定一个持有者密钥,每个信封都必须用它签名,并设有每日限额。阻止会在节点上吊销印章。陌生人则改为支付工作量证明。
- 与节点的通道:基于 WebSocket 的 Noise NK,节点密钥事先已知,因此无论是中继,还是节点前面负责 TLS 终止的服务器,都无法读取或伪造任何内容。路由器后面的节点用 Noise IK 连接到中继。
- 媒体:每个文件都用自己的密钥加密,切成 48 KB 的分块,并以分块的哈希值寻址。
- 唤醒:Web Push(RFC 8291 和 8292),使用由 App 生成的 VAPID 密钥,因此你的任何一个邮箱都能唤醒你的手机,不需要中心化的推送密钥。
安装与更新
- Android:从本网站下载 APK。需要 Android 7 或更高版本。App 每天向本网站查询一次最新版本,并在“设置”中显示Nós x 现已推出;新的 APK 会直接覆盖安装旧版本,并保留你的账户和聊天。
- iPhone 和 iPad:通过 Safari 使用网页 App。打开 leonardoaguiar.com/apps/nos/app/,轻点分享 › 添加到主屏幕,然后从主屏幕打开 Nós。需要 iOS 16.4 或更高版本。它会自动更新。
- 任何浏览器:同一地址也适用于较新版本的 Chrome、Safari、Edge 或 Firefox,账户保存在该浏览器中。
- 节点:请参阅“运行你自己的节点”。
隐私
Nós 没有自己的服务器,也没有账户。离开你设备的内容有:
- 发往节点上邮箱的信封,均已封装:节点能看到一个随机的邮箱名称、大小档位、时间以及连接所用的互联网地址。
- 你节点上的你的名片,已签名并为你的联系人加密。
- 你和收件人邮箱中的媒体分块,已加密,保存到被下载为止(公共节点上 7 天,你的节点上 30 天)。
- 你邮箱中的加密备份(打开备份时)。
- 空的唤醒推送,通过 Apple、Google 或 Mozilla 的网页推送服务发送(打开即时通知时)。
- 通话,直接发往对方设备;Cloudflare 的 STUN 服务器(
stun.cloudflare.com)会告诉每部手机它的公共地址。 - Android App 的版本检查:每天向本网站发送一次请求,不包含任何关于你的信息。
没有使用统计,不上传联系人,没有用户目录,也没有“最后上线时间”。