Blog
Dec 31, 2023 - 16 MIN READ
Midjourney and the Product Loop: Why Some Generators Feel Magical

Midjourney and the Product Loop: Why Some Generators Feel Magical

Diffusion models made image generation possible. Midjourney made it feel addictive. The difference wasn’t just the model — it was the product loop: fast iteration, visible search, and UI as a steering system for probability.

Axel Domingues

Axel Domingues

In November, I wrote about DALL·E as the proof that text can steer image distributions.

In December, I want to talk about the part most engineers underestimate:

Why Midjourney feels magical.

Not “because the model is better.”

Because the product loop is better.

Midjourney is a masterclass in shipping a probabilistic generator as a steerable system:

  • the user doesn’t ask for one image
  • the user runs a guided search
  • the UI makes the search feel like progress
  • and the platform turns “iteration” into a habit

If you’re building any generative feature (text, images, audio, code), this is the lesson:

Capability is a model problem.
Reliability and delight are product loop problems.

This post is not a Midjourney “how to prompt” guide.It’s an architecture lens:
  • what the user loop is really doing
  • what the system needs to support that loop
  • and how to apply these patterns to your own GenAI products

The core idea

Midjourney is interactive search over a probability distribution — wrapped in a loop that feels like creation.

The engineering takeaway

When you ship generators, you’re really shipping a steering interface + job system + evaluation loop.

The product superpower

Users don’t need perfect outputs. They need fast iteration and good control handles.

The hidden constraint

The loop only works if latency, cost, and queueing are designed — not “left to infra”.


The “Product Loop” Is the Real Model

A lot of teams ship generative features like this:

  1. user submits prompt
  2. model returns output
  3. user accepts or rejects

That’s a single-shot API mental model.

Midjourney’s mental model is closer to:

  1. user submits an initial intent
  2. system returns a small set of candidates
  3. user chooses a direction
  4. system refines
  5. repeat

That’s not “one inference.”

That’s a loop — and loops create compounding improvements:

  • the user learns what the system can do
  • the system learns what the user wants (implicitly)
  • the product accumulates state and direction
  • and the output quality improves through iteration, not perfection
If your generative product feels unreliable, don’t only ask “how do we improve the model?”

Ask: “how do we make iteration cheaper and more guided?”


Why “Four Images” Is a Brilliant Default

One of Midjourney’s simplest choices is also one of its most powerful:

return a grid.

A grid does three important things:

1) It makes the distribution visible

A single image looks like “the answer.”

A grid looks like:

“Here are four plausible samples from this intent.”

That psychologically reframes the system:

  • less “model failed”
  • more “I need to steer”

2) It turns “prompting” into selection

Many users can’t describe what they want precisely.

But almost everyone can do:

  • “more like this”
  • “less like that”
  • “that one, but sharper”

Selection is a low-friction way to provide signal without writing a better prompt.

3) It creates a feeling of momentum

Even if none of the four images is perfect, the user usually sees something that’s promising.

That keeps them in the loop.

If your product returns one output and it’s wrong, the user feels blocked.

If your product returns four outputs and one is close, the user feels in control.


Midjourney’s UX Is a Control Surface for Probability

When engineers say “add controls,” they often mean:

  • sliders
  • settings panels
  • advanced configuration

Midjourney’s controls are more subtle:

  • Variation (explore locally)
  • Upscale (commit and spend compute)
  • Reroll (resample)
  • Pan / Zoom / Expand (edit the canvas by changing the conditioning)
  • Style parameters (bias the distribution)

These are not UI features.

They are steering primitives.

Think of them as the image equivalent of:

  • “regenerate”
  • “make it shorter”
  • “use a formal tone”
  • “cite sources”
  • “rewrite but keep intent”

Steering primitives

Good generative products don’t expose the model.

They expose operations over the output space: explore, refine, constrain, commit.


The “Two Loops” Pattern: Exploration vs Commitment

Under the hood, a well-designed generator has two different loops:

Exploration loop

Fast, cheap, low-risk.
Generate candidates, learn direction, stay playful.

Commitment loop

Slower, more expensive, higher confidence.
Upscale, finalize, export, publish.

This split matters because it maps to real system constraints:

  • exploration tolerates more variance
  • commitment demands stability and fewer surprises

It also maps to how people create:

  • brainstorm first
  • then polish
In LLM products, this often becomes:
  • draft mode (cheap, fast, messy)
  • final mode (slower, more grounded, more constrained)

What “Magical” Actually Means (for Engineers)

“Magical” is a word people use when they can’t explain a system.

But as engineers we can define it:

