
2026/01/25 5:33
ブログにBluesky コメントセクションを追加しました。
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
著者は、2026年1月24日にBlueskyの投稿から読み取り専用のスレッドコメントセクションをブログに追加した方法を説明しています。React Server Components と Parcel、MDX を使ってレンダリングし、Bluesky SDK(
@bluesky/api)を利用して AT Protocol URI 経由でポストスレッドを取得しました。Tanstack react‑query は API 呼び出し・ローディング状態・エラー・リトライを管理し、返信テキストのみを抽出してインデント付きのボーダーで表示することでスレッド構造を示しています。著者は複雑さから OAuth で投稿することを選ばず、Cory Zue の bluesky-comments パッケージよりもスタイリングと将来拡張性をコントロールできるカスタムコードを採用しました。実装は UI コンポーネントと API 関数で約 200 行にわたります。最後の記事には返信がなく、エンゲージメントの向上について不確定要素があることを指摘しています。著者はこれを単体パッケージ化する可能性も示唆していますが、サイト固有すぎるかもしれません。Bluesky のディスカッションをブログに直接埋め込むことで、読者はページを離れることなく関連コンテンツと交流でき、既存のコメントウィジェットより軽量な代替手段として、静的サイトへソーシャルメディア機能を統合する他開発者にインスピレーションを与える可能性があります。本文
2026年1月24日掲載
このブログ投稿に対するBlueskyの返信を、当サイト上で直接確認できるようになりました。ぜひご覧ください!
私はいつも自分のサイトにコメント欄を設置したいと考えてきましたが、コンテンツは静的生成されてCDNにホストされているため実装が難しいです。
別途VPSやクラウドサービスでコメント機能を運用することも可能ですが、動的ウェブサービスの保守は費用と時間がかかり、無報酬のパートタイムDevOpsエンジニアになる気持ちさえありません。
最近、Cory Zue がBluesky からコメントセクションを埋め込む方法を書いたブログ記事を読みました。
すぐにこの手法のメリットが分かりました:Bluesky は認証・ホスティング・ストレージ・スパム対策・モデレーションなど、ソーシャルメディアアカウント管理の面倒な作業を全て担ってくれます。さらにオープンプラットフォームで公開APIがあるため、自サイトにコメントを直接埋め込むことが容易です。
他にもTwitter(旧)から返信を埋め込む、Disqus を使う、GitHub Discussions でコメントをホストする giscus などがありますが、私はこれらの中で Bluesky が明らかに優れた選択だと考えています。Bluesky は AT Proto 上構築されたオープンソースのソーシャルメディアプラットフォームであり、権力ある億万長者が簡単に乗っ取ることはできません。また、GitHub よりも会話をホストするには自然と適した全機能付きのソーシャルメディアです。
Zue は bluesky‑comments というスタンドアロンパッケージを公開しており、React コンポーネントとしてコメントを埋め込むことができます。
私は自分でこの機能を構築することにしました。主な理由は、サイト全体のデザインに合わせていくつかスタイル調整を行いたかったことと、将来的にさらに機能を追加したいという可能性を残しておきたかったためです。実装自体は UI コンポーネントと API 関数だけで約 200 LOC に収まります。
最初は、ユーザーがサイトから直接 Bluesky に投稿できるように OAuth フローを用意し、自サイトに権限を与える設計でした。認証フロー自体は動作しましたが、既存のコメントへの返信や投稿用 UI を構築することは困難であり、実際にはカスタム Bluesky クライアントを作る必要が出てきました。この作業は時間も手間もかかり、現在の私にとっては魅力的ではありませんでした。さらにユーザーが認証フローを経て Bluesky アカウントにサインインする必要があるため、リンクされた Bluesky 投稿へ直接投稿するよりも利便性が高くなるわけでもありません。
その要件を外すと実装はずっとシンプルになります。基本的には、サイトのメタデータに対応した Bluesky の投稿 ID を指定し、ページ読み込み時にその投稿への返信を取得して表示するだけです。
前回の記事で説明したように、このサイトは React Server Components と Parcel で構築されています。記事本文は MDX(Markdown に JavaScript/JSX を埋め込む拡張)で書かれ、各ポストでは Zod スキーマで検証するメタデータオブジェクトをエクスポートします。たとえば今回の投稿のメタデータは次のようになります。
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"], };
bskyPostId の値は、コメント欄に表示する返信を取得したい Bluesky 投稿の ID を指します。TypeScript で構築しているため、Bluesky の TypeScript SDK(NPM 上の @bluesky/api)との統合が容易です。Bluesky API ドキュメントと Zue の実装を参照した結果、getPostThread エンドポイントに注目しました。このエンドポイントは AT Protocol URI を渡すと、指定投稿およびその返信のデータを含むオブジェクトを返します。
React コンポーネントから
fetch と useEffect で直接 Bluesky API にアクセスすることも可能でしたが、ローディングやエラー処理はシンプルな機能でも煩雑になるためです。そこで Tanstack の react‑query パッケージを利用し、API リクエスト/レスポンスのサイクルを管理しました。このライブラリはエラー、再試行、ローディング状態を自動で処理してくれます。
Bluesky から取得したレスポンスを解析し、返信ごとの内容とメタデータを抽出する次のステップでした。Bluesky の投稿はマークアップ・参照・添付ファイルを表すリッチコンテンツ構造をサポートしていますが、その全てを UI で完全に再現することは難しいため、各返信からテキスト内容だけを抜き出して表示しました。
スレッド化コメントを適切に表示する UI(特に小型モバイルデバイス上で見やすく)を構築するのは容易ではありません。現在はシンプルなアプローチとして、各返信をインデントし左側に境界線を付けて階層関係が分かりやすいようにしました。それ以外は、Bluesky のプロフィール画像と投稿日時のレイアウトなど、デザイン要素をほぼコピーしています。
最後に、親投稿へのリンクを Bluesky 上で設置し、ユーザーにそこで会話を追加してもらうよう促す UI コンポーネントを追加しました。これで読み取り専用のコメントセクション実装は完了です。興味がある方には、自分版の Bluesky コメント機能をスタンドアロンパッケージとして公開することも検討しています。ただし、私が行ったいくつかの選択肢は自サイトに特化したものなので、実装は簡単なため他の人もソースコードを読んで独自バージョンを作ることができるでしょう。Zue の版と同様です。
Bluesky で返信していただければと思います。これがブログ記事へのエンゲージメント向上に役立つことを願っています;ただ、私の最後の記事にはまだ返信がありませんでしたので… 😭