Third Life Docs Enter the town

Docs · Limits & optimising

Technical limits and optimisation

Every visitor's browser downloads and draws what you publish, often on a phone, often with fifty people in the square. These are the limits the site enforces, exactly as its checks apply them, and the free tools that bring a model within them.

The numbers here are read from the site's code when it is built. The editor checks them before your wallet signs, and the server checks them again when your plot arrives. A version published before a limit changed keeps loading.

1. What a plot may publish

A plot's weight is what a visitor downloads as your own files: models, their distant copies, images, plus the plot's signed description. It is counted once per file, however many times you place it.

Generated from packages/protocol/plot-limits.ts and nft-copies.ts.
PlotCellsPublishes (base)FilesSigned descriptionNFT display copiesWith all extra storage
16 × 16 m125 MB2001 MB15 MB150 MB (5 add-ons)
32 × 32 m4100 MB8001 MB60 MB300 MB (8 add-ons)
48 × 48 m9100 MB8001 MB60 MB300 MB (8 add-ons)
80 × 80 m25100 MB8001.8 MB60 MB300 MB (8 add-ons)

Over the allowance, publishing is blocked. The meter turns amber at 85 % and lists the heaviest files. Fix it by removing or reusing files, compressing textures, or adding storage.

2. Per cell

Each 16 m cell is checked on its own, as if it were a small world.

Per 16 m cellLimit
Objects (boxes, columns, frames, models…)500
Model instances (placed GLBs)16
Different model files8
Live NFT displays (token references)24
Artworks carrying their own file (older path)8
Portals16
Model triangles, all models together500,000
Model collision surfaces8,192
Object size, each side16 m
Lowest bottom / highest top-0.3 m / 16 m
Label, id, group name200 / 120 / 80 characters

3. GLB models

Models are GLB (binary glTF 2.0) with everything embedded: one binary buffer, textures inside the file. A .gltf with separate .bin and image files, or any external link, is refused.

From packages/protocol/glb.ts (the building profile) and model-preparation.ts.
One GLB placed in a plotHard limit (refused above)What the builder aims for
File size20 MBabout 3 MB
Triangles200,000180,000
Materials6424
Draw primitives (mesh parts)256240
Nodes1,000—
Embedded images / textures64 / 128—
One embedded image8 MB, at most 4,096 px a side2,048 px a side
Texture pixels, all images16.8 megapixels (4,096²)12.6 megapixels
Vertices per accessor1,000,000—
Points (point clouds)1,000,000—
Animations4 clips, 64 channels, translation / rotation / scale only, LINEAR or STEP—
Skins (rigs), morph targets, lights, camerasSkins, morph targets and lights refused—
Collision surfaces4,096made for you

Extensions

Accepted: EXT_meshopt_compression, KHR_mesh_quantization, EXT_texture_webp, KHR_materials_emissive_strength, KHR_materials_unlit, KHR_materials_specular, KHR_materials_ior, KHR_texture_transform. Anything a model requires beyond these is refused, because a missing decoder would show holes.

What the builder's import does for you

The plot editor and the free builder prepare a model on your device as it is imported: they reduce heavy geometry to about 180,000 triangles (trying gradually larger geometric errors, up to 2 %), resize textures to 2,048 px, share compatible materials in atlases, aim for about 3 MB and 24 materials, build a distant copy of up to 30,000 triangles and work out collision surfaces. What still does not fit is held back with a reason. The SDK and AI agents use your file as it is and only warn, so prepare it yourself first.

4. Textures

5. Making a texture atlas

An atlas puts the textures of many parts into one image, so a building draws as one material.

In Blender (bake)

  1. Select the parts and join them (Ctrl+J), or keep them separate and bake each to the same image.
  2. Object Data Properties › UV Maps › +: add a new map called Atlas. Select it (so it is the one being edited) but keep the camera icon on the original map.
  3. In Edit Mode, select all (A), then U › Smart UV Project (or unwrap by hand with seams for cleaner results). In the UV Editor, UV › Pack Islands with a small margin.
  4. Image Editor › New: a 2048 × 2048 image (1024 for a small piece).
  5. In every material of the object, add an Image Texture node with that image, unconnected, and click it so it is the active node.
  6. Render Properties: engine Cycles. Bake › Bake Type Diffuse, Contributions: only Color (untick Direct and Indirect). Press Bake. Repeat with Normal or Roughness if you need them, each into its own image.
  7. Save the image. Give the object one new material that uses the baked image through the Atlas map, make Atlas the render map (camera icon) and delete the old map and materials.
  8. Export (below) and save the texture as WebP.

