Skip to content

Latest commit

 

History

History
233 lines (161 loc) · 12.2 KB

File metadata and controls

233 lines (161 loc) · 12.2 KB

Sourceglass

画像の来歴を調べる、オープンソースのインスペクタ。

アップロードなし。AI API なし。アカウント登録なし。 画像はブラウザの外に出ません。

sourceglass.pages.dev — 開いて画像を落とすだけです。

ステータス: v0.1.0。 メタデータ層(EXIF / XMP / C2PA)を実装しています。 画素レベルのウォーターマークはまだ調べません。下記のロードマップを参照してください。 設計判断は ai_tasks/ に記録しています。

English

UI は英語と日本語を切り替えられます。既定ではブラウザの言語を使い、手動で選んだ言語は ブラウザに保存します。


Sourceglass とは

Sourceglass は、画像ファイルの中に 実際に記録されている 来歴情報 —— C2PA Content Credentials、EXIF、XMP —— を読み取り、見つかったものをそのまま表示します。

たとえばこういうことが分かります。

  • どんなソフトウェアで作られ、その記録が残っているか
  • C2PA の Content Credentials を持っているか
  • AI による生成・編集を明示的に示す来歴情報があるか
  • ほかにどんなメタデータが生き残っているか

Sourceglass ではないもの

Sourceglass は、画像が AI 生成かどうかを判定しません。 画像に埋め込まれた来歴情報を調べるだけのツールです。

画素を見て推測することはしません。AI probability: 87% のような表示は永久に 行いませんし、「この画像は AI ではありません」と言うこともありません。 手に入る情報からは、そう言い切ることが誠実にはできないからです。

AI関連の来歴情報が検出されなかったことは、その画像がAIによって生成・編集されていない ことを証明するものではありません。メタデータは簡単に消えます。 SNS に投稿した時点で、そのほとんどが失われます。


プライバシー

Sourceglass は静的な Web アプリケーションです。サーバーもデータベースもアカウントもありません。 すべてブラウザの中で完結します。

  • アップロードなし — 画像はどこにも送信されません
  • AI API なし — LLM も第三者の AI 分類サービスも使いません
  • アカウントなし。画像や解析結果を収集しません
  • C2PA の WebAssembly モジュールを含め、解析に使うコードはすべて同一オリジンから配信されます

検証可能なプライバシー

主張するより、証明したいと考えました。Sourceglass は2つの方法でこれを担保しています。

  1. Content Security Policy — すべての通信を自分のオリジンに制限した CSP を配信します。 第三者へのリクエストは、私たちが自制するのではなくブラウザによって遮断されます
  2. 自動テスト — 初期ページの読み込みと、画像を選択して解析結果を表示するまでの全経路で、 Playwright がすべてのネットワークリクエストを記録します。オリジン外への通信が1件でもあれば ビルドは失敗します。

どちらも CI で実行されます。主張を信用する必要はありません。 e2e/privacy.spec.tspublic/_headers の CSP を 読んで確かめてください。

公開中のサイトも、こちらの言い分を信じずに自分で確認できます。

curl -sI https://sourceglass.pages.dev/ | grep -i content-security-policy

対応形式

JPEG · PNG · WebP

AVIF と HEIC は、パーサが対応している範囲でベストエフォートで読み取ります。

読み取る来歴情報

ソース 読み取る内容
C2PA Manifest、Claim、Assertion、Action、digitalSourceType、生成ツール、検証状態
EXIF Software、日時、Artist、Copyright、カメラのメーカー・機種
XMP Creator Tool、編集履歴、編集情報、IPTC 拡張フィールド

AI 関連の判定をどう行っているか

Sourceglass は「AI」という文字列を探しているわけではありません。 C2PA と IPTC の仕様がこの目的のために定義しているフィールドを読んでいます。

中心となるのは digitalSourceType で、IPTC NewsCodes の語彙を使います。

意味 扱い
trainedAlgorithmicMedia 生成 AI によって作られた AI 関連
compositeWithTrainedAlgorithmicMedia 生成 AI の要素を含む合成 AI 関連
algorithmicMedia アルゴリズム生成だが AI ではない(CG など) AI 関連ではない
digitalCapture カメラで撮影された AI 関連ではない

これらを c2pa.actions / c2pa.actions.v2 アサーション、 stds.iptc.photo-metadata アサーション、XMP の Iptc4xmpExt:DigitalSourceType から読み取ります。

見つかった情報は、根拠の強さで区別して表示します。

  • explicit(明示的) — C2PA や IPTC のフィールドによる正式な表明
  • heuristic(推定) — EXIF の Software など自由記述欄に AI ツール名があった場合。 表示はしますが、必ず「検証されていない」と明記します。この種の欄は誰でも書き換えられるためです

すべての検出結果には、根拠となったフィールドを併記します。判断の中身を自分で確認できます。


結果の種類

Sourceglass は3つの結果のいずれかを返します。どれも画像に対する判定ではありません。

