Nós
Nós 是一款不需要伺服器的通訊 App,支援 Android 和 iPhone。聊天、群組、照片、語音訊息、檔案和通話都採用端對端加密,經由節點上的信箱傳遞,而節點任何人都能架設,包括你自己的電腦。不需要電話號碼、不需要帳號,中間也沒有任何公司。「Nós」在葡萄牙文中同時是「我們」和「節點」的意思:指的是人,以及他們共同組成的網路。

開始使用
第一個畫面提供 Create account(建立帳號)、Import account(輸入帳號)和 Explore without account(不建立帳號先逛逛)。
- Create account:一個名稱、選填的使用者名稱和大頭貼,以及一個強調色。「Your identity is your keys. No phone number required.」(你的身分就是你的金鑰,不需要電話號碼。)不會在任何地方登記任何資料:個人資料只會放在你的名片裡,傳給你的聯絡人。
- Save your recovery phrase(儲存你的復原短語):十二個單字,它們就是你的帳號。點 Show the words 顯示單字,把它們抄下來,再點 I wrote it down(我已抄下)。也可以選 Later(稍後);在你確認之前,Chats 上會有一條橫幅持續提醒你。
- Explore without account 會以示範的人物、群組和訊息打開 App,這些內容只存在記憶體中,不會傳送到任何地方。在這個模式下,通話、掃描和網路都是關閉的。點「You're exploring sample chats」(你正在瀏覽示範聊天)這條橫幅即可離開,回到第一個畫面。
底部的標籤頁有 Chats(聊天)、Calls(通話)、Contacts(聯絡人)和 Settings(設定)。
加入聯絡人
沒有人能用電話號碼或名稱找到你。別人要透過你的名片才能聯絡你,而名片要給誰由你決定。
- My card(我的名片,位於 Contacts › QR 圖像,或 Discover › Share your card)會顯示一個 QR 碼和 Share link(分享連結)。掃描它或打開連結的人可以跟你打一次招呼。邀請連結的有效期為 30 天;Privacy › Invite links 可一次取消所有連結。
- Scan QR code 可讀取別人的名片、要加入的節點、要連結的裝置或安全碼。Enter a link instead 則接受貼上的相同內容。
- 打開邀請連結會顯示對方和 Add contact(加入聯絡人)。加入時會交換你們的名片和郵戳,這樣只有你們兩人能寫信到彼此的信箱。對方會立即把你加為聯絡人(「joined from your invite」,透過你的邀請加入)。
- Search in network(在網路中搜尋,位於 Discover)可以用對方的金鑰(64 個字元)、像
[email protected]這樣的地址(當對方的網域在/.well-known/nos/<name>有回應時)來找人,或打開邀請連結。它只會找到打開了 Discoverable by key(可透過金鑰被找到)的人;對方會收到一則請求。 - Introduce to someone(介紹給某人,位於聯絡人的詳細資訊中)會把兩位聯絡人的名片分別傳給對方。兩人都會在 Requests 中看到「Introduced by …」(由…介紹),再用 Say hello(打招呼)加入對方。
請求
透過金鑰找到你,或經由介紹的人,會出現在 Requests(請求)中(Chats 和 Contacts 上會有橫幅)。在你點 Accept(接受)之前,他們無法傳訊息給你。Ignore(忽略)會忘掉他們;Block(封鎖)還會在你的信箱擋下他們。
聊天
列表會顯示每個聊天的最後一則訊息、時間、送達勾號、輸入中狀態、草稿和未讀數量。可用 All(全部)、Unread(未讀)、Groups(群組)和 Archive(封存)篩選;搜尋欄位可依名稱和內文篩選。按住某個聊天(或按右鍵)可 Pin(置頂)、Mute(靜音)、Mark as read(標示為已讀)、Archive(封存)或 Delete chat(刪除聊天)。+ 會打開 Add a contact(加入聯絡人)、Message a contact(傳訊息給聯絡人)、New group(新增群組)和 Notes to self(給自己的筆記,會與你的其他裝置同步)。

