Insights
What it takes to make one photograph you can fall into — and what it would take to go a thousand times further.
It looks like a single wide photo of a turquoise reservoir. It is one picture, but not one exposure: it is 1,695 of them, each a long-lens crop, stitched into an image you can zoom into until you find a climber on the far ridge. Here is everything that goes into one of these — and, at the end, the back-of-an-envelope plan for breaking the terapixel barrier.
The numbers
The Moiry panorama is stitched from 1,695 frames of 45 megapixels each — a theoretical 76 gigapixels. That is 76 billion pixels, 76,000,000,000; let that sink in for a second. About 7,600 times an average phone photo (or, in the only unit that truly scales, roughly 311 burgers wide). The frames overlap by ~30%, so the real figure is lower, but the stitched master still measures 293,640 × 149,023 pixels: just under 44 gigapixels in a single 123 GB file.
The view faces the Dent Blanche — at 4,357 m the 16th-highest summit in the Alps — across the turquoise reservoir, shot from the crest of the 148 m dam at 2,249 m. So the scene is steep, distant and detailed in every direction at once, which is the whole reason it is worth photographing at this scale.












Capturing it
An elevated spot with no obstructions, a clear sky, good light. The camera rides a custom, fully automated panoramic head I built — two stepper motors for yaw and pitch, a handful of drivers, and a microcontroller that also trips the shutter. I set it up, press go, and then get to stand there and enjoy the view while it works. (There is a short video of it clicking through a grid; I may open-source the head one day.)

Each frame takes about two seconds, so the raw capture runs roughly an hour — two with setup and teardown. Even at f/13 the depth of field at 450 mm is razor-thin and the rig shakes in the lightest gust, so I shoot the scene twice: once at 450 mm for detail, once at ~150 mm for the sky and as forgiving cover for mistakes. The handheld Japan panoramas skip the rig entirely — lighter to carry, far more painful to align afterwards.
Stitching it
First the RAWs are edited, normalised and exported to JPEG on my main PC — whose 16-core desktop chip is, annoyingly, about twice as fast per core as the 24-core / 1 TB server that does the final assembly. The stitcher then finds common points in the overlaps, aligns all 1,695 frames and blends them into one image. Everything must be edited before or inside that step; the finished panorama is far too large to open as a whole.

Moiry took about 16 hours end to end: ~4 hours hands-on, ~12 hours of pure processing, peaking at 850 GB of RAM during the final stitch. One recurring catch: a clear blue sky has no features to lock onto, so the stitcher cannot place those frames at all. In the Olympiapark panorama the entire sky is therefore not photographed — it is painted in by hand afterwards.
Onto a cube
A flat panorama cannot be explored like a 360° scene, so the master is reprojected onto the faces of a cube — the same projection a game engine uses for a skybox. Moiry covers 177° horizontally and 77.5° vertically, so it needs only five of the six faces: front, left, right, up and down. A little trigonometry sets the edge length of each face at 190,144 × 190,144 pixels.





Each of those faces is, on its own, far larger than any normal image format will hold — which is its own saga, a couple of chapters down.
Slicing into tiles
Each cube face is sliced into a pyramid of square tiles at ten zoom levels — coarse at the top, full resolution at the bottom. Each level up the pyramid is half the resolution, so it holds a quarter as many tiles; the finest level alone is over 300,000 individual 512 × 512 px tiles. For scale: that is more than twice as many tiles, for this one panorama, as every photograph I have taken in my entire life (around 150,000). The viewer (my own, the one running on this site) only ever fetches the handful inside your current view, so a 44-gigapixel image opens instantly — the same trick that lets an online map hand you the whole planet over a phone connection.
The bookkeeping is the expensive part. A single project peaks around 430 GB of disk — RAWs, edited JPEGs, the TIFF master, the cube faces and all those tiles — totalling roughly 410,000 files. The whole Swiss trip was worse: about 9,000 RAW frames (~500 GB), another ~300 GB of backup JPEGs, just under 3 TB and over 2.5 million files all told — and a genuine storage crisis at home.
A saga about file formats
You cannot simply save any of this as a JPEG: that format dies at 65,535 pixels a side — which is exactly why big scientific releases, from JWST frames to the LSST survey, ship as TIFF rather than JPEG. But ordinary TIFF uses 32-bit offsets, capping the file near 4 GB. PSD caps a file at 30,000 px; its big sibling PSB reaches 300,000 px and about 4 exabytes. The real escape hatch is BigTIFF — TIFF with 64-bit offsets, good for roughly 18 exabytes (2⁶⁴ bytes).
That 300,000 px PSB ceiling is not theoretical. I once shot a 600 mm version of the Olympia panorama that came out 320,000 px wide — 20,000 pixels past what PSB, and my editor, could open. After saving a 102 GB raw dump I then could not reopen, I gave up and kept the smaller 420 mm, "only" 12-gigapixel version.

