- 静的サイトでも Bluesky API を使ってコメントを表示できるようにした実装事例
- Bluesky が アカウント認証、スパム管理、ストレージ、モデレーション を処理するため、別途サーバーを維持する必要がない
- 実装は約 200行のTypeScriptコード で構成され、
@bluesky/api と Tanstack react-query を活用
- コメントは 読み取り専用 の形式で表示され、各ブログ記事のメタデータにBluesky投稿IDを関連付けて自動読み込み
- オープンなソーシャルプラットフォームと静的ブログの結合可能性 を示す実験的な実装
Blueskyコメント欄実装の背景
- 静的生成サイトではコメント機能を自前でホスティングしにくいことが出発点
- CDNに配信された静的コンテンツは動的データを保存できない
- 別途VPSやクラウドサービスを運用すると、コストと管理負担が大きい
- Bluesky は 公開APIとATプロトコルベースのオープンプラットフォーム であり、コメント管理に必要な機能をすでに提供している
- アカウント認証、スパムフィルタリング、ストレージ、モデレーションをBlueskyが処理
- ブログ側では単にAPIを呼び出してコメントを表示すればよい
他の代替案とBlueskyを選んだ理由
- Twitter、Disqus、giscus(GitHub Discussionsベース)などの代替案も検討
- Bluesky は 分散型のATプロトコル の上に構築されており、特定企業の統制リスクが低い
- GitHubベースよりも 会話中心のプラットフォーム として、コメントのホスティングに適している
実装方法
- Cory Zue が公開した bluesky-commentsパッケージ を参考にしたが、独自実装を選択
- サイトのスタイルに合わせたカスタマイズと将来の拡張性のため、自前でコードを作成
- 実装全体はUIコンポーネントとAPI関数を含めて約200行規模
- 当初はOAuthによる 直接投稿機能 も検討したが、UIの複雑さと時間的制約から見送った
- 結果として 読み取り専用のコメント表示機能 のみを実装
技術構成
- サイトは React Server Components と Parcel を使って構築
- コンテンツは MDX で書かれており、JavaScript/JSX を直接含められる
- 各記事の
metadata オブジェクトに bskyPostId を含めてBluesky投稿と関連付け
- Bluesky TypeScript SDK(
@bluesky/api)を使い、getPostThreadエンドポイント からコメントスレッドデータを取得
- APIリクエストは Tanstack react-query で管理
UI設計
- Bluesky の応答から テキストコンテンツのみを抽出 してシンプルなコメントUIとして表示
- スレッド構造 はインデントと左側の境界線で区別
- プロフィール画像と投稿日付はBlueskyのデザインを参考にした
- 上部には元のBluesky投稿へ移動するリンクを追加し、会話への参加を促す
- コメント投稿機能はなく、ユーザーはBluesky上で直接返信する
今後の可能性
- 必要に応じて、この実装を 独立したパッケージとして公開 できる
- ただし現在のコードは個人サイト向けに調整されている
- シンプルな構造なので、他の開発者もソースコードを参考に容易に実装できる
- Blueskyコメント連携がブログの エンゲージメント向上 に役立つかどうかは、まだ不明
Blueskyユーザーの反応
- 複数のBlueskyユーザーがコメントで 「良いアイデア」「反応速度が速い」「Disqusの代替として適している」 などの前向きな反応を残した
- 一部では スパム管理、ネストコメントの処理、添付ファイル対応 などについて質問が出た
- 著者は、Bluesky の 個人モデレーション機能 によって特定のコメントを非表示にできると説明
1件のコメント
Hacker Newsの意見
ブログやウェブサイトを**静的サイトジェネレーター(static site generator)**でレンダリングしているなら、コメントをコンテンツファイルとして取り込み、ビルド工程に含める方法を提案している
.mdや.htmlファイルとして保存しこの過程は手間がかかるが、スパム防止とデータの完全な所有権という利点がある
Reactを使いたくないなら、私が作ったBlueskyコメント用Webコンポーネントを参考にできる
GitHubリポジトリとテーマプレイグラウンドで確認できる。
テーマのカスタマイズがとても簡単
元記事のアイデアを参考にして、Mastodonベースのコメントシステムとして実装した
詳しくは私のブログ記事で見られる
参考: 関連ブログ記事
EUのヘイトスピーチ関連法のせいで、サイト運営者がコメントをフィルタリングしないと処罰されるという話があるが、実際どうなのか気になる
それで私はコメント機能を完全にオフにした
私のブログは完全な静的構成で、50行のCloudflare Workerスクリプトでコメントを受け取り、Markdownにそのまま追加している。
コメント機能を埋め込まなくても実装できる
Bluesky APIを活用して、特定のブログリンクを含む最初の投稿を自動で見つけ、コメントに接続する形で自動化することもできる
Blueskyの成長にも役立ちそうなので、テスト用にアカウントを作った。かなり面白いグロースハックのアイデアだと思う
理想的にはセルフホスティングやFediverseベースのコメントシステムのほうが持続可能
私のブログはそれほど人気ではないが、以前スパムとヘイトコメント地獄を経験したことがある
そのため、もう二度と個人ブログでコメント機能を開くつもりはない
Blueskyベースのシステムでも、独自にlabelerを追加して特定ラベルが付いたコメントをフィルタリングする形で自己検閲ができる
私も似たアイデアで、自分のブログ以外にcartes.appでOSMの場所ごとのコメント機能を追加した
ATprotoアカウントでレビューを残せて、データはユーザー所有のJSON形式でPDSに保存される