← Playsites / explorer / map

Decentraland · interaction topology

Every click. Every wait. One map.

The complete click/state sitemap of the Explorer — the catalyst.example.com/play web client. Nodes are URLs and component states; every edge is one user click — or a load whenever the product makes you wait more than 100 ms: engine boot, signed deploys, teleports. Hover or focus anything to light its full path. Surveyed against the live overlay, the engine page, and the engine crates.

4
route nodes
57
machine states
60
click edges
14
loads >100 ms
one user click
click, then >100 ms of invoked work — the spinner copy shown in-product
automatic — no click
reversible pair
route — click to open it
machine state
overlay
external tab
01

Entry & Lobby

BootGateLobbyNewSignInModalViewPlacesPicker

One nginx-served page hosts the wasm engine and the DOM overlay. BootGate decides: fresh visitors get the guest lobby; a stored identity still valid for 24h skips straight to loading. Sign-in is an escape hatch, not a gate.

/play/engine page + ui3 overlayfresh sessionLOBBY“Welcome to Decentraland!”
stored identity, ≥24h validity leftloadingengine starts immediately
?realm=?position=x,y?previeweditor path — overlay does not mountURL params the engine page honors — plus ?uidev=1, the sticky dev-overlay swap
LOBBYlive engine avatar preview at right
name fieldrandom default⟳ random nameMasculine ⇄ FeminineRandomrandom owned-catalog lookTerms checkboxgates JUMP INall pre-engine — the choice is applied via SetAvatar once the engine reports identity
JUMP IN, terms uncheckednudge“Accept the terms above to jump in.”
JUMP INPICKER“Where do you want to go?” · search · sort: Most active
PICKERlive places + worlds · occupancy · LIVE badges
LOBBYSign inSIGNIN_MODAL“Sign in or sign up” · step machine: options
Continue with Google / Apple / DiscordSHELL-WAITfull-page redirect · thirdweb hosted authreturns with ?authResult=sign-in completes on the way back in
Continue with walletinjected wallet foundWALLETone button per detected walletContinue with <wallet>request accounts + personal_signsigned inSetIdentity → engine
Continue with walletno injected wallet“Starting phone sign-in…”QRLibreConnect — “no WalletConnect, no project ID”phone signs · session polledsigned in
/auth/pair/:sessionon the phone — the QR is a plain https linkapprove in the walletpersonal_sign on the phonedesktop session completes
ContinueCODEe-mail one-time codecode entrythirdweb OTP verifysigned in
signed in“Signed in as 0x…”Sign out returns to guest, stays in the lobby
02

Boot, Loading & Recovery

BootGateLoadingcrash-overlay

The engine downloads and compiles on page load but waits for a destination (dclDeferStart). The overlay owns the loading screen; the native page owns the browser gates and the crash overlay. Every recovery path here is real.

/play/mobile browserMOBILE GATE“not available on mobile” · App Store / Google Play
non-Chrome desktopBROWSER GATE“Browser Not Supported” · Download Chrometry anyway…bypass cookie + reload30-day cookie
destination pickedLOADING“Booting engine” 0–50% · “Loading world” 50–100% · min 2.2sscene ready — or engine alive + 5s graceWORLDHUD mounts — engine draws, DOM chromes
TIPSrotating carousel‹ · ›manual browse
20s, engine never came upSTALLED“The world couldn’t start” · GPU hintTry againpage reload
from STALLEDBack to lobbylobby
WORLDpanic · worker error · no frames ~16sCRASH OVERLAY“The world crashed” — cause-classified: WebGPU · disk · memory · hang
Reloadpage reload
Dismissoverlay hiddenengine may still be down
frames resume ~4sauto-dismisswatchdog self-heal — no click
teleport into a heavy sceneno wedgestop-64-class teleport wedges are prevented engine-side (web-task cross-thread drop guard); the watchdog card is the fallback if one slips through
overlay render errorFATAL ERROR“Something went wrong” · ErrorBoundaryReloadpage reload
03

