prefix is a convention, not a requirement — it marks the variable as a\\nstore handle.\\n\\n## Read, write, subscribe\\n\\nThe handle has three author-facing methods.\\n\\n**`.get()`** — read the committed value. Same on both sides; the server reads\\nthe SSR render scope, the client reads the hydrated state:\\n\\n```ts\\n$title.get() // => 'Default title'\\n```\\n\\n**`.use(onChange?)`** — read it reactively. On the server it returns the\\ncommitted value directly (no hooks). On the client it's React state that\\nre-renders every reader when the value changes:\\n\\n```ts\\nconst title = $title.use() // re-renders on the client when set() runs\\n```\\n\\nThe optional `onChange` fires on the client when the value changes:\\n\\n```ts\\nconst title = $title.use((next) => console.log('title is now', next))\\n```\\n\\n> Client change detection is reference equality (`!==`). A _new but deeply\\n> equal_ object or array still triggers a client re-render. (Server\\n> stabilization uses deterministic serialization instead — see below.)\\n\\n**`.set(value)`** — write it. This is where server and client differ, and the\\ndifference is the whole point of `SsrStore`.\\n\\n## `.set` on the server: staged, not immediate\\n\\nOn the server, `.set` does **not** change the value for the current render. It\\n_stages_ the value. Between renders the SSR loop applies staged values\\n(`commitPending`) and re-renders until they stop changing — exactly like a React\\nstate setter never affects the render it's called in.\\n\\n```ts\\n// inside a server render scope:\\n$title.get() // => 'Default title'\\n$title.set('overridden')\\n$title.get() // => 'Default title' ← still the old value this pass\\n// ...the loop commits between passes, then:\\n$title.get() // => 'overridden' ← next pass sees it\\n```\\n\\nThis staging is what lets a layout pick up a page's override. The layout renders\\nfirst with the default; the page sets a new value; the loop commits it and\\nre-renders the whole tree, so the layout now reads the override. You always\\nwrite from inside a render or effect — use\\n[`useEffectSsr`](#useeffectssr-the-companion-hook), not module top-level.\\n\\nA `set` in a render that is never followed by another render is simply dropped —\\nso with `ssr.allowedRerendersCount: 0` (or at the soft cap) a final-pass `set`\\nnever reaches the HTML, keeping the markup and the transferred value consistent.\\n\\n## `.set` on the client: plain React state\\n\\nOn the client `.set` is a React state update — every reader through `.use`\\nre-renders immediately:\\n\\n```ts\\n$title.set('overridden')\\n$title.get() // => 'overridden' ← immediate on the client\\n```\\n\\nNo staging, no loop. Client and server share one API; only the timing differs.\\n\\n## How it transfers (dehydrate → hydrate)\\n\\nYou don't wire the transfer — it rides on the underlying store:\\n\\n1. **Server render** settles on the committed value.\\n2. At the end of the render, the store is serialized into an inline script in\\n the HTML (`window.__POINT0_DEHYDRATED_SUPER_STORE__`).\\n3. On boot, the client reads that script and hydrates the store **lazily** — the\\n value is decoded on its first read.\\n\\nOnly `SsrStore` values cross the wire; other store policies stay local:\\n\\n```ts\\nSsrStore.define('desc', () => 'default')\\n// ...elsewhere, a client-only store value:\\n// → only `desc` is in the dehydrated payload; the client-only value is not\\n```\\n\\nSerialization is deterministic JSON by default, so a `Date` survives only if you\\nconfigure a richer transformer (e.g. superjson) on the underlying store. The\\n`init` default and the transferred value are both plain by default.\\n\\nThere's no per-value serialization. Every value rides the one store transformer\\nshared by the whole app, which you set on the root with\\n[`.transformer`](transformer) (`.transformer(superjson)`).\\n\\n## The re-render loop and its caps\\n\\nThe headline behavior — a layout seeing a page's override — comes from the SSR\\nprefetch loop. It commits staged values at the start of each pass and re-renders\\nwhile anything is still pending, until the values stabilize. Two engine options\\nbound it (under `ssr` in [engine config](engine-config)):\\n\\n```ts\\nEngine.create({\\n // ...\\n ssr: {\\n allowedRerendersCount: Infinity, // soft budget — stop quietly when hit (default Infinity)\\n forbiddenRerendersCount: 25, // hard cap — stop AND log a server error (default 25)\\n },\\n})\\n```\\n\\n- **`allowedRerendersCount`** — soft budget. When reached the loop stops\\n quietly, no error, **without committing** the staged change. `0` or `1` opts\\n out of stabilization re-renders for performance.\\n- **`forbiddenRerendersCount`** — hard cap. Reaching it stops the loop **and**\\n logs a server error — the safety net for values that never stabilize:\\n\\n ```\\n SSR stores/cookies did not stabilize after 25 re-renders (forbiddenRerendersCount);\\n using the last render. Check for non-deterministic SsrStore or cookie values\\n (e.g. Date.now(), Math.random()).\\n ```\\n\\nStabilization compares staged vs committed by **deterministic serialization**,\\nso re-setting an equal value (even a freshly built object) ends the loop. A\\nnon-deterministic default or set — `Date.now()`, `Math.random()` — never\\nstabilizes and hits the hard cap.\\n\\nThe render count grows with the work: a default-only value settles in 1 render;\\na page overriding a layout default takes 2; add queries on both and a store-fed\\ndependent query and it climbs (4–5 passes). You don't manage this — it's why a\\nquery can feed an `SsrStore` whose value becomes the input of another query, and\\nboth end up prefetched.\\n\\n> To collapse this loop, warm the data up front in\\n> [`.onPrefetchPage`](../core/ssr#onprefetchpage) (runs server-side before the\\n> first render), or flip on `prefetchLoadersBeforePageRender` to prefetch the\\n> declared loaders automatically. Not specific to `SsrStore`; see [ssr](ssr).\\n\\n## `useEffectSsr`: the companion hook\\n\\nA normal `useEffect` does not run during SSR, so a `.set` inside one would never\\nreach the server render. `useEffectSsr` is the hook for an effect that must\\n_also_ run during SSR: on the server it runs synchronously during render (deps\\nignored, cleanup skipped); on the client it's a plain `useEffect`.\\n\\n```ts\\nuseEffectSsr(() => {\\n $title.set(idea.title)\\n}, [idea.title])\\n```\\n\\nThe production breadcrumb pattern in start0 shows the full shape — declare once,\\nwrite from a hook with a cleanup, read in a component:\\n\\n```tsx\\nimport { useEffectSsr } from '@point0/core'\\nimport { SsrStore } from '@point0/core/ssr-store'\\nimport stringify from 'safe-stable-stringify'\\n\\nexport const $breadcrumb = SsrStore.define\u003CBreadcrumbItem[]>(\\n 'breadcrumb',\\n () => [],\\n)\\n\\n// a page calls this to publish its breadcrumb\\nexport const useBreadcrumb = (...items: BreadcrumbItem[]) => {\\n useEffectSsr(() => {\\n $breadcrumb.set(items)\\n return () => $breadcrumb.set([]) // cleanup resets on the client (ignored during SSR)\\n }, [stringify(items)]) // serialized deps — a new array identity alone won't re-fire\\n}\\n\\n// the layout reads it reactively\\nconst storeItems = $breadcrumb.use()\\n```\\n\\nTwo details worth copying: the **serialized deps** (`[stringify(items)]`) avoid\\nre-firing on a new-but-equal array, and the **cleanup** resets the store on\\nunmount (it only matters on the client; SSR ignores cleanups).\\n\\n## When to use it — and when not\\n\\nUse `SsrStore` when a value computed _during render_ — usually deep in the tree,\\noften after a query resolves — must appear in an **ancestor's** SSR output and\\non the client before any JS recompute. Breadcrumbs, page title, page\\ndescription.\\n\\nIt is **optional**: if you don't need it, you don't import it.\\n\\nReach for [CookieStore](cookie-store) instead when the value must travel **both\\nways** (client → server too). The two APIs are deliberately parallel (`define` /\\n`get` / `set` / `use`), but a cookie is never dropped on the final render —\\nlosing one is worse than a hydration mismatch — whereas an `SsrStore` value _is_\\nintentionally dropped on a dropped final pass.\\n\\n## Gotchas\\n\\n- **Unique names.** `name` is the underlying store key; redefining the same name\\n overwrites. Use a clear, namespaced key.\\n- **No non-deterministic defaults or sets.** `Date.now()`, `Math.random()`, a\\n raw `new Date()` make the loop never stabilize → it hits\\n `forbiddenRerendersCount` and logs an error.\\n- **Write from render/effects, not module top-level.** Server `set` needs the\\n SSR render scope; in a real app the engine sets that up per request. Call\\n `set` from inside a component or `useEffectSsr`.\\n- **`init` is lazy.** The default isn't materialized until the first\\n `get`/`use`.\\n- **Client re-render on equal values.** `.use` change detection is reference\\n `!==`, so a new object that's deeply equal still re-renders on the client.\\n\\n## Reference\\n\\n### Import\\n\\n```ts\\nimport { SsrStore } from '@point0/core/ssr-store' // NOT from '@point0/core'\\nimport { useEffectSsr } from '@point0/core' // the companion hook IS in the barrel\\n```\\n\\n### `SsrStore.define`\\n\\n| Signature | Returns |\\n| ----------------------------------------------------------- | -------------------------------- |\\n| `SsrStore.define\u003CTValue>(name: string, init: () => TValue)` | an `SsrStoreItem\u003CTValue>` handle |\\n\\n`name` is the globally-unique key; `init` is the lazy server-side default.\\n\\n### Handle methods\\n\\n| Method | Server | Client |\\n| ----------------- | ------------------------------------------------ | --------------------------------------------------- |\\n| `.get()` | committed value from the SSR scope | committed value from hydrated state |\\n| `.set(value)` | **stages** — applied between renders by the loop | plain React state update; readers re-render |\\n| `.use(onChange?)` | committed value, synchronous (no hooks) | React state; re-renders on change; `onChange` fires |\\n| `.name` | the key passed to `define` | same |\\n\\n`SsrStore.hasPendingChanges()`, `SsrStore.commitPending()`, and the handle's\\n`getCommitted()` / `commit()` are server-lifecycle internals (the engine calls\\nthem) — not part of the author surface.\\n\\n### Engine `ssr` options (loop control)\\n\\n| Option | Default | Effect |\\n| --------------------------------- | ---------- | ---------------------------------------------------------------- |\\n| `allowedRerendersCount` | `Infinity` | soft budget; stop quietly when hit (staged change not committed) |\\n| `forbiddenRerendersCount` | `25` | hard cap; stop **and** log a server error |\\n| `prefetchLoadersBeforePageRender` | `false` | prefetch declared loaders up front to need fewer passes |\\n\\nFull SSR options live in [engine-config](engine-config) and [ssr](ssr).\",\"description\":\"A reactive value you set during the server render — the render settles on the final value and ships it to the client.\",\"example\":null,\"github\":\"https://github.com/1gr14/point0\",\"headings\":[{\"id\":\"declare-a-value\",\"level\":2,\"text\":\"Declare a value\"},{\"id\":\"read-write-subscribe\",\"level\":2,\"text\":\"Read, write, subscribe\"},{\"id\":\"set-on-the-server-staged-not-immediate\",\"level\":2,\"text\":\".set on the server: staged, not immediate\"},{\"id\":\"set-on-the-client-plain-react-state\",\"level\":2,\"text\":\".set on the client: plain React state\"},{\"id\":\"how-it-transfers-dehydrate--hydrate\",\"level\":2,\"text\":\"How it transfers (dehydrate → hydrate)\"},{\"id\":\"the-re-render-loop-and-its-caps\",\"level\":2,\"text\":\"The re-render loop and its caps\"},{\"id\":\"useeffectssr-the-companion-hook\",\"level\":2,\"text\":\"useEffectSsr: the companion hook\"},{\"id\":\"when-to-use-it--and-when-not\",\"level\":2,\"text\":\"When to use it — and when not\"},{\"id\":\"gotchas\",\"level\":2,\"text\":\"Gotchas\"},{\"id\":\"reference\",\"level\":2,\"text\":\"Reference\"},{\"id\":\"import\",\"level\":3,\"text\":\"Import\"},{\"id\":\"ssrstoredefine\",\"level\":3,\"text\":\"SsrStore.define\"},{\"id\":\"handle-methods\",\"level\":3,\"text\":\"Handle methods\"},{\"id\":\"engine-ssr-options-loop-control\",\"level\":3,\"text\":\"Engine ssr options (loop control)\"}],\"html\":\"\u003Cp>An \u003Ccode>SsrStore\u003C/code> is a piece of state you compute during the server render and want\\non the client too. The canonical case is \u003Cstrong>breadcrumbs\u003C/strong>: the trail lives in the\\nlayout's header, but only the page knows what to put in it — and often only\\n\u003Cem>after\u003C/em> a query resolves. You \u003Ccode>set\u003C/code> it deep in the tree (in the page), the SSR\\nrender settles on the final value, and that value is transferred to the client.\\nSSR-aware code up in the layout then reads it like ordinary state. The flow is\\none-way: server → client, never back.\u003C/p>\\n\u003Cdiv data-code-block class=\\\"group relative not-prose overflow-hidden rounded-md border border-border bg-muted/50\\\">\u003Cbutton type=\\\"button\\\" data-copy-code class=\\\"group/button inline-flex shrink-0 cursor-pointer items-center justify-center border border-transparent bg-clip-padding font-accent text-sm font-semibold whitespace-nowrap outline-none select-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 bg-secondary text-secondary-foreground hover:bg-secondary-hover aria-expanded:bg-secondary aria-expanded:text-secondary-foreground size-8 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-md absolute top-2 right-2 z-10 opacity-100 transition-opacity [@media(hover:hover)]:opacity-0 [@media(hover:hover)]:group-hover:opacity-100 [@media(hover:hover)]:focus-visible:opacity-100\\\" aria-label=\\\"Copy code\\\">\u003Cspan data-md-icon-idle>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-copy\\\" aria-hidden=\\\"true\\\">\u003Crect width=\\\"14\\\" height=\\\"14\\\" x=\\\"8\\\" y=\\\"8\\\" rx=\\\"2\\\" ry=\\\"2\\\">\u003C/rect>\u003Cpath d=\\\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\\\">\u003C/path>\u003C/svg>\u003C/span>\u003Cspan data-md-icon-done hidden>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-check\\\" aria-hidden=\\\"true\\\">\u003Cpath d=\\\"M20 6 9 17l-5-5\\\">\u003C/path>\u003C/svg>\u003C/span>\u003C/button>\u003Cdiv class=\\\"overflow-x-auto py-4 pl-4 max-sm:py-3 max-sm:pl-3\\\">\u003Cdiv class=\\\"language-tsx w-max pr-4 [@media(hover:none)]:pr-12 text-sm leading-[1.75] max-sm:text-xs max-sm:leading-[1.6]\\\">\u003Cpre class=\\\"shiki shiki-themes Gitpod Light Gitpod Dark\\\" style=\\\"background-color:transparent;--shiki-dark-bg:transparent;color:#000000;--shiki-dark:#d4d4d4\\\" tabindex=\\\"0\\\">\u003Ccode>\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#AF00DB;--shiki-dark:#C586C0\\\">import\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\"> { \u003C/span>\u003Cspan style=\\\"color:#001080;--shiki-dark:#9CDCFE\\\">SsrStore\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\"> } \u003C/span>\u003Cspan style=\\\"color:#AF00DB;--shiki-dark:#C586C0\\\">from\u003C/span>\u003Cspan style=\\\"color:#A31515;--shiki-dark:#CE9178\\\"> '@point0/core/ssr-store'\u003C/span>\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#008000;--shiki-dark:#6A9955\\\">// declared once, shared across the app\u003C/span>\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#AF00DB;--shiki-dark:#C586C0\\\">export\u003C/span>\u003Cspan style=\\\"color:#0000FF;--shiki-dark:#569CD6\\\"> const\u003C/span>\u003Cspan style=\\\"color:#0070C1;--shiki-dark:#4FC1FF\\\"> $breadcrumb\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\"> = \u003C/span>\u003Cspan style=\\\"color:#001080;--shiki-dark:#9CDCFE\\\">SsrStore\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">.\u003C/span>\u003Cspan style=\\\"color:#795E26;--shiki-dark:#DCDCAA\\\">define\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\"><\u003C/span>\u003Cspan style=\\\"color:#267F99;--shiki-dark:#4EC9B0\\\">BreadcrumbItem\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">[]>(\u003C/span>\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#A31515;--shiki-dark:#CE9178\\\"> 'breadcrumb'\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">,\u003C/span>\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\"> () \u003C/span>\u003Cspan style=\\\"color:#0000FF;--shiki-dark:#569CD6\\\">=>\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\"> [],\u003C/span>\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">)\u003C/span>\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#008000;--shiki-dark:#6A9955\\\">// in the layout's header, read it reactively\u003C/span>\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#0000FF;--shiki-dark:#569CD6\\\">const\u003C/span>\u003Cspan style=\\\"color:#0070C1;--shiki-dark:#4FC1FF\\\"> items\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\"> = \u003C/span>\u003Cspan style=\\\"color:#001080;--shiki-dark:#9CDCFE\\\">$breadcrumb\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">.\u003C/span>\u003Cspan style=\\\"color:#795E26;--shiki-dark:#DCDCAA\\\">use\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">()\u003C/span>\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#008000;--shiki-dark:#6A9955\\\">// in a page deeper in the tree, publish the trail during SSR after data loads\u003C/span>\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#795E26;--shiki-dark:#DCDCAA\\\">useEffectSsr\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">(() \u003C/span>\u003Cspan style=\\\"color:#0000FF;--shiki-dark:#569CD6\\\">=>\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\"> {\u003C/span>\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#001080;--shiki-dark:#9CDCFE\\\"> $breadcrumb\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">.\u003C/span>\u003Cspan style=\\\"color:#795E26;--shiki-dark:#DCDCAA\\\">set\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">([[\u003C/span>\u003Cspan style=\\\"color:#A31515;--shiki-dark:#CE9178\\\">'Ideas'\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">, \u003C/span>\u003Cspan style=\\\"color:#A31515;--shiki-dark:#CE9178\\\">'/ideas'\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">], [\u003C/span>\u003Cspan style=\\\"color:#001080;--shiki-dark:#9CDCFE\\\">idea\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">.\u003C/span>\u003Cspan style=\\\"color:#001080;--shiki-dark:#9CDCFE\\\">title\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">]])\u003C/span>\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">}, [\u003C/span>\u003Cspan style=\\\"color:#001080;--shiki-dark:#9CDCFE\\\">idea\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">.\u003C/span>\u003Cspan style=\\\"color:#001080;--shiki-dark:#9CDCFE\\\">title\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">])\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\u003C/div>\u003C/div>\u003C/div>\\n\u003Cp>The layout renders \u003Cem>above\u003C/em> the page, so on the first pass its header reads the\\nempty default. The page's \u003Ccode>.set\u003C/code> stages the real trail; the SSR loop commits it\\nand re-renders, so the layout's header ends up showing the page's breadcrumbs —\\nin the HTML and on the client.\u003C/p>\\n\u003Cblockquote>\\n\u003Cp>Import from the subpath \u003Ccode>@point0/core/ssr-store\u003C/code> — \u003Ccode>SsrStore\u003C/code> is \u003Cstrong>not\u003C/strong> in\\nthe \u003Ccode>@point0/core\u003C/code> barrel. \u003Ccode>useEffectSsr\u003C/code> is\\n(\u003Ccode>import { useEffectSsr } from '@point0/core'\u003C/code>).\u003C/p>\\n\u003C/blockquote>\\n\u003Ch2 id=\\\"declare-a-value\\\">Declare a value\u003Ca data-heading-anchor class=\\\"heading-anchor text-link dark:text-foreground hover:text-link-hover hover:dark:text-link-hover cursor-pointer p-1 flex items-center justify-center\\\" href=\\\"#declare-a-value\\\" aria-label=\\\"Copy link to this heading\\\">\u003Cspan data-md-icon-idle>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"20\\\" height=\\\"20\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-link\\\" aria-hidden=\\\"true\\\">\u003Cpath d=\\\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\\\">\u003C/path>\u003Cpath d=\\\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\\\">\u003C/path>\u003C/svg>\u003C/span>\u003Cspan data-md-icon-done hidden>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"20\\\" height=\\\"20\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-check\\\" aria-hidden=\\\"true\\\">\u003Cpath d=\\\"M20 6 9 17l-5-5\\\">\u003C/path>\u003C/svg>\u003C/span>\u003C/a>\u003C/h2>\\n\u003Cp>\u003Ccode>SsrStore.define(name, init)\u003C/code> declares one value and returns a handle:\u003C/p>\\n\u003Cdiv data-code-block class=\\\"group relative not-prose overflow-hidden rounded-md border border-border bg-muted/50\\\">\u003Cbutton type=\\\"button\\\" data-copy-code class=\\\"group/button inline-flex shrink-0 cursor-pointer items-center justify-center border border-transparent bg-clip-padding font-accent text-sm font-semibold whitespace-nowrap outline-none select-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 bg-secondary text-secondary-foreground hover:bg-secondary-hover aria-expanded:bg-secondary aria-expanded:text-secondary-foreground size-8 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-md absolute top-2 right-2 z-10 opacity-100 transition-opacity [@media(hover:hover)]:opacity-0 [@media(hover:hover)]:group-hover:opacity-100 [@media(hover:hover)]:focus-visible:opacity-100\\\" aria-label=\\\"Copy code\\\">\u003Cspan data-md-icon-idle>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-copy\\\" aria-hidden=\\\"true\\\">\u003Crect width=\\\"14\\\" height=\\\"14\\\" x=\\\"8\\\" y=\\\"8\\\" rx=\\\"2\\\" ry=\\\"2\\\">\u003C/rect>\u003Cpath d=\\\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\\\">\u003C/path>\u003C/svg>\u003C/span>\u003Cspan data-md-icon-done hidden>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-check\\\" aria-hidden=\\\"true\\\">\u003Cpath d=\\\"M20 6 9 17l-5-5\\\">\u003C/path>\u003C/svg>\u003C/span>\u003C/button>\u003Cdiv class=\\\"overflow-x-auto py-4 pl-4 max-sm:py-3 max-sm:pl-3\\\">\u003Cdiv class=\\\"language-ts w-max pr-4 [@media(hover:none)]:pr-12 text-sm leading-[1.75] max-sm:text-xs max-sm:leading-[1.6]\\\">\u003Cpre class=\\\"shiki shiki-themes Gitpod Light Gitpod Dark\\\" style=\\\"background-color:transparent;--shiki-dark-bg:transparent;color:#000000;--shiki-dark:#d4d4d4\\\" tabindex=\\\"0\\\">\u003Ccode>\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#AF00DB;--shiki-dark:#C586C0\\\">export\u003C/span>\u003Cspan style=\\\"color:#0000FF;--shiki-dark:#569CD6\\\"> const\u003C/span>\u003Cspan style=\\\"color:#0070C1;--shiki-dark:#4FC1FF\\\"> $title\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\"> = \u003C/span>\u003Cspan style=\\\"color:#001080;--shiki-dark:#9CDCFE\\\">SsrStore\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">.\u003C/span>\u003Cspan style=\\\"color:#795E26;--shiki-dark:#DCDCAA\\\">define\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">(\u003C/span>\u003Cspan style=\\\"color:#A31515;--shiki-dark:#CE9178\\\">'page.title'\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">, () \u003C/span>\u003Cspan style=\\\"color:#0000FF;--shiki-dark:#569CD6\\\">=>\u003C/span>\u003Cspan style=\\\"color:#A31515;--shiki-dark:#CE9178\\\"> 'Default title'\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">)\u003C/span>\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#008000;--shiki-dark:#6A9955\\\">// └ handle └ globally unique key └ lazy default, called on first read\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\u003C/div>\u003C/div>\u003C/div>\\n\u003Cul>\\n\u003Cli>\u003Ccode>name\u003C/code> is a \u003Cstrong>globally unique\u003C/strong> key — it's the underlying store item's name,\\nso two \u003Ccode>define\u003C/code>s with the same name collide.\u003C/li>\\n\u003Cli>\u003Ccode>init\u003C/code> produces the server-side default. It's \u003Cstrong>lazy\u003C/strong>: called on first\\naccess, not at \u003Ccode>define\u003C/code> time.\u003C/li>\\n\u003C/ul>\\n\u003Cp>Pass the value type explicitly when the default doesn't pin it down:\u003C/p>\\n\u003Cdiv data-code-block class=\\\"group relative not-prose overflow-hidden rounded-md border border-border bg-muted/50\\\">\u003Cbutton type=\\\"button\\\" data-copy-code class=\\\"group/button inline-flex shrink-0 cursor-pointer items-center justify-center border border-transparent bg-clip-padding font-accent text-sm font-semibold whitespace-nowrap outline-none select-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 bg-secondary text-secondary-foreground hover:bg-secondary-hover aria-expanded:bg-secondary aria-expanded:text-secondary-foreground size-8 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-md absolute top-2 right-2 z-10 opacity-100 transition-opacity [@media(hover:hover)]:opacity-0 [@media(hover:hover)]:group-hover:opacity-100 [@media(hover:hover)]:focus-visible:opacity-100\\\" aria-label=\\\"Copy code\\\">\u003Cspan data-md-icon-idle>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-copy\\\" aria-hidden=\\\"true\\\">\u003Crect width=\\\"14\\\" height=\\\"14\\\" x=\\\"8\\\" y=\\\"8\\\" rx=\\\"2\\\" ry=\\\"2\\\">\u003C/rect>\u003Cpath d=\\\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\\\">\u003C/path>\u003C/svg>\u003C/span>\u003Cspan data-md-icon-done hidden>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-check\\\" aria-hidden=\\\"true\\\">\u003Cpath d=\\\"M20 6 9 17l-5-5\\\">\u003C/path>\u003C/svg>\u003C/span>\u003C/button>\u003Cdiv class=\\\"overflow-x-auto py-4 pl-4 max-sm:py-3 max-sm:pl-3\\\">\u003Cdiv class=\\\"language-ts w-max pr-4 [@media(hover:none)]:pr-12 text-sm leading-[1.75] max-sm:text-xs max-sm:leading-[1.6]\\\">\u003Cpre class=\\\"shiki shiki-themes Gitpod Light Gitpod Dark\\\" style=\\\"background-color:transparent;--shiki-dark-bg:transparent;color:#000000;--shiki-dark:#d4d4d4\\\" tabindex=\\\"0\\\">\u003Ccode>\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#0000FF;--shiki-dark:#569CD6\\\">const\u003C/span>\u003Cspan style=\\\"color:#0070C1;--shiki-dark:#4FC1FF\\\"> $breadcrumb\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\"> = \u003C/span>\u003Cspan style=\\\"color:#001080;--shiki-dark:#9CDCFE\\\">SsrStore\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">.\u003C/span>\u003Cspan style=\\\"color:#795E26;--shiki-dark:#DCDCAA\\\">define\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\"><\u003C/span>\u003Cspan style=\\\"color:#267F99;--shiki-dark:#4EC9B0\\\">BreadcrumbItem\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">[]>(\u003C/span>\u003Cspan style=\\\"color:#A31515;--shiki-dark:#CE9178\\\">'breadcrumb'\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">, () \u003C/span>\u003Cspan style=\\\"color:#0000FF;--shiki-dark:#569CD6\\\">=>\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\"> [])\u003C/span>\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#0000FF;--shiki-dark:#569CD6\\\">const\u003C/span>\u003Cspan style=\\\"color:#0070C1;--shiki-dark:#4FC1FF\\\"> $count\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\"> = \u003C/span>\u003Cspan style=\\\"color:#001080;--shiki-dark:#9CDCFE\\\">SsrStore\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">.\u003C/span>\u003Cspan style=\\\"color:#795E26;--shiki-dark:#DCDCAA\\\">define\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\"><\u003C/span>\u003Cspan style=\\\"color:#267F99;--shiki-dark:#4EC9B0\\\">number\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">>(\u003C/span>\u003Cspan style=\\\"color:#A31515;--shiki-dark:#CE9178\\\">'count'\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">, () \u003C/span>\u003Cspan style=\\\"color:#0000FF;--shiki-dark:#569CD6\\\">=>\u003C/span>\u003Cspan style=\\\"color:#098658;--shiki-dark:#B5CEA8\\\"> 0\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">)\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\u003C/div>\u003C/div>\u003C/div>\\n\u003Cp>The \u003Ccode>$\u003C/code> prefix is a convention, not a requirement — it marks the variable as a\\nstore handle.\u003C/p>\\n\u003Ch2 id=\\\"read-write-subscribe\\\">Read, write, subscribe\u003Ca data-heading-anchor class=\\\"heading-anchor text-link dark:text-foreground hover:text-link-hover hover:dark:text-link-hover cursor-pointer p-1 flex items-center justify-center\\\" href=\\\"#read-write-subscribe\\\" aria-label=\\\"Copy link to this heading\\\">\u003Cspan data-md-icon-idle>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"20\\\" height=\\\"20\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-link\\\" aria-hidden=\\\"true\\\">\u003Cpath d=\\\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\\\">\u003C/path>\u003Cpath d=\\\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\\\">\u003C/path>\u003C/svg>\u003C/span>\u003Cspan data-md-icon-done hidden>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"20\\\" height=\\\"20\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-check\\\" aria-hidden=\\\"true\\\">\u003Cpath d=\\\"M20 6 9 17l-5-5\\\">\u003C/path>\u003C/svg>\u003C/span>\u003C/a>\u003C/h2>\\n\u003Cp>The handle has three author-facing methods.\u003C/p>\\n\u003Cp>\u003Cstrong>\u003Ccode>.get()\u003C/code>\u003C/strong> — read the committed value. Same on both sides; the server reads\\nthe SSR render scope, the client reads the hydrated state:\u003C/p>\\n\u003Cdiv data-code-block class=\\\"group relative not-prose overflow-hidden rounded-md border border-border bg-muted/50\\\">\u003Cbutton type=\\\"button\\\" data-copy-code class=\\\"group/button inline-flex shrink-0 cursor-pointer items-center justify-center border border-transparent bg-clip-padding font-accent text-sm font-semibold whitespace-nowrap outline-none select-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 bg-secondary text-secondary-foreground hover:bg-secondary-hover aria-expanded:bg-secondary aria-expanded:text-secondary-foreground size-8 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-md absolute top-2 right-2 z-10 opacity-100 transition-opacity [@media(hover:hover)]:opacity-0 [@media(hover:hover)]:group-hover:opacity-100 [@media(hover:hover)]:focus-visible:opacity-100\\\" aria-label=\\\"Copy code\\\">\u003Cspan data-md-icon-idle>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-copy\\\" aria-hidden=\\\"true\\\">\u003Crect width=\\\"14\\\" height=\\\"14\\\" x=\\\"8\\\" y=\\\"8\\\" rx=\\\"2\\\" ry=\\\"2\\\">\u003C/rect>\u003Cpath d=\\\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\\\">\u003C/path>\u003C/svg>\u003C/span>\u003Cspan data-md-icon-done hidden>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-check\\\" aria-hidden=\\\"true\\\">\u003Cpath d=\\\"M20 6 9 17l-5-5\\\">\u003C/path>\u003C/svg>\u003C/span>\u003C/button>\u003Cdiv class=\\\"overflow-x-auto py-4 pl-4 max-sm:py-3 max-sm:pl-3\\\">\u003Cdiv class=\\\"language-ts w-max pr-4 [@media(hover:none)]:pr-12 text-sm leading-[1.75] max-sm:text-xs max-sm:leading-[1.6]\\\">\u003Cpre class=\\\"shiki shiki-themes Gitpod Light Gitpod Dark\\\" style=\\\"background-color:transparent;--shiki-dark-bg:transparent;color:#000000;--shiki-dark:#d4d4d4\\\" tabindex=\\\"0\\\">\u003Ccode>\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#001080;--shiki-dark:#9CDCFE\\\">$title\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">.\u003C/span>\u003Cspan style=\\\"color:#795E26;--shiki-dark:#DCDCAA\\\">get\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">() \u003C/span>\u003Cspan style=\\\"color:#008000;--shiki-dark:#6A9955\\\">// => 'Default title'\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\u003C/div>\u003C/div>\u003C/div>\\n\u003Cp>\u003Cstrong>\u003Ccode>.use(onChange?)\u003C/code>\u003C/strong> — read it reactively. On the server it returns the\\ncommitted value directly (no hooks). On the client it's React state that\\nre-renders every reader when the value changes:\u003C/p>\\n\u003Cdiv data-code-block class=\\\"group relative not-prose overflow-hidden rounded-md border border-border bg-muted/50\\\">\u003Cbutton type=\\\"button\\\" data-copy-code class=\\\"group/button inline-flex shrink-0 cursor-pointer items-center justify-center border border-transparent bg-clip-padding font-accent text-sm font-semibold whitespace-nowrap outline-none select-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 bg-secondary text-secondary-foreground hover:bg-secondary-hover aria-expanded:bg-secondary aria-expanded:text-secondary-foreground size-8 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-md absolute top-2 right-2 z-10 opacity-100 transition-opacity [@media(hover:hover)]:opacity-0 [@media(hover:hover)]:group-hover:opacity-100 [@media(hover:hover)]:focus-visible:opacity-100\\\" aria-label=\\\"Copy code\\\">\u003Cspan data-md-icon-idle>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-copy\\\" aria-hidden=\\\"true\\\">\u003Crect width=\\\"14\\\" height=\\\"14\\\" x=\\\"8\\\" y=\\\"8\\\" rx=\\\"2\\\" ry=\\\"2\\\">\u003C/rect>\u003Cpath d=\\\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\\\">\u003C/path>\u003C/svg>\u003C/span>\u003Cspan data-md-icon-done hidden>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-check\\\" aria-hidden=\\\"true\\\">\u003Cpath d=\\\"M20 6 9 17l-5-5\\\">\u003C/path>\u003C/svg>\u003C/span>\u003C/button>\u003Cdiv class=\\\"overflow-x-auto py-4 pl-4 max-sm:py-3 max-sm:pl-3\\\">\u003Cdiv class=\\\"language-ts w-max pr-4 [@media(hover:none)]:pr-12 text-sm leading-[1.75] max-sm:text-xs max-sm:leading-[1.6]\\\">\u003Cpre class=\\\"shiki shiki-themes Gitpod Light Gitpod Dark\\\" style=\\\"background-color:transparent;--shiki-dark-bg:transparent;color:#000000;--shiki-dark:#d4d4d4\\\" tabindex=\\\"0\\\">\u003Ccode>\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#0000FF;--shiki-dark:#569CD6\\\">const\u003C/span>\u003Cspan style=\\\"color:#0070C1;--shiki-dark:#4FC1FF\\\"> title\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\"> = \u003C/span>\u003Cspan style=\\\"color:#001080;--shiki-dark:#9CDCFE\\\">$title\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">.\u003C/span>\u003Cspan style=\\\"color:#795E26;--shiki-dark:#DCDCAA\\\">use\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">() \u003C/span>\u003Cspan style=\\\"color:#008000;--shiki-dark:#6A9955\\\">// re-renders on the client when set() runs\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\u003C/div>\u003C/div>\u003C/div>\\n\u003Cp>The optional \u003Ccode>onChange\u003C/code> fires on the client when the value changes:\u003C/p>\\n\u003Cdiv data-code-block class=\\\"group relative not-prose overflow-hidden rounded-md border border-border bg-muted/50\\\">\u003Cbutton type=\\\"button\\\" data-copy-code class=\\\"group/button inline-flex shrink-0 cursor-pointer items-center justify-center border border-transparent bg-clip-padding font-accent text-sm font-semibold whitespace-nowrap outline-none select-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 bg-secondary text-secondary-foreground hover:bg-secondary-hover aria-expanded:bg-secondary aria-expanded:text-secondary-foreground size-8 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-md absolute top-2 right-2 z-10 opacity-100 transition-opacity [@media(hover:hover)]:opacity-0 [@media(hover:hover)]:group-hover:opacity-100 [@media(hover:hover)]:focus-visible:opacity-100\\\" aria-label=\\\"Copy code\\\">\u003Cspan data-md-icon-idle>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-copy\\\" aria-hidden=\\\"true\\\">\u003Crect width=\\\"14\\\" height=\\\"14\\\" x=\\\"8\\\" y=\\\"8\\\" rx=\\\"2\\\" ry=\\\"2\\\">\u003C/rect>\u003Cpath d=\\\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\\\">\u003C/path>\u003C/svg>\u003C/span>\u003Cspan data-md-icon-done hidden>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-check\\\" aria-hidden=\\\"true\\\">\u003Cpath d=\\\"M20 6 9 17l-5-5\\\">\u003C/path>\u003C/svg>\u003C/span>\u003C/button>\u003Cdiv class=\\\"overflow-x-auto py-4 pl-4 max-sm:py-3 max-sm:pl-3\\\">\u003Cdiv class=\\\"language-ts w-max pr-4 [@media(hover:none)]:pr-12 text-sm leading-[1.75] max-sm:text-xs max-sm:leading-[1.6]\\\">\u003Cpre class=\\\"shiki shiki-themes Gitpod Light Gitpod Dark\\\" style=\\\"background-color:transparent;--shiki-dark-bg:transparent;color:#000000;--shiki-dark:#d4d4d4\\\" tabindex=\\\"0\\\">\u003Ccode>\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#0000FF;--shiki-dark:#569CD6\\\">const\u003C/span>\u003Cspan style=\\\"color:#0070C1;--shiki-dark:#4FC1FF\\\"> title\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\"> = \u003C/span>\u003Cspan style=\\\"color:#001080;--shiki-dark:#9CDCFE\\\">$title\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">.\u003C/span>\u003Cspan style=\\\"color:#795E26;--shiki-dark:#DCDCAA\\\">use\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">((\u003C/span>\u003Cspan style=\\\"color:#001080;--shiki-dark:#9CDCFE\\\">next\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">) \u003C/span>\u003Cspan style=\\\"color:#0000FF;--shiki-dark:#569CD6\\\">=>\u003C/span>\u003Cspan style=\\\"color:#001080;--shiki-dark:#9CDCFE\\\"> console\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">.\u003C/span>\u003Cspan style=\\\"color:#795E26;--shiki-dark:#DCDCAA\\\">log\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">(\u003C/span>\u003Cspan style=\\\"color:#A31515;--shiki-dark:#CE9178\\\">'title is now'\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">, \u003C/span>\u003Cspan style=\\\"color:#001080;--shiki-dark:#9CDCFE\\\">next\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">))\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\u003C/div>\u003C/div>\u003C/div>\\n\u003Cblockquote>\\n\u003Cp>Client change detection is reference equality (\u003Ccode>!==\u003C/code>). A \u003Cem>new but deeply\\nequal\u003C/em> object or array still triggers a client re-render. (Server\\nstabilization uses deterministic serialization instead — see below.)\u003C/p>\\n\u003C/blockquote>\\n\u003Cp>\u003Cstrong>\u003Ccode>.set(value)\u003C/code>\u003C/strong> — write it. This is where server and client differ, and the\\ndifference is the whole point of \u003Ccode>SsrStore\u003C/code>.\u003C/p>\\n\u003Ch2 id=\\\"set-on-the-server-staged-not-immediate\\\">\u003Ccode>.set\u003C/code> on the server: staged, not immediate\u003Ca data-heading-anchor class=\\\"heading-anchor text-link dark:text-foreground hover:text-link-hover hover:dark:text-link-hover cursor-pointer p-1 flex items-center justify-center\\\" href=\\\"#set-on-the-server-staged-not-immediate\\\" aria-label=\\\"Copy link to this heading\\\">\u003Cspan data-md-icon-idle>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"20\\\" height=\\\"20\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-link\\\" aria-hidden=\\\"true\\\">\u003Cpath d=\\\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\\\">\u003C/path>\u003Cpath d=\\\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\\\">\u003C/path>\u003C/svg>\u003C/span>\u003Cspan data-md-icon-done hidden>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"20\\\" height=\\\"20\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-check\\\" aria-hidden=\\\"true\\\">\u003Cpath d=\\\"M20 6 9 17l-5-5\\\">\u003C/path>\u003C/svg>\u003C/span>\u003C/a>\u003C/h2>\\n\u003Cp>On the server, \u003Ccode>.set\u003C/code> does \u003Cstrong>not\u003C/strong> change the value for the current render. It\\n\u003Cem>stages\u003C/em> the value. Between renders the SSR loop applies staged values\\n(\u003Ccode>commitPending\u003C/code>) and re-renders until they stop changing — exactly like a React\\nstate setter never affects the render it's called in.\u003C/p>\\n\u003Cdiv data-code-block class=\\\"group relative not-prose overflow-hidden rounded-md border border-border bg-muted/50\\\">\u003Cbutton type=\\\"button\\\" data-copy-code class=\\\"group/button inline-flex shrink-0 cursor-pointer items-center justify-center border border-transparent bg-clip-padding font-accent text-sm font-semibold whitespace-nowrap outline-none select-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 bg-secondary text-secondary-foreground hover:bg-secondary-hover aria-expanded:bg-secondary aria-expanded:text-secondary-foreground size-8 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-md absolute top-2 right-2 z-10 opacity-100 transition-opacity [@media(hover:hover)]:opacity-0 [@media(hover:hover)]:group-hover:opacity-100 [@media(hover:hover)]:focus-visible:opacity-100\\\" aria-label=\\\"Copy code\\\">\u003Cspan data-md-icon-idle>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-copy\\\" aria-hidden=\\\"true\\\">\u003Crect width=\\\"14\\\" height=\\\"14\\\" x=\\\"8\\\" y=\\\"8\\\" rx=\\\"2\\\" ry=\\\"2\\\">\u003C/rect>\u003Cpath d=\\\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\\\">\u003C/path>\u003C/svg>\u003C/span>\u003Cspan data-md-icon-done hidden>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-check\\\" aria-hidden=\\\"true\\\">\u003Cpath d=\\\"M20 6 9 17l-5-5\\\">\u003C/path>\u003C/svg>\u003C/span>\u003C/button>\u003Cdiv class=\\\"overflow-x-auto py-4 pl-4 max-sm:py-3 max-sm:pl-3\\\">\u003Cdiv class=\\\"language-ts w-max pr-4 [@media(hover:none)]:pr-12 text-sm leading-[1.75] max-sm:text-xs max-sm:leading-[1.6]\\\">\u003Cpre class=\\\"shiki shiki-themes Gitpod Light Gitpod Dark\\\" style=\\\"background-color:transparent;--shiki-dark-bg:transparent;color:#000000;--shiki-dark:#d4d4d4\\\" tabindex=\\\"0\\\">\u003Ccode>\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#008000;--shiki-dark:#6A9955\\\">// inside a server render scope:\u003C/span>\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#001080;--shiki-dark:#9CDCFE\\\">$title\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">.\u003C/span>\u003Cspan style=\\\"color:#795E26;--shiki-dark:#DCDCAA\\\">get\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">() \u003C/span>\u003Cspan style=\\\"color:#008000;--shiki-dark:#6A9955\\\">// => 'Default title'\u003C/span>\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#001080;--shiki-dark:#9CDCFE\\\">$title\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">.\u003C/span>\u003Cspan style=\\\"color:#795E26;--shiki-dark:#DCDCAA\\\">set\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">(\u003C/span>\u003Cspan style=\\\"color:#A31515;--shiki-dark:#CE9178\\\">'overridden'\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">)\u003C/span>\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#001080;--shiki-dark:#9CDCFE\\\">$title\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">.\u003C/span>\u003Cspan style=\\\"color:#795E26;--shiki-dark:#DCDCAA\\\">get\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">() \u003C/span>\u003Cspan style=\\\"color:#008000;--shiki-dark:#6A9955\\\">// => 'Default title' ← still the old value this pass\u003C/span>\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#008000;--shiki-dark:#6A9955\\\">// ...the loop commits between passes, then:\u003C/span>\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#001080;--shiki-dark:#9CDCFE\\\">$title\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">.\u003C/span>\u003Cspan style=\\\"color:#795E26;--shiki-dark:#DCDCAA\\\">get\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">() \u003C/span>\u003Cspan style=\\\"color:#008000;--shiki-dark:#6A9955\\\">// => 'overridden' ← next pass sees it\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\u003C/div>\u003C/div>\u003C/div>\\n\u003Cp>This staging is what lets a layout pick up a page's override. The layout renders\\nfirst with the default; the page sets a new value; the loop commits it and\\nre-renders the whole tree, so the layout now reads the override. You always\\nwrite from inside a render or effect — use\\n\u003Ca href=\\\"#useeffectssr-the-companion-hook\\\">\u003Ccode>useEffectSsr\u003C/code>\u003C/a>, not module top-level.\u003C/p>\\n\u003Cp>A \u003Ccode>set\u003C/code> in a render that is never followed by another render is simply dropped —\\nso with \u003Ccode>ssr.allowedRerendersCount: 0\u003C/code> (or at the soft cap) a final-pass \u003Ccode>set\u003C/code>\\nnever reaches the HTML, keeping the markup and the transferred value consistent.\u003C/p>\\n\u003Ch2 id=\\\"set-on-the-client-plain-react-state\\\">\u003Ccode>.set\u003C/code> on the client: plain React state\u003Ca data-heading-anchor class=\\\"heading-anchor text-link dark:text-foreground hover:text-link-hover hover:dark:text-link-hover cursor-pointer p-1 flex items-center justify-center\\\" href=\\\"#set-on-the-client-plain-react-state\\\" aria-label=\\\"Copy link to this heading\\\">\u003Cspan data-md-icon-idle>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"20\\\" height=\\\"20\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-link\\\" aria-hidden=\\\"true\\\">\u003Cpath d=\\\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\\\">\u003C/path>\u003Cpath d=\\\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\\\">\u003C/path>\u003C/svg>\u003C/span>\u003Cspan data-md-icon-done hidden>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"20\\\" height=\\\"20\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-check\\\" aria-hidden=\\\"true\\\">\u003Cpath d=\\\"M20 6 9 17l-5-5\\\">\u003C/path>\u003C/svg>\u003C/span>\u003C/a>\u003C/h2>\\n\u003Cp>On the client \u003Ccode>.set\u003C/code> is a React state update — every reader through \u003Ccode>.use\u003C/code>\\nre-renders immediately:\u003C/p>\\n\u003Cdiv data-code-block class=\\\"group relative not-prose overflow-hidden rounded-md border border-border bg-muted/50\\\">\u003Cbutton type=\\\"button\\\" data-copy-code class=\\\"group/button inline-flex shrink-0 cursor-pointer items-center justify-center border border-transparent bg-clip-padding font-accent text-sm font-semibold whitespace-nowrap outline-none select-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 bg-secondary text-secondary-foreground hover:bg-secondary-hover aria-expanded:bg-secondary aria-expanded:text-secondary-foreground size-8 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-md absolute top-2 right-2 z-10 opacity-100 transition-opacity [@media(hover:hover)]:opacity-0 [@media(hover:hover)]:group-hover:opacity-100 [@media(hover:hover)]:focus-visible:opacity-100\\\" aria-label=\\\"Copy code\\\">\u003Cspan data-md-icon-idle>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-copy\\\" aria-hidden=\\\"true\\\">\u003Crect width=\\\"14\\\" height=\\\"14\\\" x=\\\"8\\\" y=\\\"8\\\" rx=\\\"2\\\" ry=\\\"2\\\">\u003C/rect>\u003Cpath d=\\\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\\\">\u003C/path>\u003C/svg>\u003C/span>\u003Cspan data-md-icon-done hidden>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-check\\\" aria-hidden=\\\"true\\\">\u003Cpath d=\\\"M20 6 9 17l-5-5\\\">\u003C/path>\u003C/svg>\u003C/span>\u003C/button>\u003Cdiv class=\\\"overflow-x-auto py-4 pl-4 max-sm:py-3 max-sm:pl-3\\\">\u003Cdiv class=\\\"language-ts w-max pr-4 [@media(hover:none)]:pr-12 text-sm leading-[1.75] max-sm:text-xs max-sm:leading-[1.6]\\\">\u003Cpre class=\\\"shiki shiki-themes Gitpod Light Gitpod Dark\\\" style=\\\"background-color:transparent;--shiki-dark-bg:transparent;color:#000000;--shiki-dark:#d4d4d4\\\" tabindex=\\\"0\\\">\u003Ccode>\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#001080;--shiki-dark:#9CDCFE\\\">$title\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">.\u003C/span>\u003Cspan style=\\\"color:#795E26;--shiki-dark:#DCDCAA\\\">set\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">(\u003C/span>\u003Cspan style=\\\"color:#A31515;--shiki-dark:#CE9178\\\">'overridden'\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">)\u003C/span>\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#001080;--shiki-dark:#9CDCFE\\\">$title\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">.\u003C/span>\u003Cspan style=\\\"color:#795E26;--shiki-dark:#DCDCAA\\\">get\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">() \u003C/span>\u003Cspan style=\\\"color:#008000;--shiki-dark:#6A9955\\\">// => 'overridden' ← immediate on the client\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\u003C/div>\u003C/div>\u003C/div>\\n\u003Cp>No staging, no loop. Client and server share one API; only the timing differs.\u003C/p>\\n\u003Ch2 id=\\\"how-it-transfers-dehydrate--hydrate\\\">How it transfers (dehydrate → hydrate)\u003Ca data-heading-anchor class=\\\"heading-anchor text-link dark:text-foreground hover:text-link-hover hover:dark:text-link-hover cursor-pointer p-1 flex items-center justify-center\\\" href=\\\"#how-it-transfers-dehydrate--hydrate\\\" aria-label=\\\"Copy link to this heading\\\">\u003Cspan data-md-icon-idle>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"20\\\" height=\\\"20\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-link\\\" aria-hidden=\\\"true\\\">\u003Cpath d=\\\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\\\">\u003C/path>\u003Cpath d=\\\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\\\">\u003C/path>\u003C/svg>\u003C/span>\u003Cspan data-md-icon-done hidden>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"20\\\" height=\\\"20\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-check\\\" aria-hidden=\\\"true\\\">\u003Cpath d=\\\"M20 6 9 17l-5-5\\\">\u003C/path>\u003C/svg>\u003C/span>\u003C/a>\u003C/h2>\\n\u003Cp>You don't wire the transfer — it rides on the underlying store:\u003C/p>\\n\u003Col>\\n\u003Cli>\u003Cstrong>Server render\u003C/strong> settles on the committed value.\u003C/li>\\n\u003Cli>At the end of the render, the store is serialized into an inline script in\\nthe HTML (\u003Ccode>window.__POINT0_DEHYDRATED_SUPER_STORE__\u003C/code>).\u003C/li>\\n\u003Cli>On boot, the client reads that script and hydrates the store \u003Cstrong>lazily\u003C/strong> — the\\nvalue is decoded on its first read.\u003C/li>\\n\u003C/ol>\\n\u003Cp>Only \u003Ccode>SsrStore\u003C/code> values cross the wire; other store policies stay local:\u003C/p>\\n\u003Cdiv data-code-block class=\\\"group relative not-prose overflow-hidden rounded-md border border-border bg-muted/50\\\">\u003Cbutton type=\\\"button\\\" data-copy-code class=\\\"group/button inline-flex shrink-0 cursor-pointer items-center justify-center border border-transparent bg-clip-padding font-accent text-sm font-semibold whitespace-nowrap outline-none select-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 bg-secondary text-secondary-foreground hover:bg-secondary-hover aria-expanded:bg-secondary aria-expanded:text-secondary-foreground size-8 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-md absolute top-2 right-2 z-10 opacity-100 transition-opacity [@media(hover:hover)]:opacity-0 [@media(hover:hover)]:group-hover:opacity-100 [@media(hover:hover)]:focus-visible:opacity-100\\\" aria-label=\\\"Copy code\\\">\u003Cspan data-md-icon-idle>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-copy\\\" aria-hidden=\\\"true\\\">\u003Crect width=\\\"14\\\" height=\\\"14\\\" x=\\\"8\\\" y=\\\"8\\\" rx=\\\"2\\\" ry=\\\"2\\\">\u003C/rect>\u003Cpath d=\\\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\\\">\u003C/path>\u003C/svg>\u003C/span>\u003Cspan data-md-icon-done hidden>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-check\\\" aria-hidden=\\\"true\\\">\u003Cpath d=\\\"M20 6 9 17l-5-5\\\">\u003C/path>\u003C/svg>\u003C/span>\u003C/button>\u003Cdiv class=\\\"overflow-x-auto py-4 pl-4 max-sm:py-3 max-sm:pl-3\\\">\u003Cdiv class=\\\"language-ts w-max pr-4 [@media(hover:none)]:pr-12 text-sm leading-[1.75] max-sm:text-xs max-sm:leading-[1.6]\\\">\u003Cpre class=\\\"shiki shiki-themes Gitpod Light Gitpod Dark\\\" style=\\\"background-color:transparent;--shiki-dark-bg:transparent;color:#000000;--shiki-dark:#d4d4d4\\\" tabindex=\\\"0\\\">\u003Ccode>\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#001080;--shiki-dark:#9CDCFE\\\">SsrStore\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">.\u003C/span>\u003Cspan style=\\\"color:#795E26;--shiki-dark:#DCDCAA\\\">define\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">(\u003C/span>\u003Cspan style=\\\"color:#A31515;--shiki-dark:#CE9178\\\">'desc'\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">, () \u003C/span>\u003Cspan style=\\\"color:#0000FF;--shiki-dark:#569CD6\\\">=>\u003C/span>\u003Cspan style=\\\"color:#A31515;--shiki-dark:#CE9178\\\"> 'default'\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">)\u003C/span>\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#008000;--shiki-dark:#6A9955\\\">// ...elsewhere, a client-only store value:\u003C/span>\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#008000;--shiki-dark:#6A9955\\\">// → only `desc` is in the dehydrated payload; the client-only value is not\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\u003C/div>\u003C/div>\u003C/div>\\n\u003Cp>Serialization is deterministic JSON by default, so a \u003Ccode>Date\u003C/code> survives only if you\\nconfigure a richer transformer (e.g. superjson) on the underlying store. The\\n\u003Ccode>init\u003C/code> default and the transferred value are both plain by default.\u003C/p>\\n\u003Cp>There's no per-value serialization. Every value rides the one store transformer\\nshared by the whole app, which you set on the root with\\n\u003Ca href=\\\"transformer\\\">\u003Ccode>.transformer\u003C/code>\u003C/a> (\u003Ccode>.transformer(superjson)\u003C/code>).\u003C/p>\\n\u003Ch2 id=\\\"the-re-render-loop-and-its-caps\\\">The re-render loop and its caps\u003Ca data-heading-anchor class=\\\"heading-anchor text-link dark:text-foreground hover:text-link-hover hover:dark:text-link-hover cursor-pointer p-1 flex items-center justify-center\\\" href=\\\"#the-re-render-loop-and-its-caps\\\" aria-label=\\\"Copy link to this heading\\\">\u003Cspan data-md-icon-idle>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"20\\\" height=\\\"20\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-link\\\" aria-hidden=\\\"true\\\">\u003Cpath d=\\\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\\\">\u003C/path>\u003Cpath d=\\\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\\\">\u003C/path>\u003C/svg>\u003C/span>\u003Cspan data-md-icon-done hidden>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"20\\\" height=\\\"20\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-check\\\" aria-hidden=\\\"true\\\">\u003Cpath d=\\\"M20 6 9 17l-5-5\\\">\u003C/path>\u003C/svg>\u003C/span>\u003C/a>\u003C/h2>\\n\u003Cp>The headline behavior — a layout seeing a page's override — comes from the SSR\\nprefetch loop. It commits staged values at the start of each pass and re-renders\\nwhile anything is still pending, until the values stabilize. Two engine options\\nbound it (under \u003Ccode>ssr\u003C/code> in \u003Ca href=\\\"engine-config\\\">engine config\u003C/a>):\u003C/p>\\n\u003Cdiv data-code-block class=\\\"group relative not-prose overflow-hidden rounded-md border border-border bg-muted/50\\\">\u003Cbutton type=\\\"button\\\" data-copy-code class=\\\"group/button inline-flex shrink-0 cursor-pointer items-center justify-center border border-transparent bg-clip-padding font-accent text-sm font-semibold whitespace-nowrap outline-none select-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 bg-secondary text-secondary-foreground hover:bg-secondary-hover aria-expanded:bg-secondary aria-expanded:text-secondary-foreground size-8 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-md absolute top-2 right-2 z-10 opacity-100 transition-opacity [@media(hover:hover)]:opacity-0 [@media(hover:hover)]:group-hover:opacity-100 [@media(hover:hover)]:focus-visible:opacity-100\\\" aria-label=\\\"Copy code\\\">\u003Cspan data-md-icon-idle>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-copy\\\" aria-hidden=\\\"true\\\">\u003Crect width=\\\"14\\\" height=\\\"14\\\" x=\\\"8\\\" y=\\\"8\\\" rx=\\\"2\\\" ry=\\\"2\\\">\u003C/rect>\u003Cpath d=\\\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\\\">\u003C/path>\u003C/svg>\u003C/span>\u003Cspan data-md-icon-done hidden>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-check\\\" aria-hidden=\\\"true\\\">\u003Cpath d=\\\"M20 6 9 17l-5-5\\\">\u003C/path>\u003C/svg>\u003C/span>\u003C/button>\u003Cdiv class=\\\"overflow-x-auto py-4 pl-4 max-sm:py-3 max-sm:pl-3\\\">\u003Cdiv class=\\\"language-ts w-max pr-4 [@media(hover:none)]:pr-12 text-sm leading-[1.75] max-sm:text-xs max-sm:leading-[1.6]\\\">\u003Cpre class=\\\"shiki shiki-themes Gitpod Light Gitpod Dark\\\" style=\\\"background-color:transparent;--shiki-dark-bg:transparent;color:#000000;--shiki-dark:#d4d4d4\\\" tabindex=\\\"0\\\">\u003Ccode>\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#001080;--shiki-dark:#9CDCFE\\\">Engine\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">.\u003C/span>\u003Cspan style=\\\"color:#795E26;--shiki-dark:#DCDCAA\\\">create\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">({\u003C/span>\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#008000;--shiki-dark:#6A9955\\\"> // ...\u003C/span>\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#001080;--shiki-dark:#9CDCFE\\\"> ssr:\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\"> {\u003C/span>\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#001080;--shiki-dark:#9CDCFE\\\"> allowedRerendersCount:\u003C/span>\u003Cspan style=\\\"color:#0000FF;--shiki-dark:#569CD6\\\"> Infinity\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">, \u003C/span>\u003Cspan style=\\\"color:#008000;--shiki-dark:#6A9955\\\">// soft budget — stop quietly when hit (default Infinity)\u003C/span>\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#001080;--shiki-dark:#9CDCFE\\\"> forbiddenRerendersCount:\u003C/span>\u003Cspan style=\\\"color:#098658;--shiki-dark:#B5CEA8\\\"> 25\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">, \u003C/span>\u003Cspan style=\\\"color:#008000;--shiki-dark:#6A9955\\\">// hard cap — stop AND log a server error (default 25)\u003C/span>\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\"> },\u003C/span>\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">})\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\u003C/div>\u003C/div>\u003C/div>\\n\u003Cul>\\n\u003Cli>\\n\u003Cp>\u003Cstrong>\u003Ccode>allowedRerendersCount\u003C/code>\u003C/strong> — soft budget. When reached the loop stops\\nquietly, no error, \u003Cstrong>without committing\u003C/strong> the staged change. \u003Ccode>0\u003C/code> or \u003Ccode>1\u003C/code> opts\\nout of stabilization re-renders for performance.\u003C/p>\\n\u003C/li>\\n\u003Cli>\\n\u003Cp>\u003Cstrong>\u003Ccode>forbiddenRerendersCount\u003C/code>\u003C/strong> — hard cap. Reaching it stops the loop \u003Cstrong>and\u003C/strong>\\nlogs a server error — the safety net for values that never stabilize:\u003C/p>\\n\u003Cdiv data-code-block class=\\\"group relative not-prose overflow-hidden rounded-md border border-border bg-muted/50\\\">\u003Cbutton type=\\\"button\\\" data-copy-code class=\\\"group/button inline-flex shrink-0 cursor-pointer items-center justify-center border border-transparent bg-clip-padding font-accent text-sm font-semibold whitespace-nowrap outline-none select-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 bg-secondary text-secondary-foreground hover:bg-secondary-hover aria-expanded:bg-secondary aria-expanded:text-secondary-foreground size-8 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-md absolute top-2 right-2 z-10 opacity-100 transition-opacity [@media(hover:hover)]:opacity-0 [@media(hover:hover)]:group-hover:opacity-100 [@media(hover:hover)]:focus-visible:opacity-100\\\" aria-label=\\\"Copy code\\\">\u003Cspan data-md-icon-idle>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-copy\\\" aria-hidden=\\\"true\\\">\u003Crect width=\\\"14\\\" height=\\\"14\\\" x=\\\"8\\\" y=\\\"8\\\" rx=\\\"2\\\" ry=\\\"2\\\">\u003C/rect>\u003Cpath d=\\\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\\\">\u003C/path>\u003C/svg>\u003C/span>\u003Cspan data-md-icon-done hidden>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-check\\\" aria-hidden=\\\"true\\\">\u003Cpath d=\\\"M20 6 9 17l-5-5\\\">\u003C/path>\u003C/svg>\u003C/span>\u003C/button>\u003Cdiv class=\\\"overflow-x-auto py-4 pl-4 max-sm:py-3 max-sm:pl-3\\\">\u003Cdiv class=\\\"w-max pr-4 [@media(hover:none)]:pr-12 text-sm leading-[1.75] max-sm:text-xs max-sm:leading-[1.6]\\\">\u003Cpre class=\\\"shiki shiki-themes Gitpod Light Gitpod Dark\\\" style=\\\"background-color:transparent;--shiki-dark-bg:transparent;color:#000000;--shiki-dark:#d4d4d4\\\" tabindex=\\\"0\\\">\u003Ccode>\u003Cspan class=\\\"line\\\">\u003Cspan>SSR stores/cookies did not stabilize after 25 re-renders (forbiddenRerendersCount);\u003C/span>\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003Cspan>using the last render. Check for non-deterministic SsrStore or cookie values\u003C/span>\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003Cspan>(e.g. Date.now(), Math.random()).\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\u003C/div>\u003C/div>\u003C/div>\\n\u003C/li>\\n\u003C/ul>\\n\u003Cp>Stabilization compares staged vs committed by \u003Cstrong>deterministic serialization\u003C/strong>,\\nso re-setting an equal value (even a freshly built object) ends the loop. A\\nnon-deterministic default or set — \u003Ccode>Date.now()\u003C/code>, \u003Ccode>Math.random()\u003C/code> — never\\nstabilizes and hits the hard cap.\u003C/p>\\n\u003Cp>The render count grows with the work: a default-only value settles in 1 render;\\na page overriding a layout default takes 2; add queries on both and a store-fed\\ndependent query and it climbs (4–5 passes). You don't manage this — it's why a\\nquery can feed an \u003Ccode>SsrStore\u003C/code> whose value becomes the input of another query, and\\nboth end up prefetched.\u003C/p>\\n\u003Cblockquote>\\n\u003Cp>To collapse this loop, warm the data up front in\\n\u003Ca href=\\\"../core/ssr#onprefetchpage\\\">\u003Ccode>.onPrefetchPage\u003C/code>\u003C/a> (runs server-side before the\\nfirst render), or flip on \u003Ccode>prefetchLoadersBeforePageRender\u003C/code> to prefetch the\\ndeclared loaders automatically. Not specific to \u003Ccode>SsrStore\u003C/code>; see \u003Ca href=\\\"ssr\\\">ssr\u003C/a>.\u003C/p>\\n\u003C/blockquote>\\n\u003Ch2 id=\\\"useeffectssr-the-companion-hook\\\">\u003Ccode>useEffectSsr\u003C/code>: the companion hook\u003Ca data-heading-anchor class=\\\"heading-anchor text-link dark:text-foreground hover:text-link-hover hover:dark:text-link-hover cursor-pointer p-1 flex items-center justify-center\\\" href=\\\"#useeffectssr-the-companion-hook\\\" aria-label=\\\"Copy link to this heading\\\">\u003Cspan data-md-icon-idle>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"20\\\" height=\\\"20\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-link\\\" aria-hidden=\\\"true\\\">\u003Cpath d=\\\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\\\">\u003C/path>\u003Cpath d=\\\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\\\">\u003C/path>\u003C/svg>\u003C/span>\u003Cspan data-md-icon-done hidden>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"20\\\" height=\\\"20\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-check\\\" aria-hidden=\\\"true\\\">\u003Cpath d=\\\"M20 6 9 17l-5-5\\\">\u003C/path>\u003C/svg>\u003C/span>\u003C/a>\u003C/h2>\\n\u003Cp>A normal \u003Ccode>useEffect\u003C/code> does not run during SSR, so a \u003Ccode>.set\u003C/code> inside one would never\\nreach the server render. \u003Ccode>useEffectSsr\u003C/code> is the hook for an effect that must\\n\u003Cem>also\u003C/em> run during SSR: on the server it runs synchronously during render (deps\\nignored, cleanup skipped); on the client it's a plain \u003Ccode>useEffect\u003C/code>.\u003C/p>\\n\u003Cdiv data-code-block class=\\\"group relative not-prose overflow-hidden rounded-md border border-border bg-muted/50\\\">\u003Cbutton type=\\\"button\\\" data-copy-code class=\\\"group/button inline-flex shrink-0 cursor-pointer items-center justify-center border border-transparent bg-clip-padding font-accent text-sm font-semibold whitespace-nowrap outline-none select-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 bg-secondary text-secondary-foreground hover:bg-secondary-hover aria-expanded:bg-secondary aria-expanded:text-secondary-foreground size-8 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-md absolute top-2 right-2 z-10 opacity-100 transition-opacity [@media(hover:hover)]:opacity-0 [@media(hover:hover)]:group-hover:opacity-100 [@media(hover:hover)]:focus-visible:opacity-100\\\" aria-label=\\\"Copy code\\\">\u003Cspan data-md-icon-idle>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-copy\\\" aria-hidden=\\\"true\\\">\u003Crect width=\\\"14\\\" height=\\\"14\\\" x=\\\"8\\\" y=\\\"8\\\" rx=\\\"2\\\" ry=\\\"2\\\">\u003C/rect>\u003Cpath d=\\\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\\\">\u003C/path>\u003C/svg>\u003C/span>\u003Cspan data-md-icon-done hidden>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-check\\\" aria-hidden=\\\"true\\\">\u003Cpath d=\\\"M20 6 9 17l-5-5\\\">\u003C/path>\u003C/svg>\u003C/span>\u003C/button>\u003Cdiv class=\\\"overflow-x-auto py-4 pl-4 max-sm:py-3 max-sm:pl-3\\\">\u003Cdiv class=\\\"language-ts w-max pr-4 [@media(hover:none)]:pr-12 text-sm leading-[1.75] max-sm:text-xs max-sm:leading-[1.6]\\\">\u003Cpre class=\\\"shiki shiki-themes Gitpod Light Gitpod Dark\\\" style=\\\"background-color:transparent;--shiki-dark-bg:transparent;color:#000000;--shiki-dark:#d4d4d4\\\" tabindex=\\\"0\\\">\u003Ccode>\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#795E26;--shiki-dark:#DCDCAA\\\">useEffectSsr\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">(() \u003C/span>\u003Cspan style=\\\"color:#0000FF;--shiki-dark:#569CD6\\\">=>\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\"> {\u003C/span>\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#001080;--shiki-dark:#9CDCFE\\\"> $title\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">.\u003C/span>\u003Cspan style=\\\"color:#795E26;--shiki-dark:#DCDCAA\\\">set\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">(\u003C/span>\u003Cspan style=\\\"color:#001080;--shiki-dark:#9CDCFE\\\">idea\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">.\u003C/span>\u003Cspan style=\\\"color:#001080;--shiki-dark:#9CDCFE\\\">title\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">)\u003C/span>\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">}, [\u003C/span>\u003Cspan style=\\\"color:#001080;--shiki-dark:#9CDCFE\\\">idea\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">.\u003C/span>\u003Cspan style=\\\"color:#001080;--shiki-dark:#9CDCFE\\\">title\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">])\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\u003C/div>\u003C/div>\u003C/div>\\n\u003Cp>The production breadcrumb pattern in start0 shows the full shape — declare once,\\nwrite from a hook with a cleanup, read in a component:\u003C/p>\\n\u003Cdiv data-code-block class=\\\"group relative not-prose overflow-hidden rounded-md border border-border bg-muted/50\\\">\u003Cbutton type=\\\"button\\\" data-copy-code class=\\\"group/button inline-flex shrink-0 cursor-pointer items-center justify-center border border-transparent bg-clip-padding font-accent text-sm font-semibold whitespace-nowrap outline-none select-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 bg-secondary text-secondary-foreground hover:bg-secondary-hover aria-expanded:bg-secondary aria-expanded:text-secondary-foreground size-8 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-md absolute top-2 right-2 z-10 opacity-100 transition-opacity [@media(hover:hover)]:opacity-0 [@media(hover:hover)]:group-hover:opacity-100 [@media(hover:hover)]:focus-visible:opacity-100\\\" aria-label=\\\"Copy code\\\">\u003Cspan data-md-icon-idle>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-copy\\\" aria-hidden=\\\"true\\\">\u003Crect width=\\\"14\\\" height=\\\"14\\\" x=\\\"8\\\" y=\\\"8\\\" rx=\\\"2\\\" ry=\\\"2\\\">\u003C/rect>\u003Cpath d=\\\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\\\">\u003C/path>\u003C/svg>\u003C/span>\u003Cspan data-md-icon-done hidden>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-check\\\" aria-hidden=\\\"true\\\">\u003Cpath d=\\\"M20 6 9 17l-5-5\\\">\u003C/path>\u003C/svg>\u003C/span>\u003C/button>\u003Cdiv class=\\\"overflow-x-auto py-4 pl-4 max-sm:py-3 max-sm:pl-3\\\">\u003Cdiv class=\\\"language-tsx w-max pr-4 [@media(hover:none)]:pr-12 text-sm leading-[1.75] max-sm:text-xs max-sm:leading-[1.6]\\\">\u003Cpre class=\\\"shiki shiki-themes Gitpod Light Gitpod Dark\\\" style=\\\"background-color:transparent;--shiki-dark-bg:transparent;color:#000000;--shiki-dark:#d4d4d4\\\" tabindex=\\\"0\\\">\u003Ccode>\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#AF00DB;--shiki-dark:#C586C0\\\">import\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\"> { \u003C/span>\u003Cspan style=\\\"color:#001080;--shiki-dark:#9CDCFE\\\">useEffectSsr\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\"> } \u003C/span>\u003Cspan style=\\\"color:#AF00DB;--shiki-dark:#C586C0\\\">from\u003C/span>\u003Cspan style=\\\"color:#A31515;--shiki-dark:#CE9178\\\"> '@point0/core'\u003C/span>\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#AF00DB;--shiki-dark:#C586C0\\\">import\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\"> { \u003C/span>\u003Cspan style=\\\"color:#001080;--shiki-dark:#9CDCFE\\\">SsrStore\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\"> } \u003C/span>\u003Cspan style=\\\"color:#AF00DB;--shiki-dark:#C586C0\\\">from\u003C/span>\u003Cspan style=\\\"color:#A31515;--shiki-dark:#CE9178\\\"> '@point0/core/ssr-store'\u003C/span>\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#AF00DB;--shiki-dark:#C586C0\\\">import\u003C/span>\u003Cspan style=\\\"color:#001080;--shiki-dark:#9CDCFE\\\"> stringify\u003C/span>\u003Cspan style=\\\"color:#AF00DB;--shiki-dark:#C586C0\\\"> from\u003C/span>\u003Cspan style=\\\"color:#A31515;--shiki-dark:#CE9178\\\"> 'safe-stable-stringify'\u003C/span>\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#AF00DB;--shiki-dark:#C586C0\\\">export\u003C/span>\u003Cspan style=\\\"color:#0000FF;--shiki-dark:#569CD6\\\"> const\u003C/span>\u003Cspan style=\\\"color:#0070C1;--shiki-dark:#4FC1FF\\\"> $breadcrumb\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\"> = \u003C/span>\u003Cspan style=\\\"color:#001080;--shiki-dark:#9CDCFE\\\">SsrStore\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">.\u003C/span>\u003Cspan style=\\\"color:#795E26;--shiki-dark:#DCDCAA\\\">define\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\"><\u003C/span>\u003Cspan style=\\\"color:#267F99;--shiki-dark:#4EC9B0\\\">BreadcrumbItem\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">[]>(\u003C/span>\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#A31515;--shiki-dark:#CE9178\\\"> 'breadcrumb'\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">,\u003C/span>\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\"> () \u003C/span>\u003Cspan style=\\\"color:#0000FF;--shiki-dark:#569CD6\\\">=>\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\"> [],\u003C/span>\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">)\u003C/span>\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#008000;--shiki-dark:#6A9955\\\">// a page calls this to publish its breadcrumb\u003C/span>\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#AF00DB;--shiki-dark:#C586C0\\\">export\u003C/span>\u003Cspan style=\\\"color:#0000FF;--shiki-dark:#569CD6\\\"> const\u003C/span>\u003Cspan style=\\\"color:#795E26;--shiki-dark:#DCDCAA\\\"> useBreadcrumb\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\"> = (...\u003C/span>\u003Cspan style=\\\"color:#001080;--shiki-dark:#9CDCFE\\\">items\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">: \u003C/span>\u003Cspan style=\\\"color:#267F99;--shiki-dark:#4EC9B0\\\">BreadcrumbItem\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">[]) \u003C/span>\u003Cspan style=\\\"color:#0000FF;--shiki-dark:#569CD6\\\">=>\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\"> {\u003C/span>\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#795E26;--shiki-dark:#DCDCAA\\\"> useEffectSsr\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">(() \u003C/span>\u003Cspan style=\\\"color:#0000FF;--shiki-dark:#569CD6\\\">=>\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\"> {\u003C/span>\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#001080;--shiki-dark:#9CDCFE\\\"> $breadcrumb\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">.\u003C/span>\u003Cspan style=\\\"color:#795E26;--shiki-dark:#DCDCAA\\\">set\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">(\u003C/span>\u003Cspan style=\\\"color:#001080;--shiki-dark:#9CDCFE\\\">items\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">)\u003C/span>\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#AF00DB;--shiki-dark:#C586C0\\\"> return\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\"> () \u003C/span>\u003Cspan style=\\\"color:#0000FF;--shiki-dark:#569CD6\\\">=>\u003C/span>\u003Cspan style=\\\"color:#001080;--shiki-dark:#9CDCFE\\\"> $breadcrumb\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">.\u003C/span>\u003Cspan style=\\\"color:#795E26;--shiki-dark:#DCDCAA\\\">set\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">([]) \u003C/span>\u003Cspan style=\\\"color:#008000;--shiki-dark:#6A9955\\\">// cleanup resets on the client (ignored during SSR)\u003C/span>\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\"> }, [\u003C/span>\u003Cspan style=\\\"color:#795E26;--shiki-dark:#DCDCAA\\\">stringify\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">(\u003C/span>\u003Cspan style=\\\"color:#001080;--shiki-dark:#9CDCFE\\\">items\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">)]) \u003C/span>\u003Cspan style=\\\"color:#008000;--shiki-dark:#6A9955\\\">// serialized deps — a new array identity alone won't re-fire\u003C/span>\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">}\u003C/span>\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#008000;--shiki-dark:#6A9955\\\">// the layout reads it reactively\u003C/span>\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#0000FF;--shiki-dark:#569CD6\\\">const\u003C/span>\u003Cspan style=\\\"color:#0070C1;--shiki-dark:#4FC1FF\\\"> storeItems\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\"> = \u003C/span>\u003Cspan style=\\\"color:#001080;--shiki-dark:#9CDCFE\\\">$breadcrumb\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">.\u003C/span>\u003Cspan style=\\\"color:#795E26;--shiki-dark:#DCDCAA\\\">use\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\">()\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\u003C/div>\u003C/div>\u003C/div>\\n\u003Cp>Two details worth copying: the \u003Cstrong>serialized deps\u003C/strong> (\u003Ccode>[stringify(items)]\u003C/code>) avoid\\nre-firing on a new-but-equal array, and the \u003Cstrong>cleanup\u003C/strong> resets the store on\\nunmount (it only matters on the client; SSR ignores cleanups).\u003C/p>\\n\u003Ch2 id=\\\"when-to-use-it--and-when-not\\\">When to use it — and when not\u003Ca data-heading-anchor class=\\\"heading-anchor text-link dark:text-foreground hover:text-link-hover hover:dark:text-link-hover cursor-pointer p-1 flex items-center justify-center\\\" href=\\\"#when-to-use-it--and-when-not\\\" aria-label=\\\"Copy link to this heading\\\">\u003Cspan data-md-icon-idle>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"20\\\" height=\\\"20\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-link\\\" aria-hidden=\\\"true\\\">\u003Cpath d=\\\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\\\">\u003C/path>\u003Cpath d=\\\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\\\">\u003C/path>\u003C/svg>\u003C/span>\u003Cspan data-md-icon-done hidden>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"20\\\" height=\\\"20\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-check\\\" aria-hidden=\\\"true\\\">\u003Cpath d=\\\"M20 6 9 17l-5-5\\\">\u003C/path>\u003C/svg>\u003C/span>\u003C/a>\u003C/h2>\\n\u003Cp>Use \u003Ccode>SsrStore\u003C/code> when a value computed \u003Cem>during render\u003C/em> — usually deep in the tree,\\noften after a query resolves — must appear in an \u003Cstrong>ancestor's\u003C/strong> SSR output and\\non the client before any JS recompute. Breadcrumbs, page title, page\\ndescription.\u003C/p>\\n\u003Cp>It is \u003Cstrong>optional\u003C/strong>: if you don't need it, you don't import it.\u003C/p>\\n\u003Cp>Reach for \u003Ca href=\\\"cookie-store\\\">CookieStore\u003C/a> instead when the value must travel \u003Cstrong>both\\nways\u003C/strong> (client → server too). The two APIs are deliberately parallel (\u003Ccode>define\u003C/code> /\\n\u003Ccode>get\u003C/code> / \u003Ccode>set\u003C/code> / \u003Ccode>use\u003C/code>), but a cookie is never dropped on the final render —\\nlosing one is worse than a hydration mismatch — whereas an \u003Ccode>SsrStore\u003C/code> value \u003Cem>is\u003C/em>\\nintentionally dropped on a dropped final pass.\u003C/p>\\n\u003Ch2 id=\\\"gotchas\\\">Gotchas\u003Ca data-heading-anchor class=\\\"heading-anchor text-link dark:text-foreground hover:text-link-hover hover:dark:text-link-hover cursor-pointer p-1 flex items-center justify-center\\\" href=\\\"#gotchas\\\" aria-label=\\\"Copy link to this heading\\\">\u003Cspan data-md-icon-idle>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"20\\\" height=\\\"20\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-link\\\" aria-hidden=\\\"true\\\">\u003Cpath d=\\\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\\\">\u003C/path>\u003Cpath d=\\\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\\\">\u003C/path>\u003C/svg>\u003C/span>\u003Cspan data-md-icon-done hidden>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"20\\\" height=\\\"20\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-check\\\" aria-hidden=\\\"true\\\">\u003Cpath d=\\\"M20 6 9 17l-5-5\\\">\u003C/path>\u003C/svg>\u003C/span>\u003C/a>\u003C/h2>\\n\u003Cul>\\n\u003Cli>\u003Cstrong>Unique names.\u003C/strong> \u003Ccode>name\u003C/code> is the underlying store key; redefining the same name\\noverwrites. Use a clear, namespaced key.\u003C/li>\\n\u003Cli>\u003Cstrong>No non-deterministic defaults or sets.\u003C/strong> \u003Ccode>Date.now()\u003C/code>, \u003Ccode>Math.random()\u003C/code>, a\\nraw \u003Ccode>new Date()\u003C/code> make the loop never stabilize → it hits\\n\u003Ccode>forbiddenRerendersCount\u003C/code> and logs an error.\u003C/li>\\n\u003Cli>\u003Cstrong>Write from render/effects, not module top-level.\u003C/strong> Server \u003Ccode>set\u003C/code> needs the\\nSSR render scope; in a real app the engine sets that up per request. Call\\n\u003Ccode>set\u003C/code> from inside a component or \u003Ccode>useEffectSsr\u003C/code>.\u003C/li>\\n\u003Cli>\u003Cstrong>\u003Ccode>init\u003C/code> is lazy.\u003C/strong> The default isn't materialized until the first\\n\u003Ccode>get\u003C/code>/\u003Ccode>use\u003C/code>.\u003C/li>\\n\u003Cli>\u003Cstrong>Client re-render on equal values.\u003C/strong> \u003Ccode>.use\u003C/code> change detection is reference\\n\u003Ccode>!==\u003C/code>, so a new object that's deeply equal still re-renders on the client.\u003C/li>\\n\u003C/ul>\\n\u003Ch2 id=\\\"reference\\\">Reference\u003Ca data-heading-anchor class=\\\"heading-anchor text-link dark:text-foreground hover:text-link-hover hover:dark:text-link-hover cursor-pointer p-1 flex items-center justify-center\\\" href=\\\"#reference\\\" aria-label=\\\"Copy link to this heading\\\">\u003Cspan data-md-icon-idle>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"20\\\" height=\\\"20\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-link\\\" aria-hidden=\\\"true\\\">\u003Cpath d=\\\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\\\">\u003C/path>\u003Cpath d=\\\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\\\">\u003C/path>\u003C/svg>\u003C/span>\u003Cspan data-md-icon-done hidden>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"20\\\" height=\\\"20\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-check\\\" aria-hidden=\\\"true\\\">\u003Cpath d=\\\"M20 6 9 17l-5-5\\\">\u003C/path>\u003C/svg>\u003C/span>\u003C/a>\u003C/h2>\\n\u003Ch3 id=\\\"import\\\">Import\u003Ca data-heading-anchor class=\\\"heading-anchor text-link dark:text-foreground hover:text-link-hover hover:dark:text-link-hover cursor-pointer p-1 flex items-center justify-center\\\" href=\\\"#import\\\" aria-label=\\\"Copy link to this heading\\\">\u003Cspan data-md-icon-idle>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"20\\\" height=\\\"20\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-link\\\" aria-hidden=\\\"true\\\">\u003Cpath d=\\\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\\\">\u003C/path>\u003Cpath d=\\\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\\\">\u003C/path>\u003C/svg>\u003C/span>\u003Cspan data-md-icon-done hidden>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"20\\\" height=\\\"20\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-check\\\" aria-hidden=\\\"true\\\">\u003Cpath d=\\\"M20 6 9 17l-5-5\\\">\u003C/path>\u003C/svg>\u003C/span>\u003C/a>\u003C/h3>\\n\u003Cdiv data-code-block class=\\\"group relative not-prose overflow-hidden rounded-md border border-border bg-muted/50\\\">\u003Cbutton type=\\\"button\\\" data-copy-code class=\\\"group/button inline-flex shrink-0 cursor-pointer items-center justify-center border border-transparent bg-clip-padding font-accent text-sm font-semibold whitespace-nowrap outline-none select-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 bg-secondary text-secondary-foreground hover:bg-secondary-hover aria-expanded:bg-secondary aria-expanded:text-secondary-foreground size-8 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-md absolute top-2 right-2 z-10 opacity-100 transition-opacity [@media(hover:hover)]:opacity-0 [@media(hover:hover)]:group-hover:opacity-100 [@media(hover:hover)]:focus-visible:opacity-100\\\" aria-label=\\\"Copy code\\\">\u003Cspan data-md-icon-idle>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-copy\\\" aria-hidden=\\\"true\\\">\u003Crect width=\\\"14\\\" height=\\\"14\\\" x=\\\"8\\\" y=\\\"8\\\" rx=\\\"2\\\" ry=\\\"2\\\">\u003C/rect>\u003Cpath d=\\\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\\\">\u003C/path>\u003C/svg>\u003C/span>\u003Cspan data-md-icon-done hidden>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-check\\\" aria-hidden=\\\"true\\\">\u003Cpath d=\\\"M20 6 9 17l-5-5\\\">\u003C/path>\u003C/svg>\u003C/span>\u003C/button>\u003Cdiv class=\\\"overflow-x-auto py-4 pl-4 max-sm:py-3 max-sm:pl-3\\\">\u003Cdiv class=\\\"language-ts w-max pr-4 [@media(hover:none)]:pr-12 text-sm leading-[1.75] max-sm:text-xs max-sm:leading-[1.6]\\\">\u003Cpre class=\\\"shiki shiki-themes Gitpod Light Gitpod Dark\\\" style=\\\"background-color:transparent;--shiki-dark-bg:transparent;color:#000000;--shiki-dark:#d4d4d4\\\" tabindex=\\\"0\\\">\u003Ccode>\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#AF00DB;--shiki-dark:#C586C0\\\">import\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\"> { \u003C/span>\u003Cspan style=\\\"color:#001080;--shiki-dark:#9CDCFE\\\">SsrStore\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\"> } \u003C/span>\u003Cspan style=\\\"color:#AF00DB;--shiki-dark:#C586C0\\\">from\u003C/span>\u003Cspan style=\\\"color:#A31515;--shiki-dark:#CE9178\\\"> '@point0/core/ssr-store'\u003C/span>\u003Cspan style=\\\"color:#008000;--shiki-dark:#6A9955\\\"> // NOT from '@point0/core'\u003C/span>\u003C/span>\\n\u003Cspan class=\\\"line\\\">\u003Cspan style=\\\"color:#AF00DB;--shiki-dark:#C586C0\\\">import\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\"> { \u003C/span>\u003Cspan style=\\\"color:#001080;--shiki-dark:#9CDCFE\\\">useEffectSsr\u003C/span>\u003Cspan style=\\\"color:#000000;--shiki-dark:#D4D4D4\\\"> } \u003C/span>\u003Cspan style=\\\"color:#AF00DB;--shiki-dark:#C586C0\\\">from\u003C/span>\u003Cspan style=\\\"color:#A31515;--shiki-dark:#CE9178\\\"> '@point0/core'\u003C/span>\u003Cspan style=\\\"color:#008000;--shiki-dark:#6A9955\\\"> // the companion hook IS in the barrel\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\u003C/div>\u003C/div>\u003C/div>\\n\u003Ch3 id=\\\"ssrstoredefine\\\">\u003Ccode>SsrStore.define\u003C/code>\u003Ca data-heading-anchor class=\\\"heading-anchor text-link dark:text-foreground hover:text-link-hover hover:dark:text-link-hover cursor-pointer p-1 flex items-center justify-center\\\" href=\\\"#ssrstoredefine\\\" aria-label=\\\"Copy link to this heading\\\">\u003Cspan data-md-icon-idle>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"20\\\" height=\\\"20\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-link\\\" aria-hidden=\\\"true\\\">\u003Cpath d=\\\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\\\">\u003C/path>\u003Cpath d=\\\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\\\">\u003C/path>\u003C/svg>\u003C/span>\u003Cspan data-md-icon-done hidden>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"20\\\" height=\\\"20\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-check\\\" aria-hidden=\\\"true\\\">\u003Cpath d=\\\"M20 6 9 17l-5-5\\\">\u003C/path>\u003C/svg>\u003C/span>\u003C/a>\u003C/h3>\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\u003Ctable>\u003Cthead>\u003Ctr>\u003Cth>Signature\u003C/th>\u003Cth>Returns\u003C/th>\u003C/tr>\u003C/thead>\u003Ctbody>\u003Ctr>\u003Ctd>\u003Ccode>SsrStore.define<TValue>(name: string, init: () => TValue)\u003C/code>\u003C/td>\u003Ctd>an \u003Ccode>SsrStoreItem<TValue>\u003C/code> handle\u003C/td>\u003C/tr>\u003C/tbody>\u003C/table>\\n\u003Cp>\u003Ccode>name\u003C/code> is the globally-unique key; \u003Ccode>init\u003C/code> is the lazy server-side default.\u003C/p>\\n\u003Ch3 id=\\\"handle-methods\\\">Handle methods\u003Ca data-heading-anchor class=\\\"heading-anchor text-link dark:text-foreground hover:text-link-hover hover:dark:text-link-hover cursor-pointer p-1 flex items-center justify-center\\\" href=\\\"#handle-methods\\\" aria-label=\\\"Copy link to this heading\\\">\u003Cspan data-md-icon-idle>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"20\\\" height=\\\"20\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-link\\\" aria-hidden=\\\"true\\\">\u003Cpath d=\\\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\\\">\u003C/path>\u003Cpath d=\\\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\\\">\u003C/path>\u003C/svg>\u003C/span>\u003Cspan data-md-icon-done hidden>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"20\\\" height=\\\"20\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-check\\\" aria-hidden=\\\"true\\\">\u003Cpath d=\\\"M20 6 9 17l-5-5\\\">\u003C/path>\u003C/svg>\u003C/span>\u003C/a>\u003C/h3>\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\u003Ctable>\u003Cthead>\u003Ctr>\u003Cth>Method\u003C/th>\u003Cth>Server\u003C/th>\u003Cth>Client\u003C/th>\u003C/tr>\u003C/thead>\u003Ctbody>\u003Ctr>\u003Ctd>\u003Ccode>.get()\u003C/code>\u003C/td>\u003Ctd>committed value from the SSR scope\u003C/td>\u003Ctd>committed value from hydrated state\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd>\u003Ccode>.set(value)\u003C/code>\u003C/td>\u003Ctd>\u003Cstrong>stages\u003C/strong> — applied between renders by the loop\u003C/td>\u003Ctd>plain React state update; readers re-render\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd>\u003Ccode>.use(onChange?)\u003C/code>\u003C/td>\u003Ctd>committed value, synchronous (no hooks)\u003C/td>\u003Ctd>React state; re-renders on change; \u003Ccode>onChange\u003C/code> fires\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd>\u003Ccode>.name\u003C/code>\u003C/td>\u003Ctd>the key passed to \u003Ccode>define\u003C/code>\u003C/td>\u003Ctd>same\u003C/td>\u003C/tr>\u003C/tbody>\u003C/table>\\n\u003Cp>\u003Ccode>SsrStore.hasPendingChanges()\u003C/code>, \u003Ccode>SsrStore.commitPending()\u003C/code>, and the handle's\\n\u003Ccode>getCommitted()\u003C/code> / \u003Ccode>commit()\u003C/code> are server-lifecycle internals (the engine calls\\nthem) — not part of the author surface.\u003C/p>\\n\u003Ch3 id=\\\"engine-ssr-options-loop-control\\\">Engine \u003Ccode>ssr\u003C/code> options (loop control)\u003Ca data-heading-anchor class=\\\"heading-anchor text-link dark:text-foreground hover:text-link-hover hover:dark:text-link-hover cursor-pointer p-1 flex items-center justify-center\\\" href=\\\"#engine-ssr-options-loop-control\\\" aria-label=\\\"Copy link to this heading\\\">\u003Cspan data-md-icon-idle>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"20\\\" height=\\\"20\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-link\\\" aria-hidden=\\\"true\\\">\u003Cpath d=\\\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\\\">\u003C/path>\u003Cpath d=\\\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\\\">\u003C/path>\u003C/svg>\u003C/span>\u003Cspan data-md-icon-done hidden>\u003Csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"20\\\" height=\\\"20\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" class=\\\"lucide lucide-check\\\" aria-hidden=\\\"true\\\">\u003Cpath d=\\\"M20 6 9 17l-5-5\\\">\u003C/path>\u003C/svg>\u003C/span>\u003C/a>\u003C/h3>\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\u003Ctable>\u003Cthead>\u003Ctr>\u003Cth>Option\u003C/th>\u003Cth>Default\u003C/th>\u003Cth>Effect\u003C/th>\u003C/tr>\u003C/thead>\u003Ctbody>\u003Ctr>\u003Ctd>\u003Ccode>allowedRerendersCount\u003C/code>\u003C/td>\u003Ctd>\u003Ccode>Infinity\u003C/code>\u003C/td>\u003Ctd>soft budget; stop quietly when hit (staged change not committed)\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd>\u003Ccode>forbiddenRerendersCount\u003C/code>\u003C/td>\u003Ctd>\u003Ccode>25\u003C/code>\u003C/td>\u003Ctd>hard cap; stop \u003Cstrong>and\u003C/strong> log a server error\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd>\u003Ccode>prefetchLoadersBeforePageRender\u003C/code>\u003C/td>\u003Ctd>\u003Ccode>false\u003C/code>\u003C/td>\u003Ctd>prefetch declared loaders up front to need fewer passes\u003C/td>\u003C/tr>\u003C/tbody>\u003C/table>\\n\u003Cp>Full SSR options live in \u003Ca href=\\\"engine-config\\\">engine-config\u003C/a> and \u003Ca href=\\\"ssr\\\">ssr\u003C/a>.\u003C/p>\",\"next\":{\"label\":\"CookieStore\",\"to\":\"/point0/latest/cookie-store\"},\"prev\":{\"label\":\"Bun or Vite\",\"to\":\"/point0/latest/bun-vs-vite\"},\"project\":{\"card\":\"/images/point0-card-black@2x.png\",\"homeUrl\":\"/point0\",\"repoUrl\":\"https://github.com/1gr14/point0\",\"slug\":\"point0\",\"title\":\"Point0\",\"versions\":[{\"slug\":\"v0\"}]},\"title\":\"SsrStore\"},\"dataUpdateCount\":1,\"dataUpdatedAt\":1782781845057,\"error\":null,\"errorUpdateCount\":0,\"errorUpdatedAt\":0,\"fetchFailureCount\":0,\"fetchFailureReason\":null,\"fetchMeta\":null,\"fetchStatus\":\"idle\",\"isInvalidated\":false,\"status\":\"success\"}}]}},\"dataUpdateCount\":1,\"dataUpdatedAt\":1782781845064,\"error\":null,\"errorUpdateCount\":0,\"errorUpdatedAt\":0,\"fetchFailureCount\":0,\"fetchFailureReason\":null,\"fetchMeta\":null,\"fetchStatus\":\"idle\",\"isInvalidated\":false,\"status\":\"success\"}}]},\"__POINT0_SSR_LOCATION__\":{\"abs\":true,\"hash\":\"\",\"host\":\"1gr14.dev\",\"hostname\":\"1gr14.dev\",\"href\":\"http://1gr14.dev/point0/latest/ssr-store\",\"hrefRel\":\"/point0/latest/ssr-store\",\"origin\":\"http://1gr14.dev\",\"params\":{\"doc\":\"ssr-store\",\"version\":\"latest\"},\"pathname\":\"/point0/latest/ssr-store\",\"port\":null,\"route\":\"/point0/:version/:doc\",\"search\":{},\"searchString\":\"\"},\"breadcrumb\":[]},\"meta\":{\"referentialEqualities\":{\"__POINT0_QUERY_CLIENT__.queries.0.queryKey.1.tags\":[\"__POINT0_QUERY_CLIENT__.queries.0.state.data.dehydratedState.queries.0.queryKey.1.tags\",\"__POINT0_QUERY_CLIENT__.queries.0.state.data.dehydratedState.queries.1.queryKey.1.tags\",\"__POINT0_QUERY_CLIENT__.queries.0.state.data.dehydratedState.queries.2.queryKey.1.tags\"],\"__POINT0_QUERY_CLIENT__.queries.0.state.data.dehydratedState.queries.0.state.data.navigation.version\":[\"__POINT0_QUERY_CLIENT__.queries.0.state.data.dehydratedState.queries.0.state.data.navigation.versions.0\"]},\"v\":1,\"values\":{\"__POINT0_QUERY_CLIENT__.queries.0.state.data.dehydratedState.queries.2.state.data.example\":[\"undefined\"],\"__POINT0_SSR_LOCATION__.port\":[\"undefined\"]}}}";
Building open-source software for the glory
of the Lord Jesus Christ ☦️
With love for developers
of all backgrounds around the world ❤️