{
  "schema": "fc-lang-ugrad-structure/v1",
  "product": "lang.ugrad.ai",
  "title": "Language // One Construct",
  "canonical": "https://lang.ugrad.ai/",
  "local": "http://127.0.0.1:8790/lang/",
  "updated": "2026-08-10",
  "purpose": "Multi-language stream hub: seats, LIVE MIX, peer 3-pane popups, STENO lab, typebar SEND/RECV, stream-with flayer, bandwidth, conversation turns.",
  "build_language": {
    "summary": "Static multi-page hub: Vanilla HTML5 + CSS3 custom properties + ES5-compatible browser JS (IIFE). No React/Vue/Svelte, no webpack/vite bundler for the hub.",
    "ui": "Vanilla HTML5 + CSS3 + ES5-compatible browser JavaScript (IIFE, no React/Vue/Svelte build step for the hub)",
    "languages": {
      "markup": "HTML5 (single-file hub + satellite pages)",
      "style": "CSS3 (custom properties --den*, data-density tiers, media queries)",
      "script": "JavaScript ES5-ish IIFE in browser (no TypeScript compile step for hub)",
      "optional_bridge": "Python 3 (lang-chat-bridge.py for SpaceXAI / OpenAI-compat / Ollama)",
      "deploy": "bash scripts/language/lang-site-deploy.sh \u2192 Cloudflare Pages (wrangler) + Worker proxy"
    },
    "module_style": "Single-page hub (index.html inline CSS+JS) + external scripts (lang-typebar.js, stream-stack-core.js)",
    "type": "static site \u00b7 Cloudflare Pages + Worker proxy \u00b7 local paper :8790",
    "no_bundler": true,
    "frameworks": "none on hub (lattice may use ECharts vendor)",
    "apis": [
      "BroadcastChannel (fc-language-streams)",
      "localStorage / sessionStorage",
      "getUserMedia (cam)",
      "Canvas 2D",
      "Fetch",
      "FileReader / clipboard paste images",
      "CSS content-visibility / density data attributes",
      "visualViewport resize (laptop browser chrome)",
      "pageshow bfcache soft refresh"
    ],
    "backend_optional": [
      "python3 scripts/language/lang-chat-bridge.py (SpaceXAI / OpenAI-compat / Ollama)",
      "POST /api/transcript (cast lower-thirds)",
      "~/.panda/packs language hotpipe JSON"
    ]
  },
  "repo_paths": {
    "hub": "experiments/memory-glass/pwa/lang/index.html",
    "typebar_js": "experiments/memory-glass/pwa/lang/lang-typebar.js",
    "typebar_css": "experiments/memory-glass/pwa/lang/lang-typebar.css",
    "chrome": "experiments/memory-glass/pwa/lang/lang-chrome.js|css",
    "stream_core": "experiments/memory-glass/pwa/stream-stack-core.js",
    "graph_hub": "experiments/memory-glass/pwa/lang-graph-hub.html",
    "lattice": "experiments/memory-glass/pwa/lang-lattice.html",
    "shadow": "experiments/memory-glass/pwa/lang-shadow-entity.html",
    "multiband": "experiments/memory-glass/pwa/multiband-glyph.html",
    "deploy_script": "scripts/language/lang-site-deploy.sh",
    "dist": "experiments/memory-glass/pwa/lang-dist/",
    "contracts": [
      "robots.txt",
      "sitemap.xml",
      "sitemap.json",
      "version.json",
      "structure.json",
      "/llms-language.txt",
      "/data/language/manifest.json",
      "/data/language/site-ops-map.json"
    ]
  },
  "runtime_globals": {
    "window.__fcLangPerf": "tier high|med|low \u00b7 safeguard \u00b7 cadence",
    "window.__fcLangDensity": "density roomy|cozy|compact|phone \u00b7 apply/cycle/auto",
    "window.__fcLangBuild": "version snapshot for agents",
    "window.__fcLangLandingSeats": "active seat codes",
    "window.__fcLangBandwidth": "KB/s pool \u00b7 designate",
    "window.__fcStenoLab": "maze \u00b7 home \u00b7 origin snapshot",
    "window.__fcLangStreamCompose": "open/close stream-with modal",
    "window.__fcStreamStack": "PIP/SPLIT/BLEND flayer API",
    "window.LangTypebar": "mount \u00b7 fanout \u00b7 openLane \u00b7 ingestImage",
    "window.__fcLangGraphHub": "on graph hub page \u00b7 probe \u00b7 traceroute \u00b7 governance",
    "window.__fcLangRoom": "room plane join/leave/sendTurn/sendState \u00b7 DO WS",
    "window.__fcLangRoomPlane": "hub wrapper \u00b7 lobby dual-write"
  },
  "layout_sections": {
    "header": "brand \u00b7 chat tools \u00b7 chat party \u00b7 LIVE MIX \u00b7 live presence pill \u00b7 density \u00b7 version \u00b7 seats",
    "under_header": "construct-bar ONE row \u00b7 PEERS / STENO / OPEN DESK collapse together \u00b7 __fcLangSections.construct",
    "main_land": "pin-rail | center world translate + bandwidth | turn-rail",
    "typebar": "fixed footer SEND | prompt | RECV \u00b7 TYPE tiers \u00b7 lane popup z=420 body",
    "modals": "peer-modal \u00b7 room-modal \u00b7 walk-modal \u00b7 stream-compose-modal \u00b7 tb-lane-pop",
    "boot": "walk-modal v3 \u00b7 Start|Map|Tools|More"
  },
  "density": {
    "auto": "measureWorkArea() = viewport \u2212 top-stack \u2212 typebar; tier from workH + w\u00d7h",
    "tiers": {
      "roomy": "large desktop \u00b7 workH\u2265520 \u00b7 readable air",
      "cozy": "default laptop (13\u201315\") \u00b7 readable type \u00b7 modest mix",
      "compact": "short work height only \u00b7 collapse STENO \u00b7 keep type ~0.96 (not crushed)",
      "phone": "w<720 \u00b7 single column"
    },
    "smart_scale": "applySmartScale sets continuous --den (0.9\u20131.08), --den-mix-h, --den-typebar-pad, --den-center-min from measured workH",
    "storage": "localStorage fc.lang.density (lock manual cycle; alt/\u2318-click pill = auto)",
    "api": "window.__fcLangDensity.apply|cycle|auto|measure|scaleApply|softRefresh",
    "css": "html[data-density=roomy|cozy|compact|phone] + continuous --den* vars",
    "refresh": "pageshow + visibility + visualViewport + ver-pill click + boot+80ms \u2192 softRefreshLayout() double-pass RAF"
  },
  "surfaces": {
    "/": "hub index.html",
    "/lang-graph-hub.html": "section graph \u00b7 speed \u00b7 site traceroute \u00b7 governance",
    "/lang-lattice.html": "composer \u00b7 organic \u00b7 bloch \u00b7 echarts",
    "/lang-shadow-entity.html": "living persona compose",
    "/multiband-glyph.html": "FC-STRIPE \u00b7 stenostrip crypto",
    "/stream-stack.html": "A+B flayer",
    "/lang-chat-desk.html": "full session desk"
  },
  "stack_z": [
    {
      "z": 0,
      "id": "glyph-field"
    },
    {
      "z": 1,
      "id": "shell"
    },
    {
      "z": 40,
      "id": "top-stack sticky"
    },
    {
      "z": 200,
      "id": "#lang-typebar overflow:hidden"
    },
    {
      "z": 300,
      "id": "peer-modal"
    },
    {
      "z": 320,
      "id": "walk/room-modal"
    },
    {
      "z": 420,
      "id": "#tb-lane-pop body"
    },
    {
      "z": 430,
      "id": "stream-compose-modal"
    }
  ],
  "signal_flow": [
    "prompt \u2192 SEND \u2192 MT/translate \u2192 BroadcastChannel \u2192 RECV/turns/mix/pins",
    "peer enlarge \u2192 3-pane glyph|feeds|quick send",
    "stream with \u2192 A base + B cam \u00b7 PIP/SPLIT/BLEND",
    "steno maze \u2192 isolate signal \u2192 home music/DDR only when detecting"
  ],
  "analyze_with_grok": {
    "prompt_hint": "Fetch https://lang.ugrad.ai/sitemap.json first (full routing map), then version.json + structure.json. Walk routes and hub_sections; open lang-graph-hub for live probe.",
    "key_files_to_read": [
      "https://lang.ugrad.ai/repo.html",
      "https://lang.ugrad.ai/repo-tree.txt",
      "https://lang.ugrad.ai/repo.json",
      "https://lang.ugrad.ai/sitemap.xml",
      "https://lang.ugrad.ai/sitemap.json",
      "https://lang.ugrad.ai/structure.json",
      "https://lang.ugrad.ai/version.json",
      "https://lang.ugrad.ai/llms-language.txt",
      "https://lang.ugrad.ai/data/language/manifest.json",
      "https://lang.ugrad.ai/data/language/site-ops-map.json",
      "https://lang.ugrad.ai/lang-typebar.js?v=1.17"
    ]
  },
  "boot_menu": {
    "version": "v3",
    "tabs": [
      "start",
      "map",
      "tools",
      "more"
    ],
    "default": "start",
    "primary_ctas": [
      "Enter live",
      "Stream with cam",
      "Chat desk"
    ],
    "storage": "fc.lang.walkthrough.seen.v3",
    "reopen": "pin rail Boot button \u00b7 openWalkthrough(true)",
    "purpose": "Plain-language load screen: Start cards first; Map for page zones; Tools for advanced rack; More for other pages"
  },
  "sitemap": {
    "json": "https://lang.ugrad.ai/sitemap.json",
    "xml": "https://lang.ugrad.ai/sitemap.xml",
    "robots": "https://lang.ugrad.ai/robots.txt",
    "schema": "fc-lang-ugrad-sitemap/v1",
    "purpose": "Full routing map for AI \u00b7 pages \u00b7 hashes \u00b7 contracts \u00b7 APIs"
  },
  "presence": {
    "hud": "#live-presence-pill \u00b7 LIVE N \u00b7 collab M",
    "api": "window.__fcLangPresence.snapshot|setName",
    "channel": "BroadcastChannel fc-lang-presence",
    "network": "POST/GET https://lang.ugrad.ai/api/presence",
    "ttl_s": 45,
    "glyph_field": "OFF by default \u00b7 localStorage fc.lang.glyphField=1 to enable"
  },
  "repo": {
    "html": "https://lang.ugrad.ai/repo.html",
    "json": "https://lang.ugrad.ai/repo.json",
    "tree": "https://lang.ugrad.ai/repo-tree.txt",
    "md": "https://lang.ugrad.ai/REPO.md",
    "schema": "fc-lang-ugrad-repo/v1"
  },
  "develec": {
    "atlas": "https://lang.ugrad.ai/sitemap.html",
    "engine": "develec-atlas.js",
    "layers": [
      "quantum-gutter",
      "prefixes",
      "dac",
      "gluelam",
      "iron-line",
      "steno-strip",
      "glyph-qr"
    ],
    "qr": "ugrad/qrcode-generator.js",
    "api": "window.__fcDevelecAtlas \u00b7 window.__fcLangSitemapAtlas",
    "qr_color": "anaglyph",
    "qr_heat": "magma",
    "qr_ref": "ugrad-arena.html?mode=glyph&color=anaglyph&heat=magma"
  },
  "room_plane": {
    "schema": "fc-lang-room-plane/v1",
    "ws": "wss://lang.ugrad.ai/api/room/:roomId",
    "client": "lang-room-client.js",
    "health": "/api/room-plane",
    "ai": "/api/ai",
    "r5": "in_progress"
  },
  "stack": {
    "room": "Durable Objects LangRoom \u00b7 lang-room-boot all surfaces",
    "scorecard": "sitemap.html#status-board",
    "alice_mt": "data/language/alice-mt-analysis/",
    "mt_max_chars": 12000,
    "max_peers_soft": 512
  },
  "apis": {
    "room": "/api/room/:id",
    "ai": "/api/ai",
    "sfu": "/api/sfu/ticket",
    "scorecard": "/data/language/scorecard.json"
  }
}