HUD Chrome & Chat

AppLayoutSidebarChatMinimap

Everything in-world is DOM over the canvas: a left rail, minimap, profile widget, chat dock, floating widgets, toasts. Full-screen panels are hash routes inside the overlay; Esc always walks back to the world.

WORLDhash #/ — rail + minimap + chat + widgets
Backpack [I]Places [Z]Communities [O]Camera Reel [K]Settings [P]MarketplaceHelp & Supportrail top — full-screen panels, each a hash route; the same hint keys work from the world
Voice ChatPortable ExperiencesSkyboxCameraEmotes [B]FriendsChat [Enter]rail bottom — floating widgets over the world, one open at a time
ProfileNotificationsMinimapConnectionToastsalways-on: profile widget · notifications bell · minimap · connection dot · engine toasts
WORLDrail icon / hint keyPANELtabs: Events [X] · Places [Z] · Communities [O] · Map [M] · Backpack [I] · Gallery [K] · Settings [P]Esc / ✕ / same keyWORLDfocus returns to the canvas
WORLDEnter / chat iconCHAT DOCKNearby channel · @mentions · emoji + :shortcodes:sendSendChat → engine
coords / world link in a messagejump-inTeleport · ChangeRealm
MINIMAPscene name + parcel — live position streamexpandMAP PANEL#/map
Jump to coordinatesTeleportCopy coordinatesCopy Link⋮ menu
WORLDB / rail EmotesEMOTE WHEEL10 slots from your loadoutslotPlayEmotewheel closes
04

Backpack, Profile & Identity

BackpackProfileWidget

The wearables editor equips live through the engine; outfits save as slots. The profile widget is the in-world door to the same sign-in machine as the lobby — and to sign-out, which keeps you in-world as a guest.

BACKPACK#/backpack · tabs: Wearables · Emotes · Outfitscategory tileCATEGORY GRIDowned catalog · paginateditemequipped liveSetAvatar → engine preview
color swatchesrecolorskin · hair · eyes
Emotes tabEMOTE SLOTSequip the 10 wheel slots
Outfits tabOUTFITSSAVE OUTFITslot saved
savesigned profile deployprofile persistedsigned-in only — guest looks are session-local
WORLDavatar chipPROFILE CARDname · wallet · copy address
VIEW PROFILEPASSPORT#/passport · badges · photos · equipped
Sign inSIGNIN_MODALsame machine as the lobbysign-in flow
Sign outguest sessionLogout → engine · you stay in-world
engine pushes login codeLOGIN CODEcode + “open on another device”open linkexternal auth completesengine-gated — appears only when the engine pushes a login code (desktop-style external auth); rare on web
05

Explore & Jump-in

Events.routePlaces.routeMap.routeWorldVisitModal

Events, Places and the Map feed one jump-in chain: land parcels teleport immediately (scene prewarmed over the wire), world realms confirm first. The overlay names the destination the whole way.

EVENTS#/events · day carousel · LIVE badges · featured railjump in — land eventTeleport + scene prewarmJUMP LOADING“Teleporting to <name>…”3.5s timerWORLDminimap follows the position stream
jump in — world eventVISIT WORLD?“Do you want to jump to the following realm?”CONTINUEChangeRealmJUMP LOADING“Teleporting to <name>…”
from VISIT WORLD?CANCEL / ✕
PLACES#/places · search · sort · likesplace cardPLACE DETAILJUMP INsame chainparcel → Teleport · world → confirm
MAP#/map · pan/zoom atlas · place sidebarparcel / placesame chain
PHOTO DETAIL#/galleryjump to photo locationTeleportJUMP LOADING
06

Scene Lifecycle

lifecycle.rsload.rsscene_loop.rsloading_quads.rsimposters

What the engine does under every teleport: parcels resolve to scene entities, each scene walks a five-state boot, runs a tick loop with a 10s watchdog, and beyond the load radius the world is baked imposters. What you actually see: glowing loading walls, the pop-in at tick 5, a scene that silently freezes when it breaks, and the imposter skyline.

