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

A newer version of the Gradio SDK is available: 6.19.0

Upgrade
metadata
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

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