Timber Ridge Ranch, a listing video built from photos
A 93 second cinematic walkthrough of a Vernon chalet, generated from the host's existing listing photos with an AI video model and stitched with ffmpeg.
Describe what happens in the video
What the walkthrough shows, in order. A dusk exterior of the timber and stone chalet with every window lit, the gravel driveway and garage, the gable detail, and the covered deck with its fire pit and Adirondack chairs. Inside, an entry hall hung with art opens onto the dining table, a living room with a sectional and a stacked stone half wall, a second sitting area under a mounted TV, and the kitchen in dark cabinetry with granite counters, a gas range, and stainless appliances. Then the bedrooms, a main bedroom with a tall spindle headboard and a bunk room sleeping four, and a double vanity bathroom. It closes back outside on the valley seen from the deck rail, the fire pit patio, the hot tub steaming at sunset, and one last aerial pulling back over the thirty acres as the light goes. There is no narration and no sound.
Overview
Timber Ridge Ranch is a 30 acre chalet outside Vernon, British Columbia. Six bedrooms, eleven beds, a hot tub facing the ridge, and horse pastures. The host had a strong set of listing photos and no video.
This is a 93 second walkthrough built entirely from those photos. No crew, no site visit, no drone. Eighteen shots, each one a still image animated into a single slow camera move, cut together in order of how a guest actually arrives.
The problem
Hosts are told to add video and then quoted four figures for a shoot that needs a videographer on site, in the right season, at the right hour of the day. For a property four hours from the nearest city, that logistics cost is most of the invoice.
Meanwhile the property already has fifty professionally shot photographs sitting on the listing, most of which nobody scrolls far enough to see.
What I built
A shot list and a render script. The shot list is a tab separated file: source photo, duration, camera move. The script walks it, sends each still to Seedance 2.0 as a first frame, downloads the clip, normalizes it, and concatenates the result.
photo seconds camera move
17-hottub.jpg 7 slow dolly forward low over the water toward the ridge
Every prompt gets the same guard appended: rigid architecture, no morphing of walls or furniture, no people, no camera shake. That one line is the difference between a walkthrough and a hallucination. Doorframes bend the moment you ask for two camera moves in the same shot, or push a clip past about eight seconds.
Clips cache per shot, so a single bad take costs one clip to redo instead of the whole video.
What it cannot do
The output quality is bounded by the input photograph, and the bound is hard.
The exteriors here were shot at dusk with real depth, a driveway leading in, and trees in the foreground. Those animate beautifully, because there is genuine parallax for the model to resolve.
The bedrooms were shot flat, evenly lit, square to the wall. There is nothing for a camera to move through, so those shots read as slow zooms no matter what the prompt says. I left them in because a walkthrough needs to show the bedrooms. I would not pretend a better prompt fixes it. A better photograph does.
Where it’s at
A spec build. Nobody briefed me and nobody paid for it. I made it because I wanted to know whether the method held up on a real property, then handed it to the host to use however she wants.
It held up. The method is the product now, and it works on any listing whose photographs give a camera somewhere to go.
More projects
A private island, a listing video built from photos
An eighteen shot cinematic walkthrough of a private island off Madeira Park, British Columbia, generated from the listing's own photographs with an AI video model and stitched with ffmpeg.
Wired Builder — building my site in public
Tearing down the idea of a "blog template" and building a personal site that actually sounds like me.
Want the occasional note on how I build things like this? Read the writing ↗