{
  "schema": "leumas.docs.page/1",
  "id": "pkg:@leumas/livepools-web",
  "slug": "products/livepools-web",
  "kind": "capabilities",
  "bucket": "product",
  "title": "@leumas/livepools-web — Leumas LivePools, at livepools.leumas.tech",
  "name": "@leumas/livepools-web",
  "eyebrow": "Leumas LivePools, at livepools.leumas.tech",
  "chip": null,
  "summary": "Leumas LivePools at livepools.leumas.tech — put every live source you care about into one pool and read it as one real-time stream: in the browser, from the Fusion Node on your own machine, or from...",
  "keywords": [
    "livepools",
    "livepools.leumas.tech",
    "live pool",
    "real-time stream",
    "pool source",
    "livepools node"
  ],
  "audience": "both",
  "funnel": {
    "product": null,
    "cta": null
  },
  "body": "# @leumas/livepools-web — Leumas LivePools, at `livepools.leumas.tech`\n\nPut every live source you care about into one pool and read it as one real-time stream — in this\nbrowser, from the LivePools Node on your own machine, or from an application through `@leumas/livepools`.\n\n```\npnpm dev:livepools                          # vite on :5085, API proxied from :3000, /ws proxied too\npnpm --filter @leumas/livepools-web build   # vite → prerender → crawler files → check:livepools-public\npnpm check:livepools                        # the wiring invariants (+ --self-test)\npnpm check:livepools-public                 # every route indexed, or excluded with a reason\npnpm smoke:livepools                        # the MVP chain, headless, against a real API\npnpm smoke:livepools-site                   # the row through the real Imperium worker, /ws claimed\n```\n\n## The product, in one line\n\n```\nSOURCE ──-> observation ──-> POOL ──-> browser · @leumas/livepools · SSE · rules\n```\n\nEvery source becomes `{ id, pool, source, type, ts, data, meta }` (`@leumas/fusion-protocol`) and\nnothing downstream learns the transport. The browser is one consumer among several, not the product.\n\n## Where things are\n\n| | |\n|---|---|\n| `src/pages.js` | THE page table — router, sitemap, llms.txt, nav, prerender and the guard all read it |\n| `src/lib/live.js` | the page's one `/ws/livepools` socket: subscribe, publish, reconnect, re-subscribe |\n| `src/lib/bridge.js` | the browser sources: serial (Web Serial), camera + motion, microphone level, GPS, Bluetooth, this machine, a note |\n| `src/components/LiveView.jsx` | tiles for every field's current value per source, and the live log |\n| `src/screens/Pool.jsx` | Live · Sources · Rules · API (keys are minted here, plaintext shown once) |\n| `src/screens/Connect.jsx` | the bridge page — each source its own card with its own Start (user gestures) |\n| `shared/engines/fusion` | the engine: store, hub, controller, router, gateway |\n| `shared/packages/fusion-node` | the node runtime; `products/standalone/leumas-fusion-node` is its shell |\n| `shared/packages/fusion-client` | published as `@leumas/livepools` |\n\n## Traps this site keeps\n\n- **`/api` is a proxied prefix** — the docs page is `/docs`, never `/api`.\n- **Root assets are namespaced `fusion-`** — the apex build is mounted first on every host.\n- **`createRoot`, not `hydrateRoot`** — the prerendered article is not what React renders.\n- **A camera, a microphone or GPS never becomes public by default.** Every pool starts private.\n- **Every Start is a click.** Web Serial, the camera, the microphone and Web Bluetooth all need a\n  user gesture; a \"start everything\" button would open one and lose the rest.\n\n\n## [critical] Three surfaces, three different jobs\n\nThis is the rule new work here is held to, and it is what makes \"cinematic\" and \"instant\" compatible\ninstead of contradictory. Getting it backwards is the easiest mistake to make on this product,\nbecause every one of these is the same dark deck and looks like it wants the same treatment.\n\n| | job | treatment |\n|---|---|---|\n| `/`, `/pricing`, `/download`, `/enterprise` | **persuasion** — seen once or twice | Cinematic. May cost a little. Must never block first paint. |\n| `/connect`, the first pool | **the moment** — ninety seconds to a real reading | Warm and guided. It ends at a **live number**, not a success toast. |\n| `/pools`, `/pools/:id` | **the instrument** — opened forty times a day | Dense, fast, quiet, keyboard-first. **No decorative motion at all.** The only thing that moves is data. |\n\nConcretely:\n\n- `CinematicHero` and `PoolConstellation` are `lazy()`. The prerendered static hero is the LCP element\n  and is complete on its own. In the eager path they would tax every route — including the pool page\n  an operator lives in. `pnpm check:livepools-budget` asserts `lp-const__spoke` is in its **own**\n  chunk and not the entry.\n- **No entrance animation on a prerendered page.** The words are already on screen when React mounts;\n  fading them in means they were there and then were not. `Suspense` falls back to a reserved BOX.\n- `prefers-reduced-motion` is honoured everywhere, and nothing the picture *says* is lost when the\n  motion stops — which is the test of whether the motion was content or ornament.\n- `FirstReading` removes itself the instant an observation lands. The tiles are the success state;\n  putting a congratulation between somebody and the thing they came for is worse than saying nothing.\n\n## Guards\n\n```\npnpm check:livepools            # 18 invariant groups (+ --self-test)\npnpm check:livepools-public     # every route advertised, crawler files on disk\npnpm check:livepools-head       # JSON-LD parses; unique titles, descriptions, canonicals\npnpm check:livepools-budget     # a MARKER grep first, byte ceilings second\npnpm smoke:livepools            # 54 checks — the chain, quotas, CORS, webhooks, audit\npnpm smoke:livepools-realtime   # 35 checks — latency, gap replay, slow-consumer eviction, clocks\npnpm smoke:livepools-site       # the Imperium row, deep links, /ws claimed\n```\n",
  "source": {
    "path": "products/leumas-livepools/README.md",
    "blobSha": "",
    "commit": "",
    "committedAt": "",
    "provenance": "no-git",
    "bytes": 5280,
    "hash": "c64cbb134f64a2247e8ad48d15a9454d54a4cae1"
  },
  "urls": {
    "html": "/p/products/livepools-web",
    "json": "/docs/products/livepools-web.json",
    "md": "/docs/products/livepools-web.md"
  },
  "links": {
    "composes": [
      "pkg:@leumas/devices",
      "pkg:@leumas/leviathan",
      "pkg:@leumas/theme",
      "pkg:@leumas/ui"
    ],
    "usedBy": [],
    "product": [],
    "howTo": [],
    "skills": []
  },
  "exports": null
}
