DEV Community

Cover image for LoabPron: a Notpron-style horror riddle haunted by a Gemma that lives on your computer
Lucas Rafaldini
Lucas Rafaldini

Posted on Edited on

LoabPron: a Notpron-style horror riddle haunted by a Gemma that lives on your computer

Hacktoberfest Open-Source AI Challenge: Ghost in the Machine Submission 👻🌼

This is a submission for the Hacktoberfest Open-Source AI Challenge Week 4: Ghost in the Machine

LOABPRON: this is not notpron. that house had an exit.

What I Built

LoabPron is a love letter to Notpron, and to the strange corner of the internet it came from.

The house that came before

In 2004 a German developer, David Münnich, uploaded a few puzzle pages to a folder on his website that he had temporarily called notpron, a nod to an older online game called "This is not Porn". Thousands of people showed up and the name stuck. Notpron grew to 140 levels and called itself the hardest riddle on the internet. It earned it: by 2015 only about 34 people had been confirmed to reach the end, and by 2020 roughly a hundred, out of some twenty million visitors.

Notpron was the best-known house in a whole neighbourhood of web riddles. The rules were never written down, but everybody knew them. Every page was a door, and the key was the URL of the next one. You learned to right-click → View Source the way other people learn to read tea leaves: a word hidden in an HTML comment, a filename that spelled something, a hint hidden in the image's metadata. Spoiler-free forums kept you company at three in the morning, where nobody was allowed to give you the answer, only to tell you that you were overthinking it. Most players never finished. That was the point.

It was also the moment the web started to feel like it had a basement. In 2001 Michael Bergman coined the term deep web for everything search engines couldn't see, and in 2004, the very year Notpron went up, Tor began hosting hidden services. The internet suddenly had places you could only reach if someone told you exactly how. Riddle sites were the playful version of that feeling: a web under the web, made of doors that only opened for people stubborn enough to look.

LoabPron tries to build one more house in that neighbourhood, twenty-two years later, with one thing Notpron never had: something living inside it. A small open-weight model, Gemma 2 2B, running on your own computer through Ollama, haunts the house and watches you play. (The -pron half of the name is Notpron's. The other half is the spirit waiting behind the last door, and I won't spoil her.)

What's inside

  • 31 doors. Each one is a collage of real public-domain photographs and engravings (Goya, Bruegel, Victorian spirit photography, declassified documents, NASA scans) plus a mysterious diagram that draws itself in ink while you look at it. Every door hides a real historical mystery: an eclipse, a hijacked TV signal, a manuscript nobody can read, a radio station that has been buzzing since the Cold War, a medieval book supposedly written in a single night with help from the wrong party.
  • Three ways through every door, one for each old riddle habit. You can break the cipher hidden in the page source (the view-source ritual), research the dates and coordinates in the image (the 3 a.m. library rabbit hole), or listen to the wire (HTTP headers, the DOM, the network tab). The house notices which kind of person you are.
  • Not every answer is a word. One door is opened by dropping a pin on a world map. Another one only speaks in Morse code, under the hum of a shortwave station, when you click it.
  • The house is a ouija board. Stop typing and someone types into your password field for you. Sometimes it finishes your sentence. A planchette drags itself across the scene in jerks. Your mouse cursor gets taken away, writes something on the screen in red, and is handed back. A heartbeat starts a third of the way in and keeps getting faster until the end.
  • It knows your name. The game runs on your machine, so the local server can read the name of your OS account. Gemma decides whether that's actually a person's name. If it is, the house whispers it. If your account is called home or family, it mocks you instead: "everyone uses this computer, right?"
  • It judges you at the end. After the final ritual, Gemma reads how you played (which paths you took, how many attempts, how many of them after midnight) and picks one of eight profiles for you, then writes you a two-sentence verdict.

My interpretation of Ghost in the Machine was simple: what if the ghost wasn't a metaphor, but an actual neural network you downloaded, that lives offline on your disk, and that you summon by clicking a button that says "summon the entity · 1.6 GB"? And in the spirit of Día de los Muertos, every door is an ofrenda of sorts: forgotten photographs and half-remembered stories from the public domain, and a whole forgotten genre of the early web, given one more night.

