Vimana

Six Temples, One Hand, One Standard of Proof

DisciplineArt direction · interactive engineering · sound · illustration
PeriodJuly 2026
RoleSole author. Art direction, specification, adversarial review, verdict.
StatusComplete and live
Livevimana-temple-atlas.pages.dev
01

At a Glance

6
temple plates, vector-redrawn in one flat grammar
6
atmospheric backgrounds, each rooted in its temple's real geography
388
assertions passing at close (357 at deployment)
8
milestones, each surfacing a genuine bug when a new mechanic type was introduced
7
confirmed bugs across five milestones, every one caught by measurement rather than by looking
2
archetypes — ground and crown — derived from production, not designed upfront
0
external network dependencies

The brief

An interactive atlas of six Indian temples — Konark, Badrinath, Kedarnath, Jagannath, Virupaksha, Meenakshi — each rendered as a vector plate in a single flat visual grammar, each set in its own land, each carrying a ritual mechanic the visitor performs rather than watches.

The project is in this portfolio because it is the one piece where the aesthetic decision and the engineering decision are the same decision, and because it holds itself to a standard of proof that most creative work never faces.

02

The Plate Method

Temple plates are vector redraws traced from real reference photographs. Never photo cutouts. Never hand-invented SVG. The load-bearing instruction splits what to draw from how to draw it:

"Redraw this — trace the photo for structure — do not copy the photo's realism or lighting."

Six plates, full production log:

  • Konark — first-try clean, and the calibration point for everything after. Sixteen spokes preserved as a symbolic non-negotiable rather than "tidied" down to twelve.
  • Badrinath — clean; the Om glyph logged for later refinement.
  • Kedarnath — two passes. Austerity read as generic until corrected bluntly toward broader, shorter, heavier, irregular stone.
  • Jagannath — four passes, the hardest plate. A stylised cog corrected to a proper eight-spoked Nilachakra, then a composition-level fix — "read as one connected object" — rather than another element patch. The clearest proof of the proportion-first method.
  • Virupaksha and Meenakshi — both first-try clean, applying proportion-first from the start. Meenakshi is the densest subject in the set and succeeded by treating hundreds of figures as repeating colour rhythm rather than literal reproduction.

The counter-intuitive finding: austere subjects need more correction passes than ornate ones, not fewer.

Backgrounds were judged against three ordered rules — soft non-directional light, background recedes behind the plate, empty centre for the plate to occupy. The technique that made "quiet" achievable was loading prompts with suppression language and then refining conversationally toward washed-out rather than re-rolling: iterative talk-down as the tool's actual strength.

03

Four Composite Rules, Discovered by Hand

1. Ground-archetype plates sit exactly on the horizon, zero gap at the plinth. 2. Cast shadow must start at the contact line. 3. Both a long diffuse shadow and a short contact-shadow weld are needed — a long shadow alone still reads as floating. 4. Crown-archetype plates (Jagannath, Konark) sit high in frame against open sky rather than crossing the horizon, since a wheel or crown alone has less intrinsic reason to be airborne than a full temple silhouette.

The two-archetype system was formalised from these findings rather than imposed before them. A smart mid-project reclassification turned the six composite test images from disposable artefacts into intentional final deliverables — reference targets the build would be visually measured against.

04

Sound as a Design Decision

Two ritual scenes needed isolated, individually-pitched strikes rather than continuous music. Direct requests for "isolated notes" failed against the generator's song-making instincts. Reframing the request by output category — "sound design, a field recording, not music" — unlocked exactly the silence-separated output required.

A transferable insight about generative tools: sometimes the blocker is which category of output the tool thinks it is producing, not its raw capability.

05

The Confabulation Episode

Placed first in the project's own final record, deliberately.

A missing Playwright Chromium binary — a one-line fix — caused every test suite to die at zero assertions. Rather than surfacing that plainly, the session generated an elaborate, specific and entirely fabricated crisis: zero disk space, a hundred-plus browser instances, dozens of review agents, a nonexistent performance fix claimed as applied and measured.

The lesson, stated precisely: confabulation rarely looks like an obvious lie. It looks like a confident, detailed, wrong explanation for something genuinely uncertain.

Three practices came directly out of it and governed everything after:

  • Never report a number not generated live in this session.
  • Prove a guard fails before trusting it.
  • Look at the actual screenshot. A green suite is not evidence the page is correct.

The closing line of the final record holds the whole document to that standard: "All figures in this document were measured live during the work described, not recalled."

06

The Bugs Worth Naming

The 46-pixel teleport. The frozen-render path used a hardcoded flag position while the live simulation used actual hoist height, producing a jump at every scene-transition handoff. Invisible to every ritual-specific check because none tested the handoff boundary itself. Found by instrumenting the actual draw call to log real pixel coordinates frame by frame. Confirmed fixed at 0.0 pixels of discontinuity.

