- Các hệ thống bình luận truyền thống (Disqus, tự quản lý, GitHub Issues, v.v.) không được sử dụng vì các vấn đề về tốc độ, theo dõi, gánh nặng bảo trì và giới hạn người dùng
- Bluesky phù hợp cho bình luận blog vì không cần duy trì hạ tầng, hỗ trợ nội dung giàu, tài khoản dựa trên danh tính thật, hội thoại đa nền tảng
- Cách triển khai là đăng bài viết blog → chia sẻ lên Bluesky → thêm AT URI vào metadata bài viết → tải và hiển thị thread bình luận của bài viết đó
- Thành phần được chia thành 3 phần: hiển thị toàn bộ bình luận, hiển thị bình luận + trả lời, xử lý nhúng hình ảnh/đường liên kết
- Dùng đệ quy để hiển thị tối đa 5 cấp bình luận, lưới ảnh + modal, card liên kết, và các embed không hỗ trợ được hiển thị bằng câu thay thế
- Tích hợp Astro + React, load trên client bằng
client:load, kích hoạt bằng cách thêm DID và postCid vào frontmatter - Dùng kiểu TypeScript của
@atcute/clientđể đảm bảo an toàn kiểu, với cấu trúc Progressive Enhancement giúp nội dung chính vẫn hiển thị bình thường khi JavaScript bị tắt - Đảm bảo hiệu năng bằng cách dùng API và CDN của Bluesky mà không cần máy chủ hay cơ sở dữ liệu
- Cách tiếp cận này giữ được khả năng mở rộng và tính độc lập bằng việc kết nối với nền tảng người dùng đã dùng, thay vì tái tạo lại tính năng xã hội cho từng site
Lý do chọn Bluesky làm hệ thống bình luận
- Không cần duy trì hạ tầng
- Hỗ trợ nội dung phong phú như hình ảnh, liên kết, bài viết trích dẫn
- Tính tin cậy và trách nhiệm nhờ tài khoản Bluesky
- Có thể chuyển lưu lượng qua lại giữa blog và mạng xã hội
- Tách quyền sở hữu nội dung (bài viết thuộc chủ sở hữu, bình luận thuộc người viết)
Hiểu về giao thức AT
- DID: Định danh người dùng phi tập trung
- CID: Định danh nội dung
- AT URI: địa chỉ dạng
at://did:.../app.bsky.feed.post/... - Có thể lấy thread bình luận bằng lời gọi API
getPostThread, không cần xác thực
Cấu trúc component
- Component bình luận chính
- Component render bình luận + trả lời
- Component xử lý nhúng hình ảnh, liên kết, v.v.
Xử lý bình luận lồng nhau
- Render đệ quy, giới hạn tối đa độ sâu 5 cấp
- Biểu diễn theo tầng bằng thụt lề trực quan
Xử lý nội dung rich media
- Hình ảnh: cung cấp qua CDN, grid nhiều ảnh + chế độ xem modal
- Liên kết ngoài: render card kèm ảnh thu nhỏ và mô tả
- Embed khác: hiển thị câu thay thế
Tích hợp Astro
- Dùng React component +
client:load - Kích hoạt bình luận bằng cách thêm DID và postCid của Bluesky vào frontmatter
Trải nghiệm triển khai
- Đảm bảo tính ổn định nhờ hỗ trợ TypeScript type
- Với Progressive Enhancement, API lỗi vẫn không ảnh hưởng nội dung bài viết
- Tận dụng hạ tầng Bluesky mà không cần máy chủ hay DB
Kết luận
- Tránh các vấn đề của hệ thống bình luận cũ, kết nối với nền tảng người dùng đã quen thuộc
- Khi Bluesky phát triển, số lượng người tham gia có thể tăng theo
- Nhờ nền tảng ATProto, việc chuyển sang AppView khác hay triển khai riêng cũng dễ dàng
1 bình luận
Ý kiến trên Hacker News
Mình mong rằng họ sẽ công khai một bức tranh tổng thể về cách Bluesky sẽ tạo ra doanh thu trong tương lai; dù phần kỹ thuật khá phức tạp, cuối cùng nếu đi tới việc thu phí thì chắc chắn sẽ có cách nào đó và mình rất tò mò.
Bài này thú vị đấy, mình thích đọc cách người khác tự xây dựng và vận hành website một cách độc lập. Trong bài có nói đến bốn giải pháp cho bài toán hệ thống bình luận, nhưng mình muốn chia sẻ rằng phương án thứ năm của mình cũng có tác dụng. Mình đã thử vài hệ thống bình luận bên thứ ba rồi cuối cùng làm một hệ thống bình luận đơn giản (form.lisp) và đang dùng. Mỗi bình luận được lưu dưới dạng file văn bản, nên không phải lo về spam, XSS hay bình luận vô nghĩa; mình xử lý bằng cách tự kiểm tra vào mỗi cuối tuần rồi thêm vào blog. Các bình luận được lưu dưới dạng file HTML bình thường, và static site generator (site.lisp) sẽ tạo luôn trang bình luận (ví dụ bình luận) kèm nội dung bài viết, tức là về bản chất nó hoạt động như một công cụ tạo bình luận tĩnh. Nó không đáp ứng đủ năm thuộc tính được nêu trong bài (không cần hạ tầng riêng, nội dung phong phú, xác thực danh tính thật, v.v.), nhưng nó lại rất hợp với mình và mình đã vận hành ổn định ít nhất hơn bốn năm rồi.
Nhận bình luận qua email form rồi từ góc độ quản trị viên tự thêm trực tiếp vào cuối bài cũng là một cách cũng ổn.
Cách của mình rất phù hợp cho blog lưu lượng thấp. Tuy nhiên, cá nhân mình thấy hơi gượng khi cho phép tiếng nói của người khác xuất hiện trên site của mình, nên đã gỡ luôn chức năng bình luận để để blog là không gian thể hiện bản sắc của mình; thay vào đó, khi ai truyền cảm hứng cho mình, mình thích để lại phản hồi qua email.
Mình cảm giác giống như mục “bài góp ý của độc giả” trên tờ báo.
Mình khuyên thử cactus.chat, nền tảng này dựa trên Matrix và có hỗ trợ khách mời nên vẫn có thể bình luận mà không cần tài khoản Matrix riêng; nếu dùng tài khoản của bạn thì mỗi bài viết sẽ tương ứng với một phòng Matrix.
Bluesky rất hữu ích cho việc lưu trữ thông tin dựa trên tài khoản người dùng có sẵn; hiện tại bản đồ web mã nguồn mở cartes.app đang phát triển hệ thống review dựa trên Bluesky. Việc này không dễ, vì phải tạo lexicon và liên tục quản lý DB theo stream của Bluesky.
Thật ra cũng có thể đi được một chừng nào mà không cần DB: trên scrapboard.org trước đây, chỉ dùng API getRecord (tài liệu) đã truy xuất được khá nhiều dữ liệu client.
Có đề xuất dùng thay thế là mangrove.reviews. Dịch vụ này có giấy phép CC-BY-SA rõ ràng và hiện đang dùng cả MapComplete.org; Bluesky sau này cũng có thể gặp vấn đề.
Mình hoài nghi về tính bền vững của mô hình kiếm tiền của Bluesky; khả năng miễn phí hiện tại phần lớn là nhờ vốn đầu tư của VC. Vì vậy mình khá dè dặt khi triển khai, và có cảm giác rằng rất có thể trong tương lai gần API sẽ bị đóng hoặc hệ thống bình luận sẽ hỏng.
Kiến trúc Bluesky hoạt động dưới Personal Data Server (PDS) của người dùng, bất kỳ ai cũng có thể đổi PDS; server ứng dụng chính thức của Bluesky chỉ làm nhiệm vụ tổng hợp. Người khác vẫn có thể tự làm app server, app view để truy cập cùng một dữ liệu, nên không nhất thiết phải phụ thuộc vào API chính thức; về mặt mở, nó lại khá rộng.
Mình rất tin vào khái niệm POSSE. Mặt tích cực của "chu kỳ enshittification" là có thể trải nghiệm một cộng đồng trực tuyến dễ chịu trong một thời gian rồi lại chuyển sang nơi mới; giống như những câu lạc bộ hay biến mất trước đây, không cần níu kéo quá lâu. Mình có một link trên Mastodon tóm lược góc nhìn này, giải thích lý thuyết.
Bluesky sẽ đến lúc chuyển sang thương mại hóa, nhưng AI và các dịch vụ khác về bản chất cũng vận hành theo mô hình vốn VC. Dù cuối cùng môi trường sẽ bị biến chất giống Twitter, Uber, DoorDash..., thì trong giai đoạn VC đổ tiền vì khao khát sự giàu có mới, tận hưởng quãng thời gian bùng nổ đó cũng là một hiện tượng cũng thú vị.
Mình nghĩ hệ sinh thái Bluesky thật sự tuyệt vời; trước đây mình từng thấy một ví dụ về cách làm này (hệ thống bình luận dựa trên Bluesky). Chỉ tiếc ở chỗ mỗi trang web phải đăng một bài riêng trên Bluesky thì bình luận mới hoạt động; nếu có webcomponent hay thứ gì tương tự thì sẽ tốt hơn.
Tác giả bài viết nói “tôi chưa gắn nổi hệ thống bình luận đúng nghĩa cho blog trong nhiều năm”, nhưng trên toàn bộ blog của họ hiện chỉ thấy hai bài của năm 2025 (một bài là bài này).
Đây là một cách thú vị để tương tác với social media mà không cần đụng trực tiếp vào social feed. Mình muốn gắn tính năng này lên blog để mọi người bình luận trực tiếp, và mình có thể chỉ tương tác với Bluesky hoặc các social khác qua kiểu giao diện này. Mở feed thường dẫn đến doomscrolling và lãng phí thời gian; với cách này, mình thấy có một hướng mới để nối với social media mà vẫn tránh được vòng luẩn quẩn đó.
Mình cảm giác Bluesky đang tạo ra một môi trường để những ý tưởng mới xuất hiện trên Internet một lần nữa một cách tự do.
Thực ra có thể xem như một bước "mở" hơn so với Threads, cộng thêm vài tuỳ chọn tích hợp; có lẽ cách nói “đổi mới mở” còn hợp cho ATProto hơn.
Mình không muốn dồn quá nhiều công sức cho một doanh nghiệp hay nhóm đơn lẻ, nhưng hiện giờ cộng đồng Bluesky khá vui. Mình từng là fan của Twitter và có vẻ tầng lớp người dùng chính của Bluesky hiện nay cũng khá nhiều người cùng thế hệ; rồi chuyện sẽ đi về đâu thì còn đợi.
Mình theo đuổi khẩu hiệu “không phải nền tảng mà là giao thức”; câu “build mode” cũng vậy, tức là tạo thứ gì đó khó để bị chiếm hữu hay lạm dụng.
Nếu gây khó chịu cho ban vận hành Bluesky hoặc một nhóm người dùng nào đó, hoặc bị tố cáo bởi một nhóm cụ thể, tài khoản có thể bị khóa ngay lập tức; hoặc nếu bị đưa vào blacklist đã chia sẻ trước, có thể biến mất trước khi kịp mở miệng. Cảm giác chung là đang cố tái tạo một môi trường thậm chí gắt gao hơn Twitter cũ, thậm chí có cả thứ cạnh tranh quyền lực non nớt kiểu căng tin cấp ba.
Bản thân mình không tự hosting blog mà dựa trên Bluesky, nên về cơ bản thì Bluesky đang quản lý blog. Mặc dù họ nói không có vendor lock-in, nhưng nếu mai mốt Bluesky chặn tài khoản mình hoặc công ty sụp đổ thì mình sẽ làm gì? Có thể chuyển sang sản phẩm tương thích AT, nhưng mình vẫn lo liệu có mất đi nhiều dữ liệu không.
Nếu quan tâm chủ đề này, ở https://whtwnd.com/bnewbold.net có tập hợp thông tin và công cụ thực tế về việc tự xây relay network, migration dữ liệu và các thứ khác dựa trên Bluesky và AT Proto; đã có tiến triển về migration dữ liệu, portability, hỗ trợ relay network thay thế; xem thêm liên kết liên quan. (Bản thân mình lưu ý: tác giả blog đó là nhân viên Bluesky, còn mình là người khác.)
Bạn có thể sao lưu dữ liệu cá nhân vào file CAR (kiểu tarball) trên IPFS; sau đó có thể phục hồi trên bất kỳ PDS nào bằng tài liệu did:plc của tài khoản hoặc bản ghi DNS. Ngay cả khi PDS hiện tại bị hỏng hoặc bị chặn, bạn có thể chuyển ngay sang máy chủ khác. Có nhiều triển khai mã nguồn mở và nhà cung cấp hosting cho relay (gossip node), PDS, client, app view (backend của web app Bluesky)... Ngay cả khi Bluesky biến mất ngày mai, bạn vẫn có thể tự host hoặc tiếp tục app cũ bằng nhà cung cấp khác, ví dụ zeppelin.social. PLC directory hiện vẫn do Bluesky quản lý nhưng đang chuyển dần sang quỹ độc lập; có thể nhân bản khi cần, còn nếu dùng did:web thì chỉ phụ thuộc vào DNS nên tính độc lập cao hơn.
Ngoài ra, Bluesky cũng đang chủ động đẩy ra khỏi nền tảng các người dùng có xu hướng libertarian hoặc cánh hữu khá rõ; còn không khí dành cho cánh tả hoặc nhóm ít quan tâm chính trị thì ổn.