Did It Move?:將每小時 $6.12 的氛圍式鬼屋體驗成本降至幾美仙
Did It Move? An ambient haunting that costs $6.12 an hour, so I made it cost cents
Did It Move? 以混合設計打造智能電視上的氛圍式鬧鬼體驗,把即時生成影片限制在異象出現的短暫時段,避免閒置時持續計費。即時使用 Reactor 的 xmax-x2-1 每小時需 $6.12;約 2% 的運行佔比下,一晚成本只需幾美仙。公開示範則重播預先錄製的片段,每位訪客無需付費。
This is a submission for the Hacktoberfest Open-Source AI Challenge Week 4: Ghost in the Machine
What I Built
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.
Demo
Live demo: 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:
Code
Mike-Demo
/
did-it-move
Did It Move? — a haunted living room for DEV Hacktoberfest Week 4 'Ghost in the Machine'. CSS room, generative video bursts, and a gaslight layer that denies everything.
Did It Move?
An ambient haunting for smart TVs and large monitors, built for the DEV Hacktoberfest Week 4 challenge — "Ghost in the Machine" (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.
Why it isn't just "run a real-time model all evening"
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…
How I Built It
The idea vs. the invoice
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:
- $48.96 for one Halloween evening on one TV
- ~$147 a day if you leave it on
- an unbounded amount the moment you post a public demo link, because every visitor holds their own GPU session
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 hybrid: generate the moments, not the room
- Idle layer (99% of the time, $0). The room itself is hand-built CSS/SVG — fire, rain, moonlight. It can run on a TV forever for free.
- Burst layer (5–8 seconds). A generative session exists only while something is happening: a 120-second hard cap, a non-recoverable disconnect (a recoverable one keeps billing — read the docs, learn from my near-miss), and a daily budget kill-switch. At a ~2% duty cycle, a live evening costs cents.
- Public mode ($0 per visitor). The bursts used by the public demo were captured once, during development, and are replayed. The HUD shows each burst's would-be live cost as a shadow price, so the economics stay visible instead of hidden.
- Gaslight layer ($0, and the actual joke). The lasting changes — crooked picture, dead candle, turned chair — are cheap DOM state. The most memorable part of the piece costs nothing at all, which is rather the point.
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.
Why Does Open Innovation Matter?
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 Spirit of It
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.
Prize Categories
General only
來源:DEV Community · dev.to