Technology

How the archive gets built

Every tool behind the objects and spaces on this site: what it is, how it works, when it comes out of the bag, and what still does not work.

The kit

Every tool, and when it comes out of the bag

Objects and spaces go through different gear. Objects are photographed by hand with a phone; spaces are filmed with a gimbal camera and solved on a workstation. Nothing below is aspirational: each entry is in use today or was tested and set aside.

In the bag

Detail camera for objects

iPhone 15 Pro Max with RealityScan

What it is
The phone camera, driven by the RealityScan capture app, which records position data alongside every photo.
How it works
48-megapixel stills, walked around the object at three heights with heavy overlap. The app logs where each frame was taken, so alignment starts from a prior instead of from nothing. Through glass, on some sessions, only a gravity prior survives and the images have to carry the solve on their own.
How and when it is used
Every object on this site so far. It reads as visitor gear, so it goes anywhere a visitor can, including museum galleries where a scanner would not be welcome. Between 21 and 50 stills per object.
Where it stands
Primary and only capture device for objects. The Fujifilm bridge camera below is the fallback when the phone cannot get close enough.

Coverage camera for spaces

DJI Osmo Pocket 4

What it is
A pocket gimbal camera: one-inch sensor, fixed 20 mm-equivalent f/2.0 lens, 4K video, three-axis mechanical stabilisation. Standard Combo, 107 GB internal.
How it works
It films continuous video while walking a room slowly, and the frames are pulled out afterwards at about three per second with the blurriest of each window dropped. It also works as a tripod scanner: over USB it exposes pan and tilt controls, so a script sweeps 12-degree pan steps across four tilt rows and grabs 88 stills per station.
How and when it is used
Rooms and sites only, never objects. Everything manual: shutter fixed at 1/120 indoors and 1/250 outdoors, ISO and white balance fixed, focus locked, 4K at 50 or 60, no digital stabilisation, and the 2x zoom is never touched mid-pass because it changes the lens model.
Where it stands
Three walking clips and one four-station scan so far, all test spaces. The findings from them are the two field-log posts on frame density and the loop-closure recipe below. No room is on the site yet because none of the captures is good enough to show.

Highlight and reflection control

Filters for the Pocket 4

What it is
A magnetic K&F Concept set: ND16, ND64, ND256 and a circular polariser.
How it works
Neutral density stops highlights blowing out on limestone under Cairo midday sun while the shutter stays fast. The polariser cuts specular reflection on marble, glazed tile and glass cases, which otherwise breaks feature matching.
How and when it is used
ND when the fixed shutter would overexpose. Polariser on single-direction passes only: on a full orbit the gimbal rotates the lens, the polarisation angle drifts against the scene, and that inconsistency is worse than the reflections.
Where it stands
In the bag with the camera. The lens itself is fixed; there are no interchangeable lenses on this camera.

Structured-light scanner for objects at home

Creality CR-Scan Otter Lite (wireless)

What it is
A handheld scanner that projects a light pattern onto the object and reads the distortion with its own cameras, building geometry directly instead of matching photographs.
How it works
Sweep the object slowly while the software tracks and fuses frames into a mesh. Fine surface detail comes out cleaner than photogrammetry on small, matte objects; dark, shiny or translucent surfaces need spray or patience.
How and when it is used
Object-level scans in controlled, permitted settings, mostly for print masters. It does not go to museums or sites: a handheld scanner draws attention from staff and security in a way a phone does not.
Where it stands
Processed in Creality Scan for tracking, fusion and export, then cleaned in Blender. None of the records on this site came from it yet; they were all museum captures.

Backup stills camera

Fujifilm FinePix HS35EXR

What it is
A bridge camera with a fixed superzoom lens, inherited rather than chosen.
How it works
Manual exposure and focus, stills only, used the same way as the phone: overlapping orbits at several heights.
How and when it is used
When an object is behind a barrier the phone cannot reach across, or when a longer focal length is needed for a detail pass.
Where it stands
Its lens has not been tested or benchmarked, so soft results from it are treated as a lens question first.

On the desk

On-site checks and object meshes

Mac

What it is
The laptop that travels.
How it works
Runs a first alignment on site to confirm a capture worked before leaving, then processes object captures into meshes.
How and when it is used
Every museum visit, and every object mesh on this site.
Where it stands
Object meshes are built with Apple's PhotogrammetrySession (Object Capture) at raw detail, then cleaned and compressed for the web here.

