< overcast.video

hologram — speculative scene reconstruction (RUNBOOK)

One flat photo of a parked car goes in; interactive "holograms" come out. The

reconstruct verb holds the camera at a captured moment and then *moves* it —

lifting a textured 3D mesh you can orbit in a hand-rolled WebGL viewer (no

three.js, no CDN), synthesizing a full 360° turntable so you can walk around the

car, and estimating depth for a drag-to-parallax hologram. Every pixel it emits

is generative: each record carries a payload.caveat banner ("synthesized by a

model, speculative, NOT photographic evidence") and is quarantined from

ask/brief evidence. It's a hypothesis renderer — decide where to look next,

then verify with real captures.

A rigid, recognizable subject on a plain background reconstructs cleanest, so the

subject is a single vintage car in a front-three-quarter view against an empty

foggy dune backdrop.

Source media (provenance / license)

a 1960s Peugeot 404 parked at Parnassia aan Zee, Overveen, Netherlands

(2017-03-29), photo by Peter Kisteman (Unsplash peterkisteman,

<https://unsplash.com/photos/68pDhPHptQQ>), re-hosted on Wikimedia Commons as

*File:Vintage gray car (Unsplash).jpg*. License: CC0 1.0 (Creative Commons

Zero / Public Domain Dedication) per the Commons extmetadata. 6000×3376.

(A residual in-camera "Copyright 2017. All rights reserved." EXIF string is

stale text superseded by the uploader's CC0 dedication; the working crop below

strips all metadata.)

stripped 2000×910 crop of car-source.jpg that centres the whole vehicle with

a plain-background margin (better mesh isolation).

Fetched with the Round-2 Wikimedia recipe (Commons search API →

extmetadata.LicenseShortName = CC0 → download original imageinfo.url).


# fetch (Wikimedia Commons original) + crop to a clean, centred subject
curl -s -A 'overcast-showcase/1.0' -o showcase/_media/hologram/car-source.jpg \
  'https://upload.wikimedia.org/wikipedia/commons/4/43/Vintage_gray_car_%28Unsplash%29.jpg'
ffmpeg -y -i showcase/_media/hologram/car-source.jpg \
  -vf "crop=3780:1720:300:1500,scale=2000:-1" -map_metadata -1 \
  showcase/_media/hologram/car.jpg

The run (all commands from the repo root; .env auto-loads creds)


# 0. one-time: reconstruct has no builtin — bind the fal provider (FAL_KEY in .env)
overcast provider setup apply --verb reconstruct --choice fal --yes

# 1. isolate + reset the case
overcast case init  --case showcase/hologram --json
overcast case clear --case showcase/hologram --yes

# 2. image→3D — Trellis via the fal QUEUE api → textured GLB (1.6 MB), base64-
#    embedded in a no-dependency WebGL orbit viewer                    (~1 m 58 s)
overcast reconstruct showcase/_media/hologram/car.jpg --ops model --case showcase/hologram --json
#   → parent rec_3b9f4a756513c55f + one mesh child
overcast view rec_3b9f4a756513c55f --no-open --case showcase/hologram --json
#   → .overcast/media/reconstruct-orbit-rec_3b9f4a756513c55f.html   → hologram-3d.html

# 3. depth hologram — Depth-Anything V2 → drag-parallax WebGL viewer        (~5 s)
overcast reconstruct showcase/_media/hologram/car.jpg --ops depth --case showcase/hologram --json
#   → parent rec_f4b408b905c8fd44 + one depth-map child
overcast view rec_f4b408b905c8fd44 --no-open --case showcase/hologram --json
#   → .overcast/media/reconstruct-parallax-rec_f4b408b905c8fd44.html → hologram-depth.html

# 4. 360° sweep — Qwen multi-angle: 8 synthesized camera stops (az 0…315) →
#    labeled cards + contact sheet + turntable mp4                    (~1 m 31 s)
overcast reconstruct showcase/_media/hologram/car.jpg --ops sweep --count 8 --case showcase/hologram --json
#   → parent rec_24b56909c6f69079 + 8 view stops + sheet + turntable

# 5. keep the sweep gallery light: the viewer inlines every stop as a data-URI,
#    so downscale the 8 stops to 800px in place (30 MB → 4.3 MB), then re-view.
for a in 0 45 90 135 180 225 270 315; do
  f=showcase/hologram/.overcast/media/reconstruct/car_14840e178e_az${a}.png
  ffmpeg -y -i "$f" -vf scale=800:-1 /tmp/az.png && mv /tmp/az.png "$f"
done
overcast view rec_24b56909c6f69079 --no-open --case showcase/hologram --json
#   → .overcast/media/reconstruct-gallery-rec_24b56909c6f69079.html → hologram-sweep.html

# 6. copy the self-contained viewers into the showcase folder
cp showcase/hologram/.overcast/media/reconstruct-orbit-rec_3b9f4a756513c55f.html    showcase/hologram/hologram-3d.html
cp showcase/hologram/.overcast/media/reconstruct-gallery-rec_24b56909c6f69079.html  showcase/hologram/hologram-sweep.html
cp showcase/hologram/.overcast/media/reconstruct-parallax-rec_f4b408b905c8fd44.html showcase/hologram/hologram-depth.html

# 7. publish (scrubs path leaks, copies the turntable mp4, renders the thumbnail)
node …/overcast.video/scripts/publish-case.mjs --slug hologram \
  --src …/case-studies/showcase/hologram --scrub …/case-studies \
  --thumb hologram-3d.html
node …/overcast.video/scripts/publish-runbook.mjs --slug hologram \
  --md …/case-studies/showcase/hologram/RUNBOOK.md --scrub …/case-studies

Local quirk + workaround: this machine's Homebrew ffmpeg 8.x mis-renders the

tile filter fed by the image2 sequence demuxer (and lacks drawtext), so the

sweep's auto-assembled contact sheet came out blank (~2 KB). Reproduced the

sheet manually by hstack/vstack-ing the same 8 stop PNGs (ordered by

azimuth) into a 4×2 grid at the record's sheet path, then re-ran overcast view

so the gallery embeds the fixed sheet — same content, same geometry, no HTML

edits.

Honesty note: the amber "generative reconstruction" banner burned into every

viewer is part of the product, not an apology — reconstruct's records never

enter case evidence, never trigger findings, and exist to point real sensors in

the right direction. The mesh, the eight turntable stops, and the depth map are

all a model's *guess* at the unseen sides of a real car, not a measurement.