<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB"><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://john.hartnup.uk/feed.xml" rel="self" type="application/atom+xml" /><link href="https://john.hartnup.uk/" rel="alternate" type="text/html" hreflang="en-GB" /><updated>2026-09-27T16:39:31+00:00</updated><id>https://john.hartnup.uk/feed.xml</id><title type="html">‘ERE I AM - JH!</title><subtitle>Somewhere to drop my thoughts.</subtitle><author><name>John Hartnup</name></author><entry><title type="html">Those AI posters, with real fonts</title><link href="https://john.hartnup.uk/2026/09/23/poster-svg.html" rel="alternate" type="text/html" title="Those AI posters, with real fonts" /><published>2026-09-23T00:00:00+00:00</published><updated>2026-09-23T00:00:00+00:00</updated><id>https://john.hartnup.uk/2026/09/23/poster-svg</id><content type="html" xml:base="https://john.hartnup.uk/2026/09/23/poster-svg.html"><![CDATA[<p>Those <a href="/poster-prompts/">hundred poster prompts</a> again.</p>

<p>A common observation is that it’s not using real fonts. An AI image model makes a bitmap image of what it thinks a poster should look like.
That has image has shapes that resemble letters, spelling out words. But unlike the words you’re reading out now, those shapes aren’t
built from a library of letter shapes (or more precisely, strict recipes for producing shapes) called a font. It’s as if the image
model is hand-drawing each letter from its memory of what that kind of typeface looks like.</p>

<p>Sometimes that’s obviously appropriate. Psychedelic Sixties and Push Pin Studios clearly rely on letter forms that
a real designer would hand-draw.</p>

<div class="image-pair">
<figure><a href="/poster-prompts/psychedelic-sixties/"><img class="image" width="400" src="/assets/poster-examples/psychedelic_sixties-gig-v2.webp" alt="Psychedelic Sixties" /></a>
  <figcaption class="image-caption">Psychedelic Sixties</figcaption>
  
</figure>

<figure><a href="/poster-prompts/push-pin-studios/"><img class="image" width="400" src="/assets/poster-examples/push_pin_studios-fete-v2.webp" alt="Push Pin Studios" /></a>
  <figcaption class="image-caption">Push Pin Studios</figcaption>
  
</figure>

</div>

<p>Other times it appears more likely that a real font would be the correct choice. Swiss / International Typographic Style would almost certainly use Helvetica,
Contemporary Editorial looks like a mainstream serif font like Times Roman. In this case are we only using the model’s approximation
because it doesn’t have another way?</p>

<div class="image-pair">
<figure><a href="/poster-prompts/swiss-international/"><img class="image" width="400" src="/assets/poster-examples/swiss_international-gig-v2.webp" alt="Swiss / International Typographic Style" /></a>
  <figcaption class="image-caption">Swiss / International Typographic Style</figcaption>
  
</figure>

<figure><a href="/poster-prompts/contemporary-editorial/"><img class="image" width="400" src="/assets/poster-examples/contemporary_editorial-fete-v2.webp" alt="Contemporary Editorial" /></a>
  <figcaption class="image-caption">Contemporary Editorial</figcaption>
  
</figure>

</div>

<p>A designer friend observes: “I don’t recognise any of the fonts, they’re all approximations. One previously unseen font on a poster I could accept,
but 2-3 when they’re all fairly bland in any case still registers as a tell for me.”</p>

<p>As I’ve pointed out before, I don’t care about tells: fooling people that they’re not looking at AI is not a goal. But not triggering icky
feelings, <em>is</em> a goal. If some people are getting an uncanny-valley response because that’s not quite Helvetica, this is a problem.
(Notwithstanding, the same people get not-quite-Helvetica ick from Arial).</p>

<p>So I thought I’d experiment by trying to convert some posters into a vector format. Cut out the graphical elements, find a font that matches
the text, and reassemble it into an SVG file. <a href="/poster-prompts/svg.html">The story of how that went, and all the results, is on its own page</a>.</p>

<p>When it works, you get pretty close matches, and the knowledge that the type is as a type designer intended. Here’s the De Stijl gig, before and after:</p>

<div class="image-pair">
<figure><a href="/poster-prompts/de-stijl/"><img class="image" width="400" src="/assets/poster-examples/de_stijl-gig-v2.webp" alt="De Stijl gig — original" /></a>
  <figcaption class="image-caption">De Stijl gig — original</figcaption>
  
</figure>

<figure><img class="image" width="400" src="/assets/posts/2026-09-23-poster-svg/de_stijl-gig-v2.svg" alt="De Stijl gig — SVG rebuild" />
  <figcaption class="image-caption">De Stijl gig — SVG rebuild</figcaption>
  
</figure>

</div>

<p>So that’s better, right?</p>

<p>Maybe sometimes, maybe not always, I’m not sure.</p>

<p>Look at the Bauhaus / Modernist gig, below. That pointy ‘V’ the model drew works really well for me. Perhaps if my convertor had found the right font,
the conversion would have a pointy V too. But that might not match other letters. And anyway, the point is that the AI model is free to decide that here,
in this one word, in this one position, a pointy V works.</p>

