Somny · 2026

Everything automated except the judgement

Somny sells itself through landing pages, one for each kind of picture people go looking for. I built the pipeline that researches a topic, writes the page, generates every image on it, and hands me one proof to approve.

6Pages built, keyword to published draft
288Candidate images generated for them
1 of 4Candidates that ship, chosen by hand
Twenty-four finished images from six different landing pages: action-figure packaging, avatar portraits, Christmas scenes, graduation photographs, Halloween costumes and professional headshots. The same small cast recurs across all six topics.

The pictures were the bottleneck

Somny needs a landing page for every kind of picture people search for, and each page carries eighteen images that all have to show the same recognizable characters.

The copy was never the slow part. Sourcing eighteen on-brand images was, because every one of them has to be generated, chosen, and cropped to a slot of a fixed size.

The review screen, one card per image slot. Each card shows the slot's name and pixel size, the assigned character, four generated candidates with one ringed as chosen, and the prompt that made them beside a Regenerate button.

Left one judgement in the loop

I could have let it pick. It holds the prompt, the character and the four candidates, and best-of-four is exactly the call a model will make confidently. I kept the choice because confidently wrong is the failure that reaches a customer, and this is the one step where looking is faster than checking.

A decision I'd defend

It generates four candidates and picks none of them. Choosing is the job I kept.

Built six pages the same way

I took six pages through end to end. Four are live and I left two sitting as drafts, because I made the pipeline write into the CMS as a draft and never straight to the site. I made that the default rather than a flag, because the only thing worse than a slow page is a wrong one nobody read before it appeared.

The live Christmas photos page, its hero portrait beside the headline.
The live graduation photos page, a cap-and-gown portrait beside the headline.
The live Halloween photos page, a costumed portrait beside the headline.
The live profile picture page, a studio-lit headshot beside the headline.
The crop window over one candidate, its box locked to the slot's ratio, with a line reading that the box is locked to 391:562 and naming the minimum pixel size.

Locked the crop to the slot

I gave every slot a fixed shape, then locked the crop box to it and refused anything under its pixel floor. I would rather make a bad crop impossible than catch one later, because catching it later means spotting a stretched hero after it is live and going back around for it.

The same character in six images, one from each landing page: an action figure, an avatar portrait, a Christmas scene, a graduation photograph, a Halloween costume and a headshot.

Cast the characters by rule, not mood

I cast nine people across all six pages, and I wrote the casting as rules rather than picking each time: weights, so some turn up more often, and topic gates, so pet pages get pets and professional pages get adults. I wrote them because left to choose freely it casts its favorite, and then every page looks like the same person.

The Halloween page as published, its generated hero image, headline and call to action in place.

Mapped every slot to its CMS field

I mapped every slot to its field by hand, so the last step writes the whole page into the headless CMS I set up in one call: eighteen images and every block of copy landing where it belongs. I did that mapping myself because a page arriving half-assembled costs more than one never generated at all.

The Christmas page as published, at desktop width.
The Halloween page at phone width, its headline stacked above the portrait.
Placeholder · your wordsWhat I'd do differently. 50–80 words. The highest-signal block on the page, and the one that cannot be written for you.
Next

Air, water and scent for the home. Three devices, one screen.

View project details: Air, water and scent. One unified app.