Inspiration
AI video generation is unpredictable. Creators already do this by hand, run the same prompt through Kling, Veo, Pixverse, and whatever else is available, then eyeball the results with zero record of what came from where or what it cost. We wanted to formalize that workflow instead of leaving it to hand-comparison and disappearing browser tabs.
What it does
You describe a subject once. The app generates a single reference image, the consistency anchor, then fans out to 3 video models (Kling, Pixverse, Veo), each conditioned on that exact same image. You compare the takes side by side, pick a favorite, and every asset traces back to that one shared reference via parent_run_id. Three ways to start: bring your own image, generate and review the image before paying for video, or run everything automatically.
How we built it
FastAPI backend, plain HTML/JS/CSS frontend (no framework), deployed on Render. Genblaze orchestrates the fan-out; one Pipeline generates the reference image, three more link back to it via from_result() and condition on it via external_inputs. Backblaze B2 stores every asset and its SHA-256 provenance manifest. A background job + polling architecture surfaces live per-step progress, since generation time ranges from seconds to several minutes depending on the model.
Challenges we ran into
GMI Cloud's model catalog rotates; Veo3 went stale mid-build, replaced by veo-3.1-fast-generate-001. Two candidate third models (Seedance, then Wan) failed with reproducible backend errors, confirmed via GMI's own Playground, so we knew it wasn't our code. The one that finally worked, Pixverse, hit a real bug in genblaze itself: its connector forces the duration parameter to an integer via internal type coercion, but GMI's live API requires it as a string. We root-caused this against GMI's actual API docs and bypassed genblaze's pipeline for that one model with a direct HTTP call, uploading the result to B2 by hand. Separately, our local run history lived on disk and reset on every redeploy; we ended up recovering "lost" successful results straight from B2 rather than re-paying for them.
Accomplishments that we're proud of
Diagnosing an actual SDK bug (not just a config mistake) by comparing genblaze's behavior against the vendor's own documented API contract. Building graceful degradation so one provider failing doesn't take down the other two. Recovering real, paid-for results from B2 after a redeploy wiped local state, instead of losing them or re-paying. Shipping a real, deployed, cost-tracked app rather than a script that only runs on one machine.
What we learned
Vendor catalogs and even orchestration SDKs can have stale or simply wrong assumptions; verify against the live console, not just the docs or the SDK's own schema. Durable storage is what makes recovery possible when everything else (local disk, in-memory state) resets out from under you.
What's next for Take Comparison Studio
File the genblaze duration-coercion bug upstream. Move run history into B2 itself so it survives redeploys instead of living on local disk. Add more models and modalities (audio, multi-image references). Support side-by-side A/B voting across multiple viewers, not just a single favorite pick.
Log in or sign up for Devpost to join the conversation.