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

  1. Type any word in the input field at the bottom of the screen.
  2. 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].
  3. The Peter de Jong map runs 2.4 million iterations, accumulating a hit count for each canvas pixel.
  4. Watch the attractor emerge progressively — the image develops like a photograph in a darkroom.
  5. 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.

Open Lure →