4 điểm bởi GN⁺ 2026-01-25 | 1 bình luận | Chia sẻ qua WhatsApp
  • Một ví dụ triển khai cho phép hiển thị bình luận bằng Bluesky API ngay cả trên trang web tĩnh
  • Vì Bluesky xử lý xác thực tài khoản, quản lý spam, lưu trữ và kiểm duyệt, nên không cần duy trì máy chủ riêng
  • Phần triển khai gồm khoảng 200 dòng mã TypeScript, sử dụng @bluesky/apiTanstack react-query
  • Bình luận được hiển thị ở dạng chỉ đọc, và tự động tải bằng cách liên kết ID bài đăng Bluesky trong metadata của từng bài blog
  • Một triển khai mang tính thử nghiệm cho thấy khả năng kết hợp giữa nền tảng mạng xã hội mở và blog tĩnh

Bối cảnh triển khai mục bình luận Bluesky

  • Điểm khởi đầu là việc khó tự host tính năng bình luận trên các trang web được tạo tĩnh
    • Nội dung tĩnh triển khai trên CDN không thể lưu trữ dữ liệu động
    • Nếu vận hành VPS hoặc dịch vụ đám mây riêng thì chi phí và gánh nặng quản trị sẽ lớn
  • Bluesky là nền tảng mở dựa trên API công khai và giao thức AT, vốn đã cung cấp sẵn những chức năng cần cho việc quản lý bình luận
    • Bluesky xử lý xác thực tài khoản, lọc spam, lưu trữ và kiểm duyệt
    • Phía blog chỉ cần gọi API để hiển thị bình luận

Các lựa chọn khác và lý do chọn Bluesky

  • Cũng đã cân nhắc các lựa chọn như Twitter, Disqus, giscus (dựa trên GitHub Discussions)
  • Bluesky được xây dựng trên giao thức AT phi tập trung, nên ít rủi ro bị một công ty cụ thể kiểm soát hơn
  • So với nền tảng dựa trên GitHub, đây là nền tảng thiên về hội thoại nên phù hợp hơn cho việc host bình luận

Cách triển khai

  • Có tham khảo gói bluesky-comments do Cory Zue công khai, nhưng đã chọn tự triển khai
    • Tự viết mã để tùy biến theo phong cách của trang và mở rộng về sau
    • Toàn bộ phần triển khai, gồm cả component UI và hàm API, có quy mô khoảng 200 dòng
  • Ban đầu cũng cân nhắc chức năng đăng trực tiếp thông qua OAuth, nhưng đã loại bỏ do độ phức tạp của UI và giới hạn thời gian
    • Kết quả là chỉ triển khai chức năng hiển thị bình luận ở chế độ chỉ đọc

Cấu trúc kỹ thuật

  • Trang web được xây dựng bằng React Server ComponentsParcel
    • Nội dung được viết bằng MDX, nên có thể nhúng trực tiếp JavaScript/JSX
    • Trong đối tượng metadata của mỗi bài viết có thêm bskyPostId để liên kết với bài đăng Bluesky
  • Sử dụng SDK TypeScript của Bluesky (@bluesky/api) để nhận dữ liệu luồng bình luận từ endpoint getPostThread
  • Các yêu cầu API được quản lý bằng Tanstack react-query
    • Tự động xử lý trạng thái lỗi, tải và thử lại

Thiết kế UI

  • Từ phản hồi của Bluesky, chỉ trích xuất nội dung văn bản để hiển thị bằng UI bình luận đơn giản
  • Cấu trúc luồng được phân biệt bằng thụt lề và đường viền bên trái
    • Ảnh hồ sơ và ngày đăng tham khảo thiết kế của Bluesky
  • Ở phía trên có thêm liên kết tới bài đăng Bluesky gốc để khuyến khích tham gia cuộc trò chuyện
  • Không có chức năng viết bình luận; người dùng sẽ trả lời trực tiếp trên Bluesky

Khả năng trong tương lai

  • Nếu cần, có thể công khai phần triển khai này thành một gói độc lập
    • Tuy nhiên, mã hiện tại được điều chỉnh cho phù hợp với trang cá nhân
    • Vì cấu trúc đơn giản, các nhà phát triển khác cũng có thể dễ dàng tham khảo mã nguồn để tự triển khai
  • Vẫn chưa rõ việc tích hợp bình luận Bluesky có giúp tăng mức độ tương tác cho blog hay không

Phản ứng của người dùng Bluesky

  • Nhiều người dùng Bluesky đã để lại phản hồi tích cực như “ý tưởng hay”, “phản hồi rất nhanh”, “phù hợp làm lựa chọn thay thế Disqus”
  • Một số người đặt câu hỏi về quản lý spam, xử lý bình luận lồng nhau, hỗ trợ tệp đính kèm
  • Tác giả giải thích rằng có thể ẩn các bình luận cụ thể bằng tính năng kiểm duyệt cá nhân của Bluesky

