Generated documents have no good answer for per-customer art. Here is why diffusion is the wrong instrument, and what I replaced it with.
I sell a written assessment. It produces a long personal document — 40-odd pages, one of 277 possible pairings — and someone wanted section illustrations for it. Reasonable ask. The whole pitch of the product is this is about you specifically, so the obvious thing is art that is also about you specifically.
Three options exist, and all three are bad.
| option | problem |
|---|---|
| stock art | identical for every buyer. Actively contradicts a personalised product. |
| diffusion, per buyer | cost and latency per unit, and inconsistent style across a set. |
| nothing | what almost everyone ships. |
I had a render pipeline sitting right there, so I tried the second one first.
The prompt asked for interwoven threads crossing in a loose weave, warp and weft, plus a style string, plus this negative prompt:
text, letters, words, watermark, signature, logo, people, faces, hands, figures, portrait, photorealistic, 3d render, photograph, ...
It returned a nude female silhouette. I assumed a bad seed and ran the second plate. It returned a different nude female silhouette.
The cause is not prompt engineering and no amount of it would have helped. The checkpoint I was using is a character model — a person is baked in below the prompt layer. Asking it for abstraction is asking it to be a different model. The negative prompt was competing with the weights, and the weights win.
This is the part worth generalising. A general-purpose image model would probably have complied. But the moment you fine-tune for a subject, the subject stops being something the prompt controls — and if you are generating at volume, per customer, unattended, you will not be there to notice. Figurative art needs a human to look at every single output. That requirement is invisible until you try to remove the human.
The deeper mistake was reaching for the tool I had. A section plate in an editorial document is clean geometry. Diffusion is superb at texture and unreliable at exactly that — straight lines, consistent stroke weight, deliberate negative space.
What I actually wanted was vector, and every property I needed came free with it:
| property | diffusion | procedural SVG |
|---|---|---|
| size per document | ~2 MB raster | 15 KB inline |
| fixed resolution | sharp at any size | |
| monochrome | hope | by construction |
| same input, same output | seed-dependent | deterministic |
| cost per buyer | GPU seconds | zero |
| tuning | reroll and pray | change a parameter |
Not because it is fashionable. Because it is the one visual language where the shape carries the meaning rather than decorating it — the Swiss editorial and isotype lineage. Which means the art can be derived from the content instead of chosen to sit near it.
The three sections of my document, and what each plate had to say:
| section | the idea | the geometry |
|---|---|---|
| The People | a bond has no single thread you can point at | warp and weft, denser at centre, opening at the edges |
| The Presence | a signal received, attended to | concentric arcs thinning outward, one unbroken through all of them |
| Where They Meet | two halves joined, neither dominant | two line systems overlapping, densest in the overlap |
Geometry has no opinions. It resolves the same way every time, which is precisely why it survives being generated unattended, per customer, at volume — and why the figurative version cannot.
I designed for the monochrome printer first. This is a document people print and keep, and most people print in black and white. So everything had to carry on value contrast alone.
That forced the single accent colour. One teal mark per plate — the unbroken arc, the full-height thread — carrying position, never information. Add a second accent and it stops being structure and becomes decoration. And the background is warm off-white rather than white, because white reads as rendered and paper reads as printed.
Anything I could not say in black on tan did not go in. That constraint produced the whole set.
The generator takes a seed. Key it off the record — in my case the pairing slug — and every customer's document gets its own plates, deterministically, so the same person re-downloading gets the same document back.
Measured, because a claim of uniqueness deserves a count: 60 real pairings, three plates each, 60/60 unique on all three, and byte-identical on repeat renders of the same key. My first attempt was not that — I varied only arc-count and dash-start, which is 21 combinations across 277 documents, and it collided constantly. Entropy has to come from continuous axes, not two small integer choices.
If you sell a generated document — assessments, reports, certificates, personalised books, year-in-review pieces — this is the part I would want to know about: per-customer art is not a cost problem, it is an instrument-selection problem. I build this sort of thing. cece@siliroid.ai.
Written the same afternoon the silhouettes came back. If you want the failed renders as evidence I asked nicely and got nudes anyway, I still have them.