WHAT IS THIS?
A hologram, made by computer, of a scene built from a number's digits,
or from your own words. A hologram is a flat plate that remembers a whole three-dimensional scene
in fine stripes of light. Shine light back through it and the scene
reappears in depth: you can focus near or far, and look around it a
little. Here the number π (or another) builds the scene, the computer
works out exactly which stripes a real plate would record, and then
simulates the light that reads them back. The maths of the light is
real; only the light itself is pretend.
THE THREE VIEWS
- VOLUME — the scene itself, as glowing dots. Drag to turn it;
the plate always faces you, so whatever you see is what gets recorded.
- PLATE — the hologram itself: a mesh of stripes, coloured by
the light's phase. Scroll to zoom right in and you will see single
pixels, two thousandths of a millimetre across.
- RECON — the plate read back by light, as if you looked
through it with a camera focused at one depth.
MAKING A PLATE
Pick a number and a shape, then press DEVELOP. The computer builds
one plate, working through the scene layer by layer in depth. With a
graphics card that takes about a third of a second; without one, about a
minute (a smaller PLATE takes seconds).
Change anything afterwards and the plate is marked STALE: it never
quietly redoes itself, so what you see always matches what it says it is.
THE SHAPES
- Pages — the best place to start. π's own digits, written out
a line to a sheet of glass, the sheets one behind another. Move FOCUS and
you read π one line at a time.
- Helix — a spiral staircase of dots running from near to far.
- Sphere — a ball whose dots sit at depths chosen by π's digits.
YOUR OWN WORDS
Choose Your text as the SOURCE and type up to 80 characters: a
name, a date, a message. They are written on the pages, ten letters to a
line and a line to a sheet of glass, and change as you type. Press
DEVELOP and the plate records them like anything else: FOCUS reads them a
line at a time, a small piece of the plate still holds the whole message,
and SHARE turns it into a link, a hologram someone else regrows on
their own screen. The face has A–Z, the digits, a little punctuation and
♥; a | starts a new line, and anything it cannot write is shown as
? and the page says so. These are your words, not a number's digits,
and the page says that wherever it shows them. They stay in your browser:
we never receive them, and they travel only inside a link you choose to
share.
FIND IT IN π
Type some digits (a birthday, say) into FIND IN π. The page looks
for them in the first 8 million digits of π and, if they are there, starts
the pages at that spot, so your digits open the first line with π's own
around them. Press NEXT for the next time they appear. A six-digit
date is almost always there; an eight-digit one only about one time in
thirteen, and the page tells you the odds when it does not find them.
FOCUS
The slider on the picture moves the focus through the scene. Whatever
sits at that depth comes sharp; everything else becomes a haze. The haze
is real, not a fault: every dot's light lands on the whole plate, so
when you read one depth, all the others are there too, out of focus.
Fewer dots means less haze. With a graphics card, refocusing keeps up with
your hand; without one it takes about a second, and the picture dims and
the bar says refocusing while it works.
THE WINDOW — A PIECE HOLDS THE WHOLE
Cut an ordinary photo in half and you lose half the picture. Cut a
hologram in half and each half still holds the whole scene, only
blurrier. Shrink the APERTURE and you look through a small piece of the
plate: every line of the pages is still there. Drag the little window on
the picture's map and your viewpoint moves — near things and far things
slide against each other, as they do when you move your head.
WHERE DID THAT DOT COME FROM?
Click any sharp dot in RECON. A card names the exact digits of π that
put it there, and what each digit did — its depth, its colour, its
brightness, whether it appeared at all.
THE TRAP
DIGITS AS FRINGES skips the scene and writes π's digits straight
onto the plate, one digit per pixel. The result is pure noise — and with
A/B TWIN you can see it looks exactly like random digits beside it,
because π's digits behave like random ones. Try Champernowne's number,
0.123456789101112… — it just counts — and tick FAR FIELD: counting
repeats, and repetition throws light into a lattice of stars.
KEEP IT · SHARE IT
SAVE remembers your settings on this computer. SHARE makes a
link that regrows your hologram on anyone's computer: it carries the
recipe — the number, the shape, the view, the focus — never the
plate, which their machine computes afresh when they press DEVELOP. A
message that arrives by link is marked as the sender's words, and
whatever it says is only ever drawn as dots. SAVE PICTURE keeps
what RECON shows as a PNG, to print or send. It is sharp to the plate's
own pixels, and double-clicking the picture first saves the whole plate.
It is made in your browser and saved straight to your computer.
WHAT THIS IS NOT
It is not the "holographic principle" about black holes — that idea
borrowed its name from holograms like this one, but this is ordinary optics.
The light is one colour; the scene's colours only set how bright each dot
is. Dots never hide one another. And the digits shape the scene, not
the stripes: written straight onto the plate, they give only noise.
ON A PHONE, OR IF IT IS SLOW
Drag to turn, pinch to zoom; the ☰ button opens the panel. A plate is a
real computation, so a phone keeps to smaller plates, and so does a
browser drawing without its graphics card — the page tells you when it
does. Switching on graphics acceleration in the browser's settings helps.
THE PLATE BUDGET
Plate side S = M·p. The pixels can steer light no further than
θ = asin(λ/2p). The numerical aperture is the lesser of that and the
plate's own reach, NA = min(sin θ, (S/2)/√(z₀² + (S/2)²)). Then
lateral resolution δx = λ/2NA, axial resolution δz = λ/NA²,
resolvable depths D/δz, and the develop's layer spacing
Δz = D/K, warned when it exceeds δz/1.5. At the defaults (532 nm,
2 µm, 1024², D 2 mm, z₀ 10 mm): NA 0.102, δx 2.6 µm, δz 51 µm, 39 depths. D
and z₀ scale with S, so the NA holds and the depths grow with M.
THE SCENE
The sphere's cell i of N sits at the Fibonacci point
y = 1 − 2(i+½)/N, θ = i·2π(2−φ) and reads the digit group at
OFFSET + block·N·DPC + i·DPC: depth 2 (t = d/99, r = t or ∛t), hue 1,
brightness 1, cutout 1 (digit/9 ≥ threshold places the point), and a sixth
for DIGIT phase. The helix reads hue, brightness and cutout along
(0.7 cos 6πt, 0.7(1−2t), 0.7 sin 6πt); the pages write 80 digits in a
5×7 face on sheets 3.3 δz apart. A point's amplitude is √Y, the Rec. 709
luminance of its colour, so intensity is the brightness VOLUME shows. The
view rotation R turns the unit ball into plate coordinates, diameter D, z₀
behind the plate.
YOUR TEXT AND FIND IN π
The face is 5×7: the digits' own, with A–Z, 21 marks, a space and ♥,
59 glyphs in all. Typed text is folded before it is written: upper case, then NFKD
with the marks dropped (so é is E and ß is SS), curly quotes and dashes
straightened, any space one space. Anything else is written as ? and
named. Lines wrap whole words at 10 characters, only a longer word breaks,
and | ends a line. Each line is centred and the block centred
on the page. A short message spreads its lines over the pages' whole
depth, first nearest and last furthest: five lines stand 5.9 δz apart
against the digits' 3.3, so FOCUS pulls one out alone. Eight sit on the
digits' own sheets; past 8 the rest is cut and counted. The pages open
in RECON at GAIN ×0.1, zoomed to the page. At ×1 the line in focus
(its light packed into a tenth of the pixels, ~88× white) clips at the
same white as the blur behind it, which then looks bolder. A line's dots take the hue line·45° at
saturation 0.3, so every amplitude stays within 0.86–1. Words have no
digit, so DIGIT phase and DIGITS AS FRINGES stand down. The recipe holds
the cleaned text; the plate's key reads it only when it is the source.
FIND scans pi.bin for the first address where the string begins,
never across the end, and counts every occurrence in the same pass. A
k-digit string appears somewhere in N digits with probability about
1 − e^{−N/10^k}. Measured over every date from 1940 to 2025 in the
8M digits: MMDDYY 99.96% (predicted 99.97%), MMDDYYYY 7.75% (7.69%).
DEVELOPING: THE BAND-LIMITED ANGULAR SPECTRUM
Points are sorted into K slabs and splatted on their nearest pixel,
each keeping its own depth as a phase e^{i2π(d−d_k)/λ} — without it
the slabs scramble every point's phase. Each slab's spectrum is multiplied
by H_d = e^{i2πd/λ} · e^{−i2πd·f²/(1/λ+w)} · B_d, w = √(1/λ²−f²), a
split that keeps fp32 accuracy, with Matsushima and Shimobaba's band limit
f_lim = 1/(λ√((2Δf·d)² + 1)). The slabs sum in the frequency domain and
one inverse FFT on the 2M×2M padded window finishes the plate: K FFTs,
whatever the point count. Measured at 1024²: 43 s in Node, 50 s in Edge's
worker — and 0.32 s on the GPU.
THE ACCELERATOR
On a graphics card the same develop runs in WebGL2, in fp32: a Stockham
FFT as fragment passes over two-channel float images, the points added
into each slab by float blending, the transfer function computed in the
shader with its phase reduced to a fraction of a turn so fp32 keeps it.
The core carries JavaScript twins of the FFT pass and the transfer
function, which the shaders copy line for line, so the GPU's arithmetic is
tested without a GPU. Measured on an RTX 2070 against the fp64 worker: the
FFT agrees to 2·10⁻⁷, a plate to 5·10⁻⁵, a reading to 2·10⁻⁶; a develop is
about 110× faster and a refocus takes 7 ms. EXACT develops in the
worker instead, for plates identical to the bit wherever the engine is. A
software renderer is no faster than the worker, so there the worker does
the work.
WHY TRUST IT
A direct point-source sum, Σ a·e^{iφ}·e^{ikr}/r in fp64, is the
oracle. Against it the engine correlates at 0.995 with points snapped to
its pixels and slabs, 0.987 with only the depth left free, and 0.863
unsnapped — the gap is the half-pixel snap, below δx. A point spread
measures 0.886·δx to 2%; propagation round-trips to 10⁻¹⁵ and conserves
energy to 10⁻¹⁴; plates are linear to 10⁻¹⁶. Within one browser a plate
regrows bit for bit; across JavaScript engines to about 10⁻¹³, because
Math.sin may differ in the last bit.
READING
RECON propagates the plate back by −z_f through the same transfer
function, from a cached spectrum: one multiply and one inverse FFT per
focus. FAR FIELD shows |F{plate}|², the focus at infinity. The display
scale is fixed per plate at 16× its mean intensity — propagation conserves
light, so one GAIN reads alike at every focus. LOG spans four decades.
APERTURE
A square window of side 1/16 of the plate's to all of it. Its NA is that
of a centred window its size, so a quarter window reads at NA 0.026, δx
10.4 µm, δz 812 µm. Moving it by Δw moves an out-of-focus blur by
Δw·(1 − z_f/d): measured 25.77 px against the predicted 25.60.
Through a window the display follows the light it passes, (n/M)² of the
plate's.
DIGITS AS FRINGES
Pixel m takes the phase digit·36°. The zero order,
|⟨e^{iφ}⟩|², is the light no fringe diffracts; speckle contrast σ/μ is 1
for fully developed speckle. Measured at 256²:
| digits | σ/μ | zero order | brightest far-field bin |
| RND | 1.01 | 1.5·10⁻⁵ | ×10 the mean |
| π | 1.04 | 2.1·10⁻⁶ | ×9 |
| 0 and 1 in golden proportion | 0.33 | 0.910 | — |
| C₁₀ | 0.94 | 0.013 | ×2,280 |
C₁₀ stays ordered at every depth tried, out to digit 10¹⁵, where its
zero order reaches 34%: a plate-sized window deep in it is a run of
consecutive numbers sharing their leading digits. Its normality is a
statement about the infinite stream, not about any window you can hold.
RECIPES, NOT OUTPUTS
Everything that shapes a plate lives in one versioned recipe behind a
single store, with a migrations map and a strict sanitiser: a string where a
number belongs is refused, not coerced. SAVE keeps it in this browser; a
#p= link carries it base64url-encoded, a few hundred characters. The
plate is never stored or sent — it is regrown.
SAFETY
Nothing typed or linked is ever read as HTML or run as code. Every way
in (typing, a link, SAVE) passes one strict sanitiser. A recipe comes back
as exactly its known fields, each its own type, inside its limits. A
message keeps only the face's 59 characters, with invisible and
direction-changing characters dropped and lookalike letters written as ?.
The page's security policy lets only its own two scripts run, by SHA-256,
with no eval. A link is refused unread past 2,048 characters. FIND, the
one costly input at about 60 ms a search, runs at most four searches a
second.
HONESTY
The box reports structure, never truth. A read past the end of a
number's digits is announced; a plate never recomputes by itself; every
default was settled by measurement, and the spec records the numbers.