1 bình luận

 
GN⁺ 2026-01-25
Ý kiến trên Hacker News
  • Nếu bạn render blog hay website bằng static site generator, có người đề xuất cách đưa bình luận về thành file nội dung và đưa vào quy trình build

    1. thu thập bình luận qua email, CGI script, chương trình server, v.v.
    2. duyệt thủ công để xóa spam
    3. lưu bình luận thành file .md hoặc .html
    4. rồi render cùng lúc khi build site
      Cách này khá tốn công, nhưng có ưu điểm là chặn spamtoàn quyền sở hữu dữ liệu
    • Tôi cũng đã triển khai một hệ thống tương tự theo kiểu dựa trên email. Chi tiết được viết trong bài blog của tôi
    • Với website nhỏ thì mỗi ngày chỉ phải quản lý vài bình luận, nên duyệt thủ công là hoàn toàn khả thi. Ngoài ra còn có thể dễ dàng tự động hóa bằng cách tự động cập nhật file Markdown
    • Có người đùa rằng: “Tôi chỉ nhận bình luận qua fax ;)”
    • Có người phản ứng rằng: “Nghe thật kinh khủng”, ý chê là quá kém hiệu quả
  • Nếu không muốn dùng React, bạn có thể tham khảo web component bình luận Bluesky mà tôi làm
    Có thể xem tại kho GitHubtheme playground.
    Việc tùy biến theme rất dễ

  • Có người đã dựa trên ý tưởng của bài gốc để làm một hệ thống bình luận dựa trên Mastodon
    Xem chi tiết trong bài blog của tôi

    • Thực ra kiểu tích hợp bình luận Fediverse này đã được thử với Mastodon hay Bluesky từ trước rồi
      Tham khảo: bài blog liên quan
  • Có ý kiến nói rằng vì luật của EU liên quan đến phát ngôn thù ghét, nếu chủ site không lọc bình luận thì có thể bị xử phạt, nên tôi tò mò thực tế ra sao
    Vì vậy tôi đã tắt hẳn chức năng bình luận

    • Tôi không phải chuyên gia pháp lý, nhưng rủi ro kiểu này thường bị phóng đại vì động cơ chính trị. Luật EU có xét đến quy mô và mục đích của website. Tôi chưa từng nghe trường hợp site cá nhân nhỏ nào bị xử phạt
    • Có thể dùng moderation labeler của Bluesky để lọc trước. Chưa có cái nào đúng chuẩn EU, nhưng bạn cũng có thể tự làm labeler để chỉ chặn các bình luận có vấn đề
    • Ngay cả trước vấn đề pháp lý, tôi cũng không muốn phát ngôn thù ghét xuất hiện trên website mang tên mình
  • Blog của tôi có cấu trúc hoàn toàn tĩnh, và dùng một script Cloudflare Worker 50 dòng để nhận bình luận rồi thêm thẳng vào Markdown.
    Có thể làm như vậy mà không cần embed tính năng bình luận

    • Có người nói sẽ thú vị nếu tự động commit bình luận thành Pull Request, dùng PR như một công cụ duyệt bình luận
    • Có người đùa: “Nếu đúng là ColdFusion thật thì còn ngầu hơn nữa”
    • Cũng có người hỏi: “Bạn có thể chia sẻ link hoặc chi tiết triển khai không?”
  • Có thể tự động hóa bằng cách dùng Bluesky API để tự tìm bài đăng đầu tiên có chứa link blog cụ thể rồi nối nó với phần bình luận

  • Tôi đã tạo một tài khoản để thử vì có vẻ nó cũng giúp Bluesky phát triển. Nghe khá giống một ý tưởng growth hacking thú vị

    • Nhưng tôi nghĩ mạng xã hội vì lợi nhuận cuối cùng rồi cũng sẽ thành như Twitter.
      Lý tưởng nhất thì hệ thống bình luận tự host hoặc dựa trên Fediverse sẽ bền vững hơn
    • Cũng có ý kiến cho rằng chỉ với thông điệp “chúng tôi không phải nền tảng kia” thì khó mà thành công
  • Blog của tôi không nổi tiếng lắm, nhưng trước đây từng trải qua địa ngục spam và bình luận thù ghét
    Vì thế tôi sẽ không bao giờ mở lại chức năng bình luận trên blog cá nhân nữa

  • Ngay cả với hệ thống dựa trên Bluesky, bạn vẫn có thể thêm labeler riêng để lọc các bình luận có gắn nhãn nhất định, tức là vẫn có thể tự kiểm duyệt

  • Tôi cũng làm một ý tưởng tương tự: ngoài blog của mình, tôi đã thêm cartes.app với chức năng bình luận theo từng địa điểm OSM
    Có thể để lại review bằng tài khoản ATproto, và dữ liệu được lưu trên PDS dưới dạng JSON do người dùng sở hữu

    • Có bình luận hỏi: “Thật sự rất hay. Bạn thu thập dữ liệu đó như thế nào, có phải bằng cách nghe Bluesky firehose không?”