Skip to content

@stainless-code/persist

Hydration-aware persistence for any reactive store — zero-dep persistSource core; codecs, backends, cross-tab transport, source + framework hydration adapters ship as opt-in recipes

preact-persist

51 linesSource

Gate Preact UI on Persist hydration with useHydrated (preact/compat useSyncExternalStore). Use when avoiding flash of default state on async backends or wiring HydrationSignal into Preact.

Preact hydration gate

@stainless-code/persist/frameworks/preact mirrors the React adapter via preact/compat useSyncExternalStore (SSR snapshot always true). Not a state source — pair with a ./sources/* adapter.

Install

shell
bun add @stainless-code/persist preact

Peer: preact >=10.19.0.

Minimal wiring

tsx
import { useHydrated } from "@stainless-code/persist/frameworks/preact";

const { hydrated } = useHydrated(prefsHydration);
if (!hydrated) return <Skeleton />;
return <PrefsView />;

prefsHydration = toHydrationSignal(persist) from your store module.

Common mistakes

  • Importing /frameworks/react in a Preact app. Use this subpath.
  • Treating the hook as state. Read the store separately.
  • Null signal ≠ loading — means no persist → hydrated.

API surface

  • useHydrated(signal) → { hydrated: boolean }

See also: react-persist (same contract).