Doing it all in memory
Off-the-shelf tools want to write every stage out to disk — the stitched master, the cube faces, the tiles — and reading and re-writing multi-hundred-gigabyte intermediates is slow, lossy, and forever colliding with the format ceilings from the last chapter. So the whole thing became a single program that never writes a giant file at all: frames in, aligned, blended, projected onto the cube and sliced into tiles, every stage living only in memory as plain arrays of pixels.
The price is memory. A single frame from my mirrorless body is around 130 MB of raw pixels the instant it is decoded; holding a few hundred of them at once runs to tens of gigabytes before any blending even begins. That is the whole reason the big jobs want a machine with an indecent amount of RAM — and a fairly loud hint that the very largest ones belong in the cloud.
Getting there was a long string of dead ends. Aligning the frames by hand — finding the same rock in two overlapping shots and solving for how they fit together — was correct but agonisingly slow across this many inputs. The ready-made automatic stitchers were quicker, and quietly gave up often enough that I could not trust them on seventeen hundred frames. And simply to read the oversized PSB files the older tools choked on, I wrote my own PSB-to-BigTIFF converter — my first real Go project, hand-built from a format spec that reads as though it were written to punish the curious, back before you could ask a machine to do the same in five minutes. It works. I am not proud of how, but it works.
Rolling my own tools
All of this used to lean on off-the-shelf software — a well-known open-source panorama viewer and the tiler that ships with it. Both have since been replaced with my own. The viewer rendering this page is written from scratch and runs straight on the graphics card; the tool that cuts a finished panorama into its tiles is custom too, kept deliberately compatible with the old tile layout so that nothing already published had to be redone.
The viewer has one job, and it is restraint. Out of a 44-gigapixel image it loads only the few hundred-kilobyte tiles your screen is actually pointed at, at exactly the zoom you are sitting at, pulling in sharper ones as you push closer and quietly dropping them again as you pull back. That is the reason something the size of a small country opens in a heartbeat over an ordinary connection.
The tiler was the bigger rewrite, and it was mostly about not waiting. The old one re-read the entire multi-gigabyte master once for every zoom level — roughly ten passes for a deep pyramid — and sat pinned to the disk while everything else idled. The new one reads the source a single time, keeps as much of it in memory as the machine will allow, and produces every level from there at once; the heavy geometry and the compression can both be handed off to the graphics card.
I am keeping the exact how to myself for now — less out of secrecy than because it is simply not ready to hand over. I lean on open hardware and open software every single day, and I fully intend to give these back at some point; just not before they are something I would not wince to publish.
Tiling is the least glamorous part of the whole process and the one I have optimised the hardest — because it is the part standing between a finished panorama and being able to look at it at all. Nothing on my machine, or anyone else’s, will just open a 44-gigapixel image and let me pan around it smoothly; even I never see one of these as a single file at full resolution. Sliced into tiles it becomes something a browser can serve a sliver at a time — and only then does the thing I spent two hours freezing on a dam for turn into something a person can actually look at.
Past what the lens caught
There is a soft ceiling on detail that no amount of patience beats: the lens, and the atmosphere in front of it. One way past it is to let a neural upscaler invent the missing pixels — running each source frame through it at two or four times its resolution before anything is stitched. Doing it frame by frame keeps every piece small enough for the graphics card and avoids ever building one gigantic upscaled intermediate; overlapping passes are blended so the seams disappear.
It is, of course, partly a polite fiction — the upscaler is guessing at detail the sensor never recorded. But on rock and foliage and water the guesses are convincing, and it buys real-looking resolution the optics alone could not. The honest gigapixels still come from the glass; this only smooths the very last step.
Breaking the terapixel boundary
On that mountain, two hours to kill and a head clicking away on its own, the obvious question turned up: what would it take to go an order of magnitude further — to a terapixel? A terapixel is 10¹² pixels, one trillion. Moiry would need tiling about 23 times over to reach it. It is roughly 16,000 times a phone camera, or about 4.1 million burgers wide. The burger comparison scales linearly. I checked.
Some context for the absurdity: a terapixel of uncompressed 24-bit colour is about 3 TB. The entire printed collection of the Library of Congress is estimated near 10 TB — so a single terapixel panorama would be about 30% of everything humanity has committed to paper, except instead of knowledge it is rock and sky.
The number that actually matters is angular resolution — pixels per degree — and that is focal length times sensor pixel pitch. My 450 mm setup samples about 1,800 px per degree. Move to 800 mm on a 61 MP sensor (3.75 µm pitch) and it climbs to ~3,724 px/°, which makes a 180° × 90° panorama about 225 gigapixels. Better — but still 4.5× short. There are three honest ways to close the gap:
- Go wider
- A full 360° × 180° sphere at 800 mm ≈ 900 GP — about 11,600 frames and ~6.5 hours of continuous shooting at altitude (and cloning your own tripod legs out of the floor afterwards).
- Go longer
- Push to ~1,700 mm and a 180° × 90° panorama clears a terapixel cleanly — but now it is ~26,000 frames and 14.5 hours of shooting before any weather happens.
- Go parallel
- A 2×2 array of four 61 MP bodies at 800 mm yields ~900 GP per pass; two passes clear a terapixel. The problem moves from optics to mechanically carrying four synchronised cameras up a mountain. This is how commercial gigapixel rigs work — they have staff for the carrying.
Then physics pushes back. At long focal lengths the atmosphere stops being transparent and behaves like a lens made of warm soup; even on the clearest alpine day, thermal seeing limits you to roughly 1–3 arcseconds. At 1,700 mm you are trying to resolve detail at the very scale of the blur. The escape is lucky imaging — shoot hundreds of frames per position and keep only the few milliseconds where the air held still. I already do this for the Moon at over 8,000 mm.
Applied to a terapixel landscape it turns gloriously silly: 500 frames per position, the best 5 kept, across 26,000 positions is 13 million raw frames — about 780 terabytes of capture before stitching even begins. That is not a typo.
The real bottleneck, it turns out, is none of that — not the camera, the lens, the software or the server. At terapixel scale a single dropped frame is a permanent hole in the sky that no post-processing can fill, so the prerequisite is simply a perfect day: clear, still and empty, for hours on end. (Empty matters more than you would think — the Olympiapark panorama was shot during peak lockdown, and a park with nobody in it saved me hours of cloning tourists out of 12 gigapixels.) I am working on it.
Thanks for stopping by.