訊息
- 輸入後送出;在手機上,按 Enter 會換行,除非打開了 Settings › Chats › Enter sends(按 Enter 送出)。
- 輸入列中的 + 可傳送 Photo or video(照片或影片)、Camera(相機拍攝的照片)、File(檔案,最大 100 MB)或 My location(我的位置,會在 OpenStreetMap 中打開)。
- 麥克風可錄製語音訊息:點一下開始,然後送出或捨棄。語音訊息播放時會顯示波形。
- 按住某則訊息(或按右鍵)可使用快速回應,以及 Reply(回覆)、Forward(轉傳)、Save or share(儲存或分享)、Edit(編輯你自己的文字,限 48 小時內)、Info(資訊)和 Delete(刪除,可只對你刪除,或在 48 小時內對所有人刪除)。按兩下會以愛心回應。
- 照片會先立刻顯示小預覽圖,再從節點下載;點一下可全螢幕打開。檔案在點一下時才會下載。
送達狀態
| 標記 | 意思 |
|---|---|
| 時鐘 | 正在這支手機上等待(沒有連線,或沒有任何信箱回應)。它會自動送出。 |
| 一個勾號 | 已在對方的某個信箱中,會在那裡等到對方的手機取走它。 |
| 兩個勾號 | 對方的裝置已收到並解密。 |
| 兩個藍色勾號 | 對方已讀取(如果雙方都打開了已讀回條)。 |
| 警告 | 未送達(被封鎖,或無法聯絡到對方)。Info › Send again(再傳送一次)會重試。 |
訊息的 Info 會告訴你它何時寫成、何時送到信箱、何時送達和何時被讀取;在群組中,還會告訴你誰收到、誰讀了。
自動消失的訊息
在聊天的詳細資訊中,Disappearing messages(自動消失的訊息:1 小時、24 小時、7 天、90 天或 Off 關閉)會讓新訊息在這段時間後從雙方的手機上消失。Privacy › Disappearing messages 可設定新聊天的計時。
群組
New group 需要一個名稱、選填的圖片,以及要加入的聯絡人(最多 64 位成員)。沒有任何伺服器保存群組:每位成員都保存一份由管理員簽署的成員清單,每則訊息都以傳送者的金鑰加密一次,再送到每位成員的信箱。

- 群組上方的標籤頁:Chat(聊天)、Media(媒體)、Files(檔案)、Members(成員)。
- 管理員可以 Add members(加入成員)、Remove from group(從群組移除)、Make admin(設為管理員)、重新命名群組及更換它的圖片。Leave group 會退出群組;聊天仍保留在裝置上。
- 不是你聯絡人的成員仍然能聯絡到你,你也能聯絡到他們,但僅限於群組內:每位成員都會為群組在自己的信箱蓋上郵戳。
- 有人加入或離開時,傳送者會改用新的金鑰,這樣離開的人就無法讀取之後的內容。
通話
聯絡人聊天中的電話和攝影機按鈕可開始語音或視訊通話。通話直接在兩台裝置之間進行(WebRTC),並經過加密;訊號傳遞則以一分鐘後就失效的小信封傳送。通話中有:Mute(靜音)、Camera(打開或關閉視訊)、Flip(切換鏡頭)和 End(結束)。來電會顯示 Accept(接聽)和 Decline(拒絕)。
通話沒有中繼:當兩邊的網路無法建立直接的路徑時,通話就無法接通,App 會顯示「Couldn't connect directly」(無法直接連線)。Calls 標籤頁會列出你的通話;點電話圖像即可回撥。
聯絡人
列表會顯示你的聯絡人及其使用者名稱、Online(上線中,若對方有分享),以及你的群組。聯絡人的詳細資訊中有 Message(傳訊息)、Call(語音通話)、Video(視訊)、Verify safety number(驗證安全碼)、Nickname(暱稱,只有你看得到)、媒體、自動消失的訊息、Mute(靜音)、Introduce to someone(介紹給某人)、對方的 Devices(裝置)、Block(封鎖)、Clear chat(清除聊天)和 Remove contact(移除聯絡人)。
安全碼
每一對聯絡人共用一組 60 位數的安全碼。你可以當面或在通話中比對,或用 Scan their code 掃描對方手機上的條碼:如果相符,就把對方標示為 Verified(已驗證,名稱旁會有一個標記)。
封鎖
Block 會取消你在所有信箱上給那個人的郵戳:節點不再接受他的信封。對方不會收到通知。Settings › Privacy › Blocked 會列出被封鎖的人,並可解除封鎖。
通知
Settings › Notifications 有兩種模式:
- Instant(即時):你的信箱會透過瀏覽器的推播服務,以一則空白推播喚醒這台裝置。推播服務只知道何時要喚醒裝置,絕不知道傳了什麼或誰傳的。通知會顯示「New message」(新訊息);訊息在你打開 App 時才會被取回並解密。
- Pure(純粹):完全沒有推播。你打開 App 時才會看到新訊息。
在 iPhone 上,通知需要先把 App 加入主畫面(Safari › 分享 › 加入主畫面),再點 Turn on notifications(打開通知)。Android App 會在打開時檢查訊息。App 打開時,其他聊天的新訊息會以橫幅顯示。
裝置
Settings › Devices 會列出你的裝置。要加入一台裝置,請在新裝置上打開 Nós,選擇 Import account › Link to my phone(連結到我的手機),為它命名,然後在你的手機上點 Link a device(連結裝置)並掃描它顯示的條碼(或在手機上打開它的連結)。新裝置會取得你的聯絡人和群組,並從那時起收到每一則訊息;之前的訊息仍留在原處。復原短語保留在主要裝置上,裝置的移除也是由主要裝置進行。
網路