player moves / realm setPOINTER FETCHPOST /entities/active · batches of 100, ×2 to a 1000 cap · farthest-first · engine-internalresolvedparcel → scene hash | Nothing
fetch failsBACKOFFbatch halves · 0.5s·2ⁿ up to 32s · engine-internal10 consecutive failureserror toastAppError → engine toast — the only surface
SPAWNED“spawning scene” — parcels within 50m of youentity definition fetchedSCENE ENTITYscene.json + content map · scene-pack prefetchmain.crdt, if anyMAIN CRDTjs module readyJAVASCRIPT“started scene” · per-scene worker · SDK6 scenes get the adaption layertick 5scene appearsparked at y −1000 behind glowing boundary walls until now
any step failsFAILEDterminal — no retry until despawn + respawn
you stand in a booting sceneneighbors deferred≤15s, then spawned anyway — “to avoid an empty (green-ground) world”
per-asset fetches: 30s header / 10s stall timeouts, ≤3 retries, failed URLs muted 10s — engine-internal; misses show as missing meshes
RUNNINGCRDT tick loop ⇄ rendererno reply for 10s while in flightBROKEN“has not responded for 10s, marking broken” — freezes as-is, updates discarded
js exceptionBROKENerror logged to the scene console
what you seethe scene simply freezesthe “not responding… timeout in Ns” stream exists engine-side; the web overlay doesn’t render it
teleport / realm changeOUT OF WORLDplayer held while the destination bootsscene ready · or FAILED · or 60s capdropped into the world
scene beyond the load radiusdespawnedscene pack released · see the hysteresis note in the footer
ChangeRealmfull purgeall non-portable scenes + pointers + imposters
beyond the load radiusIMPOSTERbaked tiles · mip rings at 100 · 200 · 400 · 800 · 1600m · same-origin /bvimposters
tile requestedPENDING≤6 downloads in flight on web · a coarser parent tile stands inzip fetchedrendered
no bake existsnothing — sky and fogno placeholder · re-polled every frame · failed assets refetched ×2, then given up
a live scene loads inimposter suppressedreturns if the scene unloads again
07

Social & Comms

FriendsCommunitiesPassport

Friends and communities run on the node’s social services; voice runs through the engine. The floating rail widgets and the full-screen panels share the same data.

FRIENDSrail widget or full panel · friends · requests · blockedrequest / accept / cancel / reject / delete / block / unblockSignRequest upsert_friendshipengine signs → social service
COMMUNITIES#/communities · browse · searchjoin / leavemembership updated
community cardCOMMUNITYmembers · stream
VOICErail widgetmic on / offSetMic → engine
WORLDbellNOTIFICATIONSunread badge · floating panel
08

Camera, Settings & Permissions

CameraSettingsPermissionPrompt

The camera detaches through the engine and captures real renders; settings write straight to the engine and apply live; scenes ask for capabilities through one prompt.

CAMERArail widget — SetCameraMode detachedshutter / SpaceCapturePhoto — engine renderssaved to reelsigned-in only
GALLERY#/gallery — your photosphotoPHOTO DETAILvisible people · jump to location
SETTINGS#/settings · pill sectionstoggle / pickSetSetting → engine, livefps cap · antialiasing · shadows · fog · scene load distance · voice volume · chat privacy
SKYBOXrail widgettime of daySetTimeOfDay → engine
scene requests a capabilityPERMISSIONscene name + capabilityAllow / DenyResolvePermission → engine
WORLDstatus dotCONNECTIONrealm · rooms · scene health
09

Exits & Meta

There is no in-product door back to the lobby from a healthy world — exits are sign-out (stay in-world as guest), the stalled card, or the browser itself. And the map maps itself.

WORLDbrowser reload / closecold bootidentity persists — auto-jump inside 24h, lobby after