Print-grade meshes

HP Omen laptop

What it is
Ryzen laptop with an RTX 4070.
How it works
Runs RealityScan for photogrammetric mesh extraction tuned for maximum detail, because those meshes feed 3D printing rather than a viewer.
How and when it is used
When a record needs a print master or a higher-detail pass than the phone pipeline gives.
Where it stands
Second machine in the pipeline; the tower below took over the heavy space reconstructions.

Space reconstruction and splat training

Windows tower

What it is
i9-13900KF, RTX 4090 with 24 GB, 64 GB of RAM, driven over SSH from the Mac.
How it works
COLMAP solves camera poses for the extracted video frames; Brush trains the Gaussian splat from them. A typical 1,275-frame walk solves in about eleven minutes and trains in about the same.
How and when it is used
Every walking clip and station scan since August 2026.
Where it stands
The whole splat investigation ran here: 33 recorded phases, 167 logs, kept in the research folder with the scripts.

Software

Mesh engine for objects

Apple PhotogrammetrySession (Object Capture)

What it is
Apple's built-in photogrammetry, run at its raw detail level.
How it works
Takes the phone stills with their position data and returns a watertight textured mesh. Raw detail gives the most real geometry (126k faces on the Thuya mask, 223k on Aphrodite on the dolphin).
How and when it is used
Every object mesh on this site.
Where it stands
Output is cleaned (self-intersecting and non-manifold faces fixed, holes closed), textures are compressed to 4096-pixel JPEG for the web, and the mesh is packed for the viewer.

Print-grade photogrammetry, and a tested aligner

RealityScan

What it is
Epic's desktop photogrammetry (formerly RealityCapture), run on the Omen.
How it works
Aligns the image set, builds a dense mesh, and lets each pass be treated as its own camera group with its own lens model, which matters for video frames with no EXIF.
How and when it is used
When the goal is a print master at maximum detail. Ingest rules for video: one camera group per pass, set the focal prior by hand for the Pocket 4 (one-inch sensor, about 7.4 mm actual focal length), Brown3 distortion, higher detector sensitivity for low-texture limestone.
Where it stands
Tested as a pose solver for the walking clips too: version 2.2 registered 557 of 1,275 frames in six components, worse than COLMAP on the same clip, so it stays a mesh tool here.

Camera poses for spaces

COLMAP

What it is
Open-source structure-from-motion. Every space capture goes through it before a trainer sees the frames.
How it works
Finds matching features across frames, solves where each camera was, and produces a sparse point cloud. The recipe that works on a long walk: sequential matching plus vocabulary-tree loop closure, global mapper, delete cameras flung far from the scene, re-triangulate, bundle adjust.
How and when it is used
Every walking clip and station scan.
Where it stands
Frame density was the whole problem for weeks: decimating video to roughly 680 to 1,275 frames gave 100 percent registration at 0.78 pixels. Loop closure helps when a walk revisits itself and hurts when it does not; the sequential model is checked first.

Gaussian-splat trainer

Brush

What it is
Rust, command-line first, runs natively or in a browser through WASM.
How it works
Turns COLMAP poses and frames into a Gaussian splat. The proven configuration: 25,000 iterations, 2,400-pixel resolution, spherical harmonics degree 3, growth threshold 0.005, refine every 400, four levels of detail.
How and when it is used
The trainer for every space on this site once one is released.
Where it stands
Chosen over splatfacto, gsplat MCMC and OpenSplat on the same footage: best SSIM and LPIPS on both capture types at half the file size. Every training-side change since moved quality by under half a decibel; changing the capture moved it by ten.

Benchmarked, not adopted

gsplat and OpenSplat

What it is
Two other open-source trainers: gsplat from the nerfstudio project (Python), OpenSplat (C++ and CUDA).
How it works
Both ran on the identical decimated reconstruction and iteration budget as Brush for a fair comparison.
How and when it is used
Reference points only.
Where it stands
gsplat trained cleanly after several Windows build fixes but its default densification did not suit these captures. OpenSplat produced the fastest and smallest output, 3.7 minutes and 13 MB, but visibly soft. The table below carries the numbers.

Cleanup and repair

Creality Scan and Blender

