W3AI Celestial Map
OASIS identity · Surge launches · LabLab builders
Plotting the four anchor systems
"Space is big. Really big. You just won't believe how vastly, hugely, mind-bogglingly big it is."
Live tally
live
OAPPs
building
partners
concepts
holonized
Loading galaxy data…
Selected System

Click any system
to explore it

Filter
System Types
All
Live
Holonic OAPPs
Building
Partners
Concepts
Holonized
All holonized
Tier Sizes
Grand SuperStar
SuperStar
Star
Planet
Moon
Tech Stack

Holonize a project
to see its languages

Pangalactic Timebank
2,142TEA
W12 · +42 hrs pledged
Active Quest Cycle
Fabulous Machine · W12
Day 6 of 42 · 36 remaining
Scroll to zoom · Drag to rotate · Click a system
// // Position encoding: // New OAPPs land in the "outer discovery arm" (radius 28–48) unless the OAPP // author encodes a specific galaxy position in ourWorldLat / ourWorldLong when // registering: // ourWorldLat (-90 → +90) maps to x (-45 → +45) // ourWorldLong (-180 → +180) maps to z (-45 → +45) // If both are 0 (the default), position is derived deterministically from the UUID. // Collect static OAPP IDs so we never duplicate them const _staticOappIds = new Set( SYSTEMS.filter(s => s.oappId).map(s => s.oappId) ); function _positionFromUuid(uuid) { // Derive a stable position in the outer discovery arm from the UUID hex string. const hex = uuid.replace(/-/g, ''); const angle = (parseInt(hex.slice(0, 8), 16) / 0xffffffff) * Math.PI * 2; const radius = 28 + (parseInt(hex.slice(8, 16), 16) / 0xffffffff) * 20; // 28–48 const y = ((parseInt(hex.slice(16, 24), 16) / 0xffffffff) - 0.5) * 8; // -4..+4 return [ Math.round(Math.cos(angle) * radius * 10) / 10, Math.round(y * 10) / 10, Math.round(Math.sin(angle) * radius * 10) / 10, ]; } function _oappTypeLabel(t) { return { 0:'OAPP', 1:'Console OAPP', 2:'WebAPI OAPP', 3:'Blazor OAPP', 4:'MAUI OAPP', 5:'OAPP Template', 6:'Generated Code' }[t] || 'OAPP'; } function _oappToSystem(oapp) { const pos = (oapp.ourWorldLat || oapp.ourWorldLong) ? [ Math.round(oapp.ourWorldLat / 90 * 45 * 10) / 10, 0, Math.round(oapp.ourWorldLong / 180 * 45 * 10) / 10, ] : _positionFromUuid(oapp.id); const typeLabel = _oappTypeLabel(oapp.oAPPType); return { name: oapp.name, shortName: oapp.name.length > 16 ? oapp.name.slice(0, 14) + '…' : oapp.name, type: 'oapp', pos, subtitle: `${typeLabel} · Holonic OAPP · STAR Registered`, region: 'Outer Arm', sector: 'STARNET Discovery Sector', cat: `${typeLabel} / Holonic OAPP`, desc: oapp.description || `${oapp.name} — registered on STARNET.`, oappId: oapp.id, oappType: typeLabel, oappFeatures: 'STAR Registered,Holonic', link: oapp.link || null, _fromStarnet: true, }; } async function fetchStarnetOapps() { if (!OASIS_API) return; const jwt = window.__OASIS_JWT__ || null; // Try authenticated list first; fall back to public search const endpoints = jwt ? [`${OASIS_API}/api/OAPPs`, `${OASIS_API}/api/OAPPs/search?searchTerm=`] : [`${OASIS_API}/api/OAPPs/search?searchTerm=`]; for (const url of endpoints) { try { const ctrl = new AbortController(); const tid = setTimeout(() => ctrl.abort(), 8000); const headers = { Accept: 'application/json' }; if (jwt) headers['Authorization'] = `Bearer ${jwt}`; const r = await fetch(url, { signal: ctrl.signal, headers }); clearTimeout(tid); if (!r.ok) continue; const body = await r.json(); // Unwrap OASIS envelope: body.result or body.results or body (array) const list = Array.isArray(body) ? body : Array.isArray(body?.result) ? body.result : Array.isArray(body?.results) ? body.results : []; if (!list.length) continue; let added = 0; for (const oapp of list) { if (!oapp?.id || !oapp?.name) continue; if (_staticOappIds.has(oapp.id)) continue; // already in static list if (systemMeshes.some(m => m.userData.oappId === oapp.id)) continue; // already rendered const sys = _oappToSystem(oapp); _addStarnetOapp(sys); added++; } if (added > 0) { renderTally(); renderTicker(); } return; // success — stop trying endpoints } catch { continue; } } } function _addStarnetOapp(s) { if (systemMeshes.some(m => m.userData.name === s.name)) return; const cfg = TYPE_CFG['oapp']; if (!cfg) return; const p = new THREE.Vector3(...s.pos); const glowMat = new THREE.SpriteMaterial({ color: cfg.color, transparent:true, opacity: cfg.glow, depthWrite:false }); const glow = new THREE.Sprite(glowMat); glow.scale.setScalar(cfg.size * 7.5); glow.position.copy(p); scene.add(glow); const geo = new THREE.SphereGeometry(cfg.size * 0.001, 8, 8); const mat = new THREE.MeshBasicMaterial({ color: cfg.color }); const mesh = new THREE.Mesh(geo, mat); mesh.position.copy(p); scene.add(mesh); const visualGeo = new THREE.SphereGeometry(cfg.size * 0.95, 16, 16); const visualMat = new THREE.MeshBasicMaterial({ color: cfg.color }); const visualMesh = new THREE.Mesh(visualGeo, visualMat); visualMesh.position.copy(p); scene.add(visualMesh); mesh.userData = { ...s, glow, visualMesh, _fromStarnet: true }; const div = document.createElement('div'); div.className = 'sys-label'; div.textContent = s.shortName || s.name; div.dataset.type = 'oapp'; document.getElementById('labels-overlay').appendChild(div); systemMeshes.push(mesh); labelDivs.push({ div, mesh }); _staticOappIds.add(s.oappId); } // Fetch STARNET OAPPs 2 seconds after page load (after the static scene is built) setTimeout(fetchStarnetOapps, 2000); // ── Mobile panel toggles ────────────────────────────────────────────────────── window.toggleMobFilter = function() { const fp = document.getElementById('filter-panel'); const btn = document.getElementById('mob-filter-btn'); const open = fp.classList.toggle('mob-open'); btn.classList.toggle('active', open); if (open) { document.getElementById('info-panel').classList.remove('mob-open'); document.getElementById('mob-info-btn').classList.remove('active'); } }; window.toggleMobInfo = function() { const ip = document.getElementById('info-panel'); const btn = document.getElementById('mob-info-btn'); const open = ip.classList.toggle('mob-open'); btn.classList.toggle('active', open); if (open) { document.getElementById('filter-panel').classList.remove('mob-open'); document.getElementById('mob-filter-btn').classList.remove('active'); } }; // Auto-open info panel when a system is tapped on mobile window._mobAutoOpenInfo = function() { if (window.innerWidth <= 768) { document.getElementById('info-panel').classList.add('mob-open'); document.getElementById('mob-info-btn').classList.add('active'); document.getElementById('filter-panel').classList.remove('mob-open'); document.getElementById('mob-filter-btn').classList.remove('active'); } };