Inspiration

AI-generated and AI-assisted media is everywhere now, and there's still no reliable way to answer a simple question: who made this, with what, and how much of it was AI? The EU AI Act's Article 50 transparency rules are already in effect. Existing answers are weak — NFTs point to a token disconnected from the actual file, and Content Credentials (C2PA) adoption is real but uneven: Midjourney ships with no support for it, and neither do the open-source tools most people actually generate images with. We wanted proof that lives inside the file itself, not beside it.

What it does

TrueFrame embeds a signed provenance manifest directly into a media file — model, provider, prompt, and a five-point human/AI contribution classification (from fully human-made to fully AI-generated) — so the record travels with the file wherever it goes.

  • POST /embed signs a file (PNG, JPEG, WebP, MP4, MP3, WAV, FLAC, AAC — with automatic sidecar fallback for anything else) and archives it to Backblaze B2.
  • POST /verify checks any file against that archive with a byte-for-byte comparison, not just an internal consistency check — it catches a one-pixel edit.
  • GET /report/{sha256} is a permanent, shareable provenance report.
  • GET /ledger is a public, filterable record of everything ever signed.
  • A live demo studio (Clerk-gated, to protect the shared credit pool) lets anyone generate a real image via GMI Cloud and watch it get signed, verified, and tampered with in real time.

How we built it

Two services. trueframe-api (Python/FastAPI, on Railway) does the actual signing — every manifest is built with Genblaze's own StepBuilderRunBuilderManifest.from_run(), embedded with SmartEmbedder, and the entire public ledger runs on Genblaze's ParquetSink, synced to Backblaze B2. trueframe-web (Next.js, TypeScript, Clerk, on Vercel) is a pure API client with no business logic of its own.

B2 is the only datastore — no Postgres, no application database. Content is split into two storage namespaces (trueframe/ for permanent signed content, trueframe/demo/ for the public demo) specifically so a B2 Lifecycle Rule can safely rotate out disposable demo content without ever touching a real customer's permanent record. Upstash Redis is scoped narrowly to short-lived rate-limit counters — no provenance data ever touches it.

The live demo calls GMI Cloud's gpt-image-2 through its native OpenAI-compatible endpoint, with generation quality hardcoded server-side to keep the shared credit pool safe from abuse.

Challenges we ran into

Genblaze's Manifest.verify() only checks that a manifest is internally self-consistent — it does not re-hash the surrounding media. We confirmed this directly: we signed a file, corrupted it outside the manifest chunk, and verify() still returned True. So the tamper check that actually matters for this product — does this exact file match what we signed — compares the uploaded file's hash against the archived signed copy from B2, not against Genblaze's own verify() call.

We also ran an independent security review of our own code before submitting, and it found real issues: a path where an unarchived manifest could report as verified, a billed endpoint without its own authentication, and a stored XSS in our built-in verifier UI. We fixed all of it rather than ship blind — the review is part of why we trust the demo you'll see.

The Photoshop plugin turned out to have a hard architectural constraint: Genblaze is a Python SDK, and UXP plugins run in a JavaScript sandbox with no way to run Python at all. Signing had to be delegated entirely to the API rather than reimplemented client-side. We had no Photoshop instance available to test against during that phase, so it ships as a fully documented, honestly-labeled skeleton — not a claimed-working feature.

Accomplishments that we're proud of

Everything in this submission was actually tested against real SDK behavior — a real PNG and a real ffmpeg-generated MP4 through the full embed/extract/tamper cycle — not assumed from documentation. The B2 architecture (content-addressable storage, a namespace split built specifically to make Lifecycle Rules safe, a Genblaze-native ledger) is real infrastructure, not a demo shortcut. And we treated our own security review as something to act on immediately, not defer.

What we learned

Test SDK behavior empirically — a changelog or a docstring is not the same as running the code. For a product whose entire value is trust, the verification logic's actual guarantees matter more than how confident the language around it sounds — the gap between "hash-attested" and "cryptographically signed" is not a wording nitpick, it's the whole point. And the "a big company already solved this" fear is worth checking, not assuming — the real 2026 adoption picture for Content Credentials is far more uneven than the premise suggests.

What's next for TrueFrame

Live-testing the Photoshop plugin against real Photoshop, then Adobe Marketplace submission. Real Ed25519 asymmetric signing, so verification means more than hash-attestation. Ecosystem integrations — any generation platform piped through one API call, distributed via our RapidAPI listing. Per-user quotas and B2 Object Lock for a fully immutable archive.

Built With

Share this project:

Updates