世界を動かす技術を、日本語で。

ブログに「Bluesky」のコメント欄を追加しました

概要

  • Blueskyのコメントセクション を自分のブログに組み込んだ体験談
  • 静的サイト でも外部SNSのコメントを簡単に表示できるメリット
  • 他の選択肢(Disqus、giscus、Twitter等)との比較と Blueskyの優位性
  • 実装手順や使用技術(React、TypeScript、react-query等)のポイント
  • 実装をシンプルに保つための設計思想と今後の展望

Blueskyコメントセクションの導入体験

  • 自分のブログ にBlueskyのリプライを直接表示するコメントセクションの実装体験談
  • 静的生成+CDNホスティング環境下で コメント欄の実装困難性 に直面
  • VPSやクラウドサービスでコメント機能を運用する場合の コスト・運用負担 の問題
  • 自分自身が 無償のDevOpsエンジニア になることを避けたいという動機

Bluesky活用のメリット

  • Cory Zue氏の Blueskyコメント埋め込み記事 に触発
  • Bluesky側で アカウント認証・ホスティング・ストレージ・スパム対策・モデレーション を一括管理
  • 公開API があるため、外部サイトへの埋め込みが容易
  • 他サービス(Twitter、Disqus、giscus等)との比較で Blueskyのオープン性と将来性 を評価
    • AT Protocol 基盤による分散性・透明性
    • GitHub Discussionsよりも 会話プラットフォーム としての適性

実装方針と工夫

  • Cory Zue氏の bluesky-commentsパッケージ ではなく、自作を選択
    • デザインカスタマイズ や将来の機能追加を見据えた判断
    • UIコンポーネント+API関数で 約200行のシンプルな実装
  • 当初はOAuthによる 直接投稿機能 も検討
    • 認証フロー自体は構築済み
    • 投稿・返信UIの実装負担が大きいため断念
    • 結果的に 閲覧専用 とし、実装が大幅に簡素化

技術スタックと具体的な実装

  • サイトは React Server Components +Parcelで構築
  • 記事本文は MDX (Markdown+JSX)で管理
  • 各記事のmetadataに bskyPostId を追加し、Bluesky投稿と紐付け
    • 例:
      export const metadata = {
        title: "I added a Bluesky comment section to my blog",
        description: "How I embedded Bluesky replies directly on my site",
        date: "2026-01-24",
        bskyPostId: <post-id>,
        tags: ["web-dev"],
      };
      
  • TypeScript SDK(@bluesky/api) でBluesky APIと連携
  • getPostThreadエンドポイント で投稿とリプライ一覧を取得
  • API通信・ローディング・エラー管理には Tanstack react-query を採用
    • エラー処理やリトライ、ローディング状態の管理を自動化

UI設計と表示の工夫

  • Bluesky投稿の リッチコンテンツ構造 は簡易化し、 テキストのみ抽出 で表示
  • スレッド表示 はシンプルにインデント+左ボーダーで実現
  • プロフィール画像や投稿日時 はBlueskyのデザインを参考に配置
  • Bluesky本体へのリンク をUIに追加し、会話の継続を促進
  • これにより 閲覧専用コメントセクション が完成

公開・再利用性について

  • 実装は 自サイト特化 の部分も多いため、パッケージとしての公開は未定
  • ソースコードを読めば 他の人でも簡単に実装可能 なシンプル設計
  • フィードバックや意見は Bluesky上で受付

今後の展望と雑感

  • コメント機能で ブログのエンゲージメント向上 を期待
  • 前回記事の反応ゼロという現実にも触れつつ、 今後の発展 に期待

Hackerたちの意見

ブルースカイを成長させるための面白い成長ハッキングの方法みたいだね。試してみるためにアカウント作っちゃった、笑

営利目的のソーシャルネットワークプロジェクトは、結局Twitterと同じ運命を辿るのは間違いないよね。問題はいつそうなるかだけ。理想を言えば、コメントシステムは自己ホスティングか、もっとフェディバースっぽい感じがいいな。あとは一時的な妥協で、時間の砂の中に埋もれていくんだろうね。

「他のものじゃない!」っていうのが売りの時点で、成功するのは難しいよね。意図しない炎上を避けるために編集しておくよ。

僕のブログは完全に静的で、コメントを送るための50行のCFワーカーのスクリプトがあって、それをブログ記事のマークダウンに直接インポートしてるよ。埋め込まずにコメントをする方法もあるんだ。

