Spaces:
Sleeping
A newer version of the Gradio SDK is available: 6.19.0
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 โ
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.GPUcall. State is a plain dict ingr.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.