diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9f78ed4c..a3203c6c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,9 +1,31 @@
# Changelog
-## 0.21.0
+## 0.21.1
+### Bug Fixes
+
+- **Dotted form values:** Preserve literal emails, URLs, and version strings in form value lookups instead of treating them as missing state paths (#353)
+- **Numeric validation:** Reject partially numeric strings such as `"123abc"`, empty strings, and whitespace-only strings instead of accepting them as numbers (#389)
+- **Schema type inference:** Infer `s.any()` fields as `any`, matching `z.any()`, so validated specs remain assignable to `Spec` without casts (#390)
+
+### Documentation
+
+- Migrated the **docs site** to Geistdocs while preserving public URLs, page content, and anchors (#340)
+- Updated **native WebMCP discovery and search** with the Geistdocs MCP adapter (#363)
+
+### Contributors
+
+- @ctate
+- @Railly
+- @fix2015
+- @kevin9327
+- @tmchow
+
+
+## 0.21.0
+
### New Features
- **TanStack Start renderer:** Added `@json-render/tanstack-start` for JSON-defined applications with file-based routes, reusable layouts, SSR loaders, head metadata, prerender paths, client navigation, and route fallbacks (#334)
@@ -19,7 +41,6 @@
- @ctate
- @Railly
-
## 0.20.0
diff --git a/apps/web/content/docs/changelog.mdx b/apps/web/content/docs/changelog.mdx
index dc65b3fa..f93d3fa8 100644
--- a/apps/web/content/docs/changelog.mdx
+++ b/apps/web/content/docs/changelog.mdx
@@ -4,6 +4,28 @@ title: "Changelog"
Notable changes and updates to json-render.
+## v0.21.1
+
+October 13, 2026
+
+### Fixed: Dotted Form Values
+
+Form value lookups now preserve literal emails, URLs, and version strings instead of treating them as missing state paths.
+
+### Fixed: Numeric Validation
+
+The `numeric` validator now rejects partially numeric strings such as `"123abc"`, empty strings, and whitespace-only strings instead of accepting them as numbers.
+
+### Fixed: Schema Type Inference
+
+`s.any()` fields now infer as `any`, matching `z.any()`, so validated specs remain assignable to `Spec` without casts.
+
+### Improved: Documentation
+
+Migrated the docs site to Geistdocs while preserving public URLs, page content, and anchors. Updated native WebMCP discovery and search with the Geistdocs MCP adapter.
+
+---
+
## v0.21.0
September 18, 2026
diff --git a/apps/web/tests/fixtures/docs-baseline.json b/apps/web/tests/fixtures/docs-baseline.json
index 40dc5ceb..1829adcf 100644
--- a/apps/web/tests/fixtures/docs-baseline.json
+++ b/apps/web/tests/fixtures/docs-baseline.json
@@ -2139,9 +2139,9 @@
"title": "Changelog",
"metadataTitle": "Changelog | json-render",
"prefix": "import { pageMetadata } from \"@/lib/page-metadata\"\nexport const metadata = pageMetadata(\"docs/changelog\")\n\n# Changelog\n",
- "sourceSha256": "645da4f33e85ac7bcb1642100bb0bde339dd2976c29f8501317f296c308e645e",
- "bodySha256": "54a0b41153dd3afd0a0c69ef4c19575978615420eaf15075952b5c317b6a6b1c",
- "markdownSha256": "73fa2d642e3235a7841b196625b948db486473c24c41deec1dbba07583706e2b",
+ "sourceSha256": "ad86126e05152567880b659abff2b27d88cc7b696d27b8c6640dda13c38dc9c3",
+ "bodySha256": "586921975f057696b57045a41fbdeba5d4f469a48592ea604f0262d65be3b74b",
+ "markdownSha256": "3836699e187adc31520d62b168b1f921b7f9df4272798ebc28d90bc76272b063",
"headings": [
{
"title": "v0.21.0",
diff --git a/packages/codegen/package.json b/packages/codegen/package.json
index 192a36f5..73d1e18f 100644
--- a/packages/codegen/package.json
+++ b/packages/codegen/package.json
@@ -1,6 +1,6 @@
{
"name": "@json-render/codegen",
- "version": "0.21.0",
+ "version": "0.21.1",
"license": "Apache-2.0",
"description": "Utilities for generating code from json-render UI trees",
"keywords": [
diff --git a/packages/core/package.json b/packages/core/package.json
index c542a3bb..0dd10d84 100644
--- a/packages/core/package.json
+++ b/packages/core/package.json
@@ -1,6 +1,6 @@
{
"name": "@json-render/core",
- "version": "0.21.0",
+ "version": "0.21.1",
"license": "Apache-2.0",
"description": "JSON becomes real things. Define your catalog, register your components, let AI generate.",
"keywords": [
diff --git a/packages/devtools-react/package.json b/packages/devtools-react/package.json
index 3cb0ff2a..6bce8ea2 100644
--- a/packages/devtools-react/package.json
+++ b/packages/devtools-react/package.json
@@ -1,6 +1,6 @@
{
"name": "@json-render/devtools-react",
- "version": "0.21.0",
+ "version": "0.21.1",
"license": "Apache-2.0",
"description": "React adapter for @json-render/devtools. Drop-in component.",
"keywords": [
diff --git a/packages/devtools-solid/package.json b/packages/devtools-solid/package.json
index ab20f0b6..1ba13a9d 100644
--- a/packages/devtools-solid/package.json
+++ b/packages/devtools-solid/package.json
@@ -1,6 +1,6 @@
{
"name": "@json-render/devtools-solid",
- "version": "0.21.0",
+ "version": "0.21.1",
"license": "Apache-2.0",
"description": "SolidJS adapter for @json-render/devtools. Drop-in component.",
"keywords": [
diff --git a/packages/devtools-svelte/package.json b/packages/devtools-svelte/package.json
index bc8cd8d4..26497858 100644
--- a/packages/devtools-svelte/package.json
+++ b/packages/devtools-svelte/package.json
@@ -1,6 +1,6 @@
{
"name": "@json-render/devtools-svelte",
- "version": "0.21.0",
+ "version": "0.21.1",
"license": "Apache-2.0",
"description": "Svelte adapter for @json-render/devtools. Drop-in component.",
"keywords": [
diff --git a/packages/devtools-vue/package.json b/packages/devtools-vue/package.json
index 7c90c7ef..1d1096be 100644
--- a/packages/devtools-vue/package.json
+++ b/packages/devtools-vue/package.json
@@ -1,6 +1,6 @@
{
"name": "@json-render/devtools-vue",
- "version": "0.21.0",
+ "version": "0.21.1",
"license": "Apache-2.0",
"description": "Vue adapter for @json-render/devtools. Drop-in component.",
"keywords": [
diff --git a/packages/devtools/package.json b/packages/devtools/package.json
index 17df81f6..5b0c5c83 100644
--- a/packages/devtools/package.json
+++ b/packages/devtools/package.json
@@ -1,6 +1,6 @@
{
"name": "@json-render/devtools",
- "version": "0.21.0",
+ "version": "0.21.1",
"license": "Apache-2.0",
"description": "Framework-agnostic devtools core for json-render: event store, panel UI, picker, stream taps.",
"keywords": [
diff --git a/packages/directives/package.json b/packages/directives/package.json
index 0e7a4fcd..905fd1ca 100644
--- a/packages/directives/package.json
+++ b/packages/directives/package.json
@@ -1,6 +1,6 @@
{
"name": "@json-render/directives",
- "version": "0.21.0",
+ "version": "0.21.1",
"license": "Apache-2.0",
"description": "Pre-built directives for @json-render/core — $format, $math, $concat, $count, $truncate, $pluralize, $join, and $t (i18n).",
"keywords": [
diff --git a/packages/image/package.json b/packages/image/package.json
index c033b9a4..fbef4968 100644
--- a/packages/image/package.json
+++ b/packages/image/package.json
@@ -1,6 +1,6 @@
{
"name": "@json-render/image",
- "version": "0.21.0",
+ "version": "0.21.1",
"license": "Apache-2.0",
"description": "Image renderer for @json-render/core. JSON becomes SVG and PNG images via Satori.",
"keywords": [
diff --git a/packages/ink/package.json b/packages/ink/package.json
index 7e3e703e..75c632f6 100644
--- a/packages/ink/package.json
+++ b/packages/ink/package.json
@@ -1,6 +1,6 @@
{
"name": "@json-render/ink",
- "version": "0.21.0",
+ "version": "0.21.1",
"license": "Apache-2.0",
"description": "Ink terminal renderer for @json-render/core. JSON becomes terminal UIs.",
"keywords": [
diff --git a/packages/jotai/package.json b/packages/jotai/package.json
index 87c11bfd..b1f11581 100644
--- a/packages/jotai/package.json
+++ b/packages/jotai/package.json
@@ -1,6 +1,6 @@
{
"name": "@json-render/jotai",
- "version": "0.21.0",
+ "version": "0.21.1",
"license": "Apache-2.0",
"description": "Jotai adapter for json-render StateStore",
"keywords": [
diff --git a/packages/mcp/package.json b/packages/mcp/package.json
index 31ce7318..92591cd2 100644
--- a/packages/mcp/package.json
+++ b/packages/mcp/package.json
@@ -1,6 +1,6 @@
{
"name": "@json-render/mcp",
- "version": "0.21.0",
+ "version": "0.21.1",
"license": "Apache-2.0",
"description": "MCP Apps integration for @json-render/core. Serve json-render UIs as interactive MCP Apps in Claude, ChatGPT, Cursor, and VS Code.",
"keywords": [
diff --git a/packages/next/package.json b/packages/next/package.json
index 31300976..ec459856 100644
--- a/packages/next/package.json
+++ b/packages/next/package.json
@@ -1,6 +1,6 @@
{
"name": "@json-render/next",
- "version": "0.21.0",
+ "version": "0.21.1",
"license": "Apache-2.0",
"description": "Next.js renderer for @json-render/core. JSON becomes full Next.js applications with routes, layouts, metadata, and SSR.",
"keywords": [
diff --git a/packages/react-email/package.json b/packages/react-email/package.json
index 557c3aae..824313b4 100644
--- a/packages/react-email/package.json
+++ b/packages/react-email/package.json
@@ -1,6 +1,6 @@
{
"name": "@json-render/react-email",
- "version": "0.21.0",
+ "version": "0.21.1",
"license": "Apache-2.0",
"description": "React Email renderer for @json-render/core. JSON becomes HTML emails.",
"keywords": [
diff --git a/packages/react-native/package.json b/packages/react-native/package.json
index 526e4ecc..ca3424f2 100644
--- a/packages/react-native/package.json
+++ b/packages/react-native/package.json
@@ -1,6 +1,6 @@
{
"name": "@json-render/react-native",
- "version": "0.21.0",
+ "version": "0.21.1",
"license": "Apache-2.0",
"description": "React Native renderer for @json-render/core. JSON becomes React Native components.",
"keywords": [
diff --git a/packages/react-pdf/package.json b/packages/react-pdf/package.json
index f97eeb3b..27186d02 100644
--- a/packages/react-pdf/package.json
+++ b/packages/react-pdf/package.json
@@ -1,6 +1,6 @@
{
"name": "@json-render/react-pdf",
- "version": "0.21.0",
+ "version": "0.21.1",
"license": "Apache-2.0",
"description": "React PDF renderer for @json-render/core. JSON becomes PDF documents.",
"keywords": [
diff --git a/packages/react-three-fiber/package.json b/packages/react-three-fiber/package.json
index 2363846d..c70c6874 100644
--- a/packages/react-three-fiber/package.json
+++ b/packages/react-three-fiber/package.json
@@ -1,6 +1,6 @@
{
"name": "@json-render/react-three-fiber",
- "version": "0.21.0",
+ "version": "0.21.1",
"license": "Apache-2.0",
"description": "React Three Fiber renderer for @json-render/core. JSON becomes 3D scenes.",
"keywords": [
diff --git a/packages/react/package.json b/packages/react/package.json
index a1bb0860..70eb8fd7 100644
--- a/packages/react/package.json
+++ b/packages/react/package.json
@@ -1,6 +1,6 @@
{
"name": "@json-render/react",
- "version": "0.21.0",
+ "version": "0.21.1",
"license": "Apache-2.0",
"description": "React renderer for @json-render/core. JSON becomes React components.",
"keywords": [
diff --git a/packages/redux/package.json b/packages/redux/package.json
index 758ce0ea..0f22bb9f 100644
--- a/packages/redux/package.json
+++ b/packages/redux/package.json
@@ -1,6 +1,6 @@
{
"name": "@json-render/redux",
- "version": "0.21.0",
+ "version": "0.21.1",
"license": "Apache-2.0",
"description": "Redux adapter for json-render StateStore",
"keywords": [
diff --git a/packages/remotion/package.json b/packages/remotion/package.json
index 5cf92440..9d9af21f 100644
--- a/packages/remotion/package.json
+++ b/packages/remotion/package.json
@@ -1,6 +1,6 @@
{
"name": "@json-render/remotion",
- "version": "0.21.0",
+ "version": "0.21.1",
"license": "Apache-2.0",
"description": "Remotion renderer for @json-render/core. JSON becomes video compositions.",
"keywords": [
diff --git a/packages/shadcn-svelte/package.json b/packages/shadcn-svelte/package.json
index 6086e7ad..b9ab93c1 100644
--- a/packages/shadcn-svelte/package.json
+++ b/packages/shadcn-svelte/package.json
@@ -1,6 +1,6 @@
{
"name": "@json-render/shadcn-svelte",
- "version": "0.21.0",
+ "version": "0.21.1",
"license": "Apache-2.0",
"description": "shadcn-svelte component library for @json-render/svelte. JSON becomes beautiful Tailwind-styled Svelte components.",
"keywords": [
diff --git a/packages/shadcn/package.json b/packages/shadcn/package.json
index 21221e62..f5074dee 100644
--- a/packages/shadcn/package.json
+++ b/packages/shadcn/package.json
@@ -1,6 +1,6 @@
{
"name": "@json-render/shadcn",
- "version": "0.21.0",
+ "version": "0.21.1",
"license": "Apache-2.0",
"description": "shadcn/ui component library for @json-render/core. JSON becomes beautiful Tailwind-styled React components.",
"keywords": [
diff --git a/packages/solid/package.json b/packages/solid/package.json
index dfc2a11c..136f31b4 100644
--- a/packages/solid/package.json
+++ b/packages/solid/package.json
@@ -1,6 +1,6 @@
{
"name": "@json-render/solid",
- "version": "0.21.0",
+ "version": "0.21.1",
"license": "Apache-2.0",
"description": "SolidJS renderer for @json-render/core. JSON becomes Solid components.",
"keywords": [
diff --git a/packages/svelte/package.json b/packages/svelte/package.json
index 9da28373..1b18d2a6 100644
--- a/packages/svelte/package.json
+++ b/packages/svelte/package.json
@@ -1,6 +1,6 @@
{
"name": "@json-render/svelte",
- "version": "0.21.0",
+ "version": "0.21.1",
"license": "Apache-2.0",
"description": "Svelte 5 renderer for @json-render/core. JSON becomes Svelte components.",
"keywords": [
diff --git a/packages/tanstack-start/package.json b/packages/tanstack-start/package.json
index 37e97fff..c2eb5e4c 100644
--- a/packages/tanstack-start/package.json
+++ b/packages/tanstack-start/package.json
@@ -1,6 +1,6 @@
{
"name": "@json-render/tanstack-start",
- "version": "0.21.0",
+ "version": "0.21.1",
"license": "Apache-2.0",
"description": "TanStack Start renderer for @json-render/core. JSON becomes full TanStack Start applications with routes, layouts, head metadata, and SSR.",
"keywords": [
diff --git a/packages/vue/package.json b/packages/vue/package.json
index 57e84e37..8a14782b 100644
--- a/packages/vue/package.json
+++ b/packages/vue/package.json
@@ -1,6 +1,6 @@
{
"name": "@json-render/vue",
- "version": "0.21.0",
+ "version": "0.21.1",
"license": "Apache-2.0",
"description": "Vue renderer for @json-render/core. JSON becomes Vue components.",
"keywords": [
diff --git a/packages/xstate/package.json b/packages/xstate/package.json
index 21e048fb..96938cf4 100644
--- a/packages/xstate/package.json
+++ b/packages/xstate/package.json
@@ -1,6 +1,6 @@
{
"name": "@json-render/xstate",
- "version": "0.21.0",
+ "version": "0.21.1",
"license": "Apache-2.0",
"description": "XState Store adapter for json-render StateStore",
"keywords": [
diff --git a/packages/yaml/package.json b/packages/yaml/package.json
index 59bfc96a..5f44fc7e 100644
--- a/packages/yaml/package.json
+++ b/packages/yaml/package.json
@@ -1,6 +1,6 @@
{
"name": "@json-render/yaml",
- "version": "0.21.0",
+ "version": "0.21.1",
"license": "Apache-2.0",
"description": "YAML wire format for @json-render/core. Progressive rendering and surgical edits via streaming YAML.",
"keywords": [
diff --git a/packages/zustand/package.json b/packages/zustand/package.json
index 2ea602f2..27ee78e0 100644
--- a/packages/zustand/package.json
+++ b/packages/zustand/package.json
@@ -1,6 +1,6 @@
{
"name": "@json-render/zustand",
- "version": "0.21.0",
+ "version": "0.21.1",
"license": "Apache-2.0",
"description": "Zustand adapter for json-render StateStore",
"keywords": [