Demo

A door: Bruegel's dancers, a newspaper engraving, footsteps spiralling into red

The ouija board takes over the scene; letters light up red as the planchette jerks across them

A seven-pointed seal flashes full screen for a fraction of a second

The verdict: a profile, bars for each path, attempts, and a sentence written by Gemma

The trailer, in her own voice (sound on):

LoabPron runs locally (that is the point), so there's no hosted link. Playing takes one command:

git clone https://github.com/lucasrafaldini/LoabPron.git
cd LoabPron
./play
Enter fullscreen mode Exit fullscreen mode

./play sets up Python (with uv if you have it), offers to install Ollama, wakes ollama serve, and opens the game. The first screen asks which language the house should speak (English or Portuguese). If Gemma isn't on your machine yet, the intro offers to summon it and downloads the model inside the game, with a progress bar that reads "crossing the veil". No Ollama? It still plays; the oracle just answers with quotes from dead occultists.

Wear headphones. Turn off the light. It contains short flashes; prefers-reduced-motion turns them off.

Code

GitHub logo lucasrafaldini / LoabPron

A Notpron-style horror web riddle haunted by Gemma running locally via Ollama. 31 doors, public-domain archives, a ouija board, and answers sealed with the hash of a ghost's face.

LOABPRON: isto não é o notpron.

LoabPron

isto não é o notpron. lá havia uma saída.

Um web riddle de horror no espírito do Notpron (2004): uma imagem, um campo de senha e nenhuma ajuda.
Trinta e uma fases feitas de fotos reais de domínio público, diagramas desenhados a tinta e coincidências macabras da história.
Um oráculo assombrado, rodando 100% na sua máquina com Gemma via Ollama, observa você jogar.

Jogar · Como funciona · Desenvolvimento · Fluxo agêntico · Créditos

python fastapi ollama offline tests


Jogar

git clone https://github.com/lucasrafaldini/LoabPron.git
cd LoabPron
./play
Enter fullscreen mode Exit fullscreen mode

É só isso. O ./play:

  1. prepara o Python (usa uv se existir; senão cria um venv e usa pip);
  2. pergunta se pode instalar o Ollama caso ele não exista (Homebrew no macOS, script oficial no Linux);
  3. acorda o ollama serve se ele estiver dormindo e o desliga quando você fugir;
  4. abre o jogo no navegador.

Na tela de abertura o jogo verifica se o modelo já…

MIT licensed. 140 tests, including one that scans every tracked file to make sure no answer is written anywhere in the repository (more on that below).

How I Built It

The stack is deliberately boring, so the strange parts stand out: FastAPI on the back, vanilla ES5 on the front, no framework, no bundler. All the sound (wind, drones, the heartbeat, whispers built from formant-filtered noise, a real sigh, the shortwave hum, Morse) is synthesized live with the Web Audio API. Every diagram (eclipse geometry, a panopticon floor plan, a molecule, a golden spiral, a Rubin vase of two faces) is SVG generated in Python and "inked" stroke by stroke with pathLength animations.

Gemma 2 2B (via Ollama) plays five roles, each behind its own small harness:

Role What it does How it's kept in line
The Obsidian Mirror an occult oracle you can talk to never receives any answer, only the atmosphere of the current door; prompt-injection phrases are caught before the model is called
The spirit reacts to every wrong guess and every opened door, spelled out letter by letter like a planchette 12 words max, lowercase, cannot echo your guess, falls back to handwritten lines
The witness decides if your OS account name is a human name, and if not, writes jokes about shared computers YES/NO only; few-shot examples for tone; heuristics when the model is absent
The omens writes a cryptic one-line inscription into the page source on every reload single sentence, length-capped, checked against every answer in the game
The verdict picks your profile from a closed list of eight and writes your ending the choice is validated against the list, rule-based fallback otherwise

