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 /embedsigns a file (PNG, JPEG, WebP, MP4, MP3, WAV, FLAC, AAC — with automatic sidecar fallback for anything else) and archives it to Backblaze B2.POST /verifychecks 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 /ledgeris 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 StepBuilder →
RunBuilder → Manifest.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
- clerk
- fastapi
- genblaze
- nextjs
- node.js
- pyarrow
- pydantic
- python
- railway
- react
- typescript
- unicorn
- upstash
- vercel
Log in or sign up for Devpost to join the conversation.