Render as Application

Living
Image

A still architectural render, turned into software you can explore. Move the sun from morning to dusk, then export any moment.

Phase01 — Built
OriginFebruary 2026
EngineGemini 2.5 Flash Image
Visit the live platform ↗
The platform

One slider.
A whole day.

One still render in. Thirteen generated hours out, crossfaded in the browser.

Drag from 8 AM to 8 PM and the shadows swing, the sky turns, the facade warms. Export any moment, or the whole arc as a timelapse.

Situation

Customers receive an application, not a still image.

Living Image is the MVP of a broader project. Instead of providing still images, customers receive an application, enabling real-time environmental decisions in the visualization.

A render captures one hour of one day, then it's finished. The building it depicts will stand through every hour for decades. Asking for a different time of day means re-opening the 3D model, re-rendering, re-invoicing.

Task

Thirteen renders that agree on everything but the light

Users have the ability to change time of day, while exporting images and time-lapses. For that to work, every frame across the day has to be the same building — same geometry, same windows, same materials, same camera.

Crossfade two frames that disagree about geometry and you get ghosting. So the real task wasn't rendering. It was forcing a generative model to be deterministic.

Prompt writing for deterministic outputs across thirteen of the same image became the focus of the project.
Project note
Action — the pivot

What I tried, and what didn't work

While vibe coding a mock up in February 2026 with Claude, it became evident that the model could not produce the deterministic shading techniques necessary for a viable prototype. I shifted my approach to rendering the same images thirteen times through an API, each image a different hour of the day.

Real-time shading
Segment the image, estimate depth, drive WebGPU shaders from a solar model. Shadows never moved correctly. The result read as colour-grading, not rendering.
Abandoned
Custom model
Fine-tune FLUX with a LoRA on architectural renders. Heavy data requirement, slow iteration, and it left the structural fidelity question completely unanswered.
Set aside
API crossfade
Send the same image through an image API thirteen times, once per hour from 8am to 8pm, and crossfade the stack in the browser. The whole CV pipeline collapsed into a prompt template and an API call.
Shipped
Action — the prompt

The prompt is the product

AI rendering can vary with hallucinations. Ask for the same building twice and a window shifts, a mullion divides differently, a courtyard sprouts trees that were never there. One template, thirteen instances: only the hour, sun position, shadow vector, elevation and Kelvin value change between them.

Physics, not mood Relight this architectural image to accurately
depict how it would look at {time_label} on a clear day.

CRITICAL — SUN AND SHADOWS
The sun moves from the RIGHT side of the scene
(east) in the morning to the LEFT side (west)
in the evening. At {time_label}:
- Sun position: {sun_position_in_frame}
- Shadow direction: {shadow_direction_explicit}.
  All shadows in the image must fall in this
  direction — building shadows, tree shadows,
  and ground shadows all aligned.
- Sun elevation: {sun_elevation}° above horizon.
- Colour temperature: {color_temp_k}K
Values come from a solar model: elevation peaks near 58° at noon for ~40°N, azimuth runs 90° east to 270° west, colour temperature 3000K → 6200K → 2600K.
The invariant lock CHANGE ONLY these elements:
- Sun position, lighting direction, and intensity
- Shadow angles, lengths, and softness
- Sky colour gradient and brightness
- Ambient light colour temperature
- Surface reflections and specular highlights

DO NOT CHANGE any of these elements:
- Building geometry, proportions, structural lines
- Window positions, sizes, or shapes
- Material textures, patterns, surface details
- Vegetation shapes, positions, or density — do
  not add any trees, plants, shrubs, or vegetation
  that are not in the original image; empty
  courtyards and open areas must stay empty

- Ground materials and layout
- Camera angle, focal length, and composition
- Any text, signage, or labels in the image
- The number or placement of any objects
Hallucination fills gaps, so the prompt leaves none. The vegetation clause exists because the model kept planting trees in empty courtyards. Every line here was earned by a failure.
Action — the product

Upload once. Explore the day. Export anything.

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

USER SYSTEM 01 Drop the render One still image. PNG or JPG, up to 20MB. No 3D model. 02 Generate the day 13 hour-specific prompts fire against the image API. GEMINI 2.5 FLASH IMAGE OUTPUT 13 relit frames 8:00 AM 8:00 PM 03 Move the sun Slider crossfades the stack, or press play for a timelapse. 04 Export Upscale a single moment, or download a GIF sequence. ANY TIME View prompts Every instruction sent to the model, visible.
Result

Same building, same geometry, thirteen different suns

8:00 AM on the left, 7:00 PM on the right, split down the centre of a single frame. The shadows swing, the sky turns, the rammed earth warms. Nothing about the building moves.

Living Image: the same building at 8:00 AM and 7:00 PM, split down the centre of one frame
Phase 01 — live prototype● 8:00 AM — 8:00 PM
ENGINE

Gemini 2.5 Flash Image

Three adapters were built to a common interface — Gemini, GPT-4o Image and Grok Imagine — and compared on structural fidelity. Gemini won and is the only one registered in production.

BACKEND

FastAPI + adapter registry

Swapping providers is a config change, not a rewrite. Image models change monthly, so the interface is the hedge. 42 tests, written before implementation.

NEXT

Beyond time of day

The same authored approach extends to weather, seasons and street life. Then sender-side curation and analytics: which hour the client lingered on, and what they downloaded.

13
Renders per image
$0.51
Cost per full run
42
Tests, written first
Living Image

One image in.
An application out.

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

Visit the live platform ↗
MERTENSMEYER
LIVING IMAGE

Phase 01 — Validated

February 2026

Render as Application

Time of day
09:00
Daylight