| --- |
| 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.* |
|
|