Generating an image is one API call. Keeping ~48 of them on-style across months is the actual work — here's the house style, the model bake-off, and the pipeline that makes it reproducible.
Every post on this site has a slot for a cover image. Filling one is trivial — it's a single call to an image API. Filling all of them so they read as one series instead of a grab-bag of unrelated AI outputs is the part that took real work.
That's the whole problem in a sentence: not "generate an image," but "generate dozens of images, over months, that look like they came from the same hand." Image models are non-deterministic and have their own aesthetic gravity. Left alone, they pull every generation toward a slightly different look. The job was to fight that.
My first instinct was a loose, painterly, golden-hour look. The model loved it — a little too much. Every prompt drifted toward the same soft amber haze that drowned any detail, and "golden" or "sunset" anywhere in the subject made it worse.
So I overcorrected into flat, clean-line illustration — ligne claire, flat color fills, no gradients. That read like a children's book. Rejected.
The keeper sat between them: premium modern graphic-novel ink — fine, varied-weight linework, selective crosshatching, gradient tonal modeling, deep solid blacks. Think Jim Lee pencils with Alex Sinclair color. The decision that finally made it stick was separating two things I'd been tangling together:
The rendering technique is fixed; the palette flexes per subject.
The style preamble describes how to draw — the inking, the shading, the contrast — in palette-agnostic language. Each subject states its own colors. Once those were decoupled, the same locked style carried a teal-and-brass machine hall and a cold foggy frontier without me re-tuning anything.
With the style settled, I compared three models through the Vercel AI Gateway:
The non-obvious finding: feeding gpt-image-1 a reference image to "anchor the style" backfired — its reference path clones content, not just look. Text-only, leaning entirely on the preamble, gave the most consistent family resemblance. So that's the pipeline: one model, no reference, the style living in words.
The AI Basics series is about abstract machine-learning ideas, which don't illustrate themselves. The trick was mapping each concept onto a concrete nautical-adventure scene and letting the fixed house style do the rest:

A neural network became a cliffside hall of glowing lantern-nodes wired layer to layer. Training became a shipwright's forge — a mountain of raw timber being built into a ship, with a few smiths up top making fine adjustments (the pretraining-bulk vs fine-tuning split, rendered as labor).

Two lessons fell out of doing six of these:

All of that started life as a spike — and it showed. The prompts lived in my chat history. Post-processing was hand-typed sharp commands with eyeballed crop offsets. Nothing recorded which prompt, model, or cost produced which file. Reproducing a cover meant reconstructing a conversation.
So the last step was making it boring and repeatable. The prompts now live in a typed manifest that's the single source of truth. One script does two things: generate renders a candidate and writes a provenance sidecar plus a cost-ledger line; finalize runs the approved candidate through a named output profile — crop to 16∶7, webp, drop into place — with no hand-typed image ops. A guard test fails the build if an approved cover is missing or the wrong shape.
None of that changes a single pixel. It changes whether I can do this again next month and get the same result.
The work was never "generate an image." It was building the system that makes many images look like one hand drew them.