節點負責保管信箱:加密的信封會保存在那裡,直到手機把它們取走(最多 30 天)。節點無法讀取信封,也看不到是誰寄的。每個人在不同的節點上最多有三個信箱,都列在他的名片中;一則訊息會送到所有信箱,只要有一次被取走就會清除。
- Your nodes(你的節點)會顯示每個節點、它是否已連線,以及你在上面的信箱。
- Connection(連線):Automatic(自動)會使用你的節點,在你沒有節點時使用公共節點;Manual(手動)只使用你加入的節點。
- Add a node(加入節點)會掃描或貼上節點印出的連結。如果這個節點還沒有被認領,Adopt this node(認領這個節點)會讓它成為你的節點:它會以較大的配額(每人 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 會印出一個連結和一個 QR 碼;在 Settings › Network › Add node 中打開它,即可認領這個節點。如果節點在家用路由器後面,請加上 --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)。再執行一次安裝指令即可更新它。
備份與復原

- Recovery phrase(復原短語):Show recovery phrase(顯示復原短語,請確定沒有人在看)。
- Back up now(立即備份)和 Back up every day(每天備份)會把加密的備份(聯絡人、群組、聊天和這台裝置的金鑰,不含媒體)送到你的信箱,並以從你的短語衍生的金鑰加密。Save backup file(儲存備份檔案)會產生一個由你自己保管的
.nosbak檔案。 - Import account › Recovery phrase 會在節點上找到你的名片、打開你的信箱,並取回最新的備份。如果沒有備份,你的身分、個人資料和信箱都會回來,但聯絡人和聊天會從空白開始:請用你的名片重新加入聯絡人。
- Import account › Backup file 會用對應的短語打開
.nosbak檔案。
守護人
Choose guardians(選擇守護人)會把你的短語分給 2 到 7 位聯絡人,由你決定需要其中幾位一起才能把它復原;人數不足時則什麼都不會洩露。每一份都會加密後交給他們。在新手機上,Import account › Ask my guardians(請我的守護人協助)會顯示一個代碼和一個連結,讓你傳給他們;每位守護人在 Nós 中打開它,確認真的是你之後,再送出他們的那一份。收到足夠的份數時,帳號就會回來。People you protect(你守護的人)會列出選擇了你的人。
Reset account(重設帳號)會清除這台裝置。沒有短語或守護人,帳號就無法復原:其他人都沒有它。
設定
| 頁面 | 內容 |
|---|---|
| Profile | 大頭貼、顯示名稱、使用者名稱、簡介、強調色、My card。變更會立即傳到你的聯絡人。 |
| Privacy | 介紹(Contacts 聯絡人或 Nobody 沒有人)、Discoverable by key、聯絡人可以分享你的名片、Invite links、已讀回條、輸入中指示、上線狀態、新聊天的自動消失訊息、Blocked。 |
| Notifications | Instant 或 Pure、顯示傳送者和內文、App 打開時的橫幅。 |
| Chats | 主題(System 系統、Light 淺色、Dark 深色)、文字大小、Enter sends、封存所有聊天、清除所有聊天。 |
| Storage and data | 這台裝置上照片、影片、語音訊息和檔案所使用的空間、Manage storage(管理儲存空間);自動下載照片、影片和檔案(Always 一律、Wi-Fi only 僅限 Wi-Fi、Never 永不),以及高畫質照片。 |
| Devices | 你的裝置、Link a device、Remove(移除)。 |
| Backup and recovery | 短語、備份、守護人、People you protect、Reset account。 |
| Network | 連線、你的節點、Add a node。 |
| Advanced | 你的金鑰(文字和 QR 碼)、這台裝置的金鑰、Publish my card again(重新發布我的名片)、Send waiting messages now(立即傳送等待中的訊息)。 |
沒有「上次上線時間」:沒有任何節點會保存它。輸入中和上線狀態都是幾秒內就失效的小信封,只傳給你的聯絡人,而且兩者都可以關閉。
協定
- 身分:十二個單字(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 每天會向本網站詢問一次最新的版本,並在 Settings 中顯示 Nós x is available(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 的網頁推播服務傳送(如果打開了 Instant 通知)。
- 通話,直接連到另一台裝置;Cloudflare 的 STUN 伺服器(
stun.cloudflare.com)會告訴每支手機它的公開位址。 - Android App 的版本檢查:每天向本網站發出一次請求,不傳送任何關於你的資訊。
沒有使用統計資料、不會上傳聯絡人、沒有使用者目錄,也沒有「上次上線時間」。