Build your own 3D museum for your NFTs

An implementation outline, not code. Everything an AI coding tool needs to know on day one so the build takes a weekend, not a summer. Any layout, any library, any host.

Raw markdown Walk The Axis

We tried this once and failed. Lights, GIFs on walls, a CDN, a hang edited by hand: months, and a black screen on half the machines. The second attempt copied the structure of a page we admired and then learned, one bug at a time, what is below. The code is the cheap part. This is the expensive part, written down so you can skip it.


The idea

A first-person walk through rooms you designed, with your works on the walls at the size you chose, in the order you chose. Not a grid of thumbnails. A place.

The rooms can be anything: one big hall, a ring around a courtyard, a house with a floor per collection, a long axis to one work, a cave. What matters is that the layout says something about the collection, and that you can change it in minutes without touching code.

What you get

Decisions only you can make

  1. The organising idea. What does a visitor understand by walking it? Chronology, a room per artist, a floor per chain, a procession toward one work, a cabinet of moods. Pick one; it decides the shape of the building.
  2. The rooms. Six to twenty, 10 to 20 m a side, walls 10 to 13 m high and no ceiling so a 7 m work has air. Which connects to which. Where you start.
  3. The heights. A work's height in metres is the only sizing decision per work. 2 to 3 m for most, 4 to 7 m for the ones that tower, more only for the one or two the collection is about.
  4. The order. First room, last room, what faces each door. A visitor walks a story whether you wrote one or not.
  5. Your rules. Two or three things the layout must never do, written down, because the validator will enforce them. Ours: nothing in the line of sight from the entrance to the centrepiece, nothing early on the way taller than the centrepiece deserves.

Write these as a plan file before any code exists: one section per room with its position in metres, its doors, its sign text, and the works on each wall in order, a height each. Everything is derived from it.

The build, in order

Each step is a prompt to your AI tool and leaves something that runs.

1. Manifest. From the wallet, a JSON file keyed by title: file, aspect, artist, collection, contract, token. Originals stay outside the repo.

2. Plan and placer. The plan file by hand. A script that reads it and computes every work's position. A script that goes the other way, so a round trip changes nothing.

3. Validator. Before the viewer. Fails on a work in a door, above the wall top, overlapping a neighbour, a plan out of date with the manifest, and your rules.

4. Viewer. Walls, floor, frames, pictures, captions, signs. Zero lights (below).

5. Walking. Then cards, motion, live works, wayfinding, splash, catalogue, tests, in that order. Details below.

The hacks, specifically

This is the part that took the time. Numbers are ours and work; start from them.

Rendering: no lights at all.

Textures.

Motion: never a GIF.

Live code works. A generative work that is a web page runs in a hidden iframe behind the canvas, 960 px wide, and its canvas is copied to the wall texture at 30 fps. Only the 2 nearest within 14 m run; the rest are paused with the sketch's own stop call and show their poster.

Walking and collision. Eye height 1.65 m, walk 4.2 m/s, run 8.5, jump 4.6 with gravity 14. Walkable zones are the room rectangles inset by a 0.35 m body radius, plus door rectangles bridging them; a point is walkable if it is in any zone. Movement is split into 0.12 m sub-steps so nobody tunnels a 0.3 m wall. Pointer lock on desktop; the first click locks. Mouse deltas over 400 px in one event are dropped: some browsers report a pointer warp as a jump.

The plan and the placer. Works are spread along each wall between doors and sign pillars with at least 0.6 m between frames, 0.3 m from a corner, 0.3 m from a door edge, frames 0.14 m wide. One row is centre-hung at 2.0 m for works up to 2.4 m, 2.6 m for taller ones, never lower than 0.7 m at the bottom edge. Extra rows stack from 0.75 m with 0.75 m between for captions. On a wall broken by doors every split of the ordered list across the stretches is tried and the most even wins. The one work in the end room is centred, bottom edge at 1.0 m.

Captions and signs are drawn to canvas textures with the page's own web fonts after they load, and rebuilt on a theme switch. A sign is an eyebrow line, a big name, one sentence; on first entry to a room it also appears once in the middle of the screen for 2.4 s.

Boot and survival.

Deep links and wayfinding. ?work=<slug> lands you in front of a work: start 3.5 m back and level, glide in over 1.8 s once inside. A strip of dots on the screen edge marks the rooms in order; two keys jump between them with the same landing. No map is needed when rooms have names and an order.

Tests without a browser.

Hosting

Two branches. One holds everything; one is generated from it and holds only the files the page loads at runtime: the page, the manifest, the art, the fonts, the library. A script does the copy and refuses a file over 25 MB. Any static host serves the second branch. If you want to stay anonymous, every file and every commit is public eventually; put nothing identifying in either. Before you host a work's files publicly, check its licence: owning a token usually does not include the right to re-host its media.

How to use this with an AI tool

Give it this document and your plan file. Ask for step 1, run it, look. Then step 2, and so on. Make it write the validator before the viewer and run it after every change. When something looks wrong, do not let it reach for a light. When it wants a framework, a build step, or a CDN, say no. When it is done, walk the museum yourself once, slowly, with a friend on a different machine.

The outline is the asset. The building is yours.