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