← Creative Lab
Personal R&D — 2025

VIOLET

A brand-compliance loop that grades itself and fixes its own mistakes

VIOLET researches a brand from its name, compiles that research into prompts, scores every generated image against the brand with a vision model, and rewrites the prompt when an image fails.

0
Humans in the Loop
26
Image Models Wired
3
Prompt-Assembly Tiers
The hard part

A failing brand score doesn't just get discarded — it triggers a root-cause pass that rewrites the prompt and tries generation again, with nobody standing in the loop to approve it.

Client
Personal R&D
Role
Creator / Developer Brand Research Systems / Vision-Model QA
Timeline
2025
The loopresearch → generate → validate → learn — press play, or step it

The interesting part is not that it generates images. It is that the system holds an opinion about whether its own output is on-brand, and acts on it. A vision model scores each image against the brand profile; failures get a root-cause pass that rewrites the prompt and regenerates. That is an agentic loop, built before the word was fashionable.

a brand name that is the whole input no assets, no brief research brandResearch · 517 lines palette · archetype · rivals compile the prompt promptBrandFilter · 154 competitor names stripped generate 26 fal models · one interface Flux Pro · SD3.5 · Recraft · Ideogram validate gpt-4-vision · 566 lines logo · colour · style · rivals root cause IntelligentBrandRegen · 479 rewrite the prompt, retry fails passes the loop closes here — no human
STEP 1/6 A brand name is the entire input.
verified against v0.3.6
The tool itselfv0.4.0, a real run — not a mockup
VIOLET v0.4.0 running: the brand Adobe researched into a full profile, an on-brand image generated at 100% brand influence, and the Adobe Intelligence panel
VIOLET v0.4.0, mid-run — a real screen, not a mockup. “Adobe” was typed in and researched into the profile across the bottom; the generated image is held to that profile at full influence. Not hosted here: the front end carried live API keys, so it runs locally rather than behind this gated page.

1 · Research — a brand name becomes a structured profile: colour palette, typography, photography style, audience, positioning and a do/don’t list, in the Adobe Intelligence panel.

2 · Influence dial — one control for how hard that profile leans on every prompt; here at 100%, “strong brand emphasis”.

3 · Generate — on-brand stills across Story, Landscape, Square, Portrait, Classic and Cinematic framings, images or video, from one prompt box.

4 · History — every take is kept and provenance-stamped with the brand and influence it was made at, so a run is auditable afterward.

One evening, one brandthe influence ladder in the archive — Adobe, 14–16 Aug

The generation archive still holds a complete session, and it reads like the influence dial from bottom to top. Same brand, same evening as the screenshot above — each step's prompt is quoted from the archive verbatim.

A stark, minimal Adobe ad concept in white and black — the low-influence rung
Low — the brand as a whisper. Prompt, in full: “Adobe ad concept, clear, modern, confident, palette #ffffff #000000”. The profile contributes a palette and nothing else.
A neon graphics cloud of creative-tool icons — the style-vocabulary rung
Mid — the style vocabulary joins. “…Innovative, Modern mood, Illustration style, clean, minimal, futuristic, symmetrical, rule of thirds, negative space, cool LED lighting…” — the craft-lookup tables composing mood, style and framing into the prompt. This is the family the v0.4.0 screenshot's run belongs to.
A cyberpunk graphic designer in a neon-lit office rendered in Adobe's brand language — the full-compose rung
Full — the researched profile, spelled out. “…In the style of the Adobe brand: color palette of #FF0000, #000000, #FFFFFF, #ED1C24; bold creator-centric lifestyle and process shots photography style; diverse creatives captured mid-workflow…” — composeBrandPrompt at full influence, hex codes and all.
And then it moves. The full-compose frame handed to kling-video image-to-video — “quick punch in camera move” plus the same brand text. Hover to play. Stills to motion, one profile the whole way.
The loop, in its own wordstwo excerpts, verbatim from the source
// promptBrandFilter.ts — the exclusion list is
// researched, never hardcoded
competitors.forEach(competitor => {
  const competitorRegex =
    new RegExp(`\\b${competitor}\\b`, 'gi');
  if (competitorRegex.test(prompt)) {
    conflictsDetected.push(
      `Mentioned competitor: ${competitor}`);
    filteredPrompt = filteredPrompt
      .replace(competitorRegex, targetBrand);
  }
});
compile — every researched rival becomes a regex; a competitor in the prompt is rewritten to the target brand before generation ever runs.
// RealTimeBrandComplianceValidator.ts —
// four judgements per image, then a verdict
const logoCompliance = await this
  .validateLogoCompliance(imageUrl, intel, brand);