With glTF-Transform

glTF-Transform does not bake textured materials into one atlas, but palette merges flat-coloured materials (the usual case for kit-built architecture) into one small palette texture and one material, and dedup merges identical textures and materials:

gltf-transform dedup model.glb step1.glb
gltf-transform palette step1.glb model-palette.glb

For textured materials, bake in Blender as above.

6. Optimising, step by step

Start with gltf-transform inspect or Check my model to see where the weight is: usually textures for size, triangles and materials for speed.

Blender (free)

glTF-Transform CLI (free, Node.js)

npm install --global @gltf-transform/cli
gltf-transform inspect model.glb

One command that usually does it, keeping the result inside the site's rules:

gltf-transform optimize model.glb model-web.glb --compress meshopt --texture-compress webp --texture-size 2048 --instance false

Always pass --instance false: the default writes EXT_mesh_gpu_instancing, which the site refuses. Never use --compress draco or --texture-compress ktx2. Add --simplify false if optimize must not touch the geometry.

Or one step at a time:

gltf-transform weld in.glb welded.glb
gltf-transform simplify welded.glb simple.glb --ratio 0.5 --error 0.001
gltf-transform dedup simple.glb dedup.glb
gltf-transform resize dedup.glb sized.glb --width 2048 --height 2048
gltf-transform webp sized.glb webp.glb --quality 90
gltf-transform meshopt webp.glb final.glb

gltfpack (free, from meshoptimizer)

gltfpack -i model.glb -o model-web.glb -c -tw -si 0.5

Images: cwebp or Squoosh

cwebp -q 90 -resize 2048 0 painting.png -o painting.webp

-resize 2048 0 sets the width and keeps the proportions. In a browser, Squoosh (squoosh.app) does the same visually: WebP, quality 85–92, Resize to 2048. Nothing is uploaded.

Video and GIF: ffmpeg

You do not need to convert the NFTs you hang: the site makes their display copies itself. ffmpeg is for preparing your own media before you mint it, which makes it lighter for every collector:

# GIF to a small H.264 MP4 (even dimensions, plays everywhere)
ffmpeg -i art.gif -movflags +faststart -pix_fmt yuv420p -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" -c:v libx264 -crf 23 art.mp4

# A heavy video down to 1080p, without sound
ffmpeg -i art.mov -vf "scale=-2:1080" -c:v libx264 -crf 22 -preset slow -pix_fmt yuv420p -movflags +faststart -an art-1080.mp4

# A still for a cover image
ffmpeg -i art.mp4 -frames:v 1 -vf "scale=1536:-2" cover.webp

The site's own tools

7. NFT display copies

When you publish, your device makes light copies of the heavy NFTs on your plot, signed with it. They never count in your weight; they have their own quota of 15 MB per cell, up to 60 MB.

8. Custom avatars: coming

Wearing your own avatar is not open yet. These are the limits the site's avatar check already applies, and the export specification given to the first collection preparing avatars, so you can prepare.

AvatarHard limitTarget
Triangles30,00025,000
File size4 MB2 MB
Materials41, plus 1 for the eyes
Bones64, one skinthe shared Mixamo skeleton
Decoded texture memory32 MiBWebP at 2048, 1024 or 512
Height1.2–2.2 m1.75 m, metres not centimetres
Animations16 clips, 1,024 channels, LINEAR or STEP, no morph targetsWalking, Running and Idle in the file (required)
Compressionmeshopt and quantization; no Draco, no KTX2opaque, single-sided

Required joints, in Mixamo's naming: mixamorig:Hips mixamorig:Spine mixamorig:Spine1 mixamorig:Spine2 mixamorig:Neck mixamorig:Head mixamorig:LeftShoulder mixamorig:LeftArm mixamorig:LeftForeArm mixamorig:LeftHand mixamorig:RightShoulder mixamorig:RightArm mixamorig:RightForeArm mixamorig:RightHand mixamorig:LeftUpLeg mixamorig:LeftLeg mixamorig:LeftFoot mixamorig:LeftToeBase mixamorig:RightUpLeg mixamorig:RightLeg mixamorig:RightFoot mixamorig:RightToeBase.

Sources for the tools