hollow / README.md
Pabloler21's picture
docs: link the demo video and write-up from the README (submission deliverables)
8fabf33
|
Raw
History Blame Contribute Delete
3.74 kB
---
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.*