Questing · 2026-06-16 · Chaos Theory · Zero dependencies
LURE
Type any word. Lure derives four chaos parameters from it and plots 2.4 million iterations of the Peter de Jong strange attractor — the unique orbit in phase space the word collapses into. Same word, same attractor, always.
Open Lure →What is Lure?
Lure is a browser-based strange attractor generator that uses text as its seed. Type any word — up to 24 characters — and Lure runs FNV-32a on the lowercase text, producing two 32-bit digests. Each digest supplies two 16-bit fields that map to one chaos parameter each, always in the range [−2.5, −1.0] ∪ [1.0, 2.5] (magnitudes are biased away from zero to avoid degenerate fixed-point attractors). The four parameters drive the Peter de Jong map: 2.4 million orbit points are accumulated in a 600 × 600 density buffer and color-mapped from near-black through deep crimson and amber to warm white.
The Mathematics — Peter de Jong, 1989
A strange attractor is the long-term behavior of a chaotic dynamical system: a set of points in phase space that the system visits repeatedly, but never in a periodic pattern. Unlike a fixed point or a limit cycle, a strange attractor has a fractal structure — its Hausdorff dimension is between 1 and 2, meaning it is more complex than a curve but never fills a region completely. The same orbit visits infinitely many distinct points, all drawn toward the same invisible shape.
Artist and computer scientist Peter de Jong described a family of two-dimensional maps in the late 1980s that produce some of the most visually striking strange attractors known. The recurrence relation is:
x(n+1) = sin(a · y(n)) − cos(b · x(n)) y(n+1) = sin(c · x(n)) − cos(d · y(n))
Since both terms are bounded trigonometric functions, the orbit always stays within [−2, 2] × [−2, 2] — a compact phase space. Yet within that bounded box, the trajectory never repeats and never settles. Different values of a, b, c, d produce radically different shapes: tight stellar knots, sprawling nebulae, tangled ribbons, bilateral wings. The relationship between parameters and shape is exquisitely sensitive — changing a by 0.001 can transform a star into a ribbon. The attractor in the visual is the same shape the word has always implied; you are simply watching it be revealed.
Density Rendering — Log-Scale Flame
Lure does not draw points with opacity. Instead, it maintains a Float32Array hit counter at every canvas pixel. After 2.4 million iterations, each pixel’s count is mapped to a color via a logarithmic scale — log(hits + 1) / log(maxHits + 1) — then passed through a seven-stop gradient from near-black through deep burgundy, crimson, orange-red, amber, and warm yellow to cream-white. The log scale is essential: without it, the highest-density pixels would wash out to white while most of the intricate low-density structure disappears. With it, the full range of the fractal texture — from the bright core to the faintest filaments — is visible simultaneously.
The first 300 iterations are discarded as “warmup” — this removes transient behavior before the orbit has found the attractor. The remaining 2.4 million points are plotted in batches of 60,000 per animation frame, so the image develops progressively: first the rough shape, then finer detail, then the faintest threads. The whole render completes in under two seconds on any modern device.
How to Use Lure
- Type any word in the input field at the bottom of the screen.
- Lure hashes the word with FNV-32a, extracting two 32-bit digests that map to four parameters a, b, c, d each in [−2.5, −1.0] ∪ [1.0, 2.5].
- The Peter de Jong map runs 2.4 million iterations, accumulating a hit count for each canvas pixel.
- Watch the attractor emerge progressively — the image develops like a photograph in a darkroom.
- Share your word via URL: the fragment encodes it, so the same link always generates the same attractor.
Technical Notes
Lure is a single static HTML file with no external JavaScript dependencies. The density buffer is a Float32Array of 600 × 600 = 360,000 elements; the final image is a ImageData buffer painted via putImageData. The inner loop runs at roughly 30–40 million iterations per second on a mid-range laptop — the bottleneck is the color-mapping render pass (iterating over 360,000 pixels per frame), not the attractor iteration itself. Total data: ~1.4 MB of Float32 density + ~1.4 MB of Uint8Clamp image buffer. No canvas 2D drawing API is used; every pixel is set directly through ImageData. The FNV-32a hash was chosen for speed and good avalanche behavior — single-character differences in the input word produce completely different attractors. Shareable via URL fragment: the word is encodeURIComponent-encoded in the hash so any Unicode word can be shared.