Spaces:
Sleeping
Sleeping
| title: Hollow | |
| emoji: ๐ซ๏ธ | |
| colorFrom: gray | |
| colorTo: indigo | |
| sdk: gradio | |
| sdk_version: 6.18.0 | |
| app_file: app.py | |
| python_version: "3.11" | |
| pinned: true | |
| short_description: A lost child asks for your memories โ then claims them. | |
| tags: | |
| - track:wood | |
| - achievement:offgrid | |
| - achievement:offbrand | |
| - achievement:fieldnotes | |
| - build-small-hackathon | |
| - thousand-token-wood | |
| - horror | |
| - npc | |
| - game | |
| - small-models | |
| - qwen3 | |
| - zerogpu | |
| # Hollow | |
| *Something shaped like a lost child stands at the far edge of the Thousand Token Wood, where the path ends and the fog begins.* | |
| It has no memories of its own. It asks for yours. It keeps them in a treasure. And as the bond grows, it starts telling them back to you โ **in first person, as if it had lived them.** | |
| > โ ๏ธ Contains flashing images and one sudden sound. | |
| ## Watch & read | |
| - ๐ฅ **Demo video:** https://youtu.be/Awc4g1Y7d6Q | |
| - ๐ **Field notes / write-up:** https://www.linkedin.com/feed/update/urn:li:ugcPost:7472433866822131712/ | |
| ## How it plays | |
| Talk to it. That's all. But *everything* you do is being measured on two axes: | |
| - **Bond** โ how much of yourself you share. The child literally materializes out of the fog as the bond grows: from a smudge, to a faceless shape, to a child with sad eyes, to something that has been listening too well. | |
| - **Tone** โ how you *treat* it. It mirrors your writing style. Warmth makes it attach. Coldness makes it withdraw. Cruelty reminds it of how it was treated when it was alive โ and it keeps your exact words. You'll see *something* being stored in its treasure, redacted: `โฎโฎโฎโฎโฎ`. You won't know what until it's too late. | |
| **Three endings.** Love it too much and it loves you back โ the wrong way. Stay distant and the fog simply gives up on you. Be cruel and you'll learn what it does with the words you gave it. Each ending is a scripted sequence that takes over the interface itself: messages appear on *your* side that you never typed. | |
| ## The tech (small on purpose) | |
| - **One model, 8B, no APIs:** [Qwen3-8B](https://huggingface.co/Qwen/Qwen3-8B) โ `transformers` + ZeroGPU on this Space, the same model via Ollama on a consumer 8 GB GPU during development. No cloud calls, no external services: the whole game is one small model and one prompt discipline. | |
| - **One GPU acquisition per turn:** the reply *and* a JSON extraction pass (bond delta, captured memories, tone delta, cruel quotes) run inside a single `@spaces.GPU` call. State is a plain dict in `gr.State`; all game logic (recall scheduling, ending gates, redaction) is deterministic, pure Python, covered by 147 tests. | |
| - **The pacing was tuned empirically:** a simulator plays scripted visitors through the real model and reports per-turn state, so the three ending gates are calibrated against measured behavior, not guesses. | |
| - **Off-brand by hand:** the entire interface is custom CSS over Gradio โ no JS. The materialization blur, the terror flashes that cut through every face the child could become, the full-screen screamer, the heartbeat bond meter, the redacted treasure: all CSS animations exploiting Gradio's DOM re-mount on update. Even the horror sting in the bad ending is **synthesized in numpy at boot** โ no audio file in the repo. | |
| - **Art:** five portraits generated with FLUX (grayscale, early-1900s storybook horror), embedded as base64 WebP. | |
| ## Built for the Build Small Hackathon | |
| Track: ๐ **An Adventure in Thousand Token Wood** ยท Badges: ๐ Off the Grid ยท ๐จ Off-Brand ยท ๐ Field Notes | |
| *The recall moment โ the child telling you your own memory as its own โ needs nothing bigger than 8B. Small models are perfect liars: just big enough to remember you, too small to know it shouldn't.* | |