<div class="image-pair">
<figure><a href="/poster-prompts/bauhaus-modernist/"><img class="image" width="400" src="/assets/poster-examples/bauhaus_modernist-gig-v2.webp" alt="Bauhaus / Modernist gig — original" /></a>
  <figcaption class="image-caption">Bauhaus / Modernist gig — original</figcaption>
  
</figure>

<figure><img class="image" width="400" src="/assets/posts/2026-09-23-poster-svg/bauhaus_modernist-gig-v2.svg" alt="Bauhaus / Modernist gig — SVG rebuild" />
  <figcaption class="image-caption">Bauhaus / Modernist gig — SVG rebuild</figcaption>
  
</figure>

</div>

<p>In other places, like the Festival of Britain gig below, the model-generated drawn text lines up just-so: “CARVER &amp;” the same width as “THE FLOOD”. You
can achieve this with type by stretching or adjusting whitespace, but the model has achieved it in its drawing with quite a sophisticated combination of
both: drawing and spacing all the letters so that in combination they fit the space.</p>

<figure><a href="/poster-prompts/festival-of-britain/"><img class="image" width="400" src="/assets/poster-examples/festival_of_britain-gig-v2.webp" alt="Festival of Britain gig — “CARVER &amp;” sits the same width as “THE FLOOD”" /></a>
  <figcaption class="image-caption">Festival of Britain gig — “CARVER &amp;” sits the same width as “THE FLOOD”</figcaption>
  
</figure>

<p>And on that theme: one of the reasons to use fonts with a real text layout engine, is that the layout engine knows how to space letters just-so.
And that’s especially ideal when you’re typesetting blocks of text. But I’ve been learning that especially with big titles and logos, <a href="/kerning-by-eye/">it’s not unusual
for a designer to nudge things around</a>. You don’t get that for free.</p>

<p>The AI model has the freedom to:</p>

<ul>
  <li>invent letter forms that deviate from what the “font” would normally use</li>
  <li>use different weights, widths, spacings, shapes according to context and space needs</li>
</ul>

<p>… indeed it has no concept of <em>not</em> doing those things.</p>

<p>So myself, I’ve become quite attached to letting the model do this. A model with suitable training could become very, very good at it – I’m just using
general purpose models, though. Who knows whether OpenAI are training an image model in that direction?</p>

<p>I should mention the other reason to build posters in a vector format: editability. If you have a poster in a combination of bitmap objects and
vector elements, you can move things around, add or change words, and so on. That is not the focus of this blog post.</p>

<p>As ever, I am not a professional designer, nor even a well trained amateur. I can only speak for my own untrained eye.</p>]]></content><author><name>John Hartnup</name></author><summary type="html"><![CDATA[Posters with real font-based typography]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://john.hartnup.uk/assets/og-default.png" /><media:content medium="image" url="https://john.hartnup.uk/assets/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Better poster prompts</title><link href="https://john.hartnup.uk/2026/09/20/poster-prompts-v2.html" rel="alternate" type="text/html" title="Better poster prompts" /><published>2026-09-20T00:00:00+00:00</published><updated>2026-09-20T00:00:00+00:00</updated><id>https://john.hartnup.uk/2026/09/20/poster-prompts-v2</id><content type="html" xml:base="https://john.hartnup.uk/2026/09/20/poster-prompts-v2.html"><![CDATA[<p>I’ve made a version 2 of my <a href="/poster-prompts/">hundred poster prompts</a>.</p>

<table>
  <thead>
    <tr>
      <th>before</th>
      <th>after</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><a href="/poster-prompts/expressionist-woodcut/"><img src="/images/poster-v1-expressionist-woodcut-fete.webp" width="100%" alt="Expressionist Woodcut fête poster from the version 1 prompt" /></a></td>
      <td><a href="/poster-prompts/expressionist-woodcut/"><img src="/images/poster-v2-expressionist-woodcut-fete.webp" width="100%" alt="Expressionist Woodcut fête poster from the version 2 prompt" /></a></td>
    </tr>
  </tbody>
</table>

<p><em>Expressionist Woodcut, the same fête, version 1 and version 2.</em></p>

<p>Back in June I
<a href="/2026/06/07/ai-event-posters.html">wrote about why AI posters don’t have to be horrible</a> and allowed
my experiments to sprawl into a website with
<a href="/poster-prompts/">a hundred poster prompts</a>.
I was pretty pleased with them.</p>

<p>But having these examples made me fussier, and I
began to notice flaws.</p>

<p>Then, after essentially nobody had paid any attention to the page, I shared it on <a href="https://news.ycombinator.com/item?id=49764791">Hacker News</a> - where lots of people commented, many of whom noticed the same flaws as I had:</p>

<p>The text layout was usually pretty good - it would
emphasise the headline, and put other details where
they belonged - but it could have been better.</p>

<p>The fete example highlighted a common AI problem -
if a word is in the prompt, it’ll put it in the image. So the image for the fete at the cricket ground for the village church restoration fund, would contain cricket, a church, fete tents, as well as imagery representing every attraction listed.</p>

<p>(By the way, you’d get a better poster by just listing fewer attractions – but our hypothetical client wants them all on the poster, so that would be cheating)</p>

<p>This was just one contributor to clutter. The model
often seems to want to fill every space with stuff.</p>

<p>The fictional band highlighted another problem:
AI had invented “Carver and the Flood” as the band,
playing a gig at “The Anchor”, so many of the posters
featured a woodworking tool, a lot of water, and an
anchor. Sometimes these were lovely images. But it’s
very literal - and for a real band, “The Flood” would
have ceased to be associated with water, in the fans’ minds, years ago.</p>

<p>The ferrets. My fictional fete had ferret racing as
an attraction. So many of the posters highlight ferrets.
This is understandable - it’s the most interesting thing about the event, so the model picks it out.
But you don’t want it every time. You want the user to have the opportunity to pick a try where the
ferret isn’t the star.</p>

<p>Often the model would invent logos. So the church repair fund suddenly has a crest. That’s not acceptable.</p>

<h2 id="how-version-2-was-built">How version 2 was built</h2>

<p>I put all these issues to the Claude chatbot, and it
suggested a number of ways to improve the prompt. This
went back and forth quite a lot, because it would come
up with rules that work for some styles but not others.</p>

<p>Eventually I had it write a handover, so I could move into Claude Code.</p>

<p>When I wrote v1, after assembling the code to produce the prompts, I spent a couple of evenings on the part-developed site, copy-pasting prompts into ChatGPT, saving the results to my project, as fast as the rate-limiter would allow me.</p>

<p>This time I paid for some OpenAI API credit, and automated it. All I intended to do was make the generation less laborious.</p>

<p>But as soon as Claude Code realised I had the API, it suggested doing an evaluation exercise. So that’s what we did.</p>

<p>Producing an image is two steps: the first is prompt expansion. We submit the prompt to a LLM, and it generates the text explaining what it’s going to do. You can review that before sending it to the image model.</p>

<p>So, to avoid spending too much money on image generation, we evaluated that first step. I was able to leave a lot of this to Claude Code. The criteria were pretty clear, so Claude could be the judge, Claude adjust the prompts, Claude could decide when to stop.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>while results aren't quite right {
   amend prompt
   submit prompts
   judge results
}
</code></pre></div></div>