リンクか、もう少し情報を共有してくれる?

コメントをマークダウンとしてコミット/PRで自動化できたら面白いね!プルリクエストをコメントのモデレーションとして使う感じで。

いいアイデアだね!正しいユーザーからの正しいブログ記事リンクを含む(最初の)投稿をチェックするために、ブルースカイのAPIを使ってさらに自動化できるよ。

コメントがフィルタリングされていない場合、ウェブサイトのオーナーを罰するEUの反ヘイト法についてはどう思う?興味本位で聞いてるんだけど、始まった時に僕は自分のウェブページでコメントを無効にしたんだ。

プロアクティブなフィルタリングを探してるなら、Blueskyのモデレーションラベラーを使うといいよ。ただ、EUの要件に特化したものは知らないけどね。リアクティブなフィルタリングを考えてるなら、自分専用の小さなラベラーを作って、問題のある投稿だけをフラグ付けして、コメントページが表示される前にフィルタリングすることができるよ。

どんな法律に関係なく、自分の名前がついたウェブサイトでヘイトスピーチを公開したいとは思わないな。

僕も自分のブログにそれをやった後、https://cartes.app のOSMの場所にコメントセクションを追加したよ。これで、ATprotoアカウントを使って場所をレビューできるようになった。どんなアプリでも同じレキシコンを実装できるよ。レビューのデータはユーザーのもので、PDS上のJSONとして保存される。

それはめっちゃクールだね。データをどうやって集約してるの?パブリックなBlueskyのファイアホースを聞いてるの?

ブログやウェブサイトを静的サイトジェネレーターで作ってるなら、コメントをコンテンツファイルとしてウェブサイトのソースにインポートして、ビルドの一部としてレンダリングすることも考えられるよ。全体のワークフローはこんな感じ:1. コメントをメールや他の手段で受け付ける。サーバーサイドのスクリプトが不要な簡単なハック:自分のウェブサーバーを運営してるなら、GETクエリパラメータとしてコメントを送信してaccess.logに記録し、grepやsedなどで抽出できるよ。個人的には、サーバーサイドのプログラムを使ってPOSTリクエストを受け付け、ウェブサーバーのテキストファイルにコメントを書き込んでる。2. 提出されたコメントをレビューする。スパムを削除。3. コメントをウェブサイトのソースリポジトリに.mdや.htmlなどの形式で追加する。ブログ投稿をコンテンツファイルとしてソースに追加するのと同じようにね。4. 静的サイトジェネレーターを使って、サイトの他の部分と一緒にコメントをレンダリングする。静的サイトジェネレーターの性質によっては、コメントを繰り返し表示するためのテンプレートやレイアウトを使ったり作成したりする必要があるかもしれない。かなり手動のワークフローだから、誰にでも合うわけじゃないけど、僕は個人のウェブサイトでこうやってるよ。このアプローチの主な利点は2つある。ステップ2でのレビューが手動だから、スパムが僕のウェブサイトに載ることは絶対にない。ステップ3でコメントが完全に自分の管理下にあるから、将来的にプラットフォーム間で移行する心配もないんだ。

  1. コメントをメールで受け付ける 俺はファックスでしかコメントを受け付けてないけど ;)
  1. コメントをメールで受け付ける もし興味がある人がいたら、最近メールを基にした似たようなコメントシステムを実装したよ。詳しく書いた記事も投稿したんだ。[1]

ひどいね

Reactを使わない解決策が欲しいなら、Blueskyのコメント用ウェブコンポーネントを作ったよ。https://github.com/ascorbic/bluesky-comments-tag すごくテーマ変更がしやすい。もし何かの理由でコメントをHacker Newsみたいに見せたいなら、ここにテーマがあるよ:プレイグラウンドはここで見れるよ:https://bluesky-comments.netlify.app/theme/

君のアイデアが気に入ったから、パクったけど、Mastodonを使ったよ :) https://jesse.id/blog/posts/you-can-now-comment-on-my-blog-f...

自分でモデレーションもできるよ。ラベラーを追加して、ラベルが付けられたコメントをフィルターすればいいんだ。

やあ、ミカ!ここで会えるなんてすごく嬉しいよ。数年前にプリンシパルでインターンしてた時に会ったよね。元気にしてる?

やあ、ジョーイ!コロナの時期のプリンシパルでのインターン、今では夢みたいに感じるけど、当時のサポートには感謝してるよ。君も元気でいてね!