Open-source image provenance inspector.
No uploads. No AI APIs. No accounts. Your images never leave your browser.
sourceglass.pages.dev — open it and drop an image in.
Status: v0.1.0. The metadata layer — EXIF, XMP, and C2PA — is implemented. Pixel-level watermarks are not checked yet; see the roadmap below. Design decisions are recorded in
ai_tasks/.
The interface is available in English and Japanese. It defaults to the browser language and remembers a manual selection in the browser.
Sourceglass reads the provenance information that is actually recorded inside an image file — C2PA Content Credentials, EXIF, and XMP — and shows you what it found.
It answers questions like:
- Was this image made with software that recorded what it did?
- Does it carry C2PA Content Credentials?
- Is there provenance data that explicitly indicates AI generation or AI editing?
- What other metadata survived?
Sourceglass does not determine whether an image is AI-generated. It inspects provenance information embedded in the image.
It does not look at pixels and guess. It will never show you "AI probability: 87%", and it will never tell you an image is "not AI". Those claims cannot be made honestly from the information available, so Sourceglass does not make them.
The absence of AI-related provenance does not prove that an image was not generated or edited using AI. Metadata is trivially removed — most of it disappears the moment an image is posted to a social network.
Sourceglass is a static web application. There is no server, no database, and no account. Everything runs in your browser.
- No uploads — your image is never transmitted anywhere
- No AI APIs — no LLM, no third-party AI classification service
- No accounts, no tracking of your images or results
- All analysis code, including the C2PA WebAssembly module, is served from the same origin
We would rather prove this than claim it. Sourceglass enforces it two ways:
- Content Security Policy. The app is served with a CSP that restricts every fetch to its own origin. A request to a third party would be blocked by the browser, not merely discouraged by us.
- Automated tests. Playwright records every network request during both the initial page load and the complete image-inspection path. The build fails if any request leaves the origin.
Both run in CI. If you do not trust the claim, read
e2e/privacy.spec.ts and the CSP in public/_headers.
You can also check the deployed site yourself, without taking our word for it:
curl -sI https://sourceglass.pages.dev/ | grep -i content-security-policyJPEG · PNG · WebP
AVIF and HEIC are read on a best-effort basis where the underlying parser supports them.
| Source | What is read |
|---|---|
| C2PA | Manifests, claims, assertions, actions, digitalSourceType, generator/software, validation state |
| EXIF | Software, dates, Artist, Copyright, camera make/model |
| XMP | Creator tool, history, editing information, IPTC extension fields |
Sourceglass does not scan text for the word "AI". It reads the fields that the C2PA and IPTC specifications actually define for this purpose.
The primary signal is digitalSourceType, using the IPTC NewsCodes vocabulary:
| Value | Meaning | Treated as |
|---|---|---|
trainedAlgorithmicMedia |
Created by generative AI | AI-related |
compositeWithTrainedAlgorithmicMedia |
Contains generative AI elements | AI-related |
algorithmicMedia |
Algorithmically generated, not AI (e.g. CG) | Not AI-related |
digitalCapture |
Captured with a camera | Not AI-related |
It is read from c2pa.actions / c2pa.actions.v2 assertions, from the
stds.iptc.photo-metadata assertion, and from Iptc4xmpExt:DigitalSourceType in XMP.
Findings are separated by how strong the evidence is:
- explicit — a formal declaration in C2PA or IPTC fields
- heuristic — an AI tool name appearing in a free-text field such as EXIF
Software. This is reported, but always labelled as unverified, because such fields can be edited by anyone.
Every finding is shown together with the exact field it came from, so you can check the reasoning yourself.
Sourceglass reports one of three outcomes. None of them is a verdict about the image.
| Outcome | Meaning |
|---|---|
| AI-related provenance found | A record indicating AI generation or editing was present. Sourceglass does not guarantee that the record itself is truthful. |
| No AI-related record found | Nothing in the provenance data indicated AI. This does not mean AI was not used. |
| No provenance record remains | Nothing usable was found. Nothing can be concluded about this image. |
Sourceglass also shows what it checked, because "not found" means nothing without knowing where it looked.
If a file format is unsupported, Sourceglass reports that it was not checked. It does not report that no provenance record remains. This distinction is intentional: not checking and checking without finding a record are different outcomes.
- The absence of provenance proves nothing. Metadata is removed by re-saving, resizing, screenshotting, and by nearly every social platform.
- Metadata can be forged. A record saying an image was captured by a camera does not make it true. Sourceglass reports what is recorded, not whether it is honest.
- No trust evaluation. Sourceglass does not currently evaluate whether a C2PA signer is on a trust list. It reports the validation state it is given, and says so.
- No remote manifests. C2PA manifests stored remotely rather than embedded are not fetched, and therefore cannot be found. This is a deliberate consequence of not making network requests.
- Metadata parsing is limited to 256 KiB. If the combined EXIF, XMP, and IPTC metadata exceeds 256 KiB (262,144 bytes), those metadata sources are not parsed and are shown as "Could not be read." Without a limit, oversized metadata blocked the browser's main thread for several seconds in measurement. See the measurement record.
- Unsupported formats are not checked. The UI says they were not checked rather than saying that no provenance record remains. This preserves the difference between missing information and an inspection that did not run.
- The first C2PA inspection loads approximately 3 MB of compressed WebAssembly. It is served from the same origin and is not loaded with the initial page.
- Pixel-level watermarks are not yet checked. See the roadmap below.
| Version | Scope |
|---|---|
| v0.1 | Metadata layer — EXIF, XMP, C2PA |
| v0.2 | Pixel layer — TrustMark watermark decoding, run locally |
| v0.3 | Undecided — likely a public detector plugin API |
| Future | SynthID, if and when a local detector for images is published |
Watermarks matter because they survive the re-encoding that destroys metadata. Decoding one is still a fact, not a guess: either the payload comes out intact or it does not.
Full reasoning: ai_tasks/20260804_sourceglass_mvp_design/roadmap.md
- Vite + TypeScript (strict) + React
@contentauth/c2pa-web— C2PA reading and validation (WebAssembly)ExifReader— EXIF / XMP / IPTC parsing
Dependencies are kept deliberately small. No UI framework, no i18n library, no state library. Nothing that phones home.
The analysis engine lives in src/features/provenance/ and has no dependency on React or
the DOM, so it can be extracted as a standalone package later.
Use Node.js 24.
npm install
npm run devnpm run build # static output in dist/
npm run test # unit tests (Vitest)
npm run typecheck
npm run lint
npm run design:guard
npm run test:e2e # all provenance, privacy, and UI checks (Playwright)
npm run test:e2e:provenance # provenance harness
npm run test:e2e:privacy # production build: privacy checks
npm run test:e2e:app # production build: privacy and UI checksThe build output is a plain static site. Host it anywhere that can serve files and set headers.
Contributions are welcome, with one hard rule:
No feature may guess. Anything that infers AI usage from image content — a classifier, a heuristic on pixels, a third-party AI classification API — is out of scope permanently. That is not a limitation of the current version; it is what Sourceglass is.
If you are working on this repo with an AI coding agent, read AGENTS.md first.
MIT — see LICENSE.
Third-party components are listed in NOTICE, including:
@contentauth/c2pa-web— MITExifReader— MPL-2.0 (used unmodified; file-level copyleft does not extend to this project)- C2PA public test files used as fixtures — CC BY-SA, redistributed unmodified