<p>I just had to keep an eye on spend. And to my surprise
it was iterating by making hundreds of requests, but costing me pennies. But we were having to firm up the prompt to tell the model things it should have worked out. Claude had picked five styles to test against, one for each way a poster can
decide what to draw, plus a deliberately awkward one:</p>

<ul>
  <li><strong>Polish Poster School</strong>, where the event chooses the subject, so the ferret problem shows up here first</li>
  <li><strong>Art Nouveau</strong>, where the tradition insists on its own subject — a woman among flowers — whatever the event says</li>
  <li><strong>Suprematism</strong>, which is abstract, and should draw no subject at all</li>
  <li><strong>Factory Records</strong>, where the typography <em>is</em> the image</li>
  <li><strong>Madhubani</strong>, which fills every square centimetre, and would tell us whether the new rules about restraint had flattened a style that is supposed to be dense</li>
</ul>

<p>Then we realised we were testing with gpt-5.4-mini - very cheap, but not very clever. Switching up to gpt-5.6-sol – what ChatGPT would use on Medium – started behaving much better, and we could remove many of the adjustments we’d made trying to make the mini model work.</p>

<div class="image-pair">
<figure><a href="/poster-prompts/japonisme/"><img class="image" width="400" src="/assets/poster-examples/japonisme-gig-v2.webp" alt="Japonisme — the gig, with no anchor, no flood and no chisel in sight" /></a>
  <figcaption class="image-caption">Japonisme — the gig, with no anchor, no flood and no chisel in sight</figcaption>
  
</figure>

<figure><a href="/poster-prompts/cut-paper-matisse/"><img class="image" width="400" src="/assets/poster-examples/cut_paper_matisse-gig-v2.webp" alt="Cut Paper / Matisse — the same gig: a sweeping cut-paper current, not a literal flood" /></a>
  <figcaption class="image-caption">Cut Paper / Matisse — the same gig: a sweeping cut-paper current, not a literal flood</figcaption>
  
</figure>

</div>

<p>All this meant that with about $10 worth of tokens, we’d evaluated and improved our prompts until they met the goals.</p>

<p>The biggest sticking point was ferrets. I wanted it to choose a ferret about 20% of the time. It’s a
striking image, many users would choose it, but we want it to use other options when you retry. The
problem was that it’s unusual so the LLM finds it
compelling.</p>

<h2 id="where-the-subject-comes-from">Where the subject comes from</h2>

<p>For some styles, the event dictates the subject. A fete in Letterpress, gets some fete-related image.</p>

<p>For other styles, the style dictates the subject.
Art Nouveau is a woman with flowers. You can only
override that by asking.</p>

<p>Other styles are explicitly abstract.</p>