結果 意味
AI 関連の記録が見つかった AI による生成・編集を示す記録がありました。ただし、その記録の内容が正しいことまでは保証しません
AI 関連の記録は見つからなかった 来歴情報の中に AI を示すものはありませんでした。これは「AI を使っていない」という意味ではありません
来歴の記録が残っていない 使える情報が見つかりませんでした。この画像については、何も判断できません

Sourceglass は何を調べたかも表示します。 どこを見たのか分からなければ、「見つからなかった」は何の意味も持たないからです。

対応外の形式では、Sourceglass は調べていないと表示し、「来歴の記録が残っていない」とは 表示しません。この区別は意図的です。調べていないことと、調べた上で記録が見つからないことは 異なる結果です。


既知の限界

  • 来歴情報が無いことは、何も証明しません。 メタデータは再保存・リサイズ・画面キャプチャ、 そしてほぼすべての SNS への投稿で失われます
  • メタデータは偽装できます。 「カメラで撮影した」という記録があっても、それが事実とは限りません。 Sourceglass が示すのは「何が記録されているか」であって、「それが正直かどうか」ではありません
  • 署名者の信頼性評価は行いません。 C2PA の署名者がトラストリストに載っているかの評価は 現時点では行わず、得られた検証状態をそのまま表示し、その旨を明記します
  • リモートマニフェストは取得しません。 埋め込みではなく外部に保管された C2PA マニフェストは 取得しないため、検出できません。ネットワーク通信をしない方針の当然の帰結です
  • メタデータ解析の上限は 256 KiB です。 EXIF / XMP / IPTC の合計が 256 KiB (262,144 bytes)を超える場合、それらのメタデータは解析せず、「読み取れなかったもの」として 表示します。上限がない場合、実測で巨大なメタデータがブラウザのメインスレッドを数秒間 停止させたためです。実測記録を参照してください
  • 対応外の形式は調べません。 「来歴の記録が残っていない」とは表示せず、「調べていない」と 表示します。情報が無かった場合と、解析を実行していない場合を区別するためです
  • 初回の C2PA 解析時に、圧縮後約 3 MB の WebAssembly を読み込みます。 同一オリジンから 配信し、最初のページ表示時には読み込みません
  • 画素レベルのウォーターマークはまだ調べません。 下記のロードマップを参照してください

ロードマップ

バージョン 範囲
v0.1 メタデータ層 — EXIF / XMP / C2PA
v0.2 画素層 — TrustMark ウォーターマークのローカル解読
v0.3 未定 — 検出器プラグイン API の公開が有力
将来 SynthID(画像向けのローカル検出器が公開された場合)

ウォーターマークが重要なのは、メタデータを消してしまう再エンコードに耐えるからです。 そして解読は推測ではありません。ペイロードが元の形で取り出せるか、取り出せないか、それだけです。

詳しい根拠: ai_tasks/20260804_sourceglass_mvp_design/roadmap.md


技術構成

  • Vite + TypeScript(strict) + React
  • @contentauth/c2pa-web — C2PA の読み取りと検証(WebAssembly)
  • ExifReader — EXIF / XMP / IPTC の解析

依存パッケージは意図的に最小限にしています。UI ライブラリも i18n ライブラリも状態管理ライブラリも 使っていません。外部と通信するものは一切入れません。

解析エンジンは src/features/provenance/ にあり、React にも DOM にも依存していません。 将来、単体のパッケージとして切り出せる構造になっています。

開発

Node.js 24 を使用してください。

npm install
npm run dev
npm run build       # dist/ に静的ファイルを出力
npm run test        # ユニットテスト(Vitest)
npm run typecheck
npm run lint
npm run design:guard
npm run test:e2e             # 来歴・プライバシー・UI の全検証(Playwright)
npm run test:e2e:provenance  # 来歴解析ハーネス
npm run test:e2e:privacy     # 本番ビルドのプライバシー検証
npm run test:e2e:app         # 本番ビルドのプライバシー・UI 検証

ビルド成果物はただの静的サイトです。ファイルを配信してヘッダを設定できる場所ならどこでも動きます。

コントリビュート

歓迎します。ただし、譲れないルールが1つあります。

推測する機能は追加できません。 画像の内容から AI の使用を推定するもの —— 分類モデル、画素に対するヒューリスティック、第三者の AI 分類 API —— は永久にスコープ外です。 これは現バージョンの制約ではなく、Sourceglass がそういうものだからです。

AI コーディングエージェントを使って作業する場合は、先に AGENTS.md を読んでください。

ライセンス

MIT — LICENSE を参照。

サードパーティコンポーネントは NOTICE に記載しています。

  • @contentauth/c2pa-web — MIT
  • ExifReader — MPL-2.0(無改変で利用。ファイル単位のコピーレフトは本プロジェクトに及びません)
  • テストに使用する C2PA 公式テストファイル — CC BY-SA(無改変で再配布)