開発者ガイド
biblio.bondはAT Protocol上に構築された、共読を通じた人間的なつながりの実験プロジェクトです。このガイドでは、レキシコンの仕組みと自由な活用方法を説明します。私たちは共読が人々のコミュニケーションと共感を深めると信じています。
⚠️ ステータスと透明性
実験的コミュニティプロジェクト
これらのレキシコンはBlueskyに公式登録されていません。分散型読了認証のコミュニティ実験です。名前空間やスキーマは変更される可能性があります。
📄 レキシコンファイル
🔍 ライブレコードを見る
AT Protocolブラウザで以下のコレクションを検索して実際のレコードを確認してください:
bond.biblio.bookbond.biblio.listbond.biblio.stamp
データ保存の仕組み
すべての本・リスト・スタンプのレコードはあなた自身のパーソナルデータサーバー(PDS)に保存されます。biblio.bondはファイアホースモニターを稼働させ、タイトル・著者・タイムスタンプをキャッシュしてbiblio.bonds(共読つながり)の計算と検索を可能にしています。AT Protocolの設計により、読書履歴はPDS上で公開されます。
概要
📌 バージョン3.0(2026年3月)
名前空間をbond.biblio.*に修正(正しい逆ドメインNSID)。すべてのレコードにcreatedAtが必須に。移行期間中は旧biblio.bond.*レコードも引き続きインデックスされます。
biblio.bondは3つのシンプルなレコードタイプで分散型読了認証システムを実現しています:
-
bond.biblio.book - 個人の読了レコード(読者が作成)
bond.biblio.list - 読書チャレンジ(司書が作成)
bond.biblio.stamp - 読了認証(司書が発行)
🔄 仕組み
- 読者が自分のPDSに
bond.biblio.bookレコードを作成します - 司書が特定の本と締切で
bond.biblio.list読書チャレンジを作成します - 読者がリストの本を読み終えたことを司書に通知します
- 司書が読了を確認し
bond.biblio.stamp認証を発行します - 全員がAT Protocolを通じてスタンプを暗号学的に検証できます
- ボンドは同じ本のスタンプを持つ読者間で計算されます
🔑 重要な概念:権限モデル
スタンプは読者ではなく司書のリポジトリに保存されます。これにより信頼モデルが生まれます:読者が本を読了したという司書の証明を信頼する仕組みです。スタンプURIそのものが誰がいつ検証したかを証明します。
⚙️ 制限事項と考慮点
実験的レキシコン
これらのレキシコンはコミュニティが作成したもので、今後変更される可能性があります。あなたの読書プロジェクトに自由にご活用ください。
📖 bond.biblio.book
Purpose: 読了した本を記録
スキーマ(v3.0)
{
"$type": "bond.biblio.book",
"title": string (required, max 500 chars, max 200 graphemes),
"authors": string (required, max 2048 chars, tab-separated for multiple),
"createdAt": datetime (required, ISO 8601),
"lists": [at-uri] (optional, list URIs this book is applied to)
}
例
{
"$type": "bond.biblio.book",
"title": "A Wizard of Earthsea",
"authors": "Ursula K. Le Guin",
"createdAt": "2024-11-15T12:00:00Z"
}
// Multiple authors example:
{
"$type": "bond.biblio.book",
"title": "The Difference Engine",
"authors": "William Gibson\tBruce Sterling",
"createdAt": "2024-11-15T12:00:00Z"
}
📝 v3.0の変更点
- 名前空間を
biblio.bond.bookからbond.biblio.bookに修正(正しい逆ドメインNSID) - createdAtが必須に(v2ではオプションでした)
- listsフィールドを追加(以前の
joins配列を置換) - titleに
maxGraphemes: 200制約を追加
📋 bond.biblio.list
Purpose: 特定の本と締切で読書チャレンジを作成
スキーマ(v3.0)
{
"$type": "bond.biblio.list",
"title": string (required, max 200 graphemes),
"description": string (optional, max 1000 chars),
"librarians": [did] (required, array of DIDs),
"books": [
{
"title": string (required, max 500 chars),
"authors": string (required, max 500 chars)
}
] (required),
"duedate": datetime (required, ISO 8601),
"createdAt": datetime (required, ISO 8601)
}
例
{
"$type": "bond.biblio.list",
"title": "Earthsea December 2024",
"librarians": ["did:plc:librarian123..."],
"books": [
{
"title": "A Wizard of Earthsea",
"authors": "Ursula K. Le Guin"
},
{
"title": "The Tombs of Atuan",
"authors": "Ursula K. Le Guin"
}
],
"duedate": "2024-12-31T23:59:59Z",
"createdAt": "2024-11-01T00:00:00Z"
}
📝 補足
librarians配列には共同リスト用の複数のDIDを入れることができます。duedateは適用されます — スタンプはこのタイムスタンプ以前に作成された本のみ有効です。本はURIではなくリスト内に埋め込まれます。
✓ bond.biblio.stamp
Purpose: 司書が発行する読了検証
スキーマ(v3.0)
{
"$type": "bond.biblio.stamp",
"list": at-uri (required, URI of the list),
"book": at-uri (required, URI of the book - ANY book lexicon),
"createdAt": datetime (required, ISO 8601)
}
例
// Stamp for bond.biblio.book:
{
"$type": "bond.biblio.stamp",
"list": "at://did:plc:lib.../bond.biblio.list/xyz789",
"book": "at://did:plc:reader.../bond.biblio.book/abc123",
"createdAt": "2024-12-15T18:30:00Z"
}
// Stamp for BookHive book (cross-lexicon):
{
"$type": "bond.biblio.stamp",
"list": "at://did:plc:lib.../bond.biblio.list/xyz789",
"book": "at://did:plc:reader.../buzz.bookhive.book/def456",
"createdAt": "2024-12-15T18:30:00Z"
}
📝 主な特徴
- レキシコン非依存:
bookフィールドは任意のat-uriを受け付けます。bond.biblio.book、buzz.bookhive.book、将来のレキシコンに対応。 - 権限モデル: スタンプは司書のリポジトリに存在し、誰が読了を検証したかを証明します。
- 読者の抽出: 読者のDIDはbook URIから自動的に抽出されます。
- 信頼ベース: 自己申告ではなく、スタンプを発行した司書を信頼する仕組みです。
🌐 クロスレキシコン互換性
異なるブックレキシコン間でのスタンプの仕組み
スタンプは参照するブックレコードの種類を問いません。つまり、司書はBookHive、カスタムレキシコン、将来のシステムなど、AT Protocolを使うあらゆるブック管理システムのユーザーの読了にスタンプを押せます。
例:BookHiveユーザーへのスタンプ発行
シナリオ: AliceはBookHiveで本を管理しています。Bobはbiblio.bondの読書リストを運営しています。Aliceは参加できるでしょうか?
- Aliceが「The Dispossessed」をBookHiveに追加:
at://did:plc:alice/buzz.bookhive.book/xyz123 - Aliceが司書Bobに通知:「The Dispossessedを読み終えました」
- BobがAliceの読了を確認しスタンプを発行:
{ "$type": "bond.biblio.stamp", "list": "at://did:plc:bob/bond.biblio.list/winterchallenge", "book": "at://did:plc:alice/buzz.bookhive.book/xyz123", "createdAt": "2024-12-15T10:00:00Z" } - スタンプはBobのリポジトリに保存され、彼がAliceの読了を検証した証明になります
- AliceのDIDはbook URIから抽出されます:
did:plc:alice
これにより可能になること
✅ 現在対応済み
- 司書は任意のbook URIにスタンプを押せる
- スタンプはプロトコルレベルで有効
- 読了を暗号学的に証明
⏳ アプリケーション対応が必要
- biblio.bondがBookHiveレコードをインデックスする必要あり
- レキシコン間のボンド計算
- 混合参加者を表示するUI
重要な区別
プロトコル(レキシコン): スタンプレキシコンは意図的に任意のbook URIを受け付けます。本を異なるシステム(biblio.bond、BookHive、カスタム実装)で管理しながら、同じ読書コミュニティに参加できるよう開放しています。
アプリケーション(biblio.bond): これは別の問題です。biblio.bondアプリケーションは現在、ファイアホースからbond.biblio.book、biblio.bond.book(レガシー)、buzz.bookhive.bookレコードをインデックスしています。ボンド計算はすべてのインデックス済みレキシコンタイプで機能します。
💡 開発者向け
アプリでクロスレキシコンボンドをサポートするには:
- ファイアホースから複数のブックレキシコンをインデックスする
- ブックIDを正規化する(異なるレキシコン間で「The Dispossessed」by「Ursula K. Le Guin」を照合)
- 正規化されたブックが一致するスタンプをグループ化してボンドを計算する
実装の詳細は開発者ガイドとレキシコンドキュメントをご覧ください。
🔧 APIの例
ブックレコードの作成
from atproto import Client
client = Client()
client.login('your-handle.bsky.social', 'app-password')
book = {
"$type": "bond.biblio.book",
"title": "A Wizard of Earthsea",
"authors": "Ursula K. Le Guin",
"createdAt": "2024-11-15T12:00:00Z"
}
result = client.com.atproto.repo.create_record({
'repo': client.me.did,
'collection': 'bond.biblio.book',
'record': book
})
print(f"Created book: {result.uri}")
読書リストの作成
reading_list = {
"$type": "bond.biblio.list",
"title": "Earthsea Challenge",
"librarians": [client.me.did],
"books": [
{
"title": "A Wizard of Earthsea",
"authors": "Ursula K. Le Guin"
}
],
"duedate": "2024-12-31T23:59:59Z",
"createdAt": "2024-11-01T00:00:00Z"
}
result = client.com.atproto.repo.create_record({
'repo': client.me.did,
'collection': 'bond.biblio.list',
'record': reading_list
})
print(f"Created list: {result.uri}")
スタンプの発行
stamp = {
"$type": "bond.biblio.stamp",
"list": "at://did:plc:lib.../bond.biblio.list/xyz",
"book": "at://did:plc:reader.../bond.biblio.book/abc",
"createdAt": "2024-12-15T18:30:00Z"
}
result = client.com.atproto.repo.create_record({
'repo': client.me.did,
'collection': 'bond.biblio.stamp',
'record': stamp
})
print(f"Issued stamp: {result.uri}")
🔗 インテグレーション
ファイアホースモニタリング
AT Protocolファイアホースで新しいbond.biblioレコードを監視:
from atproto import FirehoseSubscribeReposClient
def on_message(message):
if message.path.startswith('bond.biblio.'):
print(f"New record: {message.path}")
client = FirehoseSubscribeReposClient()
client.start(on_message)
レコードの照会
ユーザーの全レコードを一覧表示:
records = client.com.atproto.repo.list_records({
'repo': 'did:plc:user...',
'collection': 'bond.biblio.book'
})
for record in records.records:
print(f"{record.value.title} by {record.value.authors}")
📚 リソース
ご質問・ご意見はこちらへ: @libre.reverie.house