AdVault — About the Project

Inspiration

AI can produce ad creatives in minutes — but marketing teams still struggle with three problems: trust (was this asset tampered with?), storage (where do hundreds of generated files live?), and traceability (which prompt, model, and parent asset produced this MP4?).

We built AdVault to close that gap: a campaign pipeline that moves from product brief → generated media → durable cloud storage → verifiable provenance. The Backblaze Generative AI Media Hackathon was the perfect fit — Genblaze for orchestration and Backblaze B2 for production-grade object storage.

What AdVault does

AdVault turns a product brief into brand-safe ad packs:

Mode Pipeline Output
Quick Image → B2 + manifest Hero image
Full Ad Image → video → voiceover → FFmpeg compose Final MP4
Storyboard Multi-scene plan → edit/regenerate → finalize Scene gallery + video

Every run records who generated what: prompts, providers, models, SHA-256 hashes, and remix lineage via parent_run_id.

How we built it

Backend — Python + FastAPI + Genblaze

We followed patterns from the official genblaze-gen-media-multi-provider-sample. Core flows use genblaze_core.Pipeline with a multi-provider switchboard (NVIDIA NIM, Decart, Edge TTS, local FFmpeg Ken Burns video, and more).

Storage uses Genblaze's ObjectStorageSink backed by B2:

ObjectStorageSink(
    S3StorageBackend.for_backblaze(
        bucket, region, key_id, app_key, auto_lifecycle=True
    ),
    prefix="advault",
    key_strategy=KeyStrategy.HIERARCHICAL,
)

After each run, a manifest.json sidecar is written to B2 under advault/campaigns/{id}/runs/{run_id}/.

Frontend — React + Vite + TypeScript

A single-page app with campaign builder, live run polling, storyboard editor, asset gallery (presigned B2 previews), and a provenance viewer with one-click integrity verification.

Deploy — Docker Compose

Backend (Python 3.12 + ffmpeg) and frontend (nginx reverse proxy for /api/) run as two containers, with B2 credentials injected via environment variables.

Integrity verification

Each asset stores a SHA-256 hash when it is generated (stored_hash). When you click Verify integrity, AdVault re-downloads the file from B2 and recomputes the hash:

computed_hash = SHA256(file bytes downloaded from B2)

Verification passes when:

computed_hash == stored_hash

If someone changes the file in B2, the hashes no longer match and verification fails. That gives reviewers a clear trust signal before approving finals into advault/campaigns/{id}/approved/.

What we learned

  • Genblaze ObjectStorageSink removes custom upload code — media lands in B2 as part of the pipeline, not as a post-processing step.
  • Provider fallbacks matter. Free-tier NVIDIA NIM can return 504 timeouts under load; pinning Decart for image generation and local Ken Burns for video made Full Ad runs reliable.
  • Provenance is a product feature, not logging. Judges and marketers care about verify-before-approve, not just generation speed.
  • Storyboard mode is powerful but multiplies API calls (one image per scene) — vendor selection and timeouts need careful tuning.

Challenges we faced

  1. Multi-provider reliability — NVIDIA free NIM returned gateway timeouts during storyboard scene generation. We added per-scene vendor fallback and switched primary image generation to Decart.
  2. Windows + B2 file paths — Genblaze's local file allowlist blocked temp paths on Windows; we patched file:// handling so pipeline outputs transfer cleanly to B2.
  3. Full Ad compose — Muxing video, voiceover, and optional music required ffmpeg in the backend container and a custom LocalMuxProvider that uploads composed MP4s directly to B2.
  4. Production deploy — The frontend must be built with VITE_API_BASE_URL=/api/v1 for same-origin nginx proxying; CORS and env var propagation to Docker required explicit configuration on the host.

B2 & Genblaze usage

Backblaze B2: All generated media, brand logos, manifest sidecars, and approved finals are stored in B2 with hierarchical keys. The API serves presigned URLs for preview and download.

Genblaze: Orchestrates Quick, Full Ad, and Storyboard pipelines; produces manifests with canonical hashes; supports remix lineage and optional MP4 manifest embedding via Mp4Handler.

AI providers & models

Slot Vendors Example models
Image NVIDIA NIM, Decart, Replicate flux.1-schnell, lucy-image-2
Video Local (Ken Burns), Decart, NVIDIA, Replicate, GMI Cloud kenburns, cosmos-2.0-diffusion-text2world
TTS Edge TTS, ElevenLabs, LMNT, NVIDIA en-US-JennyNeural
Compose Local FFmpeg mux Video + voice (+ optional music)

Links

Built With

Share this project:

Updates