概要
- 従来のコメントシステム(Disqus等)の問題点と限界を指摘
- BlueskyのAPIとAT Protocolを活用した新しいコメント導入事例
- 実装アーキテクチャ、リッチコンテンツ対応、Astroとの統合方法を解説
- TypeScript活用やパフォーマンス面での利点を整理
- このアプローチの今後の展望と分散型Webの意義を考察
従来のコメントシステムへの不満
- Disqus は動作が遅く、重く、ユーザートラッキングや所有権の問題がある
- ページの読み込み速度が著しく低下するデメリット
- 自前ホスティング 型コメントは、ユーザー管理・スパム対策・DB運用などの負担が大きい
- GitHub Issues をコメント化する方法は開発者向けで、一般的な読者にはハードルが高い
- コメント機能自体を廃止すると、 議論や発見の機会 を失うリスク
Blueskyを使ったコメントシステムの発想
- Bluesky コミュニティの健全さやAPI設計、分散型の特性に着目
- Bluesky上でブログ記事を共有し、その投稿への リプライをブログコメントとして利用 するアイデア
- インフラ管理やユーザー管理が不要で、 Bluesky側に任せられる 利便性
- 画像やリンクなどの リッチコンテンツ対応、実名性による荒らし抑止
- コメントがBlueskyにも残ることで、 クロスプラットフォームな議論 が可能
- 各自が自分のコンテンツを所有し、 プラットフォームロックイン が起きない設計
実装アーキテクチャ
-
AT Protocol の理解が必須
- DID (分散型ID): 例 did:plc:abc123...
- CID (コンテンツID): 投稿固有の識別子
- AT URI: 例 at://did:plc:user.../app.bsky.feed.post/postid
-
コメント取得は getPostThreadエンドポイント を利用、認証不要
-
コンポーネント構成
- メインコメントコンポーネント: スレッド取得・表示
- リプライコンポーネント: 個別返信やメタ情報、Bluesky元投稿へのリンク
- 埋め込みコンポーネント: 画像やOGPプレビュー等リッチメディア対応
-
スレッドの深さ は最大5階層に制限し、再帰的に表示
-
const MAX_DEPTH = 5; const BlueskyReply = ({ thread, depth = 0 }) => { return ( <div style={{ marginLeft: depth * 12 }}> {/* 投稿内容表示 */} {depth < MAX_DEPTH && thread.replies?.map(reply => <BlueskyReply thread={reply} depth={depth + 1} /> )} </div> ); };
-
リッチコンテンツ対応
- 画像埋め込み: Bluesky CDN経由で複数画像をグリッド表示、モーダルで拡大
- 外部リンク: サムネイル・説明付きカードで表示
- 未知の埋め込み型: プロトコル拡張性を考慮し、未対応時はフォールバック表示
Astroとの統合
-
既存の React統合 を活用し、
client:loadで即時ハイドレーション -
フロントマターで下記のように設定
-
bsky: did: "my-bluesky-did" postCid: "the-post-id"
-
-
対象記事にのみコメント機能を有効化可能
実装から得た知見
- TypeScript型 が公式パッケージ(@atcute/client)で提供されており、開発効率向上
- プログレッシブエンハンスメント: JSやAPIが使えなくても記事は読める
- パフォーマンス: バックエンド管理不要、CDN・APIキャッシュ活用で高速
- コメント体験が より自然でソーシャル的 になった実感
このアプローチの意義と今後
- 従来のコメント欄は SNSの機能を各ブログで再発明 していた
- 読者が既に使っているSNSアカウントで参加できる利便性
- Blueskyの成長に合わせて自動的にスケール、自分は追加作業不要
- オープンプロトコル基盤のため プラットフォーム依存からの自由
- 例えばBlueskyが変質しても、他のAppView(zeppelinやBlacksky等)へ移行可能
- ATProto の柔軟性を活かし、独自AppView作成も容易
- 独立サイトが 分散型Webの広い会話圏 と繋がる理想的な形
- Mastodon等の他分散型SNSよりも、 ユーザーIDの所有・相互運用性 で優位性
- 実際の動作例は本記事下部のコメント欄で確認可能
メタ: 本記事のコメント欄もBluesky連携システムで稼働