LIVING IMAGE — Render as Application
Render as Application

Living
Image

Turning a still architectural render into software you can explore. How it's built, and why the prompt is the product.

Phase01 — Built
OriginFebruary 2026
MethodDeterministic prompting

01 — The thesis

Customers stop receiving images. They receive an application.

A render is a file. It captures one hour of one day, then it's finished. The building it depicts will stand through every hour for decades.

Living Image makes the render run. The customer opens a link and makes real-time environmental decisions inside the visualization: moving the sun, reading the shadows, watching the windows come alive at dusk.

They export any moment as a still, or the whole day as a timelapse.


02 — The problem

One moment, sold as the whole building

TODAY

Every variation is a new invoice

A different time of day means re-opening the 3D model, re-rendering, re-delivering. Days of turnaround. The economics punish exploration.

TODAY

The deliverable is mute

Once the file is sent, the sender learns nothing. Which view resonated? What did the client actually study? A static image never says.

LIVING IMAGE

One render, the entire day

Upload once. The customer explores the full arc from morning to night, and exports whatever they need from it.


03 — February 2026

The first approach hit a wall

Vibe coding a mockup with Claude, the plan was real-time relighting in the browser: segment the image, estimate depth, drive WebGPU shaders from a solar model.

The model could not produce the deterministic shading techniques a viable prototype required. Shadows didn't move correctly. Highlights sat wrong. The result was closer to colour-grading than rendering.

It's not a real-time render overlay. It's just masking. We should be rendering.
Working note — February 2026

04 — The pivot

Stop rendering light. Generate it, twelve times.

The reframe: don't compute lighting in real time. Send the same image through an image-editing API twelve times, once per hour, and let the browser crossfade between the results.

The entire pipeline collapsed. No segmentation. No depth estimation. No material classification. The frontend became a stack of layered images with opacity interpolation.

07:00
2200K
09:00
3500K
12:00
5500K
14:00
6200K
17:00
3200K
18:00
2200K

05 — The result

Twelve frames, one continuous day

The browser crossfades the stack in real time. Shadows swing, the sky shifts, and the windows warm as the sun drops below the horizon.

All of it driven by a single slider — the same control moving the light behind this page.

Living Image time-of-day demo
Phase 01 prototype● 07:00 — 21:00

06 — The real problem

Twelve renders of twelve different buildings

AI image generation drifts. Ask for the same building twice and you get two interpretations: a window shifts, a mullion divides differently, vegetation reshapes, a facade panel changes texture.

Crossfade between two frames that disagree about geometry and you get ghosting, morphing, and double vision. The illusion collapses instantly.

THE CONSTRAINT

Twelve outputs, one building

Every frame must be pixel-consistent in geometry and differ only in light.

Which makes prompt writing the entire engineering problem. Not a wrapper around the product. The product.


07 — What makes the prompt deterministic

Determinism through constraint, not creativity

✕ Fails — leaves room to interpret "Make this architectural render look like
morning light."
The model re-imagines the scene. Nothing is pinned, so everything is negotiable. Twelve runs produce twelve buildings.
✓ Works — three-part lock TARGET. Relight to 09:00, clear sky.
Sun elevation 30° from the east.
Shadows fall west-northwest at 2× object height.
Colour temperature 5500K.

PRESERVE. The EXACT building geometry,
window positions and divisions, materials,
textures, vegetation, camera angle, composition.

PERMIT. Only modify: sun position and
lighting direction, shadow angles and lengths,
sky gradient and brightness, ambient colour
temperature, surface light reflections.

08 — Four rules

Why this produces the same building every time

  1. Physics, not mood

    "30° elevation, shadows at 2× height, 5500K" is verifiable. "Morning vibes" is not. Numbers give the model a target it can hit consistently; adjectives give it room to improvise.

  2. Exhaustive invariant enumeration

    Hallucination fills gaps, so the prompt leaves none. Geometry, window divisions, materials, textures, vegetation, camera, composition are each named explicitly. Anything unnamed is something the model may feel free to reinterpret.

  3. A closed permit list

    Rather than only forbidding, the prompt states the complete set of permitted changes. Five things may move. Everything outside that list is implicitly frozen, converting an open creative task into a bounded one.

  4. One skeleton, twelve instances

    All twelve prompts are the identical template. Only the hour, the solar elevation, the shadow vector, and the Kelvin value change. Consistent structure in, consistent structure out.


09 — Where the numbers come from

The prompt is fed by real astronomy

Those elevation angles and Kelvin values aren't estimated. They're computed from a solar position model: latitude, hour angle, and seasonal declination, validated in Python against real sunrise and sunset tables.

The same model drives the browser, so the slider passes through civil and nautical twilight, golden hour, and high sun at the times they actually occur.

Solar elevation sin(elevation) =
  sin(lat)·sin(dec) +
  cos(lat)·cos(dec)·cos(hourAngle)
40.7°
Default latitude
3
Seasonal presets

10 — User flow

Upload once. Explore the day. Export anything.

01

Drop the render

A single still image, dragged into the browser. No 3D model, no plugin, no setup.

Sender
02

Generate the day

Twelve hour-specific prompts fire in parallel against the image API. Each returns the same building under different light.

System
03

Move the sun

One slider crossfades the stack in real time. Shadows swing, sky shifts, windows warm as the sun drops.

End user
04

Export

Any single moment as a still, or the entire arc as a timelapse animation.

End user

The experience is authored, not open-ended. The end user never writes a prompt. They explore inside the range the sender generated, which keeps every frame on-brand and quality-checked.


11 — How it's built

The stack

BACKEND

FastAPI + adapter layer

A shared interface across three image models, so any backend can be swapped without touching the product. Twelve calls dispatch in parallel with progress tracking.

FRONTEND

WebGPU crossfade

Layered image stack with opacity interpolation, procedural sky, window illumination and tone mapping in WGSL. 60fps on integrated graphics.

METHOD

Test-driven

42 tests written before implementation, covering prompt generation, adapter contracts and server endpoints.

3
Models evaluated
12
Renders per image
42
Tests, written first

12 — Choosing a model

Decided by evidence, not preference

Rather than pick a provider on reputation, the harness runs the same architectural render and the same twelve prompts through Gemini, GPT-4o and Grok side by side.

The measure that matters is structural fidelity: how far the geometry drifts across twelve generations. That single number decides the backend.

FALLBACK

IC-Light in reserve

A relighting model built specifically to preserve structure. The adapter pattern means adopting it is a configuration change, not a rewrite.


13 — Roadmap

Time of day is the MVP, not the product

NOW

Fidelity validation

Run real architectural renders through all three models and measure geometry drift across the twelve frames.

NEXT

Curation and instrumentation

The sender chooses which components to expose, shares a link, and sees how the client explored it and what they downloaded.

LATER

Weather, seasons, street life

The same authored approach extended to rain and snow, seasonal light, and animated street scenes. Then spatial depth and parallax.

Each addition is another environmental decision the customer can make inside the visualization, and another reason the deliverable is an application rather than a file.

Living Image

One image in.
An application out.

The render stops being the end of the conversation and becomes the start of one.

MERTENSMEYER
LIVING IMAGE

Phase 01 — Validated

February 2026

Render as Application

Time of day
14:00
Daylight