分散型ピアツーピア読書認証

開発者ガイド

biblio.bondはAT Protocol上に構築された、共読を通じた人間的なつながりの実験プロジェクトです。このガイドでは、レキシコンの仕組みと自由な活用方法を説明します。私たちは共読が人々のコミュニケーションと共感を深めると信じています。

⚠️ ステータスと透明性

実験的コミュニティプロジェクト

これらのレキシコンはBlueskyに公式登録されていません。分散型読了認証のコミュニティ実験です。名前空間やスキーマは変更される可能性があります。

📄 レキシコンファイル

🔍 ライブレコードを見る

AT Protocolブラウザで以下のコレクションを検索して実際のレコードを確認してください:

  • bond.biblio.book
  • bond.biblio.list
  • bond.biblio.stamp
AT Protocolブラウザを開く →

データ保存の仕組み

すべての本・リスト・スタンプのレコードはあなた自身のパーソナルデータサーバー(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 - 読了認証(司書が発行)

🔄 仕組み

  1. 読者が自分のPDSにbond.biblio.bookレコードを作成します
  2. 司書が特定の本と締切でbond.biblio.list読書チャレンジを作成します
  3. 読者がリストの本を読み終えたことを司書に通知します
  4. 司書が読了を確認しbond.biblio.stamp認証を発行します
  5. 全員がAT Protocolを通じてスタンプを暗号学的に検証できます
  6. ボンドは同じ本のスタンプを持つ読者間で計算されます

🔑 重要な概念:権限モデル

スタンプは読者ではなく司書のリポジトリに保存されます。これにより信頼モデルが生まれます:読者が本を読了したという司書の証明を信頼する仕組みです。スタンプ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配列を置換)
  • titlemaxGraphemes: 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は参加できるでしょうか?

  1. Aliceが「The Dispossessed」をBookHiveに追加:
    at://did:plc:alice/buzz.bookhive.book/xyz123
  2. Aliceが司書Bobに通知:「The Dispossessedを読み終えました」
  3. 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"
    }
  4. スタンプはBobのリポジトリに保存され、彼がAliceの読了を検証した証明になります
  5. AliceのDIDはbook URIから抽出されます: did:plc:alice

これにより可能になること

✅ 現在対応済み
  • 司書は任意のbook URIにスタンプを押せる
  • スタンプはプロトコルレベルで有効
  • 読了を暗号学的に証明
⏳ アプリケーション対応が必要
  • biblio.bondがBookHiveレコードをインデックスする必要あり
  • レキシコン間のボンド計算
  • 混合参加者を表示するUI

重要な区別

プロトコル(レキシコン): スタンプレキシコンは意図的に任意のbook URIを受け付けます。本を異なるシステム(biblio.bond、BookHive、カスタム実装)で管理しながら、同じ読書コミュニティに参加できるよう開放しています。

アプリケーション(biblio.bond): これは別の問題です。biblio.bondアプリケーションは現在、ファイアホースからbond.biblio.bookbiblio.bond.book(レガシー)、buzz.bookhive.bookレコードをインデックスしています。ボンド計算はすべてのインデックス済みレキシコンタイプで機能します。

💡 開発者向け

アプリでクロスレキシコンボンドをサポートするには:

  1. ファイアホースから複数のブックレキシコンをインデックスする
  2. ブックIDを正規化する(異なるレキシコン間で「The Dispossessed」by「Ursula K. Le Guin」を照合)
  3. 正規化されたブックが一致するスタンプをグループ化してボンドを計算する

実装の詳細は開発者ガイドレキシコンドキュメントをご覧ください。

🔧 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}")

📚 リソース

レキシコンファイル

AT Protocolリソース

ご質問・ご意見はこちらへ: @libre.reverie.house