If you browse a list of prospects in Trayo, you’ll hit people with no avatar. Our enrichment goes looking for a photo for everyone and often can’t find one, so it writes null and moves on. What you get is a row of initials or a flat gray icon. It works. It’s also always bugged me. Your eye goes to faces first, and a list with faces in it pulls you in where a list of initials just sits there.
So I wanted something in that slot. Not a real photo, we don’t have one. Not a made-up face for a real prospect either, but I’ll come back to that. Just something. gpt-image-2 had recently gotten good enough that this felt worth a try: 1024px stylized illustrations, a consistent style held across a whole batch, a few cents and a few seconds an image. Cheap enough to just start playing.
Starting broad
I started with a contact sheet. Ten visual languages, one sample each, all generated in parallel: flat geometric, gradient blob, memphis, risograph, paper-cut, line art, glassmorphism, pixel art, watercolor wash, brutalist mono. None of it pointed at a particular person yet. I just wanted to see the range.
Watercolor and paper-cut were the two I kept coming back to. The rest looked like UI assets. These two looked like someone made them. So I dug in.
Watercolor pulled me in
Over four rounds I pushed watercolor and paper-cut further. v1 was abstract figures in brand-palette layers, more pattern than portrait. v3 added real per-avatar variation: hair, eye shape, pose. v4 settled into adult portraits. By v5 the palette was painterly and the eyes varied and it looked, honestly, shippable.
So I scaled v5 to 50. Painterly skin tones, short hair, eyes and mouth only, adult angles. Wiring it in was simple: each person gets one of the 50, assigned at random, and it sticks. Same person, same avatar, every render.
gpt-image-2 earned its keep here. I asked for 50 variations on one painterly style and got 50 that actually held together as a set, every face different, the style never cracking. A few dollars, one afternoon. Still feels slightly illegal.
And then it stopped feeling right
Every avatar looked great on its own. Then I dropped all 50 into an actual prospect table, next to real names and real companies, and it looked wrong immediately. Not “needs another pass” wrong. Wrong wrong. I scrolled it for about ten seconds and got the ick.
The problem was that watercolor still read as a person. Every avatar implied an ethnicity, an age, a gender presentation. We didn’t choose any of that. The model just painted it, and then there it was on the screen. A specific invented face, stapled to a specific person we’d never met and knew nothing about.
It’s a kind of uncanny valley, but inverted. The usual one is a face that’s almost human and unsettling for it. Here the face was fine. Pleasant, even. That was the problem: the better the watercolor got, the more confidently it was making something up.
The old gray silhouette was at least honest. It said: we don’t have a photo. The watercolor said: here’s what they look like. Only one of those was true.
Back to faceless
The fix wasn’t a better face. It was no face. So I ran the whole probe again, ten directions, faces off the table from the start: flat solids, brand gradient fills, layered paper-cut, outline only, watercolor wash with no face, riso duotone, geometric primitives, halo orb, negative-space cutouts.
This was the cheap part. At quality: "low" a ten-style probe runs a couple of dollars, so I could move fast. Paper-cut and negative-space won.
The long middle
Then the long part. Most of the project’s hours went into negative-space cutouts on multi-color block backgrounds, and the thing broke and got rebuilt over and over.
First I tried the literal brand palette: Radiant Purple #6F00FF, Burnt Tangerine #FF7B31, Cream #FDDC98. At full saturation it looked like a 1990s concert poster. Then I inverted it, cream background, brand-color silhouette, but our cream is yellow enough that anything in front of it goes muddy. Bummer.
Multi-color backgrounds were next: sunset bands, concentric rings, diagonal stripes, sun-plus-field, four-color quadrants. These finally gave me avatars that looked different from each other. Earlier rounds hadn’t: shrink a set to thumbnail size and it was the same gray smudge fifty times over. But the multi-color ones all failed their own way. Stripes read as flags, depending on the colors. Concentric circles wrapped a halo around the head that fought the silhouette. The quadrants were just noisy. A lot of these looked clever at full size, and then I’d drop them to 32px and the clever would just disappear.
What finally worked was boring, which is usually how it goes. No circles, no diagonals, no stripes. Only perpendicular cuts. Each background is three rectangular regions, picked from eight L-shape and corner-square layouts, filled with three colors from a palette of eight softened Trayo tones. I had to soften the brand colors to get there, Soft Purple #8240FF instead of #6F00FF, Soft Tangerine #FF9558 instead of #FF7B31. The real ones were too loud at small sizes.
Layout plus color gives each avatar its own signature. Shrink it down and it still reads as its own thing, not the smudge problem again. I checked on a 32px lineup, which is where most of them actually live in the product anyway.
Where we landed
So, the final 50. Each one is an off-white silhouette (#FBF3E5) with a dark outline, about 7-8px on the 1024px source, which lands around 2px at display size. Subtle paper-grain on the colored regions, none inside the silhouette. The pose is always turned 10 to 40 degrees off-center, never straight on, never full profile.
None of that is decorative. The outline is there because at 32px it’s the only thing keeping the silhouette legible against the color. The grain is there because without it the silhouette looked like a sticker stuck on top. The poses are angled because a grid of head-on silhouettes looks exactly like a row of restroom signs. Which is not the vibe.
What it comes down to
None of this was a quality problem, which is the part that stuck with me. gpt-image-2 is good enough now that I could have shipped any of these rounds. The watercolor set was genuinely nice work. We killed it anyway, because the second a face sits next to a real person’s name it’s a claim about them, and we had nothing true to claim.
So we shipped a shape. No face.
I figured the safe option would be the dull one. Instead it’s the best-looking thing on the page, which almost never happens. I’ll take it.