- Giao thức mạng xã hội phi tập trung sử dụng website tĩnh, trong đó mỗi người dùng trực tiếp sở hữu và quản lý dữ liệu của mình
- Toàn bộ dữ liệu được lưu trong kho JSON được mã hóa, còn client trên trình duyệt sẽ tổng hợp feed và đăng bài
- Hoạt động bằng giao tiếp trực tiếp giữa website và trình duyệt của bạn bè, không cần máy chủ hay relay
- Tên miền của người dùng chính là danh tính, được xác thực qua HTTPS/TLS
- Với cấu trúc đơn giản, giao thức hiện thực hóa mạng xã hội tự chủ về dữ liệu, tập trung vào tương tác dựa trên niềm tin giữa các cá nhân
Tổng quan về giao thức sAT
s@ là giao thức mạng xã hội phi tập trung dựa trên site tĩnh, trong đó mỗi người dùng lưu dữ liệu trên website của riêng mình
- Toàn bộ dữ liệu được lưu dưới dạng tệp JSON được mã hóa, và client trên trình duyệt sẽ đọc chúng để đăng bài và tổng hợp feed
- Hoạt động không có máy chủ trung tâm hay relay, dữ liệu đi trực tiếp từ site của người dùng đến trình duyệt của bạn bè
- Chỉ khi có quan hệ theo dõi lẫn nhau thì mới có thể trao đổi bài viết, loại bỏ cấu trúc xoay quanh influencer
- Giao thức không phụ thuộc vào dịch vụ hosting cụ thể như GitHub Pages
Danh tính (Identity)
- Tên miền của người dùng đóng vai trò là danh tính
- HTTPS/TLS xác thực rằng chủ sở hữu tên miền đã đăng nội dung đó
Khám phá (Discovery)
Mô hình mã hóa (Encryption Model)
- Toàn bộ dữ liệu người dùng được lưu trong kho JSON được mã hóa, chỉ người dùng và follower mới có thể giải mã
- Dùng cặp khóa X25519 để công bố khóa công khai trong
profile.json, còn khóa riêng được lưu trong localStorage của trình duyệt
- Dữ liệu bài viết được mã hóa bằng XChaCha20-Poly1305, còn khóa nội dung được mã hóa riêng cho từng follower bằng
crypto_box_seal của libsodium
- Tệp
keys/_self.json chứa khóa nội dung và bí mật đăng bài của người dùng, chỉ chính họ mới giải mã được
Xoay vòng khóa và bỏ theo dõi
- Khi bỏ theo dõi, hệ thống tạo khóa nội dung mới và mã hóa lại toàn bộ bài viết
- Tạo các phong bì khóa mới cho những follower còn lại và cập nhật
keys/_self.json
- Người đã bị bỏ theo dõi sẽ không thể giải mã bài viết nữa
Luồng giải mã
- Khi người truy cập vào site của bạn mình, họ sẽ dùng khóa riêng của mình để giải mã
keys/{follower-domain}.json nhằm lấy khóa nội dung
- Sau đó lấy
posts/index.json và từng bài viết riêng lẻ (posts/{id}.json.enc) để giải mã
Cấu trúc dữ liệu (Data Schema)
- Mỗi bài viết được lưu trong một tệp mã hóa riêng, còn
posts/index.json liệt kê ID bài viết theo thứ tự mới nhất trước
- Ví dụ đối tượng bài viết:
{
"id": "20260309T141500Z-a1b2",
"author": "alice.com",
"created_at": "2026-03-09T14:15:00Z",
"text": "Hello, decentralized world!",
"reply_to": null,
"reply_to_author": null
}
- ID bài viết gồm timestamp UTC theo ISO8601 và hash ngẫu nhiên 4 ký tự
Danh sách theo dõi (Follow List)
Tổng hợp feed (Feed Aggregation)
- Client đọc danh sách theo dõi và giải mã bài viết của từng follower để tạo thành feed theo trình tự thời gian
- Các bài viết được sắp xếp giảm dần theo
created_at
Bình luận (Reply)
- Bình luận là các bài viết có trường
reply_to và reply_to_author được thiết lập
- Không hỗ trợ bình luận lồng nhau, chỉ có thể trả lời trực tiếp bài viết cấp cao nhất
- Nếu không thể xem bài gốc (ví dụ không ở trạng thái theo dõi), bình luận sẽ không được hiển thị
Đăng bài (Publishing)
- Tạo bài viết mới → mã hóa bằng khóa nội dung → tải lên site tĩnh → cập nhật
posts/index.json
- Có thể dùng GitHub Contents API để tải lên
- Bí mật đăng bài được lưu ở dạng mã hóa trong
keys/_self.json
Ví dụ cấu trúc site tĩnh
{domain}/satellite/
profile.json # khóa công khai và hồ sơ
posts/
index.json # danh sách ID bài viết
{id}.json.enc # bài viết được mã hóa
follows/
index.json # danh sách theo dõi
keys/
_self.json # khóa nội dung và thông tin xác thực
{domain}.json # khóa nội dung cho từng follower
FAQ
- “Có phải RSS + mã hóa không?” → Có
- “Có phải là phiên bản không có firehose của AT Protocol không?” → Có
- “Có mở rộng được không?” → Không (“tình bạn cũng không mở rộng được”)
- “s có phải viết tắt của slow/shitty không?” → Có
- “Có thể tự host không?” → Có, nhưng cần bật CORS
1 bình luận
Ý kiến trên Hacker News
Có cảm giác dự án này cũng gặp những vấn đề mà nhiều mạng xã hội thay thế/tự host khác từng gặp
Thiết kế lấy mã hóa làm trung tâm thì hay thật, nhưng khi đổi sang thiết bị mới sẽ khó khôi phục danh sách theo dõi bạn bè, và các khái niệm như cặp khóa X25519 cũng quá khó hiểu với người dùng phổ thông
Tôi nghĩ cấu trúc dựa trên ID và mật khẩu để máy chủ xử lý phần mã hóa thay là thực tế hơn
Chính hướng tiếp cận đó mới có thể trở thành giải pháp thay thế Big Tech mà cả người không rành kỹ thuật cũng dùng được
Có điều với gia đình hay bạn bè thì có thể tôi vẫn phải cài giúp. Dù vậy, nếu họ có được website của riêng mình thì có lẽ họ sẽ khá thích
Trên thực tế có thể xem như ý tưởng tích hợp blog tĩnh vào BlueSky.
Có thể cải thiện bằng cách tận dụng danh tính BlueSky, hoặc dùng plugin cho static site generator để tự động lấy thông tin xác thực
Xem bài viết liên quan
Tôi khá sốc ở chỗ họ lưu private key trong localStorage của trình duyệt
Nếu đặt lại cài đặt trình duyệt hoặc cài lại thì dữ liệu sẽ mất, việc sao lưu cũng khó, còn mã độc thì lại dễ truy cập
Cuối cùng nếu mất khóa thì feed cũng biến mất vĩnh viễn, nên nguy cơ người dùng rời đi là rất lớn
URL.createObjectURL(localStorage.getItem(...))để gợi ý lưu ra fileTất nhiên nếu mất khóa thì sẽ không truy cập được, nhưng người dùng 2FA hay ví tiền mã hóa cũng chấp nhận trách nhiệm tương tự, nên không phải chuyện hoàn toàn bất khả thi
Có người đề xuất dùng
/.well-known/thay cho đường dẫn/satellite/Họ viện dẫn tiêu chuẩn Well-known URI
.well-knowndành cho toàn bộ host nên không phù hợp ở cấp stream. Họ cho rằng tách nhiều thư mục riêng ra sẽ tốt hơnTôi thấy đề xuất
.well-known/đáng để cân nhắc nghiêm túcNó đã là chuẩn đăng ký IANA được dùng rộng rãi, và nhiều tệp phục vụ bảo mật/khám phá đều nằm ở đó
Nếu đặt tại
/.well-known/satproto.jsonthay vì/satellite/satproto.jsonthì vừa tránh xung đột vừa thể hiện rõ đây là endpoint của giao thức.well-knownhoạt động ở cấp host, nên nếu muốn có nhiều thư mục theo từng tài khoản thì nó không phù hợpGiao thức mạng xã hội không nên tồn tại chỉ vì bản thân công nghệ, mà phải đem lại lợi ích trực tiếp cho người dùng
Cũng như BitTorrent, phải khiến người ta tham gia đơn giản vì họ cần nó thì mới tạo được hiệu ứng mạng
Một hướng tiếp cận bắt đầu từ việc quản lý dữ liệu và sự tiện lợi khi chia sẻ có lẽ thực tế hơn
Lemmy hay Pixelfed có quá ít nội dung nên tạo cảm giác như “nơi chẳng có gì xảy ra”
Signal cũng vậy, chỉ phục vụ nhắn tin đơn thuần nên không có lý do để lướt
Cuối cùng vẫn phải có nội dung và FOMO (nỗi sợ bị bỏ lỡ) thì người dùng mới quay lại thường xuyên
Nếu thực sự muốn tạo ra một mạng xã hội/ứng dụng nhắn tin E2EE phi tập trung thì cần cấu trúc giống Discord, nơi mỗi máy chủ thực sự được host độc lập
Tài khoản nên được quản lý bằng giao thức như Nostr, và hệ thống nên chạy trên Yggdrasil Network để giảm phụ thuộc vào IPv4/6 và DNS
Nếu bọc lưu lượng trong HTTPS và tự động hóa việc vượt NAT thì ai cũng có thể vận hành máy chủ
Chỉ khi đó mới có thể thoát khỏi sự kiểm soát của Big Tech và chính phủ
Dù máy chủ biến mất thì dữ liệu vẫn còn ở edge, và trình duyệt của người dùng thậm chí có thể đóng vai trò host
Tham khảo ephemeral-p2p-project
Mỗi thiết bị hoạt động như một máy chủ, và WebRTC được dùng để hiện thực nhắn tin P2P hoàn toàn
Ngay cả khi không có internet, vẫn có thể trao đổi dữ liệu qua kết nối radio
Trước đây từng có những nỗ lực mạng xã hội hoàn toàn phi tập trung như FOAF hay Pingback
Tôi khuyên nên xem IndieWeb wiki vì đây là nguồn tài liệu rất tốt để tìm hiểu các công nghệ xã hội dựa trên web cá nhân như vậy
Khi đọc mô tả “sAT Protocol là một mạng xã hội phi tập trung dựa trên static site”, tôi đã muốn vẽ một biểu đồ lông mày cứ nhướng lên dần
Chỉ là ciphertext có thể bị liệt kê công khai, nên trong thời đại máy tính lượng tử có thể sẽ rủi ro
Nó phù hợp với mạng quy mô nhỏ, nhưng sẽ khó mở rộng lớn vì vấn đề phân phối và xoay vòng khóa
Từ góc nhìn người dùng, tôi thấy cần giải thích trước hết đây là dịch vụ làm gì
Toàn là các thuật ngữ kỹ thuật như fork, path, JSON, mã hóa nên không hình dung ra kịch bản sử dụng thực tế
Đây là vùng mà Mastodon hay Signal chưa đáp ứng được, nên đáng để đem ra thử
Mỗi khi thấy những thử nghiệm mạng phi tập trung như thế này tôi đều thấy rất thú vị
Dù về cấu trúc có nhiều vấn đề, việc học những cách kết hợp mới vẫn rất vui
Chỉ là việc phải mã hóa lại và build lại toàn bộ site mỗi lần follow/unfollow thì quá phiền
Ngoài ra, cấu trúc mà nếu không follow thì không thấy bình luận cũng hạn chế khả năng mở rộng rất mạnh
Dù vậy, việc pha trộn RSS, ActivityPub và static site vẫn rất hấp dẫn
Nỗ lực hiện thực kiểm soát truy cập danh sách bạn bè động bằng static site vừa mâu thuẫn vừa thú vị
Cuối cùng đây là một cấu trúc khiến tôi vừa yêu vừa ghét. Nhưng tôi vẫn vui và biết ơn vì có những thử nghiệm như thế này