Inspiration
Neolithic henges were instruments as much as monuments — aligned to the sun, built to be stood inside. I wanted a website that felt like standing inside one: a slow, ceremonial descent instead of a UI. The palette (obsidian, ember, bone) and the inscriptional typography come from carved Roman capitals and the blue hour just before sunrise — the moment when dawn leans on the horizon and won't quite fall.
What it does
MONOLITH is a single continuous, scrubbable 3D experience. You descend by scrolling into a circle of nine standing stones set on a black mirror. Dawn burns along the horizon but never breaks; an aurora breathes overhead. As you move through the timeline, the buried stones rise one by one. Click a standing stone and it rings a note on a pentatonic scale. Keep going and two outer rings of stones wake on their own as the circle begins to hum — then the whole formation fires a shaft of light to the sky and holds a single chord.
Everything in the scene is generated in the browser at runtime: the sky, the aurora, the runes carved into each stone, the reflections, and every sound. There are no image textures and no 3D model files in the project.
How I built it
- Three.js (r160) on WebGL2 for the scene, with a 16-point camera path along a Catmull-Rom curve driving the whole journey from one scrubber value.
- Custom GLSL shaders for the sky dome (gradient + dawn band + sun bloom + a procedural star field), the aurora (5-octave fbm curtains), the finale light beam, and the ground haze.
- Reflector (three/addons) for the real-time planar reflection of the black mirror floor; RoundedBoxGeometry for the 46 stones across three rings.
- A post-processing stack: UnrealBloom plus a hand-written grade pass doing chromatic aberration, split-toning, vignette and film grain, then OutputPass.
- The Web Audio API for all sound: a generated ambient drone (detuned oscillators through a slowly swept low-pass), an algorithmic convolution reverb, a plucked pentatonic tone per stone, and an arpeggiated finale chord.
- A custom virtual scrubber replaces the scrollbar entirely — wheel, touch, keyboard and a draggable rail all feed one number, and the scene chases it at a capped constant speed so a hard fling can never skip a beat.
- Plain HTML/CSS for the overlays, with Cinzel, Cormorant Garamond and JetBrains Mono from Google Fonts.
Challenges I ran into
- Making the scroll feel good with no scrollbar: early versions were either too fast (you missed the stones rising) or laggy. The fix was a velocity-capped chase with the target tethered close to what's on screen, so it always feels connected but a full pass still takes at least 20 seconds.
- Getting the black mirror to read as "a still, patient mirror" rather than a cheap chrome floor — tuning the Reflector tint, fog density and a haze sheet so distant reflections fade into the dawn instead of doubling the image.
- Keeping the finale from re-triggering while the camera rewound back to the title, and making "walk it again" actually return you to a blank title screen instead of leaving the ending text stuck on top of the scene.
- Bloom and tone mapping order in the post stack, so only emissive runes and the sun glow bloom — not the whole frame.
Accomplishments that I'm proud of
- The entire thing is procedural — no assets to download, loads fast, and the source is small enough to read in one sitting.
- The moment the outer rings wake and the beam climbs the sky genuinely makes people stop and say "wow."
- The scroll replacement: it feels like a deliberate instrument, not a hijack.
What I learned
- How much art direction lives in the post-processing pass, not the geometry.
- fbm noise in GLSL is enough to fake an aurora convincingly.
- Web Audio can carry a whole soundtrack with zero files if you treat oscillators and a noise-impulse convolver as your instruments.
What's next for MONOLITH
- A day/season cycle so the henge can be re-lit at different hours.
- Letting visitors "compose" — the sequence of stones you strike becomes a short shareable melody + seed.
- A WebGPU path for a denser particle field and softer shadows on mobile.
Built With
- 3js
- css3
- glsl
- google-fonts
- html5
- javascript
- web-audio-api
- webgl
Log in or sign up for Devpost to join the conversation.