LumiSkin
A luxury cosmetics hero with a live chameleon that changes colour to match the soap — the kind of film that normally needs a studio, a crew and a five-figure budget. Built for under $300.
A design exploration: what a premium beauty brand looks like if the hero does something rather than sits there. A chameleon walks in, shifts colour to match the bar beside it, and the product card arrives on the match. Every asset generated, for less than a day of studio time.
A hero that earns the word premium
Beauty brands nearly all open the same way: product on a clean surface, serif headline, Shop button. It photographs well and says nothing. What would a hero look like if it performed the promise instead of describing it?
The soaps answer it. Aurora Petal is lavender, Jade Mist green, Peach Quartz warm clay — a range whose identity is colour. So the hero is a chameleon: it settles beside a bar, takes its colour, and the card slides in on the match. The metaphor sells without a line of copy explaining it.
It is deliberately the expensive kind of brief. A live animal, three colourways, macro product work and a thirty-second film means a studio, a handler, a CGI house and a build. The sort of concept that dies in a budget meeting — which is why it was worth testing what production actually costs now.
One mechanic, three colourways
Stills undersell this one — the whole idea is a transition, so the page shows the thing running rather than three frames of it. The chameleon matches the bar it is standing next to, and the card arrives once the colour has landed.
Generated, not shot
Nothing was photographed or filmed. Product renders, the chameleon, macro texture and lifestyle frames were generated as stills, animated into three eight-second clips, and wrapped in a site built with an agentic IDE and finished by hand.
The order matters. Stills first meant the bars, packaging and palette were locked cheaply as images, so the film only had to move something that already existed. Going straight to video means re-rolling thirty seconds every time a soap looks wrong.
The honest limitation is consistency. Getting the same bar to look like the same bar across sixteen images is the actual work, and it is where most of the effort went — not in any single prompt but in holding one object still across a set of them.
What it actually cost
Three line items, all of them subscription or per-second pricing rather than a quote.
- 16
- Generated imagesProduct renders, macro texture, protocol and collection frames — produced on a standard ChatGPT subscription.
- 24s
- Generated videoThree eight-second clips from Google Veo, crossfaded into one continuous hero.
- ≈$10
- The video, at list price24 seconds at Veo 3's published $0.40/second API rate. On Veo 3 Fast ($0.15/second) the same footage is under $4.
- $20
- A month of image generationThe standard consumer subscription tier, not an enterprise licence.
- 1
- People involvedNo crew, no studio, no handler, no CGI house, no animal.
- < $300
- All inSubscriptions plus generation, including the agentic IDE used to build the site.
Veo pricing is Google's published Gemini API rate. Subscriptions are list prices for the consumer tiers actually used. Time is not costed — this was built in evenings, and a day rate would be invented.
What the conventional route would have cost
Published 2026 market rates for the same three jobs, quoted as ranges because that is how they are quoted. These are benchmarks, not quotes anyone gave for this project.
- $800 – $2,400
- The stills, as photography16 images at the $50–$150 per image typical of beauty and cosmetics product work.
- $1,200 – $3,500
- One studio dayCommercial product photographer day rate — before the animal handler this concept needs.
- $3,000 – $15,000
- The film, as 3D/CGIA 30–60 second product animation runs $3,000–$5,000; a 30-second commercial at the higher end reaches $5,000–$15,000.
- $1,500 – $6,000
- The site, built outA custom animated landing page: $1,500–$3,000 from a boutique agency, $3,000–$6,000 mid-size.
- $6,500+
- Conservative totalTaking the bottom of every range above, and still excluding the handler.
- ~20×
- The gapBetween the cheapest conventional route and what this cost.
Sources: 2026 photography pricing surveys (LarsMiller Media, ProShot Media, Nightjar); 3D animation from Advids and Vidico; landing page rates from Uwindi and eseospace. These ranges buy a licensed shoot, a crew, usage rights and someone accountable. The comparison is of output, not of everything an agency sells.
The part that is not a prompt
React 19, Vite and GSAP, with Google Antigravity doing the first pass and Claude finishing it. The split was deliberate: the agentic pass gets a page standing up fast and is much weaker on the small decisions that separate a demo from something shippable.
The main one: the sequence is not driven off the video. The obvious build reads the four-second mark off the player itself — and breaks silently, because autoplay is blocked often enough (Low Power Mode, Safari, data saver) that the cards can simply never appear on a page whose whole job is showing products.
So the timeline runs on its own timers and the video is decoration. Eight seconds a segment, card at 3.2 seconds. If the video never plays the sequence still runs — products over a still frame, which is worse rather than broken.
The rest of the detail work
Small things, and the reason the page holds up away from a fast desktop on a good connection.
- Reduced motion is honoured properly: the auto-advance stops entirely, so the hero settles on one product instead of cycling. The cards still appear — the preference is about motion, not about hiding the products.
- An IntersectionObserver pauses the video once the hero scrolls away, so a page left open in a tab is not decoding 1080p to nobody.
- A one-directional scrim sits under the wordmark, because the type has to stay legible over three different clips whose backgrounds change colour.
- Products are positioned as percentages against the frame rather than pinned to pixels, so the card lands next to the chameleon at any viewport instead of drifting off it.
- The seek is wrapped in a try/catch: setting currentTime on a video that is not seekable yet throws, and losing the whole sequence to a race on load would be a silly way to break a hero.
What I'd change
The three clips crossfade rather than continue — the chameleon dissolves between colours instead of walking through them. Most people will not read it as a cut, but the concept deserves one unbroken take. A generation problem I did not solve.
Generate the products at a fixed camera and lighting setup from the start. The collection frames drift in angle between bars — invisible on the hero, obvious in a grid. Lock it as a constraint before generating, not after.
And the real conclusion is narrower than "AI is cheap". What collapsed here is the cost of producing assets. Deciding that a chameleon is the right idea, that the card should arrive on the colour match, and that the sequence must not depend on autoplay — none of that got cheaper, and all of it is what makes the page work.