GenAI Brand Manager
A one-off AI campaign, rebuilt into a dashboard any brand can join
A one-off AI campaign for a credit-card brand, rebuilt as a dashboard any brand can be onboarded into — 33 days, 33 database migrations.
A single 1,130-line function, generateContent() in api.ts, dispatches five models across three providers behind one button — from Flux LoRA to Stable Video Diffusion — turning a dashboard click into a full generation pipeline.
Act 1 runs left to right and ends in a delivered campaign: a finite pipeline, run once, by hand. Act 2 is the same capability rebuilt as a product — and it is a cycle, because the point was never one brand. The fold between them is the whole story.
Train the brand, don't prompt it. The usual way to get brand-consistent AI imagery is to pile adjectives in front of a general model and hope. It does not survive a campaign, let alone a roster. So the brand was trained into the model instead: five LoRA sets built from the client's own imagery, 65 curated images in the largest, including one trained on nothing but the physical card — because the card is the element a viewer checks hardest and a general model always gets subtly wrong. Brand fidelity stopped being a prompting problem and became a weights problem. The payoff landed in Act 2, where that same trained model became the dashboard's default backend.
The pipeline became a product in 33 days. Between 13 January and 14 February 2025, 33 database migrations — roughly one a day — turned a one-off creative pipeline into an application: five tables, anonymous auth with row-level security, and about 7,100 lines of front-end. What matters is the shape of the leap, not the line count. A creative engagement normally ends when the deliverable ships. This one ended with the capability packaged so other people could operate it.
Governance in the loop. Brand research constrains the prompts rather than sitting in a document nobody opens. Prompts are composed from curated industry libraries — three industries, 21 variations — so a bad prompt cannot enter the system in the first place. And nothing reaches the marketplace tile without passing pending → generated → approved: a human gate encoded as a data model rather than a policy people are asked to remember. The volume went up; the judgement about whether something was on-brand stayed with a person.
| artifact | count | what it is |
|---|---|---|
| LoRA training sets | 5 | 65 images in the largest; one for the card alone |
| stage exports | 74 | 26 LoRA tests · 22 flux+kling · 18 Recraft · 5 Topaz · 3 luxury |
| delivered films | 4 | process film and 9:16 finals reels |
| prototype demo edits | 2 + 4 | proof-of-concept walkthroughs and four moments cut from the live recordings |
| database migrations | 33 | 2025-01-13 → 2025-02-14, one per day of build |
| tables | 5 | brands · tasks · brand_research · generation_history · feedback |
| generation engine | 1,130 lines | one dispatch across 5 models, 3 providers |
| prompt library | 3 × 21 | industries × task variations |
| front-end | ~7,100 lines | React 18 · Vite · Tailwind · Supabase |
| UI screenshots | 40 | the build in progress |
| partner roster | 99 institutions | the scale the tool was aimed at |
Built for Avant / Concora in January and February 2025, and archived since. It was an internal tool, and it shows its context honestly: API keys were bundled client-side and the listing-copy call ran in the browser — both correct for a small team behind a login, both a server-side route in anything public. The class of problem it answers is the one where brand fidelity and scale pull in opposite directions: a roster too large to art-direct one brand at a time, and a brand system too particular to hand to a general model.
Project Elements
Have a Project in Mind?
Animation direction, VFX and creative technology. Message me on LinkedIn or get in touch.