docs/solutions/developer-experience/2026-03-28-static-demo-values-need-deterministic-ids-and-timestamps-for-hydration.md
The homepage playground hydrated with a React mismatch warning after the Next 16 upgrade. The visible diff was data-table-cell-id, where server and client rendered different table cell IDs for the same demo content.
/data-table-cell-id changing between server and clientPlaygroundDemo and the table cell render pathStatic demo values were being fed into editors without deterministic normalization.
NodeIdPlugin using random nanoid() values during editor setupcreatedAt: Date.now() at module evaluation timeNormalize static example values through a package helper before editor creation:
createdAt metadata with a fixed timestampThe helper lives at:
packages/core/src/lib/plugins/node-id/normalizeStaticValue.tsIt is exported through:
@platejs/coreplatejsIt is used by:
apps/www/src/registry/examples/playground-demo.tsxapps/www/src/registry/blocks/editor-ai/components/editor/plate-editor.tsxapps/www/src/registry/blocks/editor-basic/components/editor/plate-editor.tsxapps/www/src/registry/blocks/slate-to-html/page.tsxDate.now() in module-scoped example values that may hydrate on the clientnormalizeStaticValue before creating the editornormalizeNodeId focused on node IDs only. Hydration-safe demo normalization is a separate concern and should stay a separate API.bun test packages/core/src/lib/plugins/node-id/normalizeStaticValue.spec.tspnpm -C apps/www buildpnpm -C apps/www typecheckpnpm lint:fixbrowser-use reload of http://localhost:3000/ with no hydration console error