Blueskyのコメント機能を自分のブログに構築する
(natalie.sh)- 既存のコメントシステム(Disqus、セルフホスティング、GitHub Issues など)は、速度、トラッキング、保守負荷、ユーザー制限などの問題で採用していない
- Blueskyはインフラ維持が不要、リッチコンテンツ対応、実名ベースのアカウント、クロスプラットフォーム対話が可能で、ブログのコメントに適している
- 実装方法は、ブログ記事を投稿 → Blueskyに共有 → AT URIをブログ投稿のメタデータに追加 → 該当投稿のコメントスレッドを取得して表示する構造
- コンポーネントは、コメント全体の表示、個別コメント+返信の表示、画像・リンクなど埋め込み処理の3つに分離
- 再帰方式で最大5段階の返信表示、画像グリッド・モーダル、リンクカード、未対応の埋め込みは代替文言で処理
- Astro + React統合、
client:loadでクライアント側で読み込み、frontmatterにDIDとpostCidを追加して有効化 - 型安定性確保のために
@atcute/clientTypeScript型を活用し、JavaScript無効時でも本文が正常表示されるプログレッシブ・エンハンスメント構造 - サーバー・DBなしでBluesky APIとCDNを活用してパフォーマンスを確保
- このアプローチは、ソーシャル機能をサイトごとに再実装する代わりに、ユーザーが既に使っているプラットフォームと接続することで拡張性と独立性を確保する
Blueskyをコメントシステムとして選んだ理由
- インフラ維持が不要
- 画像・リンク・引用投稿など豊富なコンテンツをサポート
- Blueskyアカウントベースの信頼性と責任性
- ブログとソーシャルメディア間でトラフィックの相互流入が可能
- コンテンツ所有権の分離(ブログ記事は本人、コメントは投稿者所有)
AT Protocolの理解
- DID: 分散型ユーザー識別子
- CID: コンテンツ識別子
- AT URI:
at://did:.../app.bsky.feed.post/...形式のアドレス getPostThreadAPI呼び出しでコメントスレッドを取得可能、認証不要
コンポーネント構成
- メインコメントコンポーネント
- 個別コメント+返信レンダリングコンポーネント
- 画像・リンクなど埋め込み処理コンポーネント
ネストコメントの処理
- 再帰レンダリング、最大深度5段階の制限
- 視覚的インデントで階層を表現
リッチコンテンツの処理
- 画像: CDN提供、複数画像グリッド・モーダルビュー
- 外部リンク: サムネイル・説明を含むカードレンダリング
- その他の埋め込み: 代替文言を表示
Astro統合
- Reactコンポーネント +
client:load使用 - frontmatterにBluesky DID、postCidを追加してコメントを有効化
開発体験
- TypeScript型サポートで安定性を確保
- Progressive Enhancementにより、API障害時でも本文への影響なし
- サーバー・DBの負荷なしでBlueskyインフラを活用
結論
- 既存のコメントシステムの課題を回避し、ユーザーがすでに使っているプラットフォームと接続
- Blueskyの成長に伴い参加者の増加が期待できる
- ATProtoベースのため、他のAppViewや独自実装への移行も容易
1件のコメント
Hacker Newsコメント
複数のサードパーティコメントシステムを試した末、最終的には自作のシンプルなコメントシステム(form.lisp)を作って使っている。各コメントはテキストファイルとして保存されるため、スパムやXSS、無意味なコメントを気にする必要がない。週末ごとに手動で確認してブログに追加する運用をしている。
コメントは通常のHTMLファイルで保存され、静的サイトジェネレーター(site.lisp)が本文と一緒にコメントページ(コメント例)も生成してくれる。つまり本質的に静的コメントジェネレーターとして動作している。
記事で言及されている5つの要件(追加インフラ不要、リッチコンテンツ、実名など)には合致しないが、自分には合っていて、4年以上満足して運用している。
簡単ではなく、lexiconを作ってBlueskyストリームに合わせてDBを継続的に管理しなければならない。
だから導入には慎重で、近い将来にAPIが閉鎖されたりコメントシステムが壊れたりするのではないかという不安がある。
第三者が作ったapp serverやapp viewなどからも同一データにアクセスできるため、わざわざ公式APIに依存する必要はない。いくつかの点で開放性は高い。
少し残念なのは、ウェブページごとにBlueskyへ別投稿を出さないとコメントシステムが動作しないこと。webcomponentのようなものがあればなお良いと思う。
この機能を自分のブログに付けて、直接コメントを書いてもらい、私はこのインターフェース経由でのみBlueskyやその他のソーシャルとやり取りするだけでもよい。
フィードを開くと結局「ドゥームスクロール」や時間の無駄に陥る場合が多かった。この方式でそうした悪循環を避けつつ、少しはソーシャルメディアとつながれる新しい可能性を感じた。
根本的には、昔のTwitterよりさらに過激な環境を再現しようとする試みのように感じる。まるで高校の給食室のような子どもっぽい権力争い要素もある。
ロックインがないと言われるが、もし明日Blueskyでアカウントがブロックされたり、会社が倒産したりした場合どうするか気になる。
AT互換製品に切り替えはできるだろうが、データの多くが消えてしまわないか心配だ。
(参考までに、このブログの著者はBluesky従業員で、私は別人だ)
現在のPDSが壊れるかブロックされた場合も、すぐ別サーバーへ移行できる。
リレー(gossipノード)、PDS、クライアント、アプリビュー(Blueskyウェブアプリのバックエンド)などの各種オープンソース実装とホスティング提供者が存在する。
Blueskyが明日壊れても、自分でホスティングするか、別業者(例:zeppelin.social)を使って既存アプリを継続できる。
PLCディレクトリはまだBlueskyが管理しているが、独立財団へ移行中で、必要なら複製も容易。did:web方式を使えばDNS体系のみに依存するため独立性が高い。