A generative product feels magical when it consistently delivers these three feelings:

  1. I can get somewhere from here
  2. I’m getting warmer
  3. I’m driving, not begging

Those feelings come from:

  • iteration speed
  • visible progress
  • and control handles that match how humans think

So if you’re designing your own generator, stop asking:

“What features should we add?”

Start asking:

“What are the smallest actions that let a user steer the distribution?”


The Architecture Behind the Loop

Midjourney’s UX implies a backend architecture that looks very different from a typical request/response API.

At minimum, you need:

A job system

Prompts become jobs with IDs, state transitions, retries, and quotas.

A real-time channel

Users need updates: queued → running → complete → failed.

Stateful sessions

Variation and upscale require remembering the lineage of an image.

Cost enforcement

Every action spends compute.
Budgets and rate limits must be first-class.

This is the same architectural move we’ve been making all year in 2023:

treat probabilistic inference like production work.

Not like a function call.


The “Lineage Graph” (Your Most Important Data Model)

If your product supports:

  • variations
  • edits
  • expansions
  • “make it like this”

…then you are no longer generating outputs.

You are building a graph of derivations.

A useful internal model is a lineage DAG:

  • each node is an artifact (image/text)
  • each edge is an operation (variation/upscale/edit)
  • each node links to:
    • prompt + parameters
    • model version
    • seed (if applicable)
    • safety checks
    • cost + runtime
    • user feedback signal

This lineage becomes:

  • auditability (“how did we get this?”)
  • reproducibility (“can we rerun?”)
  • and the foundation for evaluation (“what operations lead to satisfaction?”)
If you’re serious about generative products, your “asset table” becomes a provenance system.

Designing the Compute Queue Without Killing the Magic

The loop only feels good if the user experiences:

  • predictable latency (or at least predictable progress)
  • fairness (I’m not starved)
  • and clear costs (I know what I’m spending)

Which means your compute layer needs:

  • priority queues (paid tiers, fairness constraints)
  • per-user quotas and burst limits
  • backpressure that surfaces as UX, not errors
  • graceful degradation when GPUs are saturated
The fastest way to ruin a generative product is to make the queue opaque.

A silent queue turns curiosity into frustration.


Pattern: “Show the Search, Not Just the Result”

One reason Midjourney works so well socially is that the process is visible:

  • people see the prompt
  • they see the grid
  • they see the iterations

That visibility does two things:

  1. It teaches new users the “language” of the system
  2. It reframes generation as a craft, not a lottery

If you’re building internal tools, you can still use this pattern:

  • show intermediate candidates
  • show the operations applied
  • show cost and time per step

It makes the system learnable and trustworthy.


How to Apply This to LLM Products

Even if you never generate images, Midjourney offers patterns you can steal.

Design the exploration loop

Give users cheap ways to explore:

  • multiple drafts
  • style variants
  • “show alternatives”
  • “rewrite with constraints”

Design the commitment loop

Give users a deliberate “finalize” step:

  • stricter guardrails
  • grounding / citations if needed
  • policy checks
  • higher-cost model or tool execution

Preserve lineage

Store:

  • input
  • context used (RAG results, tools)
  • parameters
  • model versions
  • and user actions

If you can’t explain outputs later, you can’t operate the feature.

Expose steering primitives

Stop shipping “prompt boxes.”

Ship operations:

  • shorten / expand
  • formal / casual
  • extract structured data
  • verify against sources
  • call tools and cite results

Failure Modes: How the Loop Can Lie

A good loop can hide problems as well as solve them.

Here are the failure patterns I’ve seen teams hit when copying the “iteration” idea:


The Real Lesson of Midjourney

Midjourney isn’t just “a good image model.”

It’s a full-stack system that treats generation as:

  • interactive search
  • steering via primitives
  • stateful provenance
  • operable compute
  • and social learning

That is the architecture move I keep repeating in 2023:

Don’t ship a probabilistic component.
Ship the system that makes it usable.

December takeaway

“Magical” is what users call a well-designed feedback loop.


Resources

Midjourney (product)

The best public example (so far) of a generator whose UX is a steering system.

Diffusion models (overview)

A readable overview of diffusion as an iterative denoising process — useful context for why “iteration” maps so naturally to product design.


What’s Next

This wraps the 2023 series: Software in the Age of Probabilistic Systems.

From here, the blog shifts into a deeper, more operational track:

  • model families and their failure modes
  • agentic systems and tool orchestration
  • LLMOps, eval harnesses, and rollout discipline
  • production engineering patterns for probabilistic components

The through-line stays the same:

reliability is designed.

See you in the next series.

Axel Domingues - 2026