# Did It Move? An ambient haunting that costs $6.12 an hour, so I made it cost cents

> Source: <https://dev.to/mpmike/did-it-move-an-ambient-haunting-that-costs-612-an-hour-so-i-made-it-cost-cents-280k>
> Published: 2026-10-31 03:06:01+00:00

*This is a submission for the [Hacktoberfest Open-Source AI Challenge Week 4: Ghost in the Machine](https://dev.to/challenges/hacktoberfest-week4-2026-10-26)*

**Did It Move?** is an ambient haunting designed for the biggest, dumbest screen in the house: the TV.

Open it fullscreen and forget it exists. A cozy living room — fire going, rain on the window, a portrait, a rocking chair, a candle — sits quietly for minutes at a time. Then, for a few seconds, something subtly wrong happens. The portrait's eyes are looking somewhere new. A shadow crosses the window that no one casts. The rocking chair rocks itself, gently, and stops facing the other way.

When it's over, exactly one thing in the room is different from before — and the room's own event log, timestamped, insists nothing happened:

*9:42 PM — That picture has hung crooked since October.*

*10:17 PM — Books fall. Gravity is not a haunting.*

The horror isn't a jump scare. It's the argument you'll have with the person next to you on the couch: *I'm sure that candle was lit.*

Live demo: [https://did-it-move.space.fast/](https://did-it-move.space.fast/)

Try **Demo pace** in the live demo — bursts arrive every ~15 seconds instead of every 4–7 minutes, because judges, unlike ghosts, are busy.

And here is the full hour the room can haunt, if you have a TV and an evening:

An ambient haunting for smart TVs and large monitors, built for the
[DEV Hacktoberfest Week 4 challenge — "Ghost in the Machine"](https://dev.to/challenges/hacktoberfest-week4-2026-10-26)
(deadline: October 31, 2026, 11:59 PM PDT).

Open it fullscreen on a TV and forget it. A cozy living room — fireplace rain on the window, a portrait, a rocking chair — sits quietly for minutes at a time. Then, for a few seconds, something subtly wrong happens. When it's over, one thing in the room is different from before, and the room's log insists nothing happened at all.

*Did the portrait always look toward the sofa? Has that picture always
hung crooked? You can't prove it didn't.*

Real-time video models (here: Reactor's `xmax-x2-1`, a streaming
video-to-video model) bill for **session time**, not for interesting
moments. Checked live on 2026-10-28 against Reactor's public…

The obvious way to build this is a real-time generative video model — I prototyped against Reactor's `xmax-x2-1`, a streaming video-to-video model whose SDK (`@reactor-models/xmax-x2-1`) lets you feed it a source stream, set a prompt, and re-render the world as it happens. Feed it the quiet room, prompt *"the portrait's eyes shift, slowly"*, and the room haunts itself.

Then I checked the pricing endpoint. Reactor charges **$0.0017 per session-second** for this model — $6.12 an hour — billed from the moment a session is ready, *including while it sits idle*, per viewer. My quiet room is idle 99% of the time, by design. The naive version costs:

The whole project became: **how do you build an ambient generative piece when generation is priced per second and ambience is priced per hour?**

The app itself is vanilla HTML/CSS/JS, no build step, no assets — it has to run in whatever browser a smart TV shipped with. The cost guardrails live in one file, `reactor-live.js`, and the burst prompts for each event live next to their pre-recorded fallbacks in `app.js`.

Two honest answers.

**The swap test.** Because Reactor hosts several models behind one SDK, I could price the closed `xmax-x2-1` against the open-weight `sana-streaming` and `longlive-v2` — and they are listed at the *identical* $0.0017/sec. When open weights cost the same as a closed model, "we can't afford to go open" stops being an argument; the decision becomes about control, longevity, and whether your ambient ghost still works the day a vendor changes its pricing page.

**The exit door.** The burst prompts are plain text, the room is open code, and nothing in the piece depends on one vendor's session: a burst is a burst whether a hosted model renders it live, a local model renders it later, or — as in the public demo — it was rendered once and kept. Open models and open code are what let a $6.12-an-hour idea become a piece that can live on a TV, in a repo, after the hackathon, for free.

The moment it landed wasn't technical. It was the first full run on the TV, when the candle went out during a quiet stretch and the room's log — deadpan, timestamped — explained that the candle had *always* been unlit. Two people on the couch immediately disagreed about whether it had ever been lit at all. Neither could prove it. The room could. It just wouldn't.

That's the haunting I wanted: not a monster, but a small, polite, well-documented doubt that follows you out of the room.

General only