<div class="image-pair">
<figure><a href="/poster-prompts/wayfinding-signage/"><img class="image" width="400" src="/assets/poster-examples/wayfinding_signage-fete-v2.webp" alt="Wayfinding / Signage — the event chose the subject. It shortlisted a ferret, a cake and a potted plant, and took the quiet one" /></a>
  <figcaption class="image-caption">Wayfinding / Signage — the event chose the subject. It shortlisted a ferret, a cake and a potted plant, and took the quiet one</figcaption>
  
</figure>

<figure><a href="/poster-prompts/mexican-calavera/"><img class="image" width="400" src="/assets/poster-examples/mexican_calavera-fete-v2.webp" alt="Mexican Calavera — the style chose the subject; the event supplied the words and the cricket ground" /></a>
  <figcaption class="image-caption">Mexican Calavera — the style chose the subject; the event supplied the words and the cricket ground</figcaption>
  
</figure>

</div>

<h2 id="cost">Cost</h2>

<p>This cost me $28 in OpenAI tokens. Around $10 in text-only evaluation runs, then another $18 doing multi-run image tests on four styles, followed by generating all 200 images.</p>

<p>Oh well.</p>

<h2 id="outcome">Outcome</h2>

<p>I think in general the posters are better. They’re more striking. The hierarchy of text is clearer. The subject matter is wrong less often.</p>

<div class="image-pair">
<figure><a href="/poster-prompts/cobra/"><img class="image" width="400" src="/assets/poster-examples/cobra-gig-v2.webp" alt="CoBrA — a mythic animal-mask figure, which is the tradition's own subject, not the event's" /></a>
  <figcaption class="image-caption">CoBrA — a mythic animal-mask figure, which is the tradition's own subject, not the event's</figcaption>
  
</figure>

<figure><a href="/poster-prompts/mid-century-modern-graphic/"><img class="image" width="400" src="/assets/poster-examples/mid_century_modern_graphic-gig-v2.webp" alt="Mid-century Modern Graphic — echoing “The Flood” without drawing one" /></a>
  <figcaption class="image-caption">Mid-century Modern Graphic — echoing “The Flood” without drawing one</figcaption>
  
</figure>

</div>

<p>You still need to tweak the prompt, or just roll the dice a few times. The website shows the first shot for each prompt, warts and all. A second try might have been better, or might have been worse.</p>

<p>The new prompts are <em>way</em> longer than V1, and perhaps take some control away from the user. Used as intended - copy-pasted into ChatGPT - it can of course be tweaked. But the audience that would tweak it is possibly an audience that doesn’t need the hand-holding these prompts do.</p>

<h2 id="ferrets">Ferrets?</h2>

<p>It still chooses to use ferrets a lot of the time.
Well, the ferrets <em>are</em> good. But, by design now,
in ChatGPT it’s going to show the user what it’s
chosen, before producing the image. It offers a
shortlist of other subjects, and the user can ask
for any of the alternatives.</p>

<h2 id="other-stuff">Other stuff</h2>

<p>It’s been pointed out that you might be able to get better results by letting AI generate a code-based format like Postscript or SVG. Here it could lay out real fonts, give you elements you could adjust yourself. This is all true, and something that’s either already available in tools like Photoshop or Canva, or with a skill and a code agent.</p>

<p>But here we’re trying to demonstrate what a harried
PTA parent can achieve in a chatbot.</p>

