IIIFアノテーションのFirestore設計: 1件1ドキュメントの読み取りコストとcanvas単位シャードへの移行
IIIFアノテーションを Firestore に「1件1ドキュメント」で保存していた構成が読み取り上限に達したため、canvas 単位でまとめ、1MiB を超える場合はシャード分割する構成へ移行した記録です。
IIIFアノテーションを Firestore に「1件1ドキュメント」で保存していた構成が読み取り上限に達したため、canvas 単位でまとめ、1MiB を超える場合はシャード分割する構成へ移行した記録です。
暫定ミラー codh-mirror について、前回記事では『認証・保存バックエンドは結局動かない』としていたところを、後から方針転換して Firebase 認証と JSONkeeper 互換 API (Cloudflare Workers + D1 / PythonAnywhere の二系統) を実際に動かすまでの記録です。Authorized domains 設定、FirebaseUI 3.x の signInFlow リダイレクト落とし穴、authFirebase.js の差し替え、Curation Manager の外部リンク相対化、5 箇所の curationJsonExportUrl 書き換えなど、codh-mirror リポジトリ側で行った変更を 1 本にまとめます。
IIIF Curation Viewer のキュレーション保存先である JSONkeeper を、もとの Flask 実装ではなく Cloudflare Workers + D1 で書き直した記録です。Hono + jose による Firebase ID トークンの検証 (Admin SDK 不要・サービスアカウント鍵不要)、D1 SQLite スキーマ設計、JSON-LD @id 書き換えのトップレベル+ネストノード対応、Activity Stream の最小実装、CORS と Viewer 互換ヘッダ、wrangler によるデプロイ runbook、そしてアップストリーム JSONkeeper との差分一覧までを 1 本にまとめています。
IIIF Curation Viewer の保存先 (JSONkeeper, Flask) を PythonAnywhere 無料プラン (Beginner) に自前で立てる手順記録です。ブラウザ操作はトークン発行とコンソールアタッチの 2 回だけに抑え、残りすべてを HTTP API + curl で完結させます。Flask 1.0 / apscheduler 3.5 の現代 Python 非互換、Firebase Admin SDK のサービスアカウント鍵運用、CPU 100 秒/日制約、CORS、Viewer 側 (codh-mirror) の差し替えまで一通り。

IIIF画像に対して、多角形のアノテーションを付与するツールを作成しました。

Mirador 3の mirador-annotations プラグイン向けに、Firestore用のアダプタを開発しました。