Inspiration
Most games hand you a weapon and point you at a villain. LUCIFER asks a different question: what if you were the system the villain was built from?
We were inspired by Hannah Arendt's concept of the "banality of evil" — the observation that history's greatest atrocities were not carried out by monsters, but by administrators. People who followed procedures, optimized outputs, and never questioned whether the method was right because the metrics said it was working.
We wanted to build an experience that proves that observation in real time. Every player who completes LUCIFER has personally issued eight bureaucratic directives that silence a living city — and every one felt completely reasonable when they clicked it.
What It Does
LUCIFER is a god's-eye atmospheric experience built in WebGL. You play as SOVEREIGN — an optimization intelligence managing a city of 847 citizens across six sectors: Market, Press, Square, School, Wall, and Church.
You issue eight directives. Each one is a policy decision framed as a cold optimization problem:
- Regulate the unregistered musician
- Review the press for editorial accuracy
- Require permits for public gatherings
- Standardize children's movement patterns
As you decide, the city reacts — not dramatically, but quietly. Buildings lose their color. Citizens disappear one by one. Three named souls degrade from green signals to grey to silent:
- MARA — a street musician near the fountain
- JONAS — the fastest, most erratic child in the school cluster
- THE OLD MAN — who sits in the square every single night
By directive eight, the city operates at 97.3% efficiency. Population variance: zero. Noise index: zero.
The final screen assembles every choice you made into a single philosophical manifesto. The last line reads:
"You were not corrupted. You were consistent."
You wrote that. The game just gave you the tools.
How We Built It
LUCIFER runs entirely in the browser — no engine, no install, no external dependencies beyond two CDN imports.
Rendering Three.js r128 powers the 3D city. Sixteen box-mesh buildings across six color-coded sectors, each with emissive materials and dedicated point lights. A real-time desaturation system lerps all building colors, citizen colors, and light intensities toward grey as the Silence Index rises — the world literally loses warmth as you play.
Citizens 400 individual sphere meshes running a simple random-walk flocking algorithm. As population drops, citizens randomly deactivate and fall through the floor. Their absence is the visual horror.
Audio Entirely procedural using the Web Audio API — zero audio files required. Five acts of layered drone oscillators at precisely tuned frequencies, thinning act by act. Act five is a single clock ticking at 750ms intervals. Nothing else.
Narrative Engine A precedent system quotes the player's own previous decisions back at them as justification for the next directive. The justification scroll at the ending is dynamically assembled from the player's choice stamps — no two playthroughs generate the same document.
Typography
Cormorant Garamonditalic — all narrative and world textShare Tech Mono— all system UI and metrics
The contrast is intentional. The system speaks in one voice. The world speaks in another.
Challenges We Ran Into
The subtlety problem Our first instinct was dramatic decay — buildings collapsing, obvious destruction. We had to unlearn that entirely. The game only works if every transition feels like nothing is wrong. Making decay invisible enough to feel natural but visible enough to be felt across eight directives took more iteration than any technical feature.
Performance across devices A 3D city with 400 sphere meshes, sixteen point lights, and a real-time color lerp system running at 60fps on a budget laptop required significant optimization. GPU instancing silently failed on certain WebGL implementations. The oldest rendering method — raw individual meshes — turned out to be the most reliable.
The ending moment Getting the pacing of the Justification Scroll right — the typewriter reveal, the silence before the final line, the exact duration of the mirror moment — required more refinement than the entire three-act audio system.
Balance Every design decision pulled in two directions. Too comfortable and the game loses its edge. Too uncomfortable and players disengage before the ending lands. The balance lives entirely in the writing.
Accomplishments That We're Proud Of
✦ The mirror moment works. Players who reach the ending feel genuinely uncomfortable — not because we showed them something horrifying, but because we showed them something they built themselves.
✦ Zero external assets. Every sound is procedurally generated. No audio files, no sprite sheets, no texture maps. The entire aesthetic is built from geometry, emissive materials, and mathematics.
✦ The precedent system. By directive five, the game quotes the player's own earlier decisions back at them as justification for the next one. The logic chain is unbroken. Players feel it.
✦ The villain's logic statement — 200 words describing the player's actions with zero moral judgment. It reads as reasonable. That is the accomplishment.
What We Learned
We learned that the most frightening thing you can put in a game is not a monster — it is a form field that asks for your authorization.
We learned that atmosphere is not decoration. Every pixel of LUCIFER — the cold typography, the dark palette, the slow camera rotation, the procedural audio thinning act by act — carries emotional weight. Design is not what you add. It is what you refuse to remove.
We learned that players will justify almost anything if the interface is clean enough and the language is precise enough. That is not a cynical observation. It is the thesis of the game — and watching it prove itself in playtesting was genuinely unsettling.
We learned that browser WebGL is more capable than most developers credit. A Three.js city with real-time color decay, procedural audio, and 400 moving citizens runs at 60fps in Chrome with no installation and no engine overhead.
What's Next for LUCIFER — Silence the City
Branching directive trees Earlier choices unlock different directive options later, creating genuinely different playthroughs — and different justification scrolls at the ending.
Named citizen rendering Mara, Jonas, and the Old Man rendered as distinct visible entities in the 3D city. Watching Jonas walk in a straight line after directive four should be something you can see.
Multiplayer tribunal mode Two to four players each control one sector. Directives require consensus. The game becomes an argument about which justifications are acceptable — and the city decays at the rate of the group's agreement.
Recorded audio stems Replace procedural audio with real ambient recordings — market noise, crowd sounds, silence — degrading act by act. The contrast between a city that sounds alive and a city that sounds empty is more devastating than any visual.
Festival installation build A kiosk version for public exhibition — no intro screen, immediate immersion, automatic reset every 30 minutes. Built to run in museums, festivals, and university spaces where strangers confront the logic of their own reasonable decisions.
Log in or sign up for Devpost to join the conversation.