diff --git a/src/routes/solid-meta/(0)index.mdx b/src/routes/solid-meta/(0)index.mdx
index d22bdef8f6..5c07a31d57 100644
--- a/src/routes/solid-meta/(0)index.mdx
+++ b/src/routes/solid-meta/(0)index.mdx
@@ -17,6 +17,10 @@ description: >-
meta tags at any component level for flexible SEO and metadata control.
---
+:::note[Using Solid 2.0?]
+This documentation covers `@solidjs/meta` 0.29.x for Solid 1.x. For Solid 2.x, use `@solidjs/meta` 1.x and the [v1 documentation](/solid-meta/v1).
+:::
+
Solid Meta offers asynchronous SSR-ready Document Head management for Solid Applications, based on [React Head](https://github.com/tizmagik/react-head)
With Solid Meta, you can define `document.head` tags at any level of your component hierarchy.
diff --git a/src/routes/solid-meta/v1/(0)index.mdx b/src/routes/solid-meta/v1/(0)index.mdx
new file mode 100644
index 0000000000..4af8ee04fd
--- /dev/null
+++ b/src/routes/solid-meta/v1/(0)index.mdx
@@ -0,0 +1,34 @@
+---
+title: Overview
+titleTemplate: ":title"
+mainNavExclude: true
+use_cases: >-
+ managing head tags, seo optimization, document metadata, dynamic meta tags,
+ ssr meta management, streaming head updates
+tags:
+ - meta
+ - head
+ - seo
+ - ssr
+ - overview
+version: "1.0"
+description: >-
+ Solid Meta 1.0 provides document head management for Solid 2.0 — declare
+ head tags anywhere with streaming-correct SSR and flicker-free hydration.
+---
+
+:::note[Solid Meta 1.0 is for Solid 2.0]
+Solid Meta 1.x requires Solid 2.x (currently in beta). If you are using Solid 1.x, use `@solidjs/meta` 0.29.x and the [latest documentation](/solid-meta) instead.
+:::
+
+Solid Meta provides document head management for Solid applications — declare `
`, ``, ``, and other head elements anywhere in your component tree, with streaming-correct server rendering and flicker-free hydration.
+
+Solid Meta 1.x is a thin component layer over Solid 2.0's built-in head registry (`useHead` in `@solidjs/web`). There is **no provider** — the registry is ambient. Render a head component anywhere and it registers under the current reactive owner, and server rendering splices the winning tags into your document automatically.
+
+| Solid version | @solidjs/meta version |
+| ------------- | --------------------- |
+| Solid 2.x | 1.x |
+| Solid 1.x | 0.27.x – 0.29.x |
+| Solid 0.x | 0.26.x |
+
+If you are upgrading an existing app from `@solidjs/meta` 0.x, start with the [migration guide](/solid-meta/v1/migrating-from-v0).
diff --git a/src/routes/solid-meta/v1/(1)getting-started.mdx b/src/routes/solid-meta/v1/(1)getting-started.mdx
new file mode 100644
index 0000000000..0df1eb0334
--- /dev/null
+++ b/src/routes/solid-meta/v1/(1)getting-started.mdx
@@ -0,0 +1,84 @@
+---
+title: Getting started
+use_cases: >-
+ installation, setup, first head tags, page titles, meta tags, ssr setup
+tags:
+ - setup
+ - installation
+ - quickstart
+ - head
+ - meta
+version: "1.0"
+description: >-
+ Install Solid Meta 1.0 and manage document head tags from anywhere in your
+ Solid 2.0 application.
+---
+
+## Installation
+
+```package-install
+@solidjs/meta
+```
+
+Solid Meta 1.x requires `solid-js` and `@solidjs/web` 2.0 (`2.0.0-beta.31` or later).
+
+## Usage
+
+There is no provider and no other setup.
+Render head components anywhere in your component tree:
+
+```tsx
+import { Title, Link, Meta } from "@solidjs/meta";
+
+function Home() {
+ return (
+
+ Title of page
+
+
+
+ );
+}
+```
+
+Head tags follow a few consistent rules:
+
+- **Later wins.**
+ Tags deduplicate by identity (each [component's reference page](/solid-meta/v1/reference/meta/title) documents its identity rule); the last-registered tag for an identity is the one in the document.
+- **Disposal restores.**
+ When the winning tag's component unmounts, the previous registration for that identity is restored — navigating away from a page undoes its head changes automatically.
+- **Reactive.**
+ Attribute values and text children can be reactive expressions; updates apply in place without losing the tag's position in the override order.
+
+Every component accepts a `key` prop that overrides the default identity — use it to make otherwise-distinct tags override each other, or to fork an identity that would otherwise collide:
+
+```tsx
+{/* These override each other despite different attributes: */}
+
+
+```
+
+To manage a _set_ of tags as one unit — several `og:image`s, a block of social tags that should override together — wrap them in [``](/solid-meta/v1/reference/meta/head).
+
+## Server rendering
+
+Server rendering requires no wiring.
+Render your document with Solid and the head manages itself:
+
+```tsx
+import { renderToStream } from "@solidjs/web";
+import App from "./App";
+
+// ... within the context of a request ...
+renderToStream(() => ).pipe(res);
+```
+
+Winning tags are spliced into `` on the first flush (`` and `` go right after `` opens; resource links go early).
+Tags registered under a suspense boundary that completes later stream to the client as patches that apply when the boundary reveals.
+If you assemble the document yourself, use the `onHead` render option to receive the head markup instead.
+
+On the client, hydration adopts server-rendered head tags in place — there is no removal/re-insertion flicker.
+
+:::note[Static shell tags]
+A static `` in your server shell acts as the fallback when no `` is mounted. Don't hardcode other tags that Solid Meta should manage — the registry leaves foreign head tags alone, so a hardcoded `` would coexist with a rendered one.
+:::
diff --git a/src/routes/solid-meta/v1/(2)migrating-from-v0.mdx b/src/routes/solid-meta/v1/(2)migrating-from-v0.mdx
new file mode 100644
index 0000000000..b03a7fcf74
--- /dev/null
+++ b/src/routes/solid-meta/v1/(2)migrating-from-v0.mdx
@@ -0,0 +1,82 @@
+---
+title: Migrating from 0.x
+use_cases: >-
+ existing project, migration, upgrade, metaprovider removal
+tags:
+ - migration
+ - upgrade
+ - metaprovider
+ - breaking-changes
+version: "1.0"
+description: >-
+ Migrate your application from @solidjs/meta 0.x to 1.0.
+---
+
+Solid Meta 1.0 was rebuilt as a thin layer over Solid 2.0's built-in head registry.
+Most components keep their names and props, but the provider, the server plumbing, and the deduplication semantics changed.
+
+## Migration steps
+
+### Delete ``
+
+The head registry is ambient — the provider and `MetaContext` no longer exist.
+Remove the wrapper:
+
+```tsx del={1,5,7}
+import { MetaProvider } from "@solidjs/meta";
+
+export default function App() {
+ return (
+
+
+
+ );
+}
+```
+
+### Delete server plumbing
+
+The 0.x server flow — passing a `tags={[]}` array into `MetaProvider` and splicing `renderTags(tags)` into your template — is gone.
+Rendering the document with `renderToString` / `renderToStream` splices the winning tags into `` automatically, and tags registered under suspense boundaries stream to the client as patches.
+If you assemble the HTML document yourself, use the `onHead` render option to receive the head markup instead.
+
+### Review duplicate-tag semantics
+
+0.x kept multiple `` tags with the same `name` if their other attributes differed.
+1.x dedupes by `name`/`property`/`http-equiv` (qualified by `media`) with last-wins.
+
+For deliberate sets — multiple `og:image`s that should coexist — wrap them in [``](/solid-meta/v1/reference/meta/head):
+
+```tsx
+
+
+
+
+```
+
+To fork an identity that would otherwise collide, give each tag a distinct `key`.
+
+### Update `useHead` calls
+
+`useHead` is no longer exported from `@solidjs/meta` — the primitive belongs to Solid 2.0 itself.
+Import it from `@solidjs/web`; it takes `HeadTag` descriptors (`{ tag, props, key? }`) — a single tag, an array (a group), or a function (a reactive group):
+
+```tsx
+import { useHead } from "@solidjs/web";
+
+useHead({ tag: "meta", props: { name: "description", content: () => desc() } });
+```
+
+### Removed features
+
+- **`escape` prop** — everything is escaped now; text is applied via `textContent`, so markup injection isn't possible.
+- **`ref` and event handlers on head tags** — head tags are data, not managed elements. Query the DOM directly for the rare case that needs it.
+- **Client-dynamic `` / ``** — these are rendered into the server shell only, and are ignored (with a dev warning) on the client. A base or charset that changes after the document loaded is incoherent.
+- **`noscript`** — excluded from the core tag union: author it statically in your document shell.
+
+### New capabilities
+
+- [`
+ );
+}
+```
+
+## Related
+
+- [`Style`](/solid-meta/v1/reference/meta/style)
+- [`Head`](/solid-meta/v1/reference/meta/head)
diff --git a/src/routes/solid-meta/v1/reference/meta/style.mdx b/src/routes/solid-meta/v1/reference/meta/style.mdx
new file mode 100644
index 0000000000..9d00364bdb
--- /dev/null
+++ b/src/routes/solid-meta/v1/reference/meta/style.mdx
@@ -0,0 +1,82 @@
+---
+title: Style
+order: 5
+use_cases: >-
+ inline styles, critical css, css-in-js output
+tags:
+ - style
+ - css
+ - head
+ - component
+version: "1.0"
+description: >-
+ Style adds an inline style element to the document head through Solid Meta.
+---
+
+`Style` adds a [`;
+}
+```
+
+### Replaceable themed style
+
+```tsx
+import { Style } from "@solidjs/meta";
+
+export default function Theme(props: { accent: () => string }) {
+ return ;
+}
+```
+
+## Related
+
+- [`Stylesheet`](/solid-meta/v1/reference/meta/stylesheet)
+- [`Script`](/solid-meta/v1/reference/meta/script)
diff --git a/src/routes/solid-meta/v1/reference/meta/stylesheet.mdx b/src/routes/solid-meta/v1/reference/meta/stylesheet.mdx
new file mode 100644
index 0000000000..da35e3ff23
--- /dev/null
+++ b/src/routes/solid-meta/v1/reference/meta/stylesheet.mdx
@@ -0,0 +1,66 @@
+---
+title: Stylesheet
+order: 4
+use_cases: >-
+ stylesheets, css loading, route-scoped styles
+tags:
+ - stylesheet
+ - css
+ - link
+ - head
+ - component
+version: "1.0"
+description: >-
+ Stylesheet adds a stylesheet link element to the document head through
+ Solid Meta.
+---
+
+`Stylesheet` is sugar for [``](/solid-meta/v1/reference/meta/link).
+
+## Import
+
+```tsx
+import { Stylesheet } from "@solidjs/meta";
+```
+
+## Type
+
+```tsx
+const Stylesheet: Component<
+ Omit, "rel"> & { key?: string }
+>;
+```
+
+## Props
+
+Accepts attributes for [``](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link) except `rel`, which is fixed to `stylesheet`.
+
+### `key`
+
+- **Type:** `string`
+- **Optional:** Yes
+
+Overrides the default identity used for deduplication.
+
+## Behavior
+
+- Emitted eagerly: during SSR the stylesheet streams as soon as it registers, so styles load as early as possible.
+- Removed when its owner disposes — navigating away from a route removes its route-scoped stylesheet.
+- Dedupes by URL: registering the same `href` twice yields one element.
+
+## Examples
+
+### Route-scoped stylesheet
+
+```tsx
+import { Stylesheet } from "@solidjs/meta";
+
+export default function Dashboard() {
+ return ;
+}
+```
+
+## Related
+
+- [`Link`](/solid-meta/v1/reference/meta/link)
+- [`Style`](/solid-meta/v1/reference/meta/style)
diff --git a/src/routes/solid-meta/v1/reference/meta/title.mdx b/src/routes/solid-meta/v1/reference/meta/title.mdx
new file mode 100644
index 0000000000..71869a69d5
--- /dev/null
+++ b/src/routes/solid-meta/v1/reference/meta/title.mdx
@@ -0,0 +1,78 @@
+---
+title: Title
+order: 1
+use_cases: >-
+ page titles, document titles, browser tab text, head metadata
+tags:
+ - title
+ - head
+ - meta
+ - component
+version: "1.0"
+description: >-
+ Title sets the document title through Solid Meta.
+---
+
+`Title` adds a [``](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/title) element that sets the document title.
+
+## Import
+
+```tsx
+import { Title } from "@solidjs/meta";
+```
+
+## Type
+
+```tsx
+const Title: Component & { key?: string }>;
+```
+
+## Props
+
+### `children`
+
+- **Type:** `JSX.Element`
+- **Optional:** Yes
+
+Text content of the `title` element.
+Applied via `textContent`, so it is always escaped.
+Can be a reactive expression.
+
+### `key`
+
+- **Type:** `string`
+- **Optional:** Yes
+
+Overrides the default identity used for deduplication.
+
+## Behavior
+
+- `title` is a hard singleton: the last-registered `` wins regardless of attributes.
+- Unmounting the winning `` restores the previous one; a static `` in your server shell is the final fallback.
+
+## Examples
+
+### Basic usage
+
+```tsx
+import { Title } from "@solidjs/meta";
+
+export default function Page() {
+ return Solid Docs;
+}
+```
+
+### Reactive title
+
+```tsx
+import { Title } from "@solidjs/meta";
+
+export default function Product(props: { name: () => string }) {
+ return {props.name()} | My Store;
+}
+```
+
+## Related
+
+- [`Meta`](/solid-meta/v1/reference/meta/meta)
+- [`Head`](/solid-meta/v1/reference/meta/head)
diff --git a/vite.config.ts b/vite.config.ts
index 21b2ae08d3..dc03bf5f6c 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -61,6 +61,7 @@ export default defineConfig({
default: "latest",
values: {
latest: { path: "", label: "Latest" },
+ v1: { path: "v1", label: "v1" },
v2: { path: "v2", label: "v2" },
},
},
@@ -74,9 +75,13 @@ export default defineConfig({
version: ["latest", "v2"],
},
{
- project: ["router", "meta"],
+ project: "router",
version: "latest",
},
+ {
+ project: "meta",
+ version: ["latest", "v1"],
+ },
],
},
overrides: [
@@ -122,7 +127,24 @@ export default defineConfig({
title: "Solid Meta",
themeConfig: {
sidebar: {
- "/solid-meta": createFilesystemSidebar("./src/routes/solid-meta"),
+ "/solid-meta": createFilesystemSidebar(
+ "./src/routes/solid-meta",
+ {
+ filter: (item) => !item.filePath.includes("/solid-meta/v1"),
+ }
+ ),
+ },
+ },
+ },
+ {
+ project: "meta",
+ version: "v1",
+ title: "Solid Meta",
+ themeConfig: {
+ sidebar: {
+ "/solid-meta/v1": createFilesystemSidebar(
+ "./src/routes/solid-meta/v1"
+ ),
},
},
},