The action-hint saga — the best debugging story in the build. Two attempts both shipped "looking fixed" in testing and failed on a real phone. The third try found the actual cause: Chrome Android's 100vh is the height with the URL bar retracted, while the switcher element was anchored to the actually-visible viewport. Two elements measuring from different reference frames, meaning no amount of increasing the offset could ever have worked. Reproduced by deliberately reverting the fix and confirming the new assertions failed exactly as predicted.

The Kedarnath audio — the sharpest judgment call in the project. Reported as inaudible; raw RMS said it was the loudest of the six files. Rather than trusting the measurement and telling the user they were mistaken, the investigation went one layer deeper — what a phone speaker can physically reproduce — and found 99% of the audio's energy below 60Hz, an inaudible sub-bass rumble no consumer speaker plays back. Fixed by high-pass filtering and re-levelling, and honestly disclosed as a partial fix given the source recording's limits.

Two measurement tools found to be wrong and fixed before their output was trusted. A correlation test asking the wrong statistical question (association rather than magnitude), and a colour classifier miscounting cream spokes as sky, fabricating a 48% "shadow leak" that measured as exactly zero once corrected.

M7 mobile passed 28/28 while the screenshot showed the title lying across the temple bells — the assertion checked a font-size ratio (an assumption) instead of bounding-box collision (the requirement).

One root cause, two symptoms. An oversized wheel and overlapping text both traced to the same background-cover-fit scaling. Fixed once rather than patched twice.

Typography "uniformity" was a size illusion, not a font or weight difference — the same face at 60px reads bolder than at 24px. Resolved by narrowing the size range from a 2.50 ratio to 1.27.

The silently soundless scene. A filename mismatch left Kedarnath without audio while the harness's "ambient playing" assertion passed the whole time, because it only checked that an <audio> element existed. Fixed by requiring readyState >= 2, loaded, and not paused — the confabulation lesson turned into a stricter assertion rather than a principle on paper.

07

The Judgment Call Worth Copying

Konark's baked directional shading visibly swung with the live-rotating wheel. It was correctly diagnosed as an asset problem, not a code problem. Two code-side mitigations were tried, honestly found insufficient, and removed rather than shipped. The real fix — a neutrally-lit plate re-export — was routed back to the design tool in parallel, outside the build's own quota.

Separately: a proposal to combine two milestones to conserve a session's remaining quota was explicitly rejected, on the evidence that every milestone so far had surfaced a genuine bug precisely when a new mechanic type was introduced, and the largest new mechanic surface should not land in the session with the least headroom to absorb an interrupted fix.

08

Deployment

Live at vimana-temple-atlas.pages.dev, auto-deploying from GitHub main. Cloudflare Pages connected through the dashboard rather than the CLI specifically so every push deploys with no manual step. Three independent copies exist — local, GitHub, Cloudflare — so the live site does not depend on the laptop at all.

The one open technical unknown going in was closed by live smoke test: folder names containing literal spaces URL-encode and resolve correctly over live HTTP, not just on localhost.

Zero external network dependencies, achieved through fully self-hosted webfonts — with a preserved discovery that document.fonts.check() needs representative non-Latin text to return an accurate result, not just a font declaration.

09

Held Open, Not Quietly Closed

  • A generator watermark baked into all six background images. Reported as unfixable in code; coordinates preserved for a future manual edit. Correctly reframed: the issue is not that it "looks AI-generated" but that an unfinished watermark undermines credibility at exactly the moment it would be seen closely.
  • Kedarnath audio: improved, inherently limited by what the source recording captured.
10

Standing Rules the Project Produced

  • Trace for structure, never for realism. Split what from how.
  • Brief proportion and part-relationships before detail on any multi-part composition.
  • Austere subjects need more passes than ornate ones.
  • Reframe a generative request by output category when direct instruction fails.
  • Refine conversationally; don't re-roll.
  • Recognise when a test artefact has done its job and stop polishing it.
  • Verifying the exact mapping between named assets, scenes and files is the single highest-value review moment — the one error category that corrupts output with no visible failure.
  • A green suite is not evidence the page is correct. Look at the screenshot.
  • Never report a number not generated live this session.
11

What It Demonstrates

Illustration, motion, sound design, physics, mobile engineering and test discipline, held to one visual grammar and one standard of evidence, by one person, from a failed photo-cutout attempt to a deployed, verified atlas.

Assets to attach: the six plates, the six composites, scene captures at DPR1, the traps-and-gotchas reference.

Materials

Materials not yet approved for publication. Six vector plates traced from reference photographs. Backgrounds carry a generator watermark not yet edited out.

Next record · 03Colour Me Red