What it is
The scanner's own software, and Blender for everything after it.
How it works
Creality Scan tracks, fuses and exports Otter scans. Blender is where meshes from any source get repaired: holes closed, debris removed, orientation fixed, hollowing and orientation for print.
How and when it is used
Every mesh that goes to print, and any web mesh that needs more than the automatic cleanup.
Where it stands
Active post-processing, not a pass-through export step.

Web packaging

The site's own scripts

What it is
Small Python and Node scripts in the site repository.
How it works
Convert opaque PNG textures to JPEG, pack web copies of each GLB with meshopt, build 160-pixel thumbnails for released photos, record download sizes, clean and strip splat files, and sync everything to object storage.
How and when it is used
Every deploy.
Where it stands
Web meshes went from 329 MB to 64 MB across the collection with no visible texture change.

On this site

The object viewer

model-viewer

What it is
Google's web component for glTF on top of three.js.
How it works
Loads the meshopt-packed GLB, lights it with a neutral studio environment, and handles orbit, zoom and the wireframe toggle.
How and when it is used
Every record page and the embeddable viewer museums can frame on their own pages.
Where it stands
Phones wait for a tap before downloading a mesh; released records can be embedded anywhere with credit and a link back.

The space viewer

SuperSplat viewer

What it is
PlayCanvas's self-hosted Gaussian-splat viewer.
How it works
Streams a cleaned, lighter copy of the splat and lets the visitor look and move as if in the room.
How and when it is used
Spaces, once the first one is released.
Where it stands
Wired in and waiting for a capture that passes the viewer test. Two walking clips scored well on paper and still looked wrong in it, which is why the number is never the last word.

Hosting

Cloudflare Worker and R2

What it is
The site runs as a single edge worker; meshes, photos and downloads live in R2 object storage.
How it works
Released files are public; unreleased ones are served through short-lived signed links so viewing stays open while downloads follow release.
How and when it is used
archaeoarchive.com, with the old heritage.atabany.net address forwarded to it.
Where it stands
Deployed by one command that also rebuilds thumbnails and sizes and syncs storage.

The finding that changed the pipeline

Frame density, not software tuning, was the problem

Reconstructions from handheld gimbal footage kept fragmenting into disconnected pieces no matter how the reconstruction software was tuned. The cause: video shot at a normal frame rate gives structure-from-motion thousands of nearly identical consecutive frames with almost no camera movement between them, so there is nothing to triangulate a 3D position from. Resampling the same footage down to a fixed ~680-frame budget (about 6.7 frames per second of coverage instead of the near-60fps original) before reconstruction fixed it outright.

100%frames registeredup from 50% on the same footage at full density
0.786pxreprojection errorlower than every denser configuration tested
10.8 minreconstruction timedown from 189 minutes at full frame density
Read the capture-protocol writeup →

Head-to-head

Same footage, same reconstruction, three trainers

All three run against the identical 680-frame decimated reconstruction above, the first fair comparison in this investigation. Numbers land here as each run finishes.

TrainerConfigurationTimeOutputNotes
Brushgrowth-grad-threshold 0.005 · refine-every 400 · sh-degree 3 · LOD ×410.0 min98.9 MBLOD tiers down to 10.2 MB
gsplatdefault strategy · sh-degree 3 · 25,000 steps10.5 min118 MB524,262 Gaussians · PSNR 27.078 · SSIM 0.879 · LPIPS 0.297
OpenSplat25,000 iterations · sh-degree 33.7 min13.2 MBBuilt from source (libtorch + OpenCV + CMake/MSVC) for this comparison. Fastest and smallest of the three.

All three ran against the identical decimated dataset and iteration budget, the first fair comparison between them in this investigation.

What didn't work

Tried and ruled out

Mapper tuning
Leaf size, overlap, loop-closure detectionExtensive parameter tuning on the reconstruction software's clustering step never fixed fragmentation at scale. Real work, but tuning around the cause rather than finding it.
Manual sectioning
Splitting footage into overlapping chunksReconstructing sections independently and merging them found and fixed a real bug in the merge step, but most section pairs still fail to merge: real geometric drift between independently solved sections, not a settings problem.
Still open
Fresh feature-extraction runs reproducibly divergeIdentical input images, re-run from scratch, measurably diverge from the original extraction on a small subset of high-detail frames. Narrowed to a likely GPU truncation behaviour, but not fully explained. Flagged as open, not resolved.