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
ObjectStorageSinkremoves 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
504timeouts 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
- 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.
- 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. - Full Ad compose — Muxing video, voiceover, and optional music required ffmpeg in the backend container and a custom
LocalMuxProviderthat uploads composed MP4s directly to B2. - Production deploy — The frontend must be built with
VITE_API_BASE_URL=/api/v1for 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
- GitHub: https://github.com/Tsegaye16/AI-Advert
- Genblaze SDK: https://github.com/backblaze-labs/genblaze
- Reference sample: https://github.com/backblaze-labs/genblaze-gen-media-multi-provider-sample
Built With
- ai-image
- ai-video
- ant-design
- backblaze-b2
- boto3
- decart
- docker
- docker-compose
- edge-tts
- fastapi
- ffmpeg
- genblaze
- generative-ai
- multimodal
- nginx
- nvidia-nim
- provenance
- python
- react
- rest-api
- sqlalchemy
- sqlite
- text-to-speech
- typescript
- vite

Log in or sign up for Devpost to join the conversation.