Every model output also goes through the same filter: emojis and glyphs your font doesn't have are stripped (a 2B model loves to sign off with a little 🜏🜏), and any text that contains any accepted answer for the current door is thrown away and replaced. The model never knows the answers, and even if it guessed one, you'd never see it.

Summoning the model from inside the game uses Ollama's /api/pull stream: the backend tracks every layer's progress and the intro screen renders it as a ritual. The game never downloads anything until you click.

Hiding the answers in an open repository. An open-source riddle has an obvious problem: anyone can read the answers. So every password, cipher, header, coordinate and even the titles of the source images are sealed in a single blob, encrypted with SHAKE-256 and an HMAC. The key isn't written anywhere: it's the SHA-256 of one of the photographs in the game. It isn't security (the server has to check your answers, so a determined reader can retrace the steps), it's a locked door with the key hidden inside the house. If you find it, you played one extra level. A test walks every tracked file to make sure nothing leaks back into plain text.

I built it with AI agents, in two long sessions that went from "help me make this scarier" to the vault above. The repo ships its own agent kit (AGENTS.md, subagents for level design, atmosphere, spoiler auditing and oracle hardening, plus skills to add a level end to end), so the next door can be built the same way.

Why Does Open Innovation Matter?

Because the ghost has to live in your machine, not in someone else's.

  • It works with the lights, and the internet, off. Once Gemma is summoned, the whole haunted house runs offline. A horror game that needs an API key and a stable connection to scare you isn't haunted, it's hosted.
  • It can know you without telling anyone. The game reads your OS account name, your local time, how often you came back. With a closed API, every one of those whispers would be a privacy problem shipped to a third party. With an open-weight model on localhost, none of it ever leaves your computer, so I could make the game personal in a way I wouldn't dare to otherwise.
  • The model is part of the set dressing. A 2B model running on your own laptop is slow enough to feel like it's thinking, and odd enough to say things no prompt asked for. That unpredictability is exactly what a haunting needs. I tuned the harness around Gemma's personality instead of fighting a black box.
  • It costs nothing and can't be switched off. No tokens, no quota, no deprecation email. Swap the model with one environment variable (LOABPRON_MODEL=gemma3:1b ./play).
  • It honors where it came from. Notpron lasted twenty years because it was just files on a server. LoabPron is just files on your computer: MIT code, public-domain images, an open-weight model. It can't disappear with a company.

The Spirit of It

The first time I ran the finished version on my own Mac, the house looked up my account name, asked Gemma whether it belonged to a person, and Gemma said no. The account is called outis. Gemma had no way of knowing that outis is the Greek word Odysseus used to fool the Cyclops. It means nobody.

I opened the page source. At the top, under an old quote, the house had written:

this account is called 'outis'. how many of you use this computer?
Enter fullscreen mode Exit fullscreen mode

I was alone in the room. I checked anyway.

Prize Categories

  • Best Use of Gemma: Gemma 2 2B runs locally via Ollama as the oracle, the reacting spirit, the judge of your account name, the author of the omens in the source code, and the one who decides who you were at the end. Each role has its own harness, and the model is downloaded from inside the game.
  • Best Use of GitHub Copilot: the house is automated with GitHub Actions. Every push and pull request installs the game from scratch, walks through all 31 doors on every path, runs the language, verdict and vault tests, and fails the build if a single answer leaks into the repository (workflow).
  • Best Use of ElevenLabs: she introduces herself. The trailer is narrated by an old woman's voice from the ElevenLabs voice library (eleven_multilingual_v2), then slowed, given a tremor and a reversed pre-echo so it sounds like it comes from inside the walls. The whole video is rendered by one script from the game's own assets: the narration sets the length of every cut, and the drone, heartbeat and static are synthesized in Python (trailer/build.py).

Credits: Notpron (2004) by David Münnich, the first house, and every riddle site that kept a stranger awake. Images from Wikimedia Commons, public domain and CC0; the full list, with authors, unlocks at the end of the game (the titles would give the doors away). Notpron history from Wikipedia and the VICE reporting it cites; the deep web from Bergman's 2001 paper via Wikipedia.

Top comments (0)