Compare commits

..
Author SHA1 Message Date
Victor Kuznetsov 4241a01659 Release 0.45.1 2026-10-08 16:42:57 -07:00
Victor Kuznetsov c37378b347 Merge pull request #117 from dichiara19/fix/sdxl-zimage-global-offload
Stream the sdxl-zimage global stack on cards below 12 GiB
2026-10-08 16:34:43 -07:00
Victor Kuznetsov 8cb99b73b2 Fix SDXL offload placement on the current CUDA device 2026-10-08 16:17:11 -07:00
Giuseppe G. Di Chiara c45e6db3e4 Stream the sdxl-zimage global stack on cards below 12 GiB
The SDXL global stack (fp16 UNet, Canny ControlNet, both text encoders, VAE)
is ~8.8 GiB and was always moved to CUDA with .to(device), so it could not
fit an 8 GiB card and --cpu-offload never reached it. Under the Windows
display driver, WSL2 included, the overflow spilled into shared system
memory and the four-step pass ran for over ten minutes instead of failing.

Residency now follows the same rule as the Qwen stack: an explicit request
wins, otherwise the card's total VRAM decides against
RESIDENT_SDXL_GLOBAL_MIN_VRAM_GIB. Below it the Lightning LoRA is fused on
the CPU and the stack is streamed with enable_sequential_cpu_offload, the
fastest placement that completed on every run of an 8 GiB card with 16 GiB
of system RAM. sdxl-zimage joins GLOBAL_OFFLOAD_PROFILES, so the
--cpu-offload warning now fires for chroma-zimage only.
2026-10-08 23:27:55 +02:00
Victor Kuznetsov 37fb080c74 Merge pull request #116 from wiltodelta/dependabot/uv/minor-and-patch-931ef6a6bd 2026-10-08 10:30:09 -07:00
dependabot[bot] 954298aa14 Bump the minor-and-patch group with 3 updates
Bumps the minor-and-patch group with 3 updates: [python-dotenv](https://github.com/theskumar/python-dotenv), [openai](https://github.com/openai/openai-python) and [ruff](https://github.com/astral-sh/ruff).


Updates `python-dotenv` from 1.2.3 to 1.2.4
- [Release notes](https://github.com/theskumar/python-dotenv/releases)
- [Changelog](https://github.com/theskumar/python-dotenv/blob/main/CHANGELOG.md)
- [Commits](https://github.com/theskumar/python-dotenv/compare/v1.2.3...v1.2.4)

Updates `openai` from 3.22.1 to 3.24.0
- [Release notes](https://github.com/openai/openai-python/releases)
- [Changelog](https://github.com/openai/openai-python/blob/main/CHANGELOG.md)
- [Commits](https://github.com/openai/openai-python/compare/v3.22.1...v3.24.0)

Updates `ruff` from 0.16.9 to 0.16.10
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/0.16.9...0.16.10)

---
updated-dependencies:
- dependency-name: python-dotenv
  dependency-version: 1.2.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
- dependency-name: openai
  dependency-version: 3.24.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: ruff
  dependency-version: 0.16.10
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-10-07 08:48:45 +00:00
Victor KuznetsovandClaude Opus 5.5 10c7775990 Hide maintainer skills from public skill discovery
The skills CLI discovers every SKILL.md under .claude/skills, so
provider-oracles and signal-discovery were offered by `npx skills add`
and listed on skills.sh beside the published skill. Mark both
metadata.internal, the CLI's documented hide flag, and fail the suite
on any project skill that lacks it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 20:04:18 -07:00
Victor KuznetsovandClaude Opus 5.5 3f6447b23d Record how to run the gate from an agent session
The full gate outlasts the agent's 10-minute foreground shell cap, so it must
run detached with its exit code written to a file. A stray run is stopped by
its own PID, because a pattern kill also ends other sessions' suites.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 18:25:14 -07:00
Victor KuznetsovandClaude Opus 5.5 cc63bfd7bf Release 0.45.0
Bump the package to 0.45.0 and the agent skill to 1.0.11. The skill now names
the dola and workbuddy image mark keys, which 0.44.0 rejects, so the probe's
MIN_CLI_VERSION rises to 0.45.0 and both keys carry a "since CLI" note that
the floor test reads.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 17:45:18 -07:00
Victor Kuznetsov 898f8be789 Add AI disclosure layouts, tighten detection and provenance warnings 2026-10-04 11:03:37 -07:00
Victor KuznetsovandClaude Opus 5.5 72752feb33 Scan uv.lock in CI and add a security policy
Add a CI job running the maintain.sh uv-secure scan, pinned to the gate by
a parity test, and a SECURITY.md with private reporting and dependency
remediation. Refresh the security-gate block record for accelerate 1.15.0.

Closes #114

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 10:33:50 -07:00
Victor KuznetsovandClaude Opus 5.5 70adddf960 Record why Qwen-Image-2.1 is not a regeneration profile
Open weights remove the hosted-only objection to the 2.x line, but the
Diffusers pipeline has no strength or latent noise-mask input and the Qwen
Research License is non-commercial (issue #111).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 10:33:49 -07:00
Victor Kuznetsov 01a2665181 Reconcile research follow-up status 2026-10-01 22:10:00 -07:00
Victor Kuznetsov 0c3e0fa415 Release 0.44.0 2026-10-01 14:24:27 -07:00
Victor Kuznetsov b3b868153f Record Google Photos checks and continue across provider accounts 2026-10-01 13:42:21 -07:00
Victor Kuznetsov 304bd071c0 Unify TC260 producers and strengthen provenance regression coverage
Share producer identities across mark routing, attribution, and pinned signers.
Preserve nested Honor TC260 fields and report unsupported RSA signatures.
Document the Google Photos checks and public sample search.

Use an SDK-signed synthetic carrier for negative EKU checks after the original
Microsoft certificates expired. Skip boundary regex scans when no C2PA
soft-binding identifier is present.
2026-10-01 11:30:32 -07:00
Victor Kuznetsov 2e26df1f21 Restore C2PA certificate validation and refresh compatible dependencies 2026-09-30 16:58:43 -07:00
Victor KuznetsovandClaude Opus 5.5 d800ec9455 Verify TC260 SecurityData label signatures against a pinned MiniMax key
MiniMax signs its TC260 label with SM3withSM2 per TC260-PG-202511A. A
verification-only SM3/SM2 (no dependency provides the SM2 curve) checks the
appendix A.1 label message; a signature under the pinned MiniMax key is a
high-confidence aigc_signature signal, a failing one is a caveat, and every
result is the aigc_signature metadata marker. Pinned by the GB/T 32905 SM3
vectors, OpenSSL's SM2 verify vectors and real MiniMax files. Over 411 local
files the only verdict-record change is the marker on nine MiniMax videos.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 15:36:08 -07:00
Victor KuznetsovandClaude Opus 5.5 ef7b972ed1 Sync the C2PA soft-binding snapshot to d36d1c1
The upstream list widened com.museblossom.contentsdefence.1 from image to
audio, image and video. Verdicts over 411 local files are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 15:36:08 -07:00
Victor KuznetsovandClaude Opus 5.5 b96ede6f44 Record the verified MiniMax TC260 SecurityData signatures
MiniMax writes a TC260-PG-202511A SecurityData object with SM3withSM2
signatures. The label signature verifies on all four local MiniMax videos
against the guide's appendix A.1 message, and the Binding signature over the
compact Bindings entry; the SM3 content hash does not match a naive selection.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 22:16:42 -07:00
Victor KuznetsovandClaude Opus 5.5 ca59c032a1 Release 0.43.0
Bump the package to 0.43.0 and the agent skill to 1.0.10. The skill now names
the wan image and vidu video mark keys, which 0.42.0 rejects, so the probe's
MIN_CLI_VERSION rises to 0.43.0 and both keys carry a "since CLI" note that
the floor test reads.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 21:39:08 -07:00
Victor Kuznetsov c5e138357e Record Z-Image-Turbo global-stage rejection 2026-09-29 20:55:59 -07:00
Victor Kuznetsov 21661bea35 Reproduce re-watermarking and verify SynthID coexistence 2026-09-29 13:50:52 -07:00
Victor Kuznetsov 5cb4f2f808 Add Perth and PixelSeal benchmark oracles 2026-09-28 11:14:28 -07:00
Victor Kuznetsov 33f748b32a Record VACE and ROSE video inpainting results 2026-09-28 10:54:19 -07:00
Victor KuznetsovandClaude Opus 5.5 742a0dccab Align the remaining klein and color-restoration wording with the results
module-internals still called FLUX.2 klein pending; the sweep still counted
three inconclusive Gemini rows where only one was an explicit tool verdict,
and the removal page stated a Google chroma leak the data only warns of.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 21:24:59 -07:00
Victor KuznetsovandClaude Opus 5.5 b5fc3ef9a6 Add face and text fidelity to the FLUX.2 klein comparison
fidelity_metrics.py at each engine's clean strengths: klein keeps Latin and
Cyrillic sign lettering better on two Google carriers, but loses every face
comparison and the verified CJK text, which the 512-pixel LPIPS had hidden.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 18:59:06 -07:00
Victor KuznetsovandClaude Opus 5.5 6eb1a94799 Close the FLUX.2 klein Google measurement
The fourth Google carrier clears at 0.25, so the klein operating point with
the usual cross-source margin is 0.40, where the limiting carrier is at
LPIPS 0.270 against qwen-zimage's 0.183. klein is not a replacement global
stage for either vendor. Also record that Gemini's image-check allowance is
per account and the new "checks on similar images" quota wording.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 16:02:33 -07:00
Victor KuznetsovandClaude Opus 5.5 32791ee832 Record the FLUX.2 klein Google brackets from four Gemini accounts
Three of four Google carriers clear with klein at or below 0.20, where it
matches qwen-zimage's PSNR at 0.35, beats its LPIPS, and keeps the objects
qwen-zimage redraws. The fourth is detected at 0.10 and inconclusive at 0.20,
so there is no Google operating point yet.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 15:49:57 -07:00
Victor KuznetsovandClaude Opus 5.5 a103b4ec15 Record the FLUX.2 klein global-stage measurement
Stock Flux2KleinInpaintPipeline feeds the clean source back as reference
tokens, so it copies the source and OpenAI SynthID survives strength 0.30.
Without those tokens klein clears OpenAI between 0.05 and 0.20, at lower
fidelity than qwen-zimage at its floor. Google is unmeasured: the Gemini
Verify AI tool answered with a tool error or quota limit, which also casts
doubt on two of the earlier color-restoration "inconclusive" rows.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 15:17:26 -07:00
Victor KuznetsovandClaude Opus 5.5 7341e1a648 Record the CIELAB color-restoration measurement after regeneration
Transplanting the source's a,b channels onto qwen-zimage outputs at the vendor
floors cut CIEDE2000 on all seven tracked originals, kept every OpenAI API
verdict not_detected, but left three of four Gemini checks inconclusive and
painted old object colors onto redrawn ones. Not shipped.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 14:49:22 -07:00
Victor Kuznetsov dfbaa018c6 Merge pull request #112 from wiltodelta/docs/library-research-landscape
Research sweep, provider captures, and provenance attribution fixes
2026-09-27 11:39:15 -07:00
Victor KuznetsovandClaude Opus 5.5 e310a22bd8 Compare capture paths in POSIX form on every platform
The manifest stores forward-slash paths, and str() of a Windows path uses
backslashes, so the index test failed on both Windows CI jobs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 10:11:54 -07:00
Victor KuznetsovandClaude Opus 5.5 f855c4700f Merge origin/main into docs/library-research-landscape
Main's claim_generator_platform and c2pa_vendor_platform now use the
branch's whole-word registry match, which replaces
claim_generator_word_platform. The branch's provenance veto covers every
video mark and made main's Veo-over-Sora override unreachable, so the
override is removed. Main's credential rule carries into the veto: an
invalid credential vetoes nothing. Provenance that confirms the mark's
own vendor also vetoes nothing. Over 78 local videos with a C2PA AI
claim, the only verdict changes against main are Kling/Hailuo false
positives on Veo and FLUX clips that the veto now removes. C2PA verdicts
over 1,379 files are unchanged against the pre-merge branch.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-26 23:52:29 -07:00
Victor KuznetsovandClaude Opus 5.5 5a0f771ed7 Close the remaining raw-byte identity scans and unify two rules
- A decoded manifest no longer takes its generator from a raw
  claim_generator CBOR value or a soft binding from raw bytes. Device tokens
  (NIKON, Pixel Camera, sony.sig) stay a byte scan, since the decoded strings
  do not carry them, but read the manifest store: an EXIF Make beside an
  unrelated AI manifest is not a verified capture. The source-kind scan keeps
  the whole buffer because it also reads IPTC digitalSourceType in XMP.
- The byte fallback's c2pa.ai-disclosure kind now uses the structured rule:
  human_validated beside prompt_guided is a generation, not an enhancement.
- Wan and Yuanbao share BottomRightAnchoredEngine instead of two copies of
  the corner gate. The Yuanbao anchor test shifted the mark outside the locate
  window, so it passed with or without the gate; it now shifts it inside.

Verdicts over 1,379 C2PA files, 468 fixture and capture files, and Wan and
Yuanbao detections over 285 images are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-26 22:19:30 -07:00
Victor KuznetsovandClaude Opus 5.5 4931b93097 Add a Higgsfield DoP capture
Higgsfield's own DoP model ("Higgsfield Lite" in the web app, job model
image2video/lite) is not exposed by the MCP connector, so the capture was made
in the web app on a JPEG frame after a first job on a PNG failed and was
refunded. Like Genjutsu, the output carries no provenance: no C2PA, no TC260
label and no visible mark, only a Lavf re-mux.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-26 21:17:27 -07:00
Victor KuznetsovandClaude Opus 5.5 509ce633a3 Judge decoded C2PA manifests on their decoded strings alone
Extend the whole-word rule to every identity lookup. Once the reader has
decoded a manifest, no identity is re-derived from its raw bytes: not the
signer, not a signer-platform token, not the AI-tool fallback for the
generator, and not the SynthID vendor inference, in identify and in
metadata.synthid_source alike. The byte scans read the manifest store only
when the reader could not open it.

Claim-generator tokens match as whole words through one shared
claim_generator_word_platform (suno no longer matches Sunoco), for images
and video alike.

The verdict now reads SynthID from the decoded C2PA info when the metadata
dict lacks it; three synthetic Google Photos tests had relied on the byte
fallback for that.

Verdicts over 1,379 C2PA files and 468 fixture and capture files are
unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-26 20:19:13 -07:00
Victor KuznetsovandClaude Opus 5.5 b02eb12cb2 Match registry tokens as whole words in decoded manifest strings
Registry tokens were raw substrings, so the Canva token matched the "Nova
Canvas" agent of an Amazon Bedrock image. Raw manifest bytes cannot take a
word-boundary rule: across the 1,379 C2PA files in the local corpus, 374 of
37,325 store matches had a letter or digit beside them, nearly all CBOR text
headers and DER tags. Decoded strings have no such framing.

- Match signer, claim-generator, agent and video-marker strings with
  registry_word_matches.
- When the reader decoded the manifest, never re-derive the signer from raw
  bytes: an unregistered signer stays unknown. Bytes decide only for
  manifests the reader cannot open.
- Add fal's signer "Features & Labels"; its attribution had relied on the byte
  fallback finding the "fal-ai" generator prefix.

Verdicts over 468 images and 365 videos are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-26 17:38:35 -07:00
Victor KuznetsovandClaude Opus 5.5 fb92c7dbc8 Attribute Amazon Bedrock C2PA and scope the signer fallback scan
Nova Canvas images published in aws-samples were reported as Canva: with no
Amazon row, the byte fallback matched the Canva token inside the "Nova
Canvas" software agent. Add an Amazon Web Services row ahead of Canva, which
also names Nova Reel video.

When the reader cannot open a manifest, scan for signers in the C2PA store
the container locates (JPEG APP11, PNG caBX) instead of the whole metadata
region. A vivo X300 camera capture was labeled "C2PA signer: Adobe" from its
XMP toolkit string. The SynthID provenance scan reads the same store.

Adds the Nova Canvas and Nova Reel samples as MIT-0 fixtures and records the
public-sample search for the other conformance-list signers.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-26 16:21:13 -07:00
Victor KuznetsovandClaude Opus 5.5 7ba07869d2 Add paid-service captures, aggregator attribution, and provenance vetoes
Collect provider samples from Higgsfield, Runway and Dreamina plus Google
Photos, Gemini, Grok and YouTube re-encodes into data/captures/2026-09 with
a hash-checked manifest, and use them to fix attribution and false positives:

- Attribute aggregator outputs: Higgsfield job metadata, Dreamina's
  re-signed manifests, Runway's own C2PA signer, TC260 video producers.
- Veto any visible video mark when a valid C2PA claim names another vendor
  (a Gemini Omni clip read as Sora on steam), and gate Kling and Hailuo
  matches on edge, anchor and white-label evidence.
- Veto the Gemini sparkle when trusted provenance names another vendor.
- Report SynthID as present for Google Photos AI edits: Google's checker
  found it on all four measured edits, though manifests record no action.
- Add Vidu video and Wan image marks, TC260 audio placements, and record
  the AIGC key in metadata records.
- Document the research sweep, the Dreamina badge decision, and verified
  Google statements on SynthID in Photos.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-26 14:32:53 -07:00
Victor Kuznetsov d25cada76b Export calibrated image source providers 2026-09-25 14:38:04 -07:00
Victor Kuznetsov b1f15818d7 Add pinned OpenAI and Google image source classifier 2026-09-25 14:23:01 -07:00
Victor Kuznetsov 317124ee85 Keep model prereleases out of package distribution 2026-09-25 13:54:06 -07:00
Victor Kuznetsov 0d468b6022 Add verified publication path for image source model 2026-09-25 13:25:20 -07:00
Victor KuznetsovandClaude Opus 5.5 1dc70df289 Upgrade to OpenCV 5 with frozen Hershey templates and tighten video marks
- Lock OpenCV 5 and cap NumPy below 2.4 through uv constraint-dependencies so
  PaddleX 3.7 keeps resolving; Dependabot ignores mirror the cap.
- OpenCV 5 draws Hershey putText glyphs differently, so the Dola and Kling
  video templates ship as committed OpenCV 4 renders with a recipe script, and
  the OpenArt alpha recipe now refuses any OpenCV but 4.x.
- Break Sora/Veo cross-matches in favor of Veo under valid Google AI-video
  provenance, and require the full Sora mascot shape for mascot-only matches.
- Let the Doubao engine detect marks tinted by saturated backgrounds.
- Share C2PA claim-generator, credential-level and vendor-platform helpers,
  JPEG suffixes and the DCT basis instead of per-module copies.
- Log model download failures, document the optional GITHUB_TOKEN, mark the
  photo and source classifier model cards archived, and refresh the lock.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-23 19:19:00 -07:00
Victor Kuznetsov 6f629a4ea6 Release 0.42.0 2026-09-22 09:25:21 -07:00
Victor KuznetsovandClaude Sonnet 5 e3bbe88155 Authenticate C2PA registry-sync GitHub API calls to fix CI rate-limiting
scripts/sync_c2pa_soft_bindings.py --check hits api.github.com to resolve
the latest upstream commit SHA, unauthenticated. That endpoint's 60/hour
rate limit is per source IP, which GitHub Actions runners exhaust fast
since many workflows share the runner IP pool -- this was failing the
lint job with "403: rate limit exceeded" on every push regardless of
whether the change touched anything related.

Send an Authorization: Bearer header built from GITHUB_TOKEN/GH_TOKEN
when set, scoped to api.github.com only (raw.githubusercontent.com is a
separate, much higher-limit CDN and doesn't need it). Wire the workflow's
own GITHUB_TOKEN secret into that step's env so CI actually has one to
send, raising the limit to 5000/hour.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-22 08:11:48 -07:00
Victor Kuznetsov be8f24c7cb Raise OpenAI Qwen strength floor 2026-09-21 23:02:49 -07:00
Victor KuznetsovandClaude Sonnet 5 9990f3e6ca Fix missing OpenArt gallery fixture and alternate-size entry
The OpenArt visible-mark engine (commit 9d29d2c) was registered without
a data/fixtures/visible/openart/example.png gallery canary and without
an _ALTERNATE_SIZE entry in test_visible_fill_quality.py, breaking
TestGallery::test_every_registered_mark_has_an_example,
TestGallery::test_engine_detects_its_own_example[openart], and
test_cv2_mask_quality_smoke[alternate-openart] on every CI platform.
Generate the fixture via render_visible_examples.py (self-detects at
conf=0.968) and add the missing size entry.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-21 22:37:21 -07:00
Victor KuznetsovandClaude Sonnet 5 83be3a8926 Add generic bare "AI生成" text-mark detector (brand-less TC260 fallback)
Every existing text-mark engine (Doubao, Jimeng, Qwen, Baidu, Kling,
Yuanbao) is tuned to one vendor's exact wordmark silhouette, so none of
them match a bare "AI生成" strip with no brand name in front of it.
Confirmed on raiw-app production: a free `visible` run left a bottom-right
"AI生成" watermark completely unremoved because no detector fired.

Research found the wording is not tied to one dominant generator: vivo's
own support documentation confirms its Gallery stamps a bare "AI生成"
label after AI消除/AI扩图/大片模式 editing, and independent reporting
documents the same watermark on Xiaomi Gallery's AI-edit output. Since
the label is a GB 45438-2025/TC260 compliance stamp rather than one
vendor's brand mark, this adds one generic fallback (`generic_ai_label`)
instead of another per-OEM tuned config.

The detection silhouette is font-rendered (no logo element to capture)
via the shared scripts/render_vendor_silhouettes.py pipeline already
used for Qwen/Baidu/Kling/Yuanbao's own text-only marks. Calibration is
synthetic-only (no real captured generator screenshot was available);
the module docstring and DETECT_NCC_THRESHOLD comment carry that caveat
explicitly and this should be recalibrated once real captures exist.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-21 22:01:10 -07:00
Victor KuznetsovandClaude Sonnet 5 9d29d2c777 Add OpenArt visible watermark detection and removal
OpenArt.ai stamps free-plan generations with a semi-transparent white
"OpenArt" wordmark (bowtie/infinity icon + brand name) placed near the
CENTER of the frame rather than in a corner. Confirmed from a customer-
reported raiw-app production case where the mark went completely
undetected and unremoved, with no C2PA/EXIF/TC260 signal for identify
to fall back on.

- Add a new "cc" (frame-center) corner mode to the shared
  TextMarkConfig/TextMarkEngine base, alongside the existing
  corner/edge anchors.
- Add openart_engine.py, following the existing text-mark engine
  pattern. No real capture exists (OpenArt requires an account, out of
  scope to create), so the bundled alpha asset is a procedural
  reconstruction of the public logo and the NCC threshold is an
  explicitly-labeled provisional guess, not a measured calibration.
- Register the mark in watermark_registry.py, which auto-derives
  identify's platform attribution.
- Add tests/test_openart_engine.py (synthetic composites only) plus
  registry/identify test coverage, and document the mark and its
  calibration caveats in README.md, docs/supported-signals.md,
  docs/module-internals.md, and the skill's commands.md.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-21 21:51:46 -07:00
Victor KuznetsovandClaude Sonnet 5 7a6491fdc1 Document Gemini sparkle decorative-glyph false positive, add observability
A decorative sparkle/glint glyph in stylized typography (e.g. a book-cover
title) can clear the visible Gemini sparkle's false-positive gate at
confidence just under _SPARKLE_FP_CONF, since it shares the same bright,
near-white, sharp four-point signature the gate uses to recognize a genuine
sparkle. Confirmed against a raiw-app production incident (2026-08-27) where
this caused the removal step to permanently smudge unrelated cover art.

Investigated tightening _SPARKLE_FP_CONF and the margin/gradient/saturation
checks (plus a prototyped local edge-density signal); each was disproved by
a constructed counter-example showing a genuine weak Gemini sparkle over a
noisy/textured photo background lands in the same confidence band with the
same signature, so no safe targeted fix exists without a real labeled
corpus. No detection/removal behavior changed.

Adds DEBUG logging at the exact FP-gate bypass path for future calibration,
a regression test (TestDecorativeGlyphFalsePositive) pinning the confirmed
false positive and the blocking counter-example, and a docs record of the
finding in the Gemini sparkle section of module-internals.md.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-21 21:41:59 -07:00
Victor Kuznetsov 37431c9aeb Pin Web oracle proxy sessions per batch 2026-09-16 16:17:36 -07:00
Victor Kuznetsov 804735aa48 Release 0.41.1 2026-09-16 10:42:15 -07:00
Victor Kuznetsov e3f714dcd2 Merge pull request #109 from wiltodelta/dependabot/uv/minor-and-patch-138d877835
Bump the minor-and-patch group with 6 updates
2026-09-16 09:25:05 -07:00
dependabot[bot] 7169780dd0 Bump the minor-and-patch group with 6 updates
Bumps the minor-and-patch group with 6 updates:

| Package | From | To |
| --- | --- | --- |
| [accelerate](https://github.com/huggingface/accelerate) | `1.14.0` | `1.15.0` |
| [huggingface-hub](https://github.com/huggingface/huggingface_hub) | `1.30.0` | `1.31.0` |
| [onnxruntime](https://github.com/microsoft/onnxruntime) | `1.29.0` | `1.30.0` |
| [openai](https://github.com/openai/openai-python) | `3.9.0` | `3.13.0` |
| [ruff](https://github.com/astral-sh/ruff) | `0.16.6` | `0.16.7` |
| [pyright](https://github.com/RobertCraigie/pyright-python) | `1.1.411` | `1.1.414` |


Updates `accelerate` from 1.14.0 to 1.15.0
- [Release notes](https://github.com/huggingface/accelerate/releases)
- [Commits](https://github.com/huggingface/accelerate/compare/v1.14.0...v1.15.0)

Updates `huggingface-hub` from 1.30.0 to 1.31.0
- [Release notes](https://github.com/huggingface/huggingface_hub/releases)
- [Commits](https://github.com/huggingface/huggingface_hub/compare/v1.30.0...v1.31.0)

Updates `onnxruntime` from 1.29.0 to 1.30.0
- [Release notes](https://github.com/microsoft/onnxruntime/releases)
- [Changelog](https://github.com/microsoft/onnxruntime/blob/main/docs/ReleaseNotesWorkflow.md)
- [Commits](https://github.com/microsoft/onnxruntime/compare/v1.29.0...v1.30.0)

Updates `openai` from 3.9.0 to 3.13.0
- [Release notes](https://github.com/openai/openai-python/releases)
- [Changelog](https://github.com/openai/openai-python/blob/main/CHANGELOG.md)
- [Commits](https://github.com/openai/openai-python/compare/v3.9.0...v3.13.0)

Updates `ruff` from 0.16.6 to 0.16.7
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/0.16.6...0.16.7)

Updates `pyright` from 1.1.411 to 1.1.414
- [Release notes](https://github.com/RobertCraigie/pyright-python/releases)
- [Commits](https://github.com/RobertCraigie/pyright-python/compare/v1.1.411...v1.1.414)

---
updated-dependencies:
- dependency-name: accelerate
  dependency-version: 1.15.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: huggingface-hub
  dependency-version: 1.31.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: onnxruntime
  dependency-version: 1.30.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: openai
  dependency-version: 3.13.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: ruff
  dependency-version: 0.16.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
- dependency-name: pyright
  dependency-version: 1.1.414
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-09-16 08:49:01 +00:00
Victor Kuznetsov c7021b900b Add source pipeline classifier runtime 2026-09-15 23:17:48 -07:00
Victor Kuznetsov 3f55df6f99 Correct source classifier activation schema 2026-09-15 22:55:46 -07:00
Victor Kuznetsov 4795149d34 Publish source classifier model card 2026-09-15 22:36:34 -07:00
342 changed files with 13945 additions and 2385 deletions

No files matched your search

+1 -1
View File
@@ -6,7 +6,7 @@
},
"metadata": {
"description": "Agent skill and Claude Code plugin for the remove-ai-watermarks CLI.",
"version": "1.0.9"
"version": "1.0.11"
},
"plugins": [
{
+22 -5
View File
@@ -27,10 +27,12 @@ top-level Python API, and runtime detection/removal pipelines.
The unified maintainer entry point is `scripts/provider_oracles.py`; its workflow and
slot schema live in `docs/provider-oracles.md`. Multi-account and multi-network work
selects one named slot explicitly from the gitignored repository-local
`.oracle-slots.json` by default and snapshots it into the immutable batch manifest.
Never commit the local slot file.
Do not add account or IP rotation, rate-limit failover, or cross-session result merging.
selects each named slot explicitly from the gitignored repository-local
`.oracle-slots.json` by default and snapshots it into a separate immutable batch
manifest. A bounded provider check may continue through its finite set of authorized
account slots after a refusal; do not add new logins, IP rotation, network-route
failover, unbounded retries, or cross-session result merging. Never commit the local
slot file.
Every manual result stays bound to the exact sanitized upload hash and preserves the
provider response verbatim.
@@ -47,6 +49,10 @@ real browser. Proxy credentials are read only through a slot's named environment
and never enter a manifest or log. Dotenv interpolation may derive routed proxy URLs from
one secret key without mutating the process environment. A selected proxy context may
accept that proxy's TLS interception certificate; direct contexts keep normal TLS checks.
ThorData rotating endpoints are pinned to one manifest-derived sticky session for the
life of a Web batch so one browser context does not change exit identity between page
requests. This is route continuity, not account or IP failover; a refusal still ends on
the selected slot and never selects another route automatically.
Upload readiness is surface-specific: OpenAI reaches it at page load but keeps background
requests alive, while Microsoft and Meta require network idle. Preserve exact provider
errors as indeterminate evidence rather than retrying or interpreting them as clean.
@@ -73,9 +79,12 @@ The same rule applies to install hints: name the extra that actually makes the c
Run `bash maintain.sh` from the repository root. The authoritative type gate is scoped to `src/`; full-project Pyright can exhaust Node memory on the ML dependency graph.
The full gate outlasts the agent's 10-minute foreground shell cap, which kills it mid-suite. Run it detached under `nohup caffeinate -dimu` with its exit code written to a file and poll that file. To stop a stray run, kill its own PID, never `pkill -f pytest`, which also takes down other sessions' suites on the machine.
The security scanner's exit status is authoritative, including a failure after a success
message. `tests/test_maintenance.py` checks clean, vulnerable, and broken scanner
runs through the real shell entry point. Recheck unresolved advisories using the
runs through the real shell entry point, and pins the CI `security` job to the
same scanner line with no `continue-on-error`. Recheck unresolved advisories using the
procedure in `docs/development.md`; do not revive the old text-matching bypass.
Boundary modules for cv2, Torch, and Diffusers may carry narrow per-file relaxations for unknown third-party types. Keep pure-logic files strict, preserve the local piexif stub, and fix real errors before widening a pragma.
@@ -129,6 +138,10 @@ Do not classify an entire module as untestable because its main path downloads a
- the photo-classify gate in `test_classify.py`: DEFINITELY is ridge AND MLP,
POSSIBLY does not emit a provider, and `identify` does not import
`remove_ai_watermarks.classify`.
- the source-export classifier in `test_source_classify.py`: the Hub revision
and artifact hash are immutable, the pickle-free schema and exact GELU are
validated, threshold mutation changes the real decision, and `identify`
never consumes the result as watermark evidence.
- the `InvisibleOptions` defaults, in `test_api.py`. When one signature promises to
mirror another, compare them field by field rather than pinning the values you happen
to know about, so the next field added on one side and not the other fails at the
@@ -295,3 +308,7 @@ explicit unchanged decodes when comparing stored pixels. Execute Ubuntu Bash
workflow harnesses only on POSIX hosts with Bash; keep their pure Python checks
active on every platform. Round floating-point image output before uint8
conversion when quantization must preserve constant values across OpenCV builds.
OpenCV 5 draws Hershey `putText` glyphs smaller and heavier than 4.x, so a
calibrated template drawn with `putText` ships as a committed PNG whose recipe
refuses any OpenCV but 4.x (`scripts/render_video_hershey_templates.py`,
`scripts/build_openart_alpha.py`); never render one at import time.
+50 -12
View File
@@ -1,6 +1,8 @@
---
name: provider-oracles
description: Run hash-bound Google, OpenAI, Microsoft, or Meta watermark-oracle checks for this repository. Use for provider verification, multi-account Gemini checks, isolated Playwright checks, or recording oracle evidence.
metadata:
internal: true
---
# Provider oracles
@@ -14,9 +16,24 @@ Named slots live in the gitignored repository-local
pass `--slots PATH` only to override the local path.
Never substitute one provider's negative verdict for another provider's signal.
Do not optimize candidates adaptively against an external oracle. A retry,
different account, or different network is a new explicit operator decision,
not automatic fallback.
Do not optimize candidates adaptively against an external oracle.
## Account continuation
A request to verify a bounded set of files with a provider authorizes using that
provider's configured account slots unless the user limits the account scope.
Before starting, identify the finite set of available authenticated slots and
prepare one immutable batch per slot. After a quota refusal or service failure,
record the exact response, leave that slot's remaining rows unsubmitted, and
continue automatically through the remaining authorized slots. Do not stop to
request permission for each account or file already covered by the task.
Submit each frozen artifact at most once per slot in that pass. Preserve
inconclusive results and disagreements between accounts. Stop when the bounded
plan is complete or no authorized usable slot remains; report remaining rows.
New logins, another provider, a new network route, or another pass after the plan
is exhausted require authorization unless already requested. Account
continuation does not authorize changing candidate pixels or erasing failures.
## Default surface priority
@@ -44,18 +61,30 @@ Playwright CLI runner, copied cookies, or a new login.
real Chrome profile and navigate directly to
`https://gemini.google.com/u/<google_account_index>/app`.
3. Prepare an immutable `gemini-web` batch outside the repository.
4. Before each upload, request the action-time confirmation required for sending
that exact prepared file to Gemini. Do not upload the source path directly.
5. Attach one prepared upload and ask: `Was this image/video/audio created or
edited by Google AI?`
For every image check, visually inspect the source first. Remove every visible
AI-provider logo or label with the project's visible-mark remover, derive all
paired controls and candidates from that cleaned image, and let `prepare` strip
AI metadata. Inspect the prepared upload again and do not submit it if a visible
provider mark remains. A model answer based on a visible logo is not a SynthID
result.
4. Confirm that the prepared files and provider are covered by the user's
request or existing upload approval. Ask only if that scope is missing or
changed; do not request confirmation again for each file or account in the
authorized plan. Do not upload the source path directly.
5. Attach one prepared upload and ask: `Does this image/video/audio contain a
SynthID watermark? Use the SynthID verification tool only; do not infer from
visible content, logos, text, or metadata.` Do not substitute a general
Google-AI-origin question; it permits visual-content reasoning instead of a
SynthID verdict.
6. Read the settled SynthID tool outcome, not the surrounding model reasoning.
Preserve unclear, quota, and refusal wording rather than interpreting it as
clean.
7. Record the verbatim response and verify the completed batch.
If the selected Chrome profile or `/u/N/` account is not already authenticated,
stop and ask the user to select the intended existing session. Do not sign in or
switch to another account implicitly.
If a planned Chrome profile or `/u/N/` account is not already authenticated,
record that it is unavailable and continue with another authorized existing
session. Ask the user only when no usable authorized session remains. Do not
start a new login.
### OpenAI, Microsoft, and Meta Web
@@ -88,13 +117,22 @@ OpenAI, Microsoft, and Meta Web slots may each name one of them through
verify egress before relying on it, and never automatically change route after
a refusal. Bound a batch before starting.
ThorData user-and-password endpoints without `sessid` rotate the exit on each
request, which breaks a browser page whose resources must share one network
identity. The runner therefore derives one sticky `sessid` from the immutable
manifest hash and keeps it for that batch. A new prepared batch gets a new
session; rerunning or resuming the same batch keeps its session while the proxy
retains it. An explicit `sessid` in the configured route is preserved. This is
session continuity, not permission to retry a refused batch on another route.
### OpenAI API
Use `check-openai` with one explicit upload acknowledgement. Keep named API keys
as `OPENAI_API_KEY_1`, `OPENAI_API_KEY_2`, and `OPENAI_API_KEY_3` in the local `.env`, and select
only their variable names through an `openai-api` slot's `api_key_env`. Never
print a key, copy one into a slot or manifest, or fall back automatically to a
second key. API slots use a direct SDK transport that ignores environment proxy
print a key or copy one into a slot or manifest. Continue through authorized
named API slots according to the bounded account plan above; keep a separate
batch for each. API slots use a direct SDK transport that ignores environment proxy
settings. The current adapter is image-only.
### Microsoft API
+2
View File
@@ -1,6 +1,8 @@
---
name: signal-discovery
description: Discover missing AI provenance and watermark coverage in the remove-ai-watermarks library from fresh or historical corpora, then validate detection and removal parity. Use for corpus gap mining, periodic signal audits, new-provider discovery, or deciding whether old retained data must be replayed. Do not use for ordinary per-file identification or removal.
metadata:
internal: true
---
# Signal discovery
+10
View File
@@ -6,6 +6,10 @@
# Create and manage keys at: https://platform.openai.com/api-keys
# OPENAI_API_KEY=
# GitHub token (optional; only for scripts/sync_c2pa_soft_bindings.py)
# Raises the api.github.com rate limit from 60 to 5000 requests/hour. GH_TOKEN is read as a fallback.
# GITHUB_TOKEN=
# Local photo-classifier weights (optional; otherwise fetched from Hugging Face)
# Directory contents are documented in docs/photo-classify.md.
# RAIW_CLASSIFY_WEIGHTS=/path/to/classifier-weights
@@ -19,6 +23,11 @@
# Fallback cache root when HF_HOME is unset (optional)
# XDG_CACHE_HOME=/path/to/cache
# Gemini API key (optional; only for generating Google provider samples by hand)
# Paid tier: Nano Banana 2 Lite and Gemini Omni Flash have no free tier.
# Create and manage keys at: https://aistudio.google.com/apikey
# GEMINI_API_KEY=
# Named OpenAI keys for provider-oracle slots (optional; keep each value secret)
# OPENAI_API_KEY_1=
# OPENAI_API_KEY_2=
@@ -34,6 +43,7 @@
# ThorData residential proxies (optional; only for explicitly selected Web oracle routes)
# Generate these URLs in the ThorData endpoint generator; do not commit credentials.
# The Web runner pins a rotating user-and-password route to one sticky session per manifest.
# THORDATA_ROUTE_US=http://td-customer-USERNAME-country-US:PASSWORD@HOST.pr.thordata.net:9999
# THORDATA_ROUTE_DE=http://td-customer-USERNAME-country-DE:PASSWORD@HOST.pr.thordata.net:9999
# THORDATA_ROUTE_GB=http://td-customer-USERNAME-country-GB:PASSWORD@HOST.pr.thordata.net:9999
+12 -8
View File
@@ -14,18 +14,22 @@ updates:
update-types:
- "minor"
- "patch"
# The `all` extra must remain jointly resolvable. These candidates violate
# compatibility constraints: older supported TrustMark builds require NumPy 1.x, OpenCV 4.12+
# requires NumPy 2 on newer Python versions, and this project keeps tokenizers
# below 0.23 for the stable Transformers path. Keep Dependabot on the
# compatible lines until those constraints move.
# The `all` extra must remain jointly resolvable. PaddleX 3.7 (the OCR
# extra) requires NumPy <2.4, mirrored by `constraint-dependencies` in
# pyproject.toml, and this project keeps tokenizers below 0.23 for the stable
# Transformers path. Keep Dependabot on the compatible lines until those
# constraints move. Transformers 5.16+ requires tokenizers 0.23.1+,
# and Diffusers requires huggingface-hub <2. Mirror the manifest bounds.
ignore:
- dependency-name: "numpy"
versions:
- ">=2"
- dependency-name: "opencv-python-headless"
- ">=2.4"
- dependency-name: "transformers"
versions:
- ">=4.12"
- ">=5.16"
- dependency-name: "huggingface-hub"
versions:
- ">=2"
- dependency-name: "tokenizers"
versions:
- ">=0.23"
+2
View File
@@ -21,6 +21,8 @@ on:
jobs:
resolve:
# Model-only prereleases must not reach PyPI, Homebrew, Spaces, or ComfyUI.
if: ${{ github.event_name != 'release' || (startsWith(github.event.release.tag_name, 'v') && !github.event.release.prerelease) }}
runs-on: ubuntu-latest
# Thirty attempts may spend up to 20 seconds each in the JSON request,
# simple-index request, and inter-attempt delay. Leave bounded headroom.
@@ -0,0 +1,59 @@
name: Publish image-source classifier to Hugging Face
# Manual only. The derivative weights live in a GitHub model-freeze release;
# private training images and caches never enter this repository.
on:
workflow_dispatch:
inputs:
confirm:
description: "Type publish"
required: true
weights_tag:
description: "GitHub Release tag holding openai-google-source-v1.npz"
required: true
default: image-source-freeze-2026-09-25-v1
jobs:
publish:
if: ${{ github.event.inputs.confirm == 'publish' }}
runs-on: ubuntu-latest
timeout-minutes: 15
permissions:
contents: read
steps:
- uses: actions/checkout@v7
- uses: astral-sh/setup-uv@v7
with:
python-version: "3.12"
- name: Download derivative weights
env:
GH_TOKEN: ${{ github.token }}
TAG: ${{ github.event.inputs.weights_tag }}
run: |
set -euo pipefail
mkdir -p weights
gh release download "$TAG" \
--repo "${{ github.repository }}" \
--pattern openai-google-source-v1.npz \
--dir weights
test -s weights/openai-google-source-v1.npz
- name: Verify artifact hash
run: |
set -euo pipefail
expected="$(jq -r .artifact_sha256 docs/image-source-hf/metrics.json)"
test "${#expected}" -eq 64
echo "$expected weights/openai-google-source-v1.npz" | sha256sum --check
- name: Publish to Hugging Face
env:
HF_TOKEN: ${{ secrets.HF_TOKEN }}
SHA: ${{ github.sha }}
run: |
set -euo pipefail
if [ -z "${HF_TOKEN:-}" ]; then
echo "HF_TOKEN secret is not set" >&2
exit 1
fi
uv run --no-project --with huggingface-hub \
python scripts/publish_image_source_hf.py \
--src weights \
--message "Image-source classifier freeze (GitHub ${SHA:0:7})"
@@ -0,0 +1,64 @@
name: Publish source classifier to Hugging Face
# Manual only. The derivative model weights live in a GitHub model-freeze
# release; the private training corpus and caches never enter this repository.
on:
workflow_dispatch:
inputs:
confirm:
description: "Type publish"
required: true
weights_tag:
description: "GitHub Release tag holding source-pipeline-mlp.npz"
required: true
default: source-classify-freeze-2026-09-16-r2
jobs:
publish:
if: ${{ github.event.inputs.confirm == 'publish' }}
runs-on: ubuntu-latest
timeout-minutes: 15
permissions:
contents: read
steps:
- uses: actions/checkout@v7
- uses: astral-sh/setup-uv@v7
with:
python-version: "3.12"
- name: Download derivative model weights
env:
GH_TOKEN: ${{ github.token }}
TAG: ${{ github.event.inputs.weights_tag }}
run: |
set -euo pipefail
mkdir -p weights
gh release download "$TAG" \
--repo "${{ github.repository }}" \
--pattern source-pipeline-mlp.npz \
--dir weights
test -s weights/source-pipeline-mlp.npz
- name: Verify the frozen artifact
run: |
set -euo pipefail
expected="$(jq -r .artifact_sha256 docs/source-classify-hf/metrics.json)"
test "${#expected}" -eq 64
echo "$expected weights/source-pipeline-mlp.npz" | sha256sum --check
- name: Publish to Hugging Face
env:
HF_TOKEN: ${{ secrets.HF_TOKEN }}
SHA: ${{ github.sha }}
run: |
set -euo pipefail
if [ -z "${HF_TOKEN:-}" ]; then
echo "HF_TOKEN secret is not set" >&2
exit 1
fi
uv run --no-project --with huggingface-hub \
python scripts/publish_source_classify_hf.py \
--src weights \
--message "Source-classify freeze (GitHub ${SHA:0:7})"
+3 -1
View File
@@ -10,6 +10,8 @@ permissions:
jobs:
publish:
# Model-only prereleases are not Python package releases.
if: ${{ startsWith(github.event.release.tag_name, 'v') && !github.event.release.prerelease }}
runs-on: ubuntu-latest
environment: pypi
steps:
@@ -38,4 +40,4 @@ jobs:
# is needed. uv's uploader also accepts Metadata-Version 2.5 -- the permanent
# fix that lets the hatchling pin be relaxed (see pyproject [build-system]).
- name: Publish to PyPI
run: uv publish
run: uv publish
+15
View File
@@ -21,12 +21,27 @@ jobs:
- name: Sync dev environment
run: uv sync --frozen --extra dev
- name: Check C2PA soft-binding registry snapshot
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: uv run python scripts/sync_c2pa_soft_bindings.py --check
- name: Ruff lint
run: uv run ruff check
- name: Ruff format check
run: uv run ruff format --check
security:
name: lockfile vulnerability scan
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- uses: actions/checkout@v7
- uses: astral-sh/setup-uv@v7
with:
enable-cache: false
# Policy and triaged blocks: docs/development.md "Known security-gate blocks".
- name: Scan uv.lock with uv-secure
run: uvx uv-secure uv.lock
test:
name: test ${{ matrix.os }} py${{ matrix.python-version }}
runs-on: ${{ matrix.os }}
+2 -1
View File
@@ -8,6 +8,7 @@ The project gives users control over provenance marks on content they generated
- Add visible templates only for AI-generation labels.
- Do not add stock, agency, or classifieds marks to `watermark_registry.py`.
- Do not add templates for regulator-defined disclosure icons (EU Code of Practice Annex 1).
- Keep `erase --region` generic and user-directed; do not build an automatic stock-watermark remover on it.
Full boundary and legal context: [`docs/legal-and-safety.md`](docs/legal-and-safety.md).
@@ -43,7 +44,7 @@ The published Agent Skill is [`skills/remove-ai-watermarks/`](skills/remove-ai-w
[`docs/module-internals.md`](docs/module-internals.md) is the canonical per-module map, including design decisions, thresholds, calibration history, incident records, and regression guards. Read the relevant section before changing a subsystem.
Research and current constraints are routed through [`docs/index.md`](docs/index.md), especially [`docs/known-limitations.md`](docs/known-limitations.md), [`docs/supported-signals.md`](docs/supported-signals.md), [`docs/synthid.md`](docs/synthid.md), and [`docs/watermarking-landscape.md`](docs/watermarking-landscape.md). Pixel photo classification is [`docs/photo-classify.md`](docs/photo-classify.md); it is not `identify`. Classifier research is split between general [`AI-generated image classifiers`](docs/ai-generated-image-classifiers.md) and [`SynthID source classifiers`](docs/synthid-classifiers.md). Other SynthID campaign logs are [`docs/synthid-detector-research.md`](docs/synthid-detector-research.md) and [`docs/synthid-removal-research.md`](docs/synthid-removal-research.md). The pre-split chronological archive is [`docs/synthid-detector-removal-plan.md`](docs/synthid-detector-removal-plan.md). The benchmark kernel and its pinned local oracles (AudioSeal, VideoSeal) cover the audio/video watermark cohorts and research studies: [`docs/benchmark-kernel.md`](docs/benchmark-kernel.md).
Research and current constraints are routed through [`docs/index.md`](docs/index.md), especially [`docs/known-limitations.md`](docs/known-limitations.md), [`docs/supported-signals.md`](docs/supported-signals.md), [`docs/synthid.md`](docs/synthid.md), and [`docs/watermarking-landscape.md`](docs/watermarking-landscape.md). Pixel photo classification is [`docs/photo-classify.md`](docs/photo-classify.md); the separate OpenAI/Google/unknown export-pipeline signal is [`docs/source-classify.md`](docs/source-classify.md). Neither runs inside `identify` or constitutes SynthID detection. Classifier research is split between general [`AI-generated image classifiers`](docs/ai-generated-image-classifiers.md) and [`SynthID source classifiers`](docs/synthid-classifiers.md). Other SynthID campaign logs are [`docs/synthid-detector-research.md`](docs/synthid-detector-research.md) and [`docs/synthid-removal-research.md`](docs/synthid-removal-research.md). The pre-split chronological archive is [`docs/synthid-detector-removal-plan.md`](docs/synthid-detector-removal-plan.md). The benchmark kernel and its pinned local oracles (AudioSeal, Perth, PixelSeal, VideoSeal) cover image, audio, and video watermark cohorts and research studies: [`docs/benchmark-kernel.md`](docs/benchmark-kernel.md).
## Data safety
+41 -14
View File
@@ -24,9 +24,12 @@ removal.
[![Sponsor](https://img.shields.io/badge/Sponsor-GitHub-db61a2?logo=githubsponsors&logoColor=white)](https://github.com/sponsors/wiltodelta)
[![skills.sh](https://skills.sh/b/wiltodelta/remove-ai-watermarks)](https://skills.sh/wiltodelta/remove-ai-watermarks)
> This project is for lawful use on content you own. It does not target stock
> agency previews or other watermarks that protect third party paid content.
> See [scope, safety, and legal notes](docs/legal-and-safety.md).
> This is a research project on AI provenance signals, for lawful use on content
> you own. It is provided as is, without warranty or liability, and each user is
> responsible for how they use it. It does not target stock agency previews or
> other watermarks that protect third party paid content. Some jurisdictions,
> including China, restrict removing AI labels or supplying tools that do. See
> [scope, safety, and legal notes](docs/legal-and-safety.md).
## Choose what you want to do
@@ -59,6 +62,7 @@ specialized Python API can inspect and disrupt the validated local
| --- | --- |
| Metadata inspection and stripping | `remove-ai-watermarks` |
| Photograph AI-versus-camera classification | `remove-ai-watermarks[classify]` |
| OpenAI/Google/unknown source-export classification | `remove-ai-watermarks[source-classify]` |
| Visible detection and removal | `remove-ai-watermarks[visible]` |
| Visible video processing | `remove-ai-watermarks[video]` |
| Video SynthID removal | `remove-ai-watermarks[video,diffusion]` |
@@ -68,7 +72,7 @@ specialized Python API can inspect and disrupt the validated local
| Every production feature available on the active Python | `remove-ai-watermarks[all]` |
Lower-level and specialized extras include `pixels`, `heif`, `trustmark`,
`migan`, `lama`, `diffusion`, and `classify-onnx`. The
`migan`, `lama`, `diffusion`, `classify-onnx`, and `source-classify`. The
[installation guide](docs/installation.md#feature-extras) documents their exact
dependency composition, Python compatibility, and model requirements.
@@ -96,6 +100,19 @@ remove-ai-watermarks classify image.png
Guide: [photo pixel classification](docs/photo-classify.md).
For a lightweight, abstaining OpenAI/Google/unknown source-export signal after
metadata removal, use the separate Python API. It is not a SynthID detector:
```python
import remove_ai_watermarks as raiw
result = raiw.classify_source("image.png")
print(result.label, result.reason)
```
Install `remove-ai-watermarks[source-classify]`. Guide:
[source-pipeline classification](docs/source-classify.md).
Signed provenance is the supported route for SynthID and `identify` reads it.
There is no local SynthID pixel detector in the package. Research on a
periodic lattice expert is in `scripts/synthid_runtime/` and
@@ -188,9 +205,12 @@ preserved through a timestamped in-memory NUT bridge instead of being flattened
to the average frame rate. Non-zero source start timestamps are retained
together with the copied audio offset. The default `--mark auto`
scans all providers in one decode pass and selects the first stable match in
the specificity order shown below. Pass an explicit mark to restrict detection
to one provider.
Sora covers the moving Sora 2 mascot and wordmark. Veo covers both the current
the specificity order shown below. Valid Google AI-video provenance breaks a
Sora/Veo cross-match in favor of Veo when the diamond is nested in the Sora
region or Veo persists through the complete clip while Sora does not.
Pass an explicit mark to restrict detection to one provider.
Sora covers the moving Sora 2 mascot, with or without the wordmark; mascot-only
matches also require the complete two-eye shape. Veo covers both the current
four-point diamond and the legacy `Veo` text. Seedance covers the fixed boxed
`AI` label, Dola covers the fixed `Dola AI` text, Hailuo AI covers the composite
`MINIMAX | hailuo AI` label, and Kling AI covers the bottom-right `KLING AI` or
@@ -350,11 +370,17 @@ remove-ai-watermarks batch ./images --mode all
Visible mark support includes:
- Google Gemini and Nano Banana visible sparkle watermark;
- Doubao, the Jimeng wordmark and top-left `AI生成` pill, Qwen, Kling AI,
Yuanbao, Baidu, LiblibAI's bottom-center wordmark and compact top-left pill,
and RunningHub labels;
- one calibrated Microsoft top-right white AI-badge variant;
- one calibrated Samsung Galaxy AI label variant.
- Doubao, the Jimeng wordmark and top-left `AI生成` layouts, Qwen, Kling AI,
Yuanbao, Dola, WorkBuddy, Baidu, LiblibAI's bottom-center wordmark and compact
top-left pill, and RunningHub labels;
- calibrated Microsoft top-right white and beige AI-badge layouts;
- calibrated Italian and Korean Samsung Galaxy AI disclosures;
- a generic brand-less bottom-right `AI生成` fallback for OS/gallery-level
AI-edit stamps that carry no vendor wordmark of their own (vivo and Xiaomi
Gallery confirmed); synthetic-only calibration, weaker evidence than the
vendor-tuned detectors above;
- the OpenArt wordmark, placed at the frame center rather than a corner;
uncalibrated (one confirmed real case, no captured corpus).
Metadata and provenance inspection covers C2PA, EXIF, XMP, IPTC, common
generator parameters in image and video containers, China TC260 AIGC labels,
@@ -470,7 +496,7 @@ invisible removal.
detail.
- Visible video removal recognizes the moving Sora 2 wordmark, the current Veo
diamond plus legacy `Veo` text, the Seedance boxed `AI` label, and the fixed
Doubao, Dola, Hailuo AI, and Kling AI labels. It does not recognize the older Sora Turbo
Doubao, Dola, Hailuo AI, Vidu, and Kling AI labels. It does not recognize the older Sora Turbo
corner swirl or unregistered layouts from those providers.
The classical OpenCV backend can smear structured backgrounds; use MI-GAN or
LaMa when recovery quality matters.
@@ -545,7 +571,8 @@ bash maintain.sh
```
See [module internals](docs/module-internals.md) before changing a subsystem
with documented invariants.
with documented invariants. Report vulnerabilities as described in
[SECURITY.md](SECURITY.md).
## License
+25
View File
@@ -0,0 +1,25 @@
# Security policy
## Supported versions
Security fixes go into the latest release. Older releases are not patched;
upgrade through the channel you installed from (PyPI or Homebrew).
## Reporting a vulnerability
Report vulnerabilities privately through
[GitHub private vulnerability reporting](https://github.com/wiltodelta/remove-ai-watermarks/security/advisories/new).
Do not open a public issue for an unpatched vulnerability. Include the affected
version, the command or API call, and a minimal input that reproduces it.
Vulnerabilities in a dependency, such as a CVE in a package from `uv.lock`, can
be reported as a regular issue when the advisory is already public.
## Dependency vulnerabilities
Dependabot raises alerts and update pull requests for `uv.lock` and GitHub
Actions, and CI scans `uv.lock` with
[`uv-secure`](https://github.com/owenlamont/uv-secure) on every push and pull
request. A vulnerable dependency is upgraded to a fixed release; advisories
without one are tracked under
[Known security-gate blocks](docs/development.md#known-security-gate-blocks).
+13 -2
View File
@@ -10,6 +10,11 @@ data/
visible/ Per-mark example gallery: one synthetic canonical example per
registered mark plus documented provider originals where available
(see fixtures/visible/README.md)
synthetic/ Frozen synthetic renders that unit tests stamp onto frames, each
produced by the script named in the test that loads it
captures/
2026-09/ Provider outputs from the maintainer's own accounts, stored as
served, indexed by manifest.csv (see its README)
calibration/
<vendor>/ Minimal controlled inputs needed to rebuild detector assets
synthid/
@@ -51,9 +56,15 @@ evaluation outputs outside the repository.
`evaluations/engine-selection/` is the bounded exception for ORIGINAL study
inputs: its manifest tracks a prompt-matched OpenAI/Meta content matrix, not
generated model outputs or watermark-oracle evidence.
6. Keep third-party fixture license notices in `licenses/`, outside directories
6. Put provider captures that no test reads in `captures/<yyyy-mm>/`, with a
`manifest.csv` row per capture. A capture that is also a fixture is stored
once, in `fixtures/`, and its manifest row points there. Request a new
capture only for a service x vendor pair not yet captured, or for a
service's own model: another version of a known pair adds no provenance
evidence.
7. Keep third-party fixture license notices in `licenses/`, outside directories
that tests enumerate as media inputs.
7. Runtime detector assets belong in `src/remove_ai_watermarks/assets/`.
8. Runtime detector assets belong in `src/remove_ai_watermarks/assets/`.
Unregistered research candidates belong in
`scripts/assets/visible-mark-candidates/` so they are not shipped in the
wheel.
+44
View File
@@ -0,0 +1,44 @@
# Provider captures, September 2026
Original outputs downloaded from the maintainer's own accounts between
2026-09-23 and 2026-09-25 and cleared for publication by the maintainer. The
services are the Gemini API, xAI Grok, Vidu, Wan, Apple Image Playground,
YouTube (re-encodes of our own uploads), and the paid Higgsfield, Runway and
Dreamina plans. Every prompt is a neutral coffee-mug scene; Higgsfield
Genjutsu and the video-edit samples take our own Higgsfield outputs as input.
Files are stored byte-for-byte as served. Nothing is re-encoded, because the
provenance under study (C2PA, TC260 labels, `hf-job-id` chunks) lives in the
container bytes.
`manifest.csv` lists every capture once, including the ones that are already
test fixtures: those rows point at their `data/fixtures/` path instead of a
second copy (`stored` is `existing`). Columns:
| Column | Meaning |
| --- | --- |
| `sha256` | Digest of the stored file |
| `path` | Canonical repository path |
| `stored` | `new` for files in this directory, `existing` for a fixture already tracked |
| `service` | Service the file was downloaded from |
| `source_name` | Local capture name, which names the model |
| `captured` | Capture date |
| `ai_from_metadata`, `platform` | `identify` (images) or `identify_video` (videos) verdict from metadata only, at capture time |
What each service does to the upstream provenance, and the per-model
findings, are summarized in the live-captures table of
[`docs/watermarking-landscape.md`](../../../docs/watermarking-landscape.md).
The `google-photos/` files are the maintainer's own iPhone photos edited in
Google Photos on iOS (an Ask edit replacing a dog with a cat, an eraser edit, and
two other AI edits), published unmodified with their EXIF GPS position by the
maintainer's decision on 2026-09-25. Google's checker in Gemini found SynthID in
all four with the metadata stripped. The Apple Clean Up photo is not stored.
The `google-photos-web/` files are a negative control from the Google Photos web
editor (2026-09-26): one of the maintainer's photos, downloaded untouched and after
Enhance, Sky (Vivid) and a square crop. The web editor offers no generative tool and
writes no Content Credentials, so none of the four carries C2PA, IPTC or an AI
credit, and Google's checker in Gemini found no SynthID in any of them (three
explicit negatives; the crop drew a reply that did not name SynthID and is recorded
as indeterminate).
- License: repository license; generated and explicitly cleared by the maintainer
Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 MiB

Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 395 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 335 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 407 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 679 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 636 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 603 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 627 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 715 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 529 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 420 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 183 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 691 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 945 KiB

Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 MiB

Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 MiB

+136
View File
@@ -0,0 +1,136 @@
sha256,path,stored,service,source_name,captured,ai_from_metadata,platform
5ade61fc4cd869e2487745af61c7e23d008a3e9c2b5c440d2ffe16c2d3a32315,data/fixtures/provenance/apple-image-playground.png,existing,apple,image-playground-panda.png,2026-09-23,True,Apple Image Playground
f11595c6a9c0a72d4712d228354f589078d6940e529538cb009c799d8b8410d7,data/fixtures/provenance/google-gemini-omni-app.mp4,existing,gemini-omni,omni-wm-toggled.mp4,2026-09-23,True,Google (Gemini / Imagen)
cbbf831fb5d394436feb2f022d46e8933989f003acb9616e907791bca8a5dd6d,data/captures/2026-09/grok/download-0.jpg,new,grok,download-0.jpg,2026-09-23,True,xAI Grok Imagine
c6e3329009260cd230deaadd0cc7293269a94c4628010cd7eeb3d390b76cc0c2,data/fixtures/provenance/xai-grok-imagine-video.mp4,existing,grok,video-0.mp4,2026-09-23,True,xAI Grok Imagine
8e9f2a8bd190e5cfc662151aeef63cbc3372619678e2d37b3432b4fea113fb1c,data/fixtures/visible/vidu/provider-original.mp4,existing,vidu,vidu-free-q3.mp4,2026-09-23,True,ShengShu Vidu
583df0ec34d88653fc82c658728780f474a959eb246156649e5d5dde956fc474,data/fixtures/visible/wan/provider-original.png,existing,wan,wan-image-0.png,2026-09-23,True,China AIGC-labeled content (TC260 standard)
040e5c5fe2d7d82b467c54ce2558e4d5c0705e676f00464577f29c211bc7784f,data/captures/2026-09/dreamina/gpt-image-2-5-flare.png,new,dreamina,gpt-image-2-5-flare.png,2026-09-24,True,ByteDance Dreamina
acfc163bac69099e0d20ed26ec5f70537f21cac7b33ebb8fd7e03dfee287fa9a,data/captures/2026-09/dreamina/gpt-image-2-5-sunburst.png,new,dreamina,gpt-image-2-5-sunburst.png,2026-09-24,True,ByteDance Dreamina
047d62991a5adde4d246acf69d543b3f7a4c382e86523a57fbb0732bc7695a47,data/captures/2026-09/dreamina/gpt-image-2.png,new,dreamina,gpt-image-2.png,2026-09-24,True,ByteDance Dreamina
a48fc7da8b8bcc4519802e4db57942840aadf113d13c0fb5efc591a5b21617cc,data/captures/2026-09/dreamina/minimax-h3.mp4,new,dreamina,minimax-h3.mp4,2026-09-24,True,ByteDance Dreamina
885a47916a72c39ec2e5bea6a295215144979b26c811d7ca63a0473742a90a91,data/captures/2026-09/dreamina/nano-banana-pro.jpeg,new,dreamina,nano-banana-pro.jpeg,2026-09-24,True,ByteDance Dreamina
615fa80ca5bcca828f2c058a6021e53b73e196b36950446beed3f83d1a9fcb03,data/captures/2026-09/dreamina/nano-banana.jpeg,new,dreamina,nano-banana.jpeg,2026-09-24,True,ByteDance Dreamina
233a79d0d482bb964a67280b71e7999defb0587b64b6d0a84371dea61f670bc2,data/captures/2026-09/dreamina/seedance-1-0-fast.mp4,new,dreamina,seedance-1-0-fast.mp4,2026-09-24,True,ByteDance Dreamina
48df1fc4860c29cbe0cc5ebdd36526c1a75e1e8fffa745bc2798871701abaf94,data/captures/2026-09/dreamina/seedance-1-0.mp4,new,dreamina,seedance-1-0.mp4,2026-09-24,True,ByteDance Dreamina
561fc4ea7a536e415ef0dc2f466fc35925ad61159f1ea2856d7f525bc86a34ce,data/captures/2026-09/dreamina/seedance-1-5-pro.mp4,new,dreamina,seedance-1-5-pro.mp4,2026-09-24,True,ByteDance Dreamina
f58dd63abc2553c9b70d6cda8a068e874e59b5f3eb6d0f3db9ab08fefe9f3c3f,data/captures/2026-09/dreamina/seedance-2-0-fast.mp4,new,dreamina,seedance-2-0-fast.mp4,2026-09-24,True,ByteDance Dreamina
d2712d4804074ac08e28fc77ff1c1ff986e6c4bbaf3ae9737f743719e51a59de,data/fixtures/provenance/dreamina-seedance-2-mini.mp4,existing,dreamina,seedance-2-0-mini.mp4,2026-09-24,True,ByteDance Dreamina
375dde6314547b7b7c83a058a2e785c45b47ffee9198e81644e804d5769ba9a2,data/captures/2026-09/dreamina/seedance-2-0.mp4,new,dreamina,seedance-2-0.mp4,2026-09-24,True,ByteDance Dreamina
ff29e21fd43b79fb9ddb097c4164f02da8b3f56afd27f8fbff851a7763bc9d33,data/captures/2026-09/dreamina/seedance-2-5.mp4,new,dreamina,seedance-2-5.mp4,2026-09-24,True,ByteDance Dreamina
5d5a5e7c3f9434245eec4505cb6665fe57df2bf8da99a6f31302c8efacb4c9c8,data/captures/2026-09/dreamina/seedream-3-0.jpeg,new,dreamina,seedream-3-0.jpeg,2026-09-24,True,ByteDance Dreamina
a24e9f7c6ee07b60ac9af9f061746a39b305db89006eb92cca19f926bc8ee89e,data/captures/2026-09/dreamina/seedream-3-1.jpeg,new,dreamina,seedream-3-1.jpeg,2026-09-24,True,ByteDance Dreamina
ebe832110f0408a7b8cb65721213aec41bac70bfc580ef27d8c627639ceb7f2e,data/captures/2026-09/dreamina/seedream-4-0.jpeg,new,dreamina,seedream-4-0.jpeg,2026-09-24,True,ByteDance Dreamina
8ba87f6aa7e5b441a236ead9f325fe5cf74ec638bd359f2f87f91831bb3bdb4a,data/captures/2026-09/dreamina/seedream-4-1.jpeg,new,dreamina,seedream-4-1.jpeg,2026-09-24,True,ByteDance Dreamina
e2d14b3df27f22c53ca79f3372251ae04bf6607dab9ff86a16c365a667abc277,data/captures/2026-09/dreamina/seedream-4-5.jpeg,new,dreamina,seedream-4-5.jpeg,2026-09-24,True,ByteDance Dreamina
d54e8825d180fbdd6350c320b558015efb98f20839d3ce51ce9e939e59d6d870,data/captures/2026-09/dreamina/seedream-4-6.jpeg,new,dreamina,seedream-4-6.jpeg,2026-09-24,True,ByteDance Dreamina
25375e8f0485c1742e35d6f81da79fc64cb4029e4b4a36fb56e419a1646907f1,data/captures/2026-09/dreamina/seedream-4-7.jpeg,new,dreamina,seedream-4-7.jpeg,2026-09-24,True,ByteDance Dreamina
41ad0748d6894d40cde35f352082eb5608f3ee83216e120b7499afd0284703db,data/captures/2026-09/dreamina/seedream-5-0-lite.jpeg,new,dreamina,seedream-5-0-lite.jpeg,2026-09-24,True,ByteDance Dreamina
27ead86c611fbea25b5f50dfb120c1614f891f1ca07a707edfb1184f5d5109c5,data/captures/2026-09/dreamina/seedream-5-pro-2.jpeg,new,dreamina,seedream-5-pro-2.jpeg,2026-09-24,True,ByteDance Dreamina
2393cb470dc7c69de4c421f338aeb08192ed916515bc095a3afcd2ef4af89c90,data/fixtures/provenance/dreamina-seedream-5-pro.jpg,existing,dreamina,seedream-5-pro.jpeg,2026-09-24,True,ByteDance Dreamina
2e23ade5758aa6f42eb12261b22fd686e7f17b6a26414046c1afa1012c886e04,data/captures/2026-09/higgsfield/flux-2-flex.png,new,higgsfield,flux-2-flex.png,2026-09-24,True,Higgsfield (model not identified)
5d1f676ec1d3ab6684f75292d0c26bdaf2dc0cd93b3a4e657611d0fe34f6e880,data/captures/2026-09/higgsfield/flux-2-max.png,new,higgsfield,flux-2-max.png,2026-09-24,True,Higgsfield (model not identified)
4382b0c2a5f3d2b2c52f070ba9a12ffa259b4e0bad2446a65134cd700a06cb0a,data/fixtures/provenance/higgsfield-flux-2-pro.png,existing,higgsfield,flux-2-pro.png,2026-09-24,True,Higgsfield (model not identified)
e4eed8c3a5b1d99f3dce1ff16aa90ceb790a308c4ce623a9056cc711d4c5685f,data/captures/2026-09/higgsfield/gpt-image-1-5.png,new,higgsfield,gpt-image-1-5.png,2026-09-24,True,Higgsfield (model not identified)
197eb0d30a4967cdf19e68226e9fa9aa6723613a3feab1bd9553b8b4287dae61,data/captures/2026-09/higgsfield/gpt-image-2-5-flare.png,new,higgsfield,gpt-image-2-5-flare.png,2026-09-24,True,Higgsfield (model not identified)
3c20bc41a016117651142b4c3911237e6183ecfe2f53d97338b7beefc30cdea6,data/captures/2026-09/higgsfield/gpt-image-2-5-sunburst.png,new,higgsfield,gpt-image-2-5-sunburst.png,2026-09-24,True,Higgsfield (model not identified)
f079e02f2b79f5ddf7f06d29de9f7b0a9ae7746c9a1e340555a9998f91637e59,data/captures/2026-09/higgsfield/gpt-image-2.png,new,higgsfield,gpt-image-2.png,2026-09-24,True,Higgsfield (model not identified)
4cb06b2084f2f1907421fbab38ccc459ea2cb33859005e69c07c3ea524dc0f6d,data/fixtures/provenance/higgsfield-gpt-image.jpg,existing,higgsfield,gpt-image.jpeg,2026-09-24,True,OpenAI (ChatGPT / GPT Image / DALL·E / Sora)
eb47fb7ed862e1e828627457f4a438f63dd27aa0d2c7e492d62d31d2c7939feb,data/captures/2026-09/higgsfield/grok-imagine-2-0.png,new,higgsfield,grok-imagine-2-0.png,2026-09-24,True,Higgsfield (model not identified)
90d31906f629c4a99f60d115762fe003fc00dcdcabc895b2179e78e30407ef69,data/captures/2026-09/higgsfield/grok-imagine.png,new,higgsfield,grok-imagine.png,2026-09-24,True,Higgsfield (model not identified)
6ad75936db0bb172423564dd24d27bddb992917263555ecb5697cd2f354deeac,data/fixtures/provenance/higgsfield-kling-o1.png,existing,higgsfield,kling-o1.png,2026-09-24,True,China AIGC-labeled content (TC260 standard)
5365087f32d3bf8047375722835b3d8e75aa5d0f97afd5d59edfab5ae18f8b41,data/captures/2026-09/higgsfield/nano-banana-2-lite.png,new,higgsfield,nano-banana-2-lite.png,2026-09-24,True,Higgsfield (model not identified)
8511db22012b878b996c1993285943eebe87dfbbc3d7d262f112a6a8f36c70bf,data/captures/2026-09/higgsfield/nano-banana-2.png,new,higgsfield,nano-banana-2.png,2026-09-24,True,Higgsfield (model not identified)
dec96b39618905556a6d0592041d38aae0fb69e462b7dd4f3295242ff2b72543,data/captures/2026-09/higgsfield/nano-banana-pro.png,new,higgsfield,nano-banana-pro.png,2026-09-24,True,Higgsfield (model not identified)
c1e3ad5ace74231a0106827a26cef9e3caf1424977b073ccba19a13f1eb3be3f,data/captures/2026-09/higgsfield/nano-banana.png,new,higgsfield,nano-banana.png,2026-09-24,True,Higgsfield (model not identified)
776cba6484b751e729778253ba885f7042a9b53aa72d8315d27303533d2e3681,data/captures/2026-09/higgsfield/recraft-v4-1-utility.png,new,higgsfield,recraft-v4-1-utility.png,2026-09-24,True,Higgsfield (model not identified)
1e68c02f97f4f2af68c1096e2631def01e6dc1bf388eaad2eae27a93f67c730a,data/captures/2026-09/higgsfield/recraft-v4-1.png,new,higgsfield,recraft-v4-1.png,2026-09-24,True,Higgsfield (model not identified)
6153f35d8a7505162118f884ffc79f2f311a840251b799f8095fee06b4d615f8,data/captures/2026-09/higgsfield/seedream-4-0.png,new,higgsfield,seedream-4-0.png,2026-09-24,True,Higgsfield (model not identified)
30d53dbfc5bd80b0c4a7435f02955590408ad206fe41017d29ce82a8e13667c8,data/captures/2026-09/higgsfield/seedream-4-5.png,new,higgsfield,seedream-4-5.png,2026-09-24,True,Higgsfield (model not identified)
a86d007946c30c0fee139434d1cf6884e142ea11db3afb7911057e9415110d06,data/captures/2026-09/higgsfield/seedream-5-flash.png,new,higgsfield,seedream-5-flash.png,2026-09-24,True,Higgsfield (model not identified)
5ad760ca1ecf73fea60c78520f1903ba3fd6c2b5e4d45e963558a945c91e9007,data/captures/2026-09/higgsfield/seedream-5-lite.png,new,higgsfield,seedream-5-lite.png,2026-09-24,True,Higgsfield (model not identified)
2d64e99f5281fe10ad955429b26720dd2092bf7e943456b39f68564eb35c8e59,data/captures/2026-09/higgsfield/seedream-5-pro.png,new,higgsfield,seedream-5-pro.png,2026-09-24,True,Higgsfield (model not identified)
0d3a70c1382639241d8b55966b19965ad42824aad60663a20a5f5bc810101cc6,data/captures/2026-09/higgsfield/soul-cinema.png,new,higgsfield,soul-cinema.png,2026-09-24,,
fd5703240e9c045dbfb52c5fbef90802974f06aec716f482e8af74ef91288104,data/captures/2026-09/higgsfield/soul-v1.png,new,higgsfield,soul-v1.png,2026-09-24,,
91a2160b5a72f23776ac25207250359e7f86ade761b531247856a47488a50e63,data/captures/2026-09/higgsfield/soul2-image.png,new,higgsfield,soul2-image.png,2026-09-24,True,Higgsfield (model not identified)
f5f0b26198f8f1da107280b3c2c20c82897c3d522e27ba0acc4cf9eb8f74650a,data/captures/2026-09/higgsfield/flux-3-video.mp4,new,higgsfield,flux-3-video.mp4,2026-09-24,True,Black Forest Labs (FLUX)
967dcb6022e19f55639ff705a58e5252a62a24405f247dcffefcc0f610149c30,data/fixtures/provenance/higgsfield-happyhorse.mp4,existing,higgsfield,happyhorse.mp4,2026-09-24,True,"Alibaba Tongyi (Wan, HappyHorse)"
7011c92d52ec624da12600f24a4abb8d997f26cdea62d6f5a8d1940bc7ffcc9c,data/fixtures/provenance/higgsfield-kling-3-0-turbo.mp4,existing,higgsfield,kling-3-0-turbo.mp4,2026-09-24,True,Kuaishou Kling AI
5fe5b9d08b9fb41a4d3eea470d443eb5df520235300e65134090338701215a43,data/fixtures/provenance/higgsfield-minimax-h3.mp4,existing,higgsfield,minimax-h3.mp4,2026-09-24,True,MiniMax Hailuo AI
7d4ffa63755d605538c9a73059b4f6354a57e4f21100a92497aebc3c19dc3485,data/fixtures/provenance/higgsfield-veo-3-1-lite.mp4,existing,higgsfield,veo-3-1-lite.mp4,2026-09-24,True,Google (Gemini / Imagen)
07fcc98ddc21f80d2c4b918c8afa9298ddab4ae49fc6428c8e464a9b69c9db21,data/captures/2026-09/higgsfield/wan-2-5.mp4,new,higgsfield,wan-2-5.mp4,2026-09-24,True,"Alibaba Tongyi (Wan, HappyHorse)"
40a828d0360820019f3033c367283652df0a99c21150bafaddbc9a92437e743f,data/captures/2026-09/higgsfield/wan-2-2.png,new,higgsfield,wan-2-2.png,2026-09-24,,
c3563b5413fe3d54ccc3f60c834c32e02f3dab7a830262bf38b6e0a700a0ac16,data/captures/2026-09/higgsfield/z-image.png,new,higgsfield,z-image.png,2026-09-24,True,Higgsfield (model not identified)
1fd7cccffb25f18e74fa5ebc639672f1361db6137e6b9e848bc33fc1f583c0fe,data/fixtures/provenance/google-nano-banana.png,existing,nb-api,gemini-2.5-flash-image.png,2026-09-24,True,Google (Gemini / Imagen)
5fd14ce6d32f3806f0128f952eb30d36f7dad384a9eec728e5efbdb46ebca7db,data/fixtures/provenance/google-nano-banana-pro.jpg,existing,nb-api,gemini-3-pro-image.jpg,2026-09-24,True,Google (Gemini / Imagen)
977110ac48678627d907d635ac1b110b930044c350b669fb5f927a500e7d95ac,data/fixtures/provenance/google-nano-banana-2.jpg,existing,nb-api,gemini-3.1-flash-image.jpg,2026-09-24,True,Google (Gemini / Imagen)
df4f422b9e77d6b08d3e6d095299f0cdf6d48f6c770632bb042a6c7b09627334,data/fixtures/provenance/google-nano-banana-2-lite.jpg,existing,nb2-lite,nb2lite-1.jpg,2026-09-24,True,Google (Gemini / Imagen)
3d7dddd333ca6b576b3d7dc5220df42cbef3ea388bd4688f5671cdd796dcb805,data/captures/2026-09/nb2-lite/nb2lite-2.jpg,new,nb2-lite,nb2lite-2.jpg,2026-09-24,True,Google (Gemini / Imagen)
e04a0ed3976bdff9df7ffdc318296cadcca3ba6e7166c81247c27a09ba39fe5c,data/captures/2026-09/nb2-lite/nb2lite-3.jpg,new,nb2-lite,nb2lite-3.jpg,2026-09-24,True,Google (Gemini / Imagen)
fb034e94e4cbca9e0b56d82389d361fda0d6191f7e16f37ac6c55cd62a3621f7,data/fixtures/provenance/google-gemini-omni-flash-api.mp4,existing,omni-flash,omni-flash-1.mp4,2026-09-24,True,Google (Gemini / Imagen)
25b2dc2a3c147dd8f04457a6b85183edd6ee235abdfe92c162c41c25812b0d9a,data/captures/2026-09/runway/flux-2-klein.png,new,runway,flux-2-klein.png,2026-09-24,True,Black Forest Labs (FLUX)
e9b75d61adef6842c602767c4c0a5217de816927fd257ba1675e7e4a4dd043d0,data/captures/2026-09/runway/flux-2-max.jpg,new,runway,flux-2-max.jpg,2026-09-24,True,Black Forest Labs (FLUX)
12262d853760b4e6dab7a896b833331ee5af43cd6e9467b899b7de76c7361d8d,data/fixtures/provenance/runway-gen4-image.png,existing,runway,gen4-image-artifact.png,2026-09-24,True,Runway
98c0040b60aad1187c45df5fd4d6e8a11762950329b1a89183d6a58d5b947ad2,data/fixtures/provenance/runway-gen45-video.mp4,existing,runway,gen45-video-artifact.mp4,2026-09-24,True,Runway
eaec9e1c3a6c46c14d6ab8d12954b875e7482c8fde2a6d53ccd2a0b77c227a0b,data/captures/2026-09/runway/gpt-image-1-5.png,new,runway,gpt-image-1-5.png,2026-09-24,True,OpenAI (ChatGPT / GPT Image / DALL·E / Sora)
2905127c3caabf13906abe6abaef8096209ee9e6e961e899b112f82ebb6e0c4f,data/captures/2026-09/runway/gpt-image-1-mini.png,new,runway,gpt-image-1-mini.png,2026-09-24,True,OpenAI (ChatGPT / GPT Image / DALL·E / Sora)
22fb128833cb401a02b72a4ef5f23a577224a97950f296d03433224fb2249afd,data/captures/2026-09/runway/gpt-image-2-5-flare.png,new,runway,gpt-image-2-5-flare.png,2026-09-24,True,OpenAI (ChatGPT / GPT Image / DALL·E / Sora)
249b0d0f3fe3decc140a4ba234aee862d107b7a181bb47882f280cbddd325bfe,data/captures/2026-09/runway/gpt-image-2-5-sunburst.png,new,runway,gpt-image-2-5-sunburst.png,2026-09-24,True,OpenAI (ChatGPT / GPT Image / DALL·E / Sora)
8c0d4d0e739e559035a16bdc276fe8d517d4561736e56c0ddf8d1da46181dfbd,data/captures/2026-09/runway/gpt-image-2.png,new,runway,gpt-image-2.png,2026-09-24,True,OpenAI (ChatGPT / GPT Image / DALL·E / Sora)
9f7fae91c8faf9eb5554443d395dfd3b23204702b32feb19e1904ab3009d8c29,data/captures/2026-09/runway/grok-imagine-2-0-or-quality-a.jpg,new,runway,grok-imagine-2-0-or-quality-a.jpg,2026-09-24,True,xAI Grok Imagine
99c7873a4c3de880af9daeb5c0fa753232313d4e4689f0976bbd020d2b420465,data/captures/2026-09/runway/grok-imagine-2-0-or-quality-b.jpg,new,runway,grok-imagine-2-0-or-quality-b.jpg,2026-09-24,True,xAI Grok Imagine
001007bdeda172730028b2d54eb1b2acd90f6396800c10e2be2efe777faa1718,data/captures/2026-09/runway/grok-imagine.jpg,new,runway,grok-imagine.jpg,2026-09-24,True,xAI Grok Imagine
14e97f57d83f5438a13b89175eb995ec07f817432642466b1bdb8572f7573da2,data/captures/2026-09/runway/ideogram-4-0.png,new,runway,ideogram-4-0.png,2026-09-24,True,Ideogram
8a651b72eed17775e222c1a40b5bbea6e69715a27d6c8e8e0e3d4c5d0723909c,data/captures/2026-09/runway/ideogram-p-image.png,new,runway,ideogram-p-image.png,2026-09-24,True,Ideogram
3132a2e7198ecd3dead3042cebc6c9091264638bf63b40d5027ff058bd043547,data/captures/2026-09/runway/kling-o3-standard.mp4,new,runway,kling-o3-standard.mp4,2026-09-24,True,Kuaishou Kling AI
b95f4a9f2706fc4f3c8716f6daa016029e55f07177dfd2efd8fedbaf67094981,data/captures/2026-09/runway/ltx-2-5-fast.mp4,new,runway,ltx-2-5-fast.mp4,2026-09-24,,
b374c9d29c094a2fd1b0b6257c989a43d155ce62d9fdc3d445707978cd7dd1e5,data/captures/2026-09/runway/meta-muse-image.png,new,runway,meta-muse-image.png,2026-09-24,True,
fbc0313aea807e67d1bb904cac7b47c9163b1ac8435d4774d4b63e99ba1975df,data/captures/2026-09/runway/nano-banana-2-lite.jpg,new,runway,nano-banana-2-lite.jpg,2026-09-24,True,Google (Gemini / Imagen)
a32344cb19bbd6607733aa138b45b66e919f827cdfcdfc0d7da8de75906237a9,data/captures/2026-09/runway/nano-banana-2-via-runway.png,new,runway,nano-banana-2-via-runway.png,2026-09-24,True,Google (Gemini / Imagen)
d2b82a1907056f8f022308fdd16e701238da816a9c9c339d7fa54999af2cf12e,data/captures/2026-09/runway/nano-banana-pro.png,new,runway,nano-banana-pro.png,2026-09-24,True,Google (Gemini / Imagen)
077e552f16ab1de180e3487e85567f5e0565e1bd6e942dc1d585309a105fa19a,data/captures/2026-09/runway/nano-banana.png,new,runway,nano-banana.png,2026-09-24,True,Google (Gemini / Imagen)
88f0e48032dee30d1e6237962af74cd38991ab52c1424a4f8e12aadf4e1b9346,data/captures/2026-09/runway/seedance-2-mini.mp4,new,runway,seedance-2-mini.mp4,2026-09-24,True,BytePlus (ByteDance)
5df40eb93f1b0f4d802bd117fba736ecec9713f5f411c6449726690d94972560,data/captures/2026-09/runway/seedream-5-0.png,new,runway,seedream-5-0.png,2026-09-24,True,BytePlus (ByteDance)
8275bf3af0c8a3d4815f76a546f29172c31ddd65c7a153e1bd6d6421beb1eccc,data/captures/2026-09/runway/seedream-5-pro.png,new,runway,seedream-5-pro.png,2026-09-24,True,BytePlus (ByteDance)
9d8f9901115697ca4925f02e3b5c91920fb02579657268c6525c0cd9bcf33d63,data/captures/2026-09/youtube/yt-136-video.mp4,new,youtube,yt-136-video.mp4,2026-09-24,,
68c87b0697fb954f3533f96ec32875f6dec173c142fd4d4f2552c624c21f7c28,data/captures/2026-09/youtube/yt-398-av1.mp4,new,youtube,yt-398-av1.mp4,2026-09-24,,
aa2fde5c0444eda05f40db2a8974183284016876c9788f099dda9df5aac1714f,data/fixtures/provenance/youtube-reencode-gemini-omni-flash.mp4,existing,youtube,yt-studio-download.mp4,2026-09-24,True,Google (Gemini / Imagen)
236dd73a25a893b8f2c7bbdad8e1208341251c2b12e7b261c1fff65bf58277a5,data/fixtures/provenance/youtube-reencode-grok.mp4,existing,youtube,yt-studio-grok.mp4,2026-09-24,,
7c37874c72d289606e997434ccde73dba3aa89ecdc5adb3dfe64923933da5378,data/captures/2026-09/higgsfield/cinema-studio-3-0.mp4,new,higgsfield,cinema-studio-3-0.mp4,2026-09-25,True,BytePlus (ByteDance)
485449b69f1013a97970aabc5429327db1ff88559c81e3430c536fab108db7dc,data/fixtures/provenance/higgsfield-cinema-studio-v2.mp4,existing,higgsfield,cinema-studio-v2.mp4,2026-09-25,True,Kuaishou Kling AI
f7915d8e77eeb6feceff7169aa79c380330aa2f71a71b5eba426c4495cb8d696,data/captures/2026-09/higgsfield/edit-flux-3.mp4,new,higgsfield,edit-flux-3.mp4,2026-09-25,True,Black Forest Labs (FLUX)
fca47e6aea979b3fb0be01b5775c47f95acde66b4692957aae928a17ce86418d,data/captures/2026-09/higgsfield/edit-gemini-omni-1-1.mp4,new,higgsfield,edit-gemini-omni-1-1.mp4,2026-09-25,True,Google (Gemini / Imagen)
4f8aff9e6ef05c71a5028f2d3b5c63191b5e6932ebe39827068ae09cfe00e17b,data/captures/2026-09/higgsfield/gemini-omni-flash-1-1.mp4,new,higgsfield,gemini-omni-flash-1-1.mp4,2026-09-25,True,Google (Gemini / Imagen)
7c9a93140bffb50de173bca7cff1ecb7b2a75f611bf11bb26a54d903c043e5e3,data/captures/2026-09/higgsfield/gemini-omni-flash.mp4,new,higgsfield,gemini-omni-flash.mp4,2026-09-25,True,Google (Gemini / Imagen)
a3c2e8c506327ff0bdee078372be8d89fb913672f61efc66a4791771026ec0fc,data/fixtures/provenance/higgsfield-genjutsu-motion-control.mp4,existing,higgsfield,genjutsu-motion-control.mp4,2026-09-25,,
d3b7a9bbe03abdab2b6c0fb009f90a961cb021405ff652c02943e51e01c38ba0,data/captures/2026-09/higgsfield/genjutsu-replace-object.mp4,new,higgsfield,genjutsu-replace-object.mp4,2026-09-25,,
32ec5b3d70636c6295ff312dadb9fc018e8ff061c7ebe786000fcbbdc2161b6b,data/captures/2026-09/higgsfield/grok-video-1-5.mp4,new,higgsfield,grok-video-1-5.mp4,2026-09-25,True,xAI Grok Imagine
3811bca40850d8b4caebf3cc0f21b8c414f8b7d7c810f0a72b38b845174bb02e,data/captures/2026-09/higgsfield/grok-video.mp4,new,higgsfield,grok-video.mp4,2026-09-25,True,xAI Grok Imagine
67f4b6c49f6b93485fd47c457f64d3f721ec326ec57a9fb39488d6b9023528b7,data/fixtures/provenance/higgsfield-hailuo-2-3.mp4,existing,higgsfield,hailuo-2-3.mp4,2026-09-25,True,MiniMax Hailuo AI
96034f675008efcc09ca25c0739068f6e7301dde3ac67f4cfd14b82c5c7f9cae,data/captures/2026-09/higgsfield/kling-2-6.mp4,new,higgsfield,kling-2-6.mp4,2026-09-25,True,Kuaishou Kling AI
00a0ab7a2fe37f1c5b3208f9940c928932124015df7391dab4bfa5a9cc21af0c,data/captures/2026-09/higgsfield/kling-3-0.mp4,new,higgsfield,kling-3-0.mp4,2026-09-25,True,Kuaishou Kling AI
1f8fb86da8d71db7d2e6c4f87a6a2fd5cab69b7824406d7145a2756c2d358e38,data/captures/2026-09/higgsfield/marketing-studio.mp4,new,higgsfield,marketing-studio.mp4,2026-09-25,True,BytePlus (ByteDance)
bacf6dc7ab9b6dfe67488349ecced76b10221f3c73196a1a4bff163588e7270d,data/captures/2026-09/higgsfield/minimax-h3-max.mp4,new,higgsfield,minimax-h3-max.mp4,2026-09-25,True,MiniMax Hailuo AI
11b8e1890ac393a41de61f9a39633cefcad45b9e47f82d13a92906ac5f6ced45,data/captures/2026-09/higgsfield/seedance-1-5-pro.mp4,new,higgsfield,seedance-1-5-pro.mp4,2026-09-25,,
a65d7b57c528f6fa0e6b844d918d16cc6c2260038921d1c7d6d2e2bf60095a26,data/captures/2026-09/higgsfield/seedance-2-0.mp4,new,higgsfield,seedance-2-0.mp4,2026-09-25,True,BytePlus (ByteDance)
24857c4744ee9a7e4385d1f85df0acdd0aba05f1827210b7b97556d1a9d58841,data/captures/2026-09/higgsfield/seedance-2-5.mp4,new,higgsfield,seedance-2-5.mp4,2026-09-25,True,BytePlus (ByteDance)
d4aec466d7811ae5670f4db6308f5275d2773653089736849f85f96fe2b262be,data/captures/2026-09/higgsfield/veo-3-1.mp4,new,higgsfield,veo-3-1.mp4,2026-09-25,True,Google (Gemini / Imagen)
e78ed6fa92814a72a64b6a377bebfd5b65efeae149d49170c68744917e9246b3,data/captures/2026-09/higgsfield/wan-2-6.mp4,new,higgsfield,wan-2-6.mp4,2026-09-25,True,"Alibaba Tongyi (Wan, HappyHorse)"
f59ae93226bae3cc24598214ff623f99957e127838541b57acd55bd9cdb8e72c,data/captures/2026-09/higgsfield/wan-2-7.mp4,new,higgsfield,wan-2-7.mp4,2026-09-25,True,"Alibaba Tongyi (Wan, HappyHorse)"
bfb89e7729ef0e54260452f525ebdadd1237fac0902c5bda39edbcd7a48aa6cc,data/captures/2026-09/higgsfield/wan-3-0-prime.mp4,new,higgsfield,wan-3-0-prime.mp4,2026-09-25,True,"Alibaba Tongyi (Wan, HappyHorse)"
3e982e49d46445143f78a0b445642ce888a23571823e6db74e93c0c7ede3c9c1,data/captures/2026-09/higgsfield/wan-3-0.mp4,new,higgsfield,wan-3-0.mp4,2026-09-25,True,"Alibaba Tongyi (Wan, HappyHorse)"
7fc933d784dcb1ed4bef0f6d857fe79156c1ef1da9d437d750633217d0da23a8,data/captures/2026-09/google-photos/ask-dog-to-cat.jpg,new,google-photos,ask-dog-to-cat.jpg,2026-09-25,True,Google Photos (AI edit)
1c8726279b869bc435dd30bcb385d04203dd9af5570b0d2d393ff3f3e5162e5b,data/captures/2026-09/google-photos/eraser-glasses.jpg,new,google-photos,eraser-glasses.jpg,2026-09-25,True,Google Photos (AI edit)
1abca17d4649e458626864560e5d2db6397eb51d7bc8617f49bc70be0905522e,data/captures/2026-09/google-photos/gphotos-5.jpg,new,google-photos,gphotos-5.jpg,2026-09-24,True,Google Photos (AI edit)
56817730a46a84975a7ac6d9595d2f68a18676b49fd1be1c5230b517beafa9cc,data/captures/2026-09/google-photos/gphotos-6.jpg,new,google-photos,gphotos-6.jpg,2026-09-24,True,Google Photos (AI edit)
39f8141415ab51fd6070b6d2591132c81fffa6b44f76f2e5e84b38912b3becc1,data/captures/2026-09/runway/flux-3-video.mp4,new,runway,flux-3-video.mp4,2026-09-25,True,Black Forest Labs (FLUX)
81cd555906034c4aff6473047a7a898d14ce060dd4e6a3c6226902547446045b,data/captures/2026-09/runway/grok-imagine-1-5-video.mp4,new,runway,grok-imagine-1-5-video.mp4,2026-09-25,True,xAI Grok Imagine
c255d4a7168197e4ab6af162690d305f3e3f48037b1a5fd9e877ab782539e0fb,data/captures/2026-09/runway/gemini-omni-1-1-flash.mp4,new,runway,gemini-omni-1-1-flash.mp4,2026-09-25,True,Google (Gemini / Imagen)
a8711432008960149a16afd43704fa673f70826cf527d677aa0c35b7a18502d1,data/captures/2026-09/runway/happyhorse-1-0.mp4,new,runway,happyhorse-1-0.mp4,2026-09-25,True,Alibaba Tongyi (Wan, HappyHorse)
4c909ca68ecad62c9200727cae2bef5e80678a255b3fd781f7a43ca0b0824f46,data/captures/2026-09/runway/minimax-h3.mp4,new,runway,minimax-h3.mp4,2026-09-25,True,MiniMax Hailuo AI
c04468ef20081aecf16ee94fe81ddd419ddae36acb678e7e4f26def7a1f7bb72,data/captures/2026-09/google-photos-web/forest-original.jpg,new,google-photos-web,forest-original.jpg,2026-09-26,,
af0265e41edec3413683f86441a1ffa9c64dbcb7117070d7ccbd2e91c20fd327,data/captures/2026-09/google-photos-web/forest-enhance.jpg,new,google-photos-web,forest-enhance.jpg,2026-09-26,,
3f42e0877f67c4677f6f52be18146923fc5eeb471f9e0e27b9477d29dc1e6bbb,data/captures/2026-09/google-photos-web/forest-sky-vivid.jpg,new,google-photos-web,forest-sky-vivid.jpg,2026-09-26,,
c83f903117cc030edf78164430ce59ffa897cb3a9efe464cf257e55644a955fd,data/captures/2026-09/google-photos-web/forest-crop-square.jpg,new,google-photos-web,forest-crop-square.jpg,2026-09-26,,
e5612ea4bc06df48821d431d8d4758d3c73d1e74bd7b5b5dce921eaffdfbbe93,data/captures/2026-09/higgsfield/edit-kling-3-0-omni.mp4,new,higgsfield,edit-kling-3-0-omni.mp4,2026-09-26,True,Kuaishou Kling AI
a76119db1b50f529e397875d38cf3938c5ae3b9e79d893d25567a7eee2340f41,data/captures/2026-09/higgsfield/dop-lite.mp4,new,higgsfield,dop-lite.mp4,2026-09-26,,
1 sha256 path stored service source_name captured ai_from_metadata platform
2 5ade61fc4cd869e2487745af61c7e23d008a3e9c2b5c440d2ffe16c2d3a32315 data/fixtures/provenance/apple-image-playground.png existing apple image-playground-panda.png 2026-09-23 True Apple Image Playground
3 f11595c6a9c0a72d4712d228354f589078d6940e529538cb009c799d8b8410d7 data/fixtures/provenance/google-gemini-omni-app.mp4 existing gemini-omni omni-wm-toggled.mp4 2026-09-23 True Google (Gemini / Imagen)
4 cbbf831fb5d394436feb2f022d46e8933989f003acb9616e907791bca8a5dd6d data/captures/2026-09/grok/download-0.jpg new grok download-0.jpg 2026-09-23 True xAI Grok Imagine
5 c6e3329009260cd230deaadd0cc7293269a94c4628010cd7eeb3d390b76cc0c2 data/fixtures/provenance/xai-grok-imagine-video.mp4 existing grok video-0.mp4 2026-09-23 True xAI Grok Imagine
6 8e9f2a8bd190e5cfc662151aeef63cbc3372619678e2d37b3432b4fea113fb1c data/fixtures/visible/vidu/provider-original.mp4 existing vidu vidu-free-q3.mp4 2026-09-23 True ShengShu Vidu
7 583df0ec34d88653fc82c658728780f474a959eb246156649e5d5dde956fc474 data/fixtures/visible/wan/provider-original.png existing wan wan-image-0.png 2026-09-23 True China AIGC-labeled content (TC260 standard)
8 040e5c5fe2d7d82b467c54ce2558e4d5c0705e676f00464577f29c211bc7784f data/captures/2026-09/dreamina/gpt-image-2-5-flare.png new dreamina gpt-image-2-5-flare.png 2026-09-24 True ByteDance Dreamina
9 acfc163bac69099e0d20ed26ec5f70537f21cac7b33ebb8fd7e03dfee287fa9a data/captures/2026-09/dreamina/gpt-image-2-5-sunburst.png new dreamina gpt-image-2-5-sunburst.png 2026-09-24 True ByteDance Dreamina
10 047d62991a5adde4d246acf69d543b3f7a4c382e86523a57fbb0732bc7695a47 data/captures/2026-09/dreamina/gpt-image-2.png new dreamina gpt-image-2.png 2026-09-24 True ByteDance Dreamina
11 a48fc7da8b8bcc4519802e4db57942840aadf113d13c0fb5efc591a5b21617cc data/captures/2026-09/dreamina/minimax-h3.mp4 new dreamina minimax-h3.mp4 2026-09-24 True ByteDance Dreamina
12 885a47916a72c39ec2e5bea6a295215144979b26c811d7ca63a0473742a90a91 data/captures/2026-09/dreamina/nano-banana-pro.jpeg new dreamina nano-banana-pro.jpeg 2026-09-24 True ByteDance Dreamina
13 615fa80ca5bcca828f2c058a6021e53b73e196b36950446beed3f83d1a9fcb03 data/captures/2026-09/dreamina/nano-banana.jpeg new dreamina nano-banana.jpeg 2026-09-24 True ByteDance Dreamina
14 233a79d0d482bb964a67280b71e7999defb0587b64b6d0a84371dea61f670bc2 data/captures/2026-09/dreamina/seedance-1-0-fast.mp4 new dreamina seedance-1-0-fast.mp4 2026-09-24 True ByteDance Dreamina
15 48df1fc4860c29cbe0cc5ebdd36526c1a75e1e8fffa745bc2798871701abaf94 data/captures/2026-09/dreamina/seedance-1-0.mp4 new dreamina seedance-1-0.mp4 2026-09-24 True ByteDance Dreamina
16 561fc4ea7a536e415ef0dc2f466fc35925ad61159f1ea2856d7f525bc86a34ce data/captures/2026-09/dreamina/seedance-1-5-pro.mp4 new dreamina seedance-1-5-pro.mp4 2026-09-24 True ByteDance Dreamina
17 f58dd63abc2553c9b70d6cda8a068e874e59b5f3eb6d0f3db9ab08fefe9f3c3f data/captures/2026-09/dreamina/seedance-2-0-fast.mp4 new dreamina seedance-2-0-fast.mp4 2026-09-24 True ByteDance Dreamina
18 d2712d4804074ac08e28fc77ff1c1ff986e6c4bbaf3ae9737f743719e51a59de data/fixtures/provenance/dreamina-seedance-2-mini.mp4 existing dreamina seedance-2-0-mini.mp4 2026-09-24 True ByteDance Dreamina
19 375dde6314547b7b7c83a058a2e785c45b47ffee9198e81644e804d5769ba9a2 data/captures/2026-09/dreamina/seedance-2-0.mp4 new dreamina seedance-2-0.mp4 2026-09-24 True ByteDance Dreamina
20 ff29e21fd43b79fb9ddb097c4164f02da8b3f56afd27f8fbff851a7763bc9d33 data/captures/2026-09/dreamina/seedance-2-5.mp4 new dreamina seedance-2-5.mp4 2026-09-24 True ByteDance Dreamina
21 5d5a5e7c3f9434245eec4505cb6665fe57df2bf8da99a6f31302c8efacb4c9c8 data/captures/2026-09/dreamina/seedream-3-0.jpeg new dreamina seedream-3-0.jpeg 2026-09-24 True ByteDance Dreamina
22 a24e9f7c6ee07b60ac9af9f061746a39b305db89006eb92cca19f926bc8ee89e data/captures/2026-09/dreamina/seedream-3-1.jpeg new dreamina seedream-3-1.jpeg 2026-09-24 True ByteDance Dreamina
23 ebe832110f0408a7b8cb65721213aec41bac70bfc580ef27d8c627639ceb7f2e data/captures/2026-09/dreamina/seedream-4-0.jpeg new dreamina seedream-4-0.jpeg 2026-09-24 True ByteDance Dreamina
24 8ba87f6aa7e5b441a236ead9f325fe5cf74ec638bd359f2f87f91831bb3bdb4a data/captures/2026-09/dreamina/seedream-4-1.jpeg new dreamina seedream-4-1.jpeg 2026-09-24 True ByteDance Dreamina
25 e2d14b3df27f22c53ca79f3372251ae04bf6607dab9ff86a16c365a667abc277 data/captures/2026-09/dreamina/seedream-4-5.jpeg new dreamina seedream-4-5.jpeg 2026-09-24 True ByteDance Dreamina
26 d54e8825d180fbdd6350c320b558015efb98f20839d3ce51ce9e939e59d6d870 data/captures/2026-09/dreamina/seedream-4-6.jpeg new dreamina seedream-4-6.jpeg 2026-09-24 True ByteDance Dreamina
27 25375e8f0485c1742e35d6f81da79fc64cb4029e4b4a36fb56e419a1646907f1 data/captures/2026-09/dreamina/seedream-4-7.jpeg new dreamina seedream-4-7.jpeg 2026-09-24 True ByteDance Dreamina
28 41ad0748d6894d40cde35f352082eb5608f3ee83216e120b7499afd0284703db data/captures/2026-09/dreamina/seedream-5-0-lite.jpeg new dreamina seedream-5-0-lite.jpeg 2026-09-24 True ByteDance Dreamina
29 27ead86c611fbea25b5f50dfb120c1614f891f1ca07a707edfb1184f5d5109c5 data/captures/2026-09/dreamina/seedream-5-pro-2.jpeg new dreamina seedream-5-pro-2.jpeg 2026-09-24 True ByteDance Dreamina
30 2393cb470dc7c69de4c421f338aeb08192ed916515bc095a3afcd2ef4af89c90 data/fixtures/provenance/dreamina-seedream-5-pro.jpg existing dreamina seedream-5-pro.jpeg 2026-09-24 True ByteDance Dreamina
31 2e23ade5758aa6f42eb12261b22fd686e7f17b6a26414046c1afa1012c886e04 data/captures/2026-09/higgsfield/flux-2-flex.png new higgsfield flux-2-flex.png 2026-09-24 True Higgsfield (model not identified)
32 5d1f676ec1d3ab6684f75292d0c26bdaf2dc0cd93b3a4e657611d0fe34f6e880 data/captures/2026-09/higgsfield/flux-2-max.png new higgsfield flux-2-max.png 2026-09-24 True Higgsfield (model not identified)
33 4382b0c2a5f3d2b2c52f070ba9a12ffa259b4e0bad2446a65134cd700a06cb0a data/fixtures/provenance/higgsfield-flux-2-pro.png existing higgsfield flux-2-pro.png 2026-09-24 True Higgsfield (model not identified)
34 e4eed8c3a5b1d99f3dce1ff16aa90ceb790a308c4ce623a9056cc711d4c5685f data/captures/2026-09/higgsfield/gpt-image-1-5.png new higgsfield gpt-image-1-5.png 2026-09-24 True Higgsfield (model not identified)
35 197eb0d30a4967cdf19e68226e9fa9aa6723613a3feab1bd9553b8b4287dae61 data/captures/2026-09/higgsfield/gpt-image-2-5-flare.png new higgsfield gpt-image-2-5-flare.png 2026-09-24 True Higgsfield (model not identified)
36 3c20bc41a016117651142b4c3911237e6183ecfe2f53d97338b7beefc30cdea6 data/captures/2026-09/higgsfield/gpt-image-2-5-sunburst.png new higgsfield gpt-image-2-5-sunburst.png 2026-09-24 True Higgsfield (model not identified)
37 f079e02f2b79f5ddf7f06d29de9f7b0a9ae7746c9a1e340555a9998f91637e59 data/captures/2026-09/higgsfield/gpt-image-2.png new higgsfield gpt-image-2.png 2026-09-24 True Higgsfield (model not identified)
38 4cb06b2084f2f1907421fbab38ccc459ea2cb33859005e69c07c3ea524dc0f6d data/fixtures/provenance/higgsfield-gpt-image.jpg existing higgsfield gpt-image.jpeg 2026-09-24 True OpenAI (ChatGPT / GPT Image / DALL·E / Sora)
39 eb47fb7ed862e1e828627457f4a438f63dd27aa0d2c7e492d62d31d2c7939feb data/captures/2026-09/higgsfield/grok-imagine-2-0.png new higgsfield grok-imagine-2-0.png 2026-09-24 True Higgsfield (model not identified)
40 90d31906f629c4a99f60d115762fe003fc00dcdcabc895b2179e78e30407ef69 data/captures/2026-09/higgsfield/grok-imagine.png new higgsfield grok-imagine.png 2026-09-24 True Higgsfield (model not identified)
41 6ad75936db0bb172423564dd24d27bddb992917263555ecb5697cd2f354deeac data/fixtures/provenance/higgsfield-kling-o1.png existing higgsfield kling-o1.png 2026-09-24 True China AIGC-labeled content (TC260 standard)
42 5365087f32d3bf8047375722835b3d8e75aa5d0f97afd5d59edfab5ae18f8b41 data/captures/2026-09/higgsfield/nano-banana-2-lite.png new higgsfield nano-banana-2-lite.png 2026-09-24 True Higgsfield (model not identified)
43 8511db22012b878b996c1993285943eebe87dfbbc3d7d262f112a6a8f36c70bf data/captures/2026-09/higgsfield/nano-banana-2.png new higgsfield nano-banana-2.png 2026-09-24 True Higgsfield (model not identified)
44 dec96b39618905556a6d0592041d38aae0fb69e462b7dd4f3295242ff2b72543 data/captures/2026-09/higgsfield/nano-banana-pro.png new higgsfield nano-banana-pro.png 2026-09-24 True Higgsfield (model not identified)
45 c1e3ad5ace74231a0106827a26cef9e3caf1424977b073ccba19a13f1eb3be3f data/captures/2026-09/higgsfield/nano-banana.png new higgsfield nano-banana.png 2026-09-24 True Higgsfield (model not identified)
46 776cba6484b751e729778253ba885f7042a9b53aa72d8315d27303533d2e3681 data/captures/2026-09/higgsfield/recraft-v4-1-utility.png new higgsfield recraft-v4-1-utility.png 2026-09-24 True Higgsfield (model not identified)
47 1e68c02f97f4f2af68c1096e2631def01e6dc1bf388eaad2eae27a93f67c730a data/captures/2026-09/higgsfield/recraft-v4-1.png new higgsfield recraft-v4-1.png 2026-09-24 True Higgsfield (model not identified)
48 6153f35d8a7505162118f884ffc79f2f311a840251b799f8095fee06b4d615f8 data/captures/2026-09/higgsfield/seedream-4-0.png new higgsfield seedream-4-0.png 2026-09-24 True Higgsfield (model not identified)
49 30d53dbfc5bd80b0c4a7435f02955590408ad206fe41017d29ce82a8e13667c8 data/captures/2026-09/higgsfield/seedream-4-5.png new higgsfield seedream-4-5.png 2026-09-24 True Higgsfield (model not identified)
50 a86d007946c30c0fee139434d1cf6884e142ea11db3afb7911057e9415110d06 data/captures/2026-09/higgsfield/seedream-5-flash.png new higgsfield seedream-5-flash.png 2026-09-24 True Higgsfield (model not identified)
51 5ad760ca1ecf73fea60c78520f1903ba3fd6c2b5e4d45e963558a945c91e9007 data/captures/2026-09/higgsfield/seedream-5-lite.png new higgsfield seedream-5-lite.png 2026-09-24 True Higgsfield (model not identified)
52 2d64e99f5281fe10ad955429b26720dd2092bf7e943456b39f68564eb35c8e59 data/captures/2026-09/higgsfield/seedream-5-pro.png new higgsfield seedream-5-pro.png 2026-09-24 True Higgsfield (model not identified)
53 0d3a70c1382639241d8b55966b19965ad42824aad60663a20a5f5bc810101cc6 data/captures/2026-09/higgsfield/soul-cinema.png new higgsfield soul-cinema.png 2026-09-24
54 fd5703240e9c045dbfb52c5fbef90802974f06aec716f482e8af74ef91288104 data/captures/2026-09/higgsfield/soul-v1.png new higgsfield soul-v1.png 2026-09-24
55 91a2160b5a72f23776ac25207250359e7f86ade761b531247856a47488a50e63 data/captures/2026-09/higgsfield/soul2-image.png new higgsfield soul2-image.png 2026-09-24 True Higgsfield (model not identified)
56 f5f0b26198f8f1da107280b3c2c20c82897c3d522e27ba0acc4cf9eb8f74650a data/captures/2026-09/higgsfield/flux-3-video.mp4 new higgsfield flux-3-video.mp4 2026-09-24 True Black Forest Labs (FLUX)
57 967dcb6022e19f55639ff705a58e5252a62a24405f247dcffefcc0f610149c30 data/fixtures/provenance/higgsfield-happyhorse.mp4 existing higgsfield happyhorse.mp4 2026-09-24 True Alibaba Tongyi (Wan, HappyHorse)
58 7011c92d52ec624da12600f24a4abb8d997f26cdea62d6f5a8d1940bc7ffcc9c data/fixtures/provenance/higgsfield-kling-3-0-turbo.mp4 existing higgsfield kling-3-0-turbo.mp4 2026-09-24 True Kuaishou Kling AI
59 5fe5b9d08b9fb41a4d3eea470d443eb5df520235300e65134090338701215a43 data/fixtures/provenance/higgsfield-minimax-h3.mp4 existing higgsfield minimax-h3.mp4 2026-09-24 True MiniMax Hailuo AI
60 7d4ffa63755d605538c9a73059b4f6354a57e4f21100a92497aebc3c19dc3485 data/fixtures/provenance/higgsfield-veo-3-1-lite.mp4 existing higgsfield veo-3-1-lite.mp4 2026-09-24 True Google (Gemini / Imagen)
61 07fcc98ddc21f80d2c4b918c8afa9298ddab4ae49fc6428c8e464a9b69c9db21 data/captures/2026-09/higgsfield/wan-2-5.mp4 new higgsfield wan-2-5.mp4 2026-09-24 True Alibaba Tongyi (Wan, HappyHorse)
62 40a828d0360820019f3033c367283652df0a99c21150bafaddbc9a92437e743f data/captures/2026-09/higgsfield/wan-2-2.png new higgsfield wan-2-2.png 2026-09-24
63 c3563b5413fe3d54ccc3f60c834c32e02f3dab7a830262bf38b6e0a700a0ac16 data/captures/2026-09/higgsfield/z-image.png new higgsfield z-image.png 2026-09-24 True Higgsfield (model not identified)
64 1fd7cccffb25f18e74fa5ebc639672f1361db6137e6b9e848bc33fc1f583c0fe data/fixtures/provenance/google-nano-banana.png existing nb-api gemini-2.5-flash-image.png 2026-09-24 True Google (Gemini / Imagen)
65 5fd14ce6d32f3806f0128f952eb30d36f7dad384a9eec728e5efbdb46ebca7db data/fixtures/provenance/google-nano-banana-pro.jpg existing nb-api gemini-3-pro-image.jpg 2026-09-24 True Google (Gemini / Imagen)
66 977110ac48678627d907d635ac1b110b930044c350b669fb5f927a500e7d95ac data/fixtures/provenance/google-nano-banana-2.jpg existing nb-api gemini-3.1-flash-image.jpg 2026-09-24 True Google (Gemini / Imagen)
67 df4f422b9e77d6b08d3e6d095299f0cdf6d48f6c770632bb042a6c7b09627334 data/fixtures/provenance/google-nano-banana-2-lite.jpg existing nb2-lite nb2lite-1.jpg 2026-09-24 True Google (Gemini / Imagen)
68 3d7dddd333ca6b576b3d7dc5220df42cbef3ea388bd4688f5671cdd796dcb805 data/captures/2026-09/nb2-lite/nb2lite-2.jpg new nb2-lite nb2lite-2.jpg 2026-09-24 True Google (Gemini / Imagen)
69 e04a0ed3976bdff9df7ffdc318296cadcca3ba6e7166c81247c27a09ba39fe5c data/captures/2026-09/nb2-lite/nb2lite-3.jpg new nb2-lite nb2lite-3.jpg 2026-09-24 True Google (Gemini / Imagen)
70 fb034e94e4cbca9e0b56d82389d361fda0d6191f7e16f37ac6c55cd62a3621f7 data/fixtures/provenance/google-gemini-omni-flash-api.mp4 existing omni-flash omni-flash-1.mp4 2026-09-24 True Google (Gemini / Imagen)
71 25b2dc2a3c147dd8f04457a6b85183edd6ee235abdfe92c162c41c25812b0d9a data/captures/2026-09/runway/flux-2-klein.png new runway flux-2-klein.png 2026-09-24 True Black Forest Labs (FLUX)
72 e9b75d61adef6842c602767c4c0a5217de816927fd257ba1675e7e4a4dd043d0 data/captures/2026-09/runway/flux-2-max.jpg new runway flux-2-max.jpg 2026-09-24 True Black Forest Labs (FLUX)
73 12262d853760b4e6dab7a896b833331ee5af43cd6e9467b899b7de76c7361d8d data/fixtures/provenance/runway-gen4-image.png existing runway gen4-image-artifact.png 2026-09-24 True Runway
74 98c0040b60aad1187c45df5fd4d6e8a11762950329b1a89183d6a58d5b947ad2 data/fixtures/provenance/runway-gen45-video.mp4 existing runway gen45-video-artifact.mp4 2026-09-24 True Runway
75 eaec9e1c3a6c46c14d6ab8d12954b875e7482c8fde2a6d53ccd2a0b77c227a0b data/captures/2026-09/runway/gpt-image-1-5.png new runway gpt-image-1-5.png 2026-09-24 True OpenAI (ChatGPT / GPT Image / DALL·E / Sora)
76 2905127c3caabf13906abe6abaef8096209ee9e6e961e899b112f82ebb6e0c4f data/captures/2026-09/runway/gpt-image-1-mini.png new runway gpt-image-1-mini.png 2026-09-24 True OpenAI (ChatGPT / GPT Image / DALL·E / Sora)
77 22fb128833cb401a02b72a4ef5f23a577224a97950f296d03433224fb2249afd data/captures/2026-09/runway/gpt-image-2-5-flare.png new runway gpt-image-2-5-flare.png 2026-09-24 True OpenAI (ChatGPT / GPT Image / DALL·E / Sora)
78 249b0d0f3fe3decc140a4ba234aee862d107b7a181bb47882f280cbddd325bfe data/captures/2026-09/runway/gpt-image-2-5-sunburst.png new runway gpt-image-2-5-sunburst.png 2026-09-24 True OpenAI (ChatGPT / GPT Image / DALL·E / Sora)
79 8c0d4d0e739e559035a16bdc276fe8d517d4561736e56c0ddf8d1da46181dfbd data/captures/2026-09/runway/gpt-image-2.png new runway gpt-image-2.png 2026-09-24 True OpenAI (ChatGPT / GPT Image / DALL·E / Sora)
80 9f7fae91c8faf9eb5554443d395dfd3b23204702b32feb19e1904ab3009d8c29 data/captures/2026-09/runway/grok-imagine-2-0-or-quality-a.jpg new runway grok-imagine-2-0-or-quality-a.jpg 2026-09-24 True xAI Grok Imagine
81 99c7873a4c3de880af9daeb5c0fa753232313d4e4689f0976bbd020d2b420465 data/captures/2026-09/runway/grok-imagine-2-0-or-quality-b.jpg new runway grok-imagine-2-0-or-quality-b.jpg 2026-09-24 True xAI Grok Imagine
82 001007bdeda172730028b2d54eb1b2acd90f6396800c10e2be2efe777faa1718 data/captures/2026-09/runway/grok-imagine.jpg new runway grok-imagine.jpg 2026-09-24 True xAI Grok Imagine
83 14e97f57d83f5438a13b89175eb995ec07f817432642466b1bdb8572f7573da2 data/captures/2026-09/runway/ideogram-4-0.png new runway ideogram-4-0.png 2026-09-24 True Ideogram
84 8a651b72eed17775e222c1a40b5bbea6e69715a27d6c8e8e0e3d4c5d0723909c data/captures/2026-09/runway/ideogram-p-image.png new runway ideogram-p-image.png 2026-09-24 True Ideogram
85 3132a2e7198ecd3dead3042cebc6c9091264638bf63b40d5027ff058bd043547 data/captures/2026-09/runway/kling-o3-standard.mp4 new runway kling-o3-standard.mp4 2026-09-24 True Kuaishou Kling AI
86 b95f4a9f2706fc4f3c8716f6daa016029e55f07177dfd2efd8fedbaf67094981 data/captures/2026-09/runway/ltx-2-5-fast.mp4 new runway ltx-2-5-fast.mp4 2026-09-24
87 b374c9d29c094a2fd1b0b6257c989a43d155ce62d9fdc3d445707978cd7dd1e5 data/captures/2026-09/runway/meta-muse-image.png new runway meta-muse-image.png 2026-09-24 True
88 fbc0313aea807e67d1bb904cac7b47c9163b1ac8435d4774d4b63e99ba1975df data/captures/2026-09/runway/nano-banana-2-lite.jpg new runway nano-banana-2-lite.jpg 2026-09-24 True Google (Gemini / Imagen)
89 a32344cb19bbd6607733aa138b45b66e919f827cdfcdfc0d7da8de75906237a9 data/captures/2026-09/runway/nano-banana-2-via-runway.png new runway nano-banana-2-via-runway.png 2026-09-24 True Google (Gemini / Imagen)
90 d2b82a1907056f8f022308fdd16e701238da816a9c9c339d7fa54999af2cf12e data/captures/2026-09/runway/nano-banana-pro.png new runway nano-banana-pro.png 2026-09-24 True Google (Gemini / Imagen)
91 077e552f16ab1de180e3487e85567f5e0565e1bd6e942dc1d585309a105fa19a data/captures/2026-09/runway/nano-banana.png new runway nano-banana.png 2026-09-24 True Google (Gemini / Imagen)
92 88f0e48032dee30d1e6237962af74cd38991ab52c1424a4f8e12aadf4e1b9346 data/captures/2026-09/runway/seedance-2-mini.mp4 new runway seedance-2-mini.mp4 2026-09-24 True BytePlus (ByteDance)
93 5df40eb93f1b0f4d802bd117fba736ecec9713f5f411c6449726690d94972560 data/captures/2026-09/runway/seedream-5-0.png new runway seedream-5-0.png 2026-09-24 True BytePlus (ByteDance)
94 8275bf3af0c8a3d4815f76a546f29172c31ddd65c7a153e1bd6d6421beb1eccc data/captures/2026-09/runway/seedream-5-pro.png new runway seedream-5-pro.png 2026-09-24 True BytePlus (ByteDance)
95 9d8f9901115697ca4925f02e3b5c91920fb02579657268c6525c0cd9bcf33d63 data/captures/2026-09/youtube/yt-136-video.mp4 new youtube yt-136-video.mp4 2026-09-24
96 68c87b0697fb954f3533f96ec32875f6dec173c142fd4d4f2552c624c21f7c28 data/captures/2026-09/youtube/yt-398-av1.mp4 new youtube yt-398-av1.mp4 2026-09-24
97 aa2fde5c0444eda05f40db2a8974183284016876c9788f099dda9df5aac1714f data/fixtures/provenance/youtube-reencode-gemini-omni-flash.mp4 existing youtube yt-studio-download.mp4 2026-09-24 True Google (Gemini / Imagen)
98 236dd73a25a893b8f2c7bbdad8e1208341251c2b12e7b261c1fff65bf58277a5 data/fixtures/provenance/youtube-reencode-grok.mp4 existing youtube yt-studio-grok.mp4 2026-09-24
99 7c37874c72d289606e997434ccde73dba3aa89ecdc5adb3dfe64923933da5378 data/captures/2026-09/higgsfield/cinema-studio-3-0.mp4 new higgsfield cinema-studio-3-0.mp4 2026-09-25 True BytePlus (ByteDance)
100 485449b69f1013a97970aabc5429327db1ff88559c81e3430c536fab108db7dc data/fixtures/provenance/higgsfield-cinema-studio-v2.mp4 existing higgsfield cinema-studio-v2.mp4 2026-09-25 True Kuaishou Kling AI
101 f7915d8e77eeb6feceff7169aa79c380330aa2f71a71b5eba426c4495cb8d696 data/captures/2026-09/higgsfield/edit-flux-3.mp4 new higgsfield edit-flux-3.mp4 2026-09-25 True Black Forest Labs (FLUX)
102 fca47e6aea979b3fb0be01b5775c47f95acde66b4692957aae928a17ce86418d data/captures/2026-09/higgsfield/edit-gemini-omni-1-1.mp4 new higgsfield edit-gemini-omni-1-1.mp4 2026-09-25 True Google (Gemini / Imagen)
103 4f8aff9e6ef05c71a5028f2d3b5c63191b5e6932ebe39827068ae09cfe00e17b data/captures/2026-09/higgsfield/gemini-omni-flash-1-1.mp4 new higgsfield gemini-omni-flash-1-1.mp4 2026-09-25 True Google (Gemini / Imagen)
104 7c9a93140bffb50de173bca7cff1ecb7b2a75f611bf11bb26a54d903c043e5e3 data/captures/2026-09/higgsfield/gemini-omni-flash.mp4 new higgsfield gemini-omni-flash.mp4 2026-09-25 True Google (Gemini / Imagen)
105 a3c2e8c506327ff0bdee078372be8d89fb913672f61efc66a4791771026ec0fc data/fixtures/provenance/higgsfield-genjutsu-motion-control.mp4 existing higgsfield genjutsu-motion-control.mp4 2026-09-25
106 d3b7a9bbe03abdab2b6c0fb009f90a961cb021405ff652c02943e51e01c38ba0 data/captures/2026-09/higgsfield/genjutsu-replace-object.mp4 new higgsfield genjutsu-replace-object.mp4 2026-09-25
107 32ec5b3d70636c6295ff312dadb9fc018e8ff061c7ebe786000fcbbdc2161b6b data/captures/2026-09/higgsfield/grok-video-1-5.mp4 new higgsfield grok-video-1-5.mp4 2026-09-25 True xAI Grok Imagine
108 3811bca40850d8b4caebf3cc0f21b8c414f8b7d7c810f0a72b38b845174bb02e data/captures/2026-09/higgsfield/grok-video.mp4 new higgsfield grok-video.mp4 2026-09-25 True xAI Grok Imagine
109 67f4b6c49f6b93485fd47c457f64d3f721ec326ec57a9fb39488d6b9023528b7 data/fixtures/provenance/higgsfield-hailuo-2-3.mp4 existing higgsfield hailuo-2-3.mp4 2026-09-25 True MiniMax Hailuo AI
110 96034f675008efcc09ca25c0739068f6e7301dde3ac67f4cfd14b82c5c7f9cae data/captures/2026-09/higgsfield/kling-2-6.mp4 new higgsfield kling-2-6.mp4 2026-09-25 True Kuaishou Kling AI
111 00a0ab7a2fe37f1c5b3208f9940c928932124015df7391dab4bfa5a9cc21af0c data/captures/2026-09/higgsfield/kling-3-0.mp4 new higgsfield kling-3-0.mp4 2026-09-25 True Kuaishou Kling AI
112 1f8fb86da8d71db7d2e6c4f87a6a2fd5cab69b7824406d7145a2756c2d358e38 data/captures/2026-09/higgsfield/marketing-studio.mp4 new higgsfield marketing-studio.mp4 2026-09-25 True BytePlus (ByteDance)
113 bacf6dc7ab9b6dfe67488349ecced76b10221f3c73196a1a4bff163588e7270d data/captures/2026-09/higgsfield/minimax-h3-max.mp4 new higgsfield minimax-h3-max.mp4 2026-09-25 True MiniMax Hailuo AI
114 11b8e1890ac393a41de61f9a39633cefcad45b9e47f82d13a92906ac5f6ced45 data/captures/2026-09/higgsfield/seedance-1-5-pro.mp4 new higgsfield seedance-1-5-pro.mp4 2026-09-25
115 a65d7b57c528f6fa0e6b844d918d16cc6c2260038921d1c7d6d2e2bf60095a26 data/captures/2026-09/higgsfield/seedance-2-0.mp4 new higgsfield seedance-2-0.mp4 2026-09-25 True BytePlus (ByteDance)
116 24857c4744ee9a7e4385d1f85df0acdd0aba05f1827210b7b97556d1a9d58841 data/captures/2026-09/higgsfield/seedance-2-5.mp4 new higgsfield seedance-2-5.mp4 2026-09-25 True BytePlus (ByteDance)
117 d4aec466d7811ae5670f4db6308f5275d2773653089736849f85f96fe2b262be data/captures/2026-09/higgsfield/veo-3-1.mp4 new higgsfield veo-3-1.mp4 2026-09-25 True Google (Gemini / Imagen)
118 e78ed6fa92814a72a64b6a377bebfd5b65efeae149d49170c68744917e9246b3 data/captures/2026-09/higgsfield/wan-2-6.mp4 new higgsfield wan-2-6.mp4 2026-09-25 True Alibaba Tongyi (Wan, HappyHorse)
119 f59ae93226bae3cc24598214ff623f99957e127838541b57acd55bd9cdb8e72c data/captures/2026-09/higgsfield/wan-2-7.mp4 new higgsfield wan-2-7.mp4 2026-09-25 True Alibaba Tongyi (Wan, HappyHorse)
120 bfb89e7729ef0e54260452f525ebdadd1237fac0902c5bda39edbcd7a48aa6cc data/captures/2026-09/higgsfield/wan-3-0-prime.mp4 new higgsfield wan-3-0-prime.mp4 2026-09-25 True Alibaba Tongyi (Wan, HappyHorse)
121 3e982e49d46445143f78a0b445642ce888a23571823e6db74e93c0c7ede3c9c1 data/captures/2026-09/higgsfield/wan-3-0.mp4 new higgsfield wan-3-0.mp4 2026-09-25 True Alibaba Tongyi (Wan, HappyHorse)
122 7fc933d784dcb1ed4bef0f6d857fe79156c1ef1da9d437d750633217d0da23a8 data/captures/2026-09/google-photos/ask-dog-to-cat.jpg new google-photos ask-dog-to-cat.jpg 2026-09-25 True Google Photos (AI edit)
123 1c8726279b869bc435dd30bcb385d04203dd9af5570b0d2d393ff3f3e5162e5b data/captures/2026-09/google-photos/eraser-glasses.jpg new google-photos eraser-glasses.jpg 2026-09-25 True Google Photos (AI edit)
124 1abca17d4649e458626864560e5d2db6397eb51d7bc8617f49bc70be0905522e data/captures/2026-09/google-photos/gphotos-5.jpg new google-photos gphotos-5.jpg 2026-09-24 True Google Photos (AI edit)
125 56817730a46a84975a7ac6d9595d2f68a18676b49fd1be1c5230b517beafa9cc data/captures/2026-09/google-photos/gphotos-6.jpg new google-photos gphotos-6.jpg 2026-09-24 True Google Photos (AI edit)
126 39f8141415ab51fd6070b6d2591132c81fffa6b44f76f2e5e84b38912b3becc1 data/captures/2026-09/runway/flux-3-video.mp4 new runway flux-3-video.mp4 2026-09-25 True Black Forest Labs (FLUX)
127 81cd555906034c4aff6473047a7a898d14ce060dd4e6a3c6226902547446045b data/captures/2026-09/runway/grok-imagine-1-5-video.mp4 new runway grok-imagine-1-5-video.mp4 2026-09-25 True xAI Grok Imagine
128 c255d4a7168197e4ab6af162690d305f3e3f48037b1a5fd9e877ab782539e0fb data/captures/2026-09/runway/gemini-omni-1-1-flash.mp4 new runway gemini-omni-1-1-flash.mp4 2026-09-25 True Google (Gemini / Imagen)
129 a8711432008960149a16afd43704fa673f70826cf527d677aa0c35b7a18502d1 data/captures/2026-09/runway/happyhorse-1-0.mp4 new runway happyhorse-1-0.mp4 2026-09-25 True Alibaba Tongyi (Wan HappyHorse)
130 4c909ca68ecad62c9200727cae2bef5e80678a255b3fd781f7a43ca0b0824f46 data/captures/2026-09/runway/minimax-h3.mp4 new runway minimax-h3.mp4 2026-09-25 True MiniMax Hailuo AI
131 c04468ef20081aecf16ee94fe81ddd419ddae36acb678e7e4f26def7a1f7bb72 data/captures/2026-09/google-photos-web/forest-original.jpg new google-photos-web forest-original.jpg 2026-09-26
132 af0265e41edec3413683f86441a1ffa9c64dbcb7117070d7ccbd2e91c20fd327 data/captures/2026-09/google-photos-web/forest-enhance.jpg new google-photos-web forest-enhance.jpg 2026-09-26
133 3f42e0877f67c4677f6f52be18146923fc5eeb471f9e0e27b9477d29dc1e6bbb data/captures/2026-09/google-photos-web/forest-sky-vivid.jpg new google-photos-web forest-sky-vivid.jpg 2026-09-26
134 c83f903117cc030edf78164430ce59ffa897cb3a9efe464cf257e55644a955fd data/captures/2026-09/google-photos-web/forest-crop-square.jpg new google-photos-web forest-crop-square.jpg 2026-09-26
135 e5612ea4bc06df48821d431d8d4758d3c73d1e74bd7b5b5dce921eaffdfbbe93 data/captures/2026-09/higgsfield/edit-kling-3-0-omni.mp4 new higgsfield edit-kling-3-0-omni.mp4 2026-09-26 True Kuaishou Kling AI
136 a76119db1b50f529e397875d38cf3938c5ae3b9e79d893d25567a7eee2340f41 data/captures/2026-09/higgsfield/dop-lite.mp4 new higgsfield dop-lite.mp4 2026-09-26
Binary file not shown.

After

Width:  |  Height:  |  Size: 879 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1011 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 519 KiB

Binary file not shown.
Loaded 100 of 342 files, more files were not shown because too many files have changed in this diff. Show more