Eye of the Storm
Archive
Series

Research, in arcs

AI Basics11 posts
A ground-up introduction to working with AI tools — from prompting fundamentals to integrating AI into your development workflow.
Building in Public2 posts
Behind-the-scenes posts on how this devblog gets built — workflow, tooling, and the decisions behind the decisions.
LLM Driven SDLC1 post
How large language models are reshaping every phase of the software development lifecycle — from requirements and planning through implementation, review, testing, and deployment. A practitioner's view of what actually changes when AI enters the loop.
AI Engineering Research2 posts
Deep-dive research notes on building AI-powered tools — from designing LLM-driven requirements generators to understanding architecture, inference, and production AI systems.
On GitHub

Projects in flight

codagatchiTypeScript
A tamagotchi-style desktop pet built with Tauri — a small always-on-top companion whose stats decay in real time and need tending.
groundworkTypeScript
SDLC discipline plugin for Claude Code — requirements, plans, and structured development workflows.
— Updated as projects evolveAll research & projects
ActivityAbout
GitHubXRSS
© 2026 stormbreaker9000 · charted with care
  1. home›
  2. archive›
  3. Building in Public · Part 2›
  4. A house style for AI-generated cover art
Jun 11, 2026·devblogaiimage-generationworkflow

A house style for AI-generated cover art

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.

  • The style fought me
  • The model bake-off
  • Subjects as metaphor
  • From spike to pipeline

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.

The style fought me

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.

The model bake-off

With the style settled, I compared three models through the Vercel AI Gateway:

  • gpt-image-1 — the best fine-ink renderer of the three, ~$0.25 an image. It ignores seeds, so it's not deterministic, but the quality won. Crucially, it works text-only: the locked preamble carries the look without a reference image.
  • flux-2-pro — roughly 8× cheaper (~$0.03), honors seeds (so it's reproducible), and invents fresh compositions. A notch flatter than gpt-image-1's gradient-rich rendering, but a strong cheap option for volume.
  • flux-kontext — not a from-scratch stylist at all. It's an editor: hand it a reference and it clones the composition. Useful for deterministic variations of an already-approved image, useless for generating a new one in-style.

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.

Subjects as metaphor

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 as a colossal cliffside machine of glowing lantern-nodes wired layer to layer

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).

Training as a shipwright's forge: a ship's hull rising from a mountain of timber

Two lessons fell out of doing six of these:

  • Wide and environmental beats a character close-up. Portraits don't survive the 16∶7 hero crop and don't hold the family look across the set. The covers that work put a small figure in a big scene.
  • Make the abstract cue explicit. "Hallucination" only read once I described the island as a mirage — translucent, faintly doubled, the sea visible straight through it. The first attempt drew a solid island, which just looks like discovery.

A ship's navigator reaching toward a translucent mirage island on the horizon

From spike to pipeline

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.

Was this clear?

On this page

  • The style fought me
  • The model bake-off
  • Subjects as metaphor
  • From spike to pipeline

Related

  • Streaming: publishing, not generatingJul 10
  • Structured output: making a text generator return typed dataJul 10
  • Temperature and sampling: the dice live outside the modelJul 08

Building in Public · 2 of 2

  1. 01Shipping a devblog with Claude Code and Linear
  2. 02A house style for AI-generated cover art