A slow, procedural film. No two moments ever look the same — and it runs forever until you close the tab.
The camera flies through an infinite 3D landscape. Two slow oscillators choose, minute by minute, whether to move forward through the hills, drift sideways, reverse direction, or hover almost still. Mountains, trees and buildings are projected with real perspective — they grow as you approach, and fade out as they pass.
The day cycles every five minutes through pre-dawn, dawn, noon, dusk, and night. Stars emerge, the moon and sun arc across the sky, the aurora pulses over the fjord. Vegetation quietly rotates — pines give way to bare trees, to cabins, to acacias. Rare things happen: hot-air balloons drift through, whales spout, lightning flashes, meteors fall, deer cross snowfields, distant campfires flicker to life.
Plain HTML and JavaScript. Every pixel is drawn to an imageData buffer — no images, no libraries, no AI, no build step. Sprites are baked once at load, then rendered block-by-block so every pixel stays a pixel when they grow or shrink.
It's all — see exactly how.
Every reload picks a new random seed. It determines the theme, the terrain, the moment in the day, and everything in between. The seed and theme are printed in the bottom-left.
art.noje.me
Nothing here is AI. Everything — the mountains, the aurora, the moon, the drift of the camera — is a handful of small mathematical functions layered on top of each other. Each piece is simple; the combination is the world.
A seeded bit-mixing generator (Mulberry32) provides all the "randomness". Same seed → exactly the same world, forever.
a ← a + 0x6D2B79F5 t ← (a XOR a>>15) · (1 | a) result ← ((t XOR t>>14) >>> 0) / 2³²
Mountains, clouds, wind, aurora ribbons, the camera's sideways drift — all come from noise. The fractal form stacks several octaves at halving amplitude and doubling frequency:
fbm(x) = Σ 0.5ⁱ · noise(x · 2ⁱ)
i=0..n
That single idea — tune the amplitudes and you get coastlines, hills, turbulence, or clouds. Perlin got an Academy Award for it in 1997.
The camera is a pinhole. To put a world point onto the pixel grid:
screenX = W/2 + (worldX − camX) · F / (worldZ − camZ) screenY = horizonY + worldY · F / (worldZ − camZ) scale = F / (worldZ − camZ)
Same equation Leonardo sketched around 1490. Close things get big; far things shrink toward a vanishing point. Parallax falls out for free — near layers move fast across the screen, distant ones barely stir.
The bridge between everything: colors, positions, alpha.
lerp(a, b, t) = a + (b − a) · t
The day/night cycle is lerp between keyframe palettes, smoothed with:
smoothstep(t) = t²(3 − 2t)
A cubic ease whose derivative is zero at both ends — so transitions don't have sharp corners.
Sun and moon trace arcs with sin / cos. Lighthouse beams, swaying trees, bobbing balloons — all sine waves:
sunY = horizonY − sin(sunAngle) · horizonY · 0.85 sway = sin(phase + t·0.0006) · wind
Halos around moon and campfires, firefly pulses, mist strength — all use a power function on the normalised distance:
d = √(dx² + dy²) alpha = (1 − d/r)^power · maxAlpha
The whole day wraps forever via a single modulo:
phase = ((t + offset) mod 300000) / 300000
Five minutes, looped infinitely — but never looking the same, because the vegetation rotation, the camera mode, the wind, and the events each drift on their own slow fbm of independent periods.
Seven or eight equations, a few loops, a single canvas. No training, no models, no magic. Old computer-graphics mathematics, still beautiful.
maths is pretty