Making-Of

One HTML file, one asset catalog, one Mac. How the Hollow got built.

One File

THREE.JS · NO BUNDLER · NO BACKEND

The entire game — renderer, story state machine, cutscene engine, audio engine, combat, touch and gamepad support — is a single index.html of a few thousand lines, running three.js straight from an import map. There is no build step, no server code, and no dependency to install: the page you load is the source. Saves live in your browser's localStorage; the four-act structure is a checkpoint state machine that survives reloads mid-night.

Polyfork

THE WORLD, STREAMED AS CODE

Every model — cabin, forest, car, well, lookout, and every person living or lent — streams from the Polyfork low-poly catalog as ES modules with parameters. Assets are not static files but tiny generators: the game asks for a cabin with particular wood tones, terrain with a particular flatness, a character with a particular face, and the mesh is built in the browser.

The deadites are the trick in action. Polyfork has no monsters at all — every walking corpse in the game is an ordinary catalog character run through corpse parameters: gray-green skin, whited eyes, age: old, a weary expression. The farmer and the villager are the same models a cheerful farm scene would use. The horror is entirely in the knobs, which feels appropriate for a game about ordinary things used in the wrong direction.

The farmer and villager deadites — ordinary catalog characters with corpse parameters
ORDINARY CATALOG CHARACTERS, WRONG KNOBS

The Voices

NEURAL TTS, LOCALLY, ON ONE MACHINE

No actor recorded a line for this game. The cast began as macOS speech voices arranged through effects chains, then was regenerated end-to-end with Chatterbox, Resemble AI's open-source neural TTS, running locally on an Apple M4 — every line generated in minutes, on-device, nothing sent anywhere.

Two lessons survived the process. First: a voice model clones delivery, not just timbre — the first narrator sounded robotic because it was cloned from a robot, and the fix was a human reference and punctuation-as-direction (“you pick NOW to die on me? Great.”). Second: the scariest processing is the least — the mimics are nearly dry, just a detuned double underneath, because almost right beats any amount of monster reverb.

The creatures are hybrids: human vocalizations at maximum effort, pitched down with vocal-fry tremolo and drive. The Watcher is the game's own chant reversed and slowed — the cadence, backwards is a line of lore and a literal audio pipeline. Full players for everything are on the soundtrack page.

The Trailer

SHOT INSIDE THE GAME

The trailer was filmed by the game itself: a recording rig injected into the running page captures the canvas and taps the live audio graph, while the story is driven scene to scene through debug hooks. The takes upload to a local server and are cut together with ffmpeg — title cards, hard cuts, and all. Everything you hear in it is the engine playing, not a soundtrack laid over footage.

The Wiki Itself

PORTRAITS FROM A DEBUG HOOK

Every character portrait on these pages was photographed in-engine: a debug spawn hook poses a character in front of the player camera, arrow-key look (added as a real accessibility feature) frames the shot, and a screenshot gets cropped into the card you see. The Marta portrait required walking the player character across the map to the graves — during which the photographer was bitten twice by the hunter standing frozen in the shed. The Hollow does not pause for press.

Release History

HIGHLIGHTS · TWO DAYS, SIXTY-ODD RELEASES
VERSIONWHAT LANDED
v0.1–v0.6The scene: terrain, cabin, forest, rain, deadites, scare director, film grain.
v0.7–v1.0The game: four acts, cutscenes, axe combat, the reading, both title cards.
v1.1–v1.5Mobile touch, procedural audio and music, two external reviews implemented, the trailer, The Road ending.
v1.6–v1.8Break-test hardening, nav arrow and guidance layer, Steam Deck/gamepad, reading bar, health bar.
v1.9.xThe full generated soundscape: tape, chant, mimics, growls, the Watcher, narrator, whispers — then all human voices regenerated with Chatterbox. New farmer and villager deadites. The scarecrow.
v1.10.xThis wiki, and the trailer re-shot with the finished soundtrack.

Credits

F(X) PRESENTS

Design, code, words, and audio: f(x). 3D assets streamed from the Polyfork catalog. Voices generated with Chatterbox (Resemble AI, MIT license) and macOS speech synthesis. Music and creatures synthesized with numpy and ffmpeg. Engine: three.js. An original homage — the structure of a cabin-in-the-woods possession story, with its own characters, words, and rules.