<p><a href="/poster-prompts/">One hundred poster prompts</a>.</p>]]></content><author><name>John Hartnup</name></author><summary type="html"><![CDATA[What my hundred poster prompts got wrong first time round, and what changed in version 2 after Hacker News readers spotted the same flaws I had.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://john.hartnup.uk/images/poster-v2-expressionist-woodcut-fete.webp" /><media:content medium="image" url="https://john.hartnup.uk/images/poster-v2-expressionist-woodcut-fete.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Introducing the Kladde 26 Manifesto</title><link href="https://john.hartnup.uk/2026/09/17/kladde-manifesto.html" rel="alternate" type="text/html" title="Introducing the Kladde 26 Manifesto" /><published>2026-09-17T00:00:00+00:00</published><updated>2026-09-17T00:00:00+00:00</updated><id>https://john.hartnup.uk/2026/09/17/kladde-manifesto</id><content type="html" xml:base="https://john.hartnup.uk/2026/09/17/kladde-manifesto.html"><![CDATA[<p>My <a href="/fiction/">fiction section</a> contains writing I produced with the help of AI. Or perhaps writing AI produced under my supervision.</p>

<p>Maybe I have poor taste, but I enjoy both the process and the outcomes - and <em>not</em> having authored them directly myself perhaps gives me a more detached position from which to decide that I think they’re good.</p>

<p>But I have done a lot of thinking about what I have and haven’t done. At first I thought of myself as the author, fooling myself into thinking that I had provided the inspiration, and the AI had merely saved some of the perspiration. Looking back at the logs, though, at times I was surprised at how many ideas had emerged from the AI, and at others I had forgotten what I myself had supplied or rejected or shaped.</p>

<p>I perceive a new landscape of issues, where humans collaborate with AI for creative works, among them:</p>

<ul>
  <li><strong>A widespread visceral distaste for anything AI has touched.</strong><br />
That is, of course, allowed. But my own opinion is that this fails to recognise the good material AI can generate, while also failing to account for effects of the strong guiding hand of a human co-author, commissioning editor, director, producer – whatever you want to call it.</li>
  <li><strong>Humans seeking to pass off AI-assisted creations as their own work</strong>.<br />
I feel this is both unethical and wasteful. It’s deceitful not to acknowledge AI’s role in the creation. While it’s often a good idea to clean up distracting AI tics from the language, it is wasted effort to try and deceive the reader into believing this is purely human writing.</li>
  <li><strong>A missing experience for readers.</strong><br />
It seems that readers (and viewers of art) like to imagine the author at work. When they read a sentence, they are thinking about what lived experience caused the author to use those words. Perhaps they imagine the author speaking directly to them, as they read.
Their assumptions may be false, but they are nonetheless part of the experience of reading. Believing that the entire text fell out of a language model in a matter of seconds, disrupts that experience. Learning later, that something you had imagined a human author writing, came from a machine, is the unpleasant experience of being conned. Yet when a piece is co-authored by a human and AI, there <em>is</em> a writing process that the reader may think about as they read.</li>
  <li><strong>Readers don’t know what they’re getting.</strong><br />
Without an honest, supplied provenance, how does a reader know whether they’re reading something wholly written by a human, wholly generated by an algorithm, or produced with some level of human curation by a human/machine centaur? That context can be important to the reader.</li>
</ul>

<p>If your framing is where mine is, it can be <em>thrilling</em> to know that AI, rather than the human, came up with certain ideas. In <a href="/fiction/crab/">Crab</a>, it is the model that notices that letters scattered on the floor can be misconstrued as “EVAC”, and works that into the story. Amazing.</p>

<p>For these reasons I decided to adopt <strong>radical transparency</strong>. I’m reluctant to even call myself an author, though I still don’t know what word to adopt. Since I don’t really know what to call what I do, I just demonstrate it - you get near as dammit a complete transcript of the interactions that built the piece. My <strong>workings</strong>.</p>

<p>You can read any of my stories without reading the workings - but they are there to skim or read in depth, as an honest record of how much I did, and how much a language model did for me.</p>

<p>Then I thought I’d better explain myself. And I thought, who knows, perhaps other people would like to adopt this practice? So I wrote a manifesto. Not entirely as a joke.</p>

<p>Read the manifesto here: <strong><a href="https://kladde26.org/">The Kladde 26 Manifesto: Show Your Workings</a></strong></p>

<p>I’ve taken inspiration from the <a href="https://en.wikipedia.org/wiki/Dogme_95">Dogme 95</a> manifesto, hence the Danish name, though Kladde’s aims are quite different from Dogme’s “vow of chastity”. Dogme constrains what a director may create. Kladde allows you to create what you like, how you like – but you must disclose your methods. <em>Kladde</em> refers to the rough-book Danish schoolchildren use for preliminary rough-workings. Of course the Kladde manifesto comes with its own workings.</p>

<p>Lars von Trier didn’t stick to Dogme for all his films, and (at time of writing) one of my stories lacks workings. I’m trying.</p>

<p>If you want to join in, you are free to just get on with it. You can scrape the manifesto, link to it, or you can adopt the practices without referring to the document. I don’t care. If there’s enough interest I might even step up to a domain name. (update - I got that domain name!)</p>

<p>The workings of this post? I wrote it all by myself (though I admit to asking Claude for comments).</p>]]></content><author><name>John Hartnup</name></author><summary type="html"><![CDATA[The Kladde 26 Manifesto: a proposal that writing made with AI should be published together with its workings, so readers know what they are reading.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://john.hartnup.uk/assets/og-default.png" /><media:content medium="image" url="https://john.hartnup.uk/assets/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">AI software development and backpressure</title><link href="https://john.hartnup.uk/2026/08/19/backpressure.html" rel="alternate" type="text/html" title="AI software development and backpressure" /><published>2026-08-19T00:00:00+00:00</published><updated>2026-08-19T00:00:00+00:00</updated><id>https://john.hartnup.uk/2026/08/19/backpressure</id><content type="html" xml:base="https://john.hartnup.uk/2026/08/19/backpressure.html"><![CDATA[<p>I’ve been a professional software engineer for 30 years, and AI has changed
things a great deal in the last year or two.</p>

<p>One big thing is that we can now produce code that’s
<em>probably</em> fine, but has to be reviewed and tested, faster than we can
do that reviewing and testing. How do you deal with that?</p>

<p>My favourite LLM and I wrote an essay together, with animated diagrams, even,
explaining how one of the solutions to this is <em>backpressure</em>.</p>

<p>Or in plain language, <em>slow down and stop swamping me</em>.</p>

<p><strong><a href="/backpressure/">Read the full essay →</a></strong></p>]]></content><author><name>John Hartnup</name></author><summary type="html"><![CDATA[When AI writes code faster than you can review it, the queue is the problem. An essay on backpressure in AI-assisted software development.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://john.hartnup.uk/assets/og-default.png" /><media:content medium="image" url="https://john.hartnup.uk/assets/og-default.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">AI-generated posters don’t have to be horrible</title><link href="https://john.hartnup.uk/2026/06/07/ai-event-posters.html" rel="alternate" type="text/html" title="AI-generated posters don’t have to be horrible" /><published>2026-06-07T00:00:00+00:00</published><updated>2026-06-07T00:00:00+00:00</updated><id>https://john.hartnup.uk/2026/06/07/ai-event-posters</id><content type="html" xml:base="https://john.hartnup.uk/2026/06/07/ai-event-posters.html"><![CDATA[<h2 id="the-problem">The problem</h2>

<p>A <a href="https://www.facebook.com/photo.php?fbid=1530303992439434&amp;set=pb.100063795433962.-2207520000&amp;type=3">now famous Facebook post</a> shows us the
scourge of identikit posters generated by AI.</p>

<p>Here’s an <a href="https://www.independent.co.uk/life-style/ai-poster-slop-local-events-flyer-b2989792.html">article on the subject from the Independent</a>.</p>

<figure><img class="image" width="800" src="/images/poster-ugly-collage.webp" alt="A collage of AI-generated village fayre posters found online" />
  <figcaption class="image-caption">A collage of AI-generated village fayre posters found online</figcaption>
  
</figure>

<p>Here’s another I found in the wild. With apologies for picking on the
Leamington Beer Festival - they are by no means unique</p>

<figure><img class="image" width="500" src="/images/poster-beer-fest.webp" alt="Leamington Beer Festival 2026 — with commentary from a passer-by" />
  <figcaption class="image-caption">Leamington Beer Festival 2026 — with commentary from a passer-by</figcaption>
  
</figure>

<p>The problem with these is not so much that they’re bad. They’re <em>OK</em>,
I don’t love them. The problem is that once you’ve seen that style 20 times
it starts to irritate just from the sheer repetition.</p>

<p>I knew that even ChatGPT was capable of a broader variety of styles than this,
so I set out to prove it.</p>

<p>I gave ChatGPT some invented event details and asked it to produce a poster.
Rather than go with the default look it would choose for a spring fayre,
I made a point of specifying what I thought was a different style:</p>

<blockquote>
  <p><strong>Me:</strong></p>

  <p>Produce a poster for a spring fayre.<br />
21 April - 11am to 3pm<br />
Mill Beach Park, Honeyford<br />
Free entry<br />
Tombola<br />
Cakes and drinks<br />
Performance by a samba band and a dhol band.<br />
Craft stalls<br />
Circus Skills workshop</p>

  <p>Go for a clean, unfussy, bright layout with a bold striking spring-themed
graphic. Avoid pastel/airbrush/oil style art or images of people.</p>
</blockquote>

<p>This is what came back.</p>

<figure><img class="image" width="400" src="/images/poster-first-attempt.webp" alt="First attempt — the default craft-fayre template" />
  <figcaption class="image-caption">First attempt — the default craft-fayre template</figcaption>
  
</figure>

<p>Not as successful as I hoped. To me it still feels like what I’m trying to
avoid.</p>

<p>I asked for something deliberately different.</p>

<blockquote>
  <p><strong>Me:</strong></p>

  <p>Make another one using a completely different design aesthetic of your choice.
Treat the current one as a “what not to do” – not that there is anything
wrong with it, but we want ours to stand out from other posters that look
similar.</p>
</blockquote>

<figure><img class="image" width="400" src="/images/poster-bauhaus-attempt.webp" alt="Second attempt — Bauhaus / geometric modernist" />
  <figcaption class="image-caption">Second attempt — Bauhaus / geometric modernist</figcaption>
  
</figure>

<p>I think this is already much better. It stands out just be being different. I wondered what I would call this style if I wanted to ask for it again?</p>

<blockquote>
  <p><strong>Me:</strong> What is this design style you’ve used called?</p>

  <p><strong>ChatGPT:</strong> This one is leaning into a modernist / Bauhaus-influenced graphic style, with a bit of contemporary “flat illustration” layered on top.</p>

  <p>More specifically, you could describe it as:</p>

  <p><strong>Bauhaus / Modernist Poster Design</strong></p>

  <ul>
    <li>Rooted in the Bauhaus tradition (1920s–30s)</li>
    <li>Strong emphasis on function over decoration</li>
    <li>Asymmetrical layout with clear hierarchy</li>
    <li>Bold, simple sans-serif typography</li>
    <li>Limited, high-contrast colour palette</li>
  </ul>

  <p><strong>Geometric Minimalism</strong></p>

  <ul>
    <li>Built from basic shapes (circles, semicircles, rectangles)</li>
    <li>The flower is abstracted into almost symbolic forms</li>
    <li>Very little texture or shading — mostly flat colour</li>
  </ul>

  <p><strong>Swiss Style (International Typographic Style) influence</strong></p>

  <ul>
    <li>Clean grid-based alignment (even if loosely applied)</li>
    <li>Information-first layout</li>
    <li>Clear, legible structure</li>
  </ul>

  <p>If you wanted a shorthand label for a designer or printer, you could call it:</p>

  <p>“Bauhaus-inspired geometric minimalist poster”</p>

  <p>If you’re trying to stand out, this direction works well because most local event posters default to:</p>

  <ul>
    <li>bunting</li>
    <li>hand-drawn florals</li>
    <li>pastel palettes</li>
    <li>“craft fair” aesthetics</li>
  </ul>

  <p>Whereas this feels more like:</p>

  <ul>
    <li>a gallery poster</li>
    <li>a design museum flyer</li>
    <li>or something you’d see in a well-curated café</li>
  </ul>

  <p>If you want, I can push it further into a really distinctive niche (e.g. brutalist, risograph, 90s rave flyer, Japanese minimal, etc.).</p>
</blockquote>

<p>Well, thanks GPT. I knew there was an endless array of design styles that it could produce. Instead of trying to dredge some names from my memory, I asked for suggestions.</p>

<p>It replied with a list of styles, some of which I’d never heard of, some
I recognised but couldn’t picture, some which were names I didn’t know for
styles I did.</p>

<blockquote>
  <p><strong>Me:</strong> Give me a list of styles to choose from</p>

  <p><strong>ChatGPT:</strong> Here’s a deliberately varied menu—some safe-but-distinct, some quite left-field. I’ve kept each one concrete so you can imagine how your fayre poster would actually look.</p>

  <p><strong>🎨 Clean but Characterful</strong></p>

  <p><strong>1. Bauhaus / Modernist</strong><br />
(What you just saw)<br />
Geometric shapes, primary colours, strong type<br />
Feels cultural / design-led rather than “craft fair”</p>

  <p><strong>2. Swiss Style</strong><br />
strict grid, lots of whitespace<br />
Black/white + one accent colour<br />
Very “information design”, almost institutional</p>

  <p><strong>3. Contemporary Editorial (Magazine-style)</strong><br />
Big headline, elegant serif + sans mix<br />
Think weekend supplement or gallery leaflet<br />
Could feel surprisingly premium for a fayre</p>

  <p><strong>🌿 Graphic &amp; Illustrative (but not twee)</strong></p>

  <p><strong>4. Risograph Print Style</strong><br />
Limited ink colours, slightly misregistered layers<br />
Grainy textures, bold shapes<br />
Feels handmade but designed, not crafty</p>

  <p><strong>5. Cut Paper / Collage (Matisse-inspired)</strong><br />
Inspired by Henri Matisse cut-outs<br />
Organic shapes, bold colour blocks<br />
Very striking from a distance</p>

  <p><strong>6. Botanical Scientific Illustration (Modernised)</strong><br />
Clean line drawings of plants, labelled or diagram-like<br />
Monochrome + one highlight colour<br />
Quietly distinctive, slightly academic</p>

  <p><strong>⚡ Bold / Unusual Directions</strong></p>

  <p><strong>7. Brutalist Graphic Design</strong><br />
Raw, high-contrast, almost “ugly on purpose”<br />
Heavy black blocks, stark type<br />
Feels rebellious—very different from typical village posters</p>

  <p><strong>8. 90s Rave Flyer / Acid Graphics</strong><br />
Neon colours, warped type, energetic layout<br />
Could echo the samba/dhol energy<br />
Surprisingly effective if done with restraint</p>

  <p><strong>9. Memphis Design (80s Postmodern)</strong><br />
Playful shapes, squiggles, clashing colours<br />
Inspired by Memphis Group<br />
Fun but still graphic and bold</p>

  <p><strong>🧭 Quietly Distinct / Understated</strong></p>

  <p><strong>10. Japanese Minimal Poster</strong><br />
Very restrained layout, lots of empty space<br />
One strong graphic element<br />
Elegant, calm, and unusual in this context</p>

  <p><strong>11. Monochrome + Single Accent (Ultra-minimal)</strong><br />
Black, white, and e.g. bright green or orange<br />
Typography-led, almost no illustration<br />
Relies on composition rather than decoration</p>

  <p><strong>12. Wayfinding / Signage Style</strong><br />
Looks like a park map or transport signage<br />
Icons, arrows, structured layout<br />
Functional but visually interesting</p>

  <p><strong>🎪 Slightly Playful but Still Clean</strong></p>

  <p><strong>13. Modern Icon System</strong><br />
Everything represented as simple icons<br />
Consistent stroke weight, grid-based<br />
Feels like an app UI or transport system</p>

  <p><strong>14. Stamp / Letterpress Style (Modernised)</strong><br />
Bold inked shapes, slight imperfections<br />
Limited palette, strong contrast<br />
Suggests “event” without being twee</p>

  <p><strong>15. Festival Poster (Contemporary Indie)</strong><br />
Big central graphic + stacked lineup text<br />
Borrow cues from music festivals<br />
Works nicely given the bands</p>

  <p><strong>If you want a steer</strong></p>

  <p>Given your brief (“clean, unfussy, bold, no twee imagery”), the strongest stand-out options are:</p>

  <ul>
    <li>Risograph</li>
    <li>Cut paper / Matisse</li>
    <li>Brutalist (toned down slightly)</li>
    <li>Japanese minimal</li>
    <li>Wayfinding / signage</li>
  </ul>

  <p>If one of these clicks, I can generate a poster in that exact style—and push it properly, not just superficially.</p>
</blockquote>

<p>Asking for specific aesthetics produced a variety of posters.</p>

<p>Now, I’m not claiming these don’t have a whiff of AI about them. I don’t think that’s really my goal - we can be honest that we’re using AI, we just don’t want it to have <em>that look</em> that everyone’s sick of.</p>

<blockquote>
  <p><strong>Me:</strong> Please give me Stamp / Letterpress Style (Modernised)</p>
</blockquote>

<figure><img class="image" width="400" src="/images/poster-stamp-letterpress.webp" alt="Stamp / letterpress style" />
  <figcaption class="image-caption">Stamp / letterpress style</figcaption>
  
</figure>

<blockquote>
  <p><strong>Me:</strong> and now please Japanese Minimal Poster</p>
</blockquote>

<figure><img class="image" width="400" src="/images/poster-japanese-minimal.webp" alt="Japanese minimal" />
  <figcaption class="image-caption">Japanese minimal</figcaption>
  
</figure>

<blockquote>
  <p><strong>Me:</strong> Now do Memphis Design please</p>
</blockquote>

<p>(I didn’t know what Memphis Group design was, but I recognised if when I saw it.</p>

<figure><img class="image" width="400" src="/images/poster-memphis.webp" alt="Memphis design" />
  <figcaption class="image-caption">Memphis design</figcaption>
  
</figure>

<p>Then I got a bit silly. Designers Republic is a design agency famous for
record covers from the late 80s onwards.</p>

<blockquote>
  <p><strong>Me:</strong> And now in the style of Designers Republic</p>
</blockquote>

<figure><img class="image" width="400" src="/images/poster-designers-republic.webp" alt="Designers Republic inspired" />
  <figcaption class="image-caption">Designers Republic inspired</figcaption>
  
</figure>

<p>One note here is that along the way, the poster has acquired extra text
(“A day of music making and family fun”) – it’s decided that Designers
Republic would have thrown in some text of that kind, so it’s come up
with some words. Those words are now in the chat context, so they appear
in subsequent posters.</p>

<p>If you were working from scratch, you’d just ask for the style you want
in the first place, and avoid picking up trappings as you go.</p>

<blockquote>
  <p><strong>Me:</strong> Now as if a professional graphic designer has added typography to a poster paint drawing by his young child.</p>
</blockquote>

<figure><img class="image" width="400" src="/images/poster-child-paint.webp" alt="Child's poster paint + professional typography" />
  <figcaption class="image-caption">Child's poster paint + professional typography</figcaption>
  
</figure>

<blockquote>
  <p><strong>Me:</strong> Now with the aesthetic of a photocopied 1980 punk fanzine. But with some colour snuck in.</p>
</blockquote>

<figure><img class="image" width="400" src="/images/poster-punk-fanzine.webp" alt="1980s punk fanzine" />
  <figcaption class="image-caption">1980s punk fanzine</figcaption>
  
</figure>

<blockquote>
  <p><strong>Me:</strong> Now please make one in the style of a 90s drum n bass gig flyer, with early 3D/fractal computer imagery</p>
</blockquote>

<figure><img class="image" width="400" src="/images/poster-dnb-flyer.webp" alt="90s drum and bass flyer" />
  <figcaption class="image-caption">90s drum and bass flyer</figcaption>
  
</figure>

<p>Back to sensible ideas, naming an art style but asking for a poster
that movement might have used, seems like a strong tactic.</p>

<blockquote>
  <p><strong>Me:</strong> Now in the style of a contemporary 40s poster for a cubist exhibition.</p>
</blockquote>

<figure><img class="image" width="400" src="/images/poster-cubist-exhibition.webp" alt="1940s cubist exhibition poster" />
  <figcaption class="image-caption">1940s cubist exhibition poster</figcaption>
  
</figure>

<p>So there we are. The sharp-eyed are still going to recognise these as
AI-generated, but they’re distinctive, and I think they’re not ugly.</p>

<p>So that’s the moral - you don’t have to make posters that look like everyone
else’s.</p>

<p>There’s a further step - you don’t have to ask AI for posters as images
that can’t be edited. Claude and Gemini can generate HTML, PNG, PDF,
where the text is real text, layers are real layers, you can change fonts,
move things around, edit the text – but that’s more than I want to talk about today.</p>

<p>Inspired by this blog post, I went on to make a <a href="/poster-prompts/">catalogue of one hundred poster styles</a>,
with ready-to-paste prompts and example images for each one.</p>]]></content><author><name>John Hartnup</name></author><summary type="html"><![CDATA[Why AI-generated event posters all look alike — and how naming a design style and era, from Bauhaus to punk fanzine, gets far better results.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://john.hartnup.uk/images/poster-bauhaus-attempt.webp" /><media:content medium="image" url="https://john.hartnup.uk/images/poster-bauhaus-attempt.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>