const colorCompliance = await this
  .validateColorCompliance(imageUrl, intel);
const styleCompliance = await this
  .validateStyleCompliance(imageUrl, intel);
const competitorCheck = await this
  .checkForCompetitorBrands(imageUrl, intel);
// → overallScore gates approve / regenerate
validate — logo, colour, style, rivals: the four scores that decide whether an image ships or goes back through the loop.
What is built, and what is notchecked against the source, not the README

Built and working

The closed loop. Research (517 lines) → prompt compilation (470) → compliance scoring against the brand with gpt-4-vision-preview (566) → root-cause regeneration (479). Each stage is its own service; the failure path is real code, not a diagram.

Competitor exclusion is generated, not hardcoded. promptBrandFilter.ts builds a regex per competitor from the researched rival list and strips them from prompts — so the exclusion list is as current as the research, and no brand data is baked into the source.

26 image models behind one interface, across Fal and OpenAI — Flux Pro, SD 3.5, Recraft v3, Ideogram, Bria, SDXL, plus video models (Kling, Runway Gen-3).

Honest gaps

The schema-driven form is half-built. The parameter form renders from a schema object rather than hardcoded JSX — but fetchFalModels.ts does not actually fetch it. It configures the Fal client, then returns a predefined schema branched on whether the model id contains "flux", "bria" or "recraft", with a comment saying so. A genuinely new model gets a generic fallback, not its own parameters. Live schema fetch is the obvious next commit.

Voice input is partly a stub. services/whisperService.ts is a 7-line placeholder. The working transcription path is utils/googleSpeechService.ts (75 lines, hitting Google's speech:recognize), with a 59-line Whisper response-shape helper beside it.

It cannot ship publicly as-is. Eight VITE_-prefixed keys means every one is bundled client-side. A public demo needs a keyless replay build or a server proxy — the constraint that shaped the whole showcase plan.

The receiptsv0.3.6
artifactcountwhat it is
source28,762 lines226 TypeScript / TSX files
services79research, generation, validation, regeneration, export, share, version
components94React 18 · Vite · Zustand · Supabase
image + video models26Fal ids referenced across the source, plus DALL·E via OpenAI
GPT-4 variants used5gpt-4 · 4o · 4-turbo · 4-vision-preview · 4o-mini-realtime
research service517 + 635brandResearch + EnhancedBrandIntelligenceService
compliance validator566RealTimeBrandComplianceValidator
regeneration479IntelligentBrandRegeneration

Built solo — design, architecture and engineering. The version in this write-up is 0.3.6, read from package.json; the snapshot folder is named v0.3.8, so treat the folder name as a label rather than a version. The class of problem it answers: brand fidelity at a volume where a person cannot review every frame, and where "on-brand" has to become something a system can score rather than something a human eyeballs.

Scope

Project Elements

Brand Research AutomationPrompt CompilationVision-Model Compliance ScoringRoot-Cause RegenerationCompetitor ExclusionMulti-Provider GenerationTake & Version HistoryCreative Tool Development
Next Project
ae-nano-flex →

Have a Project in Mind?

Animation direction, VFX and creative technology. Message me on LinkedIn or get in touch.