diff --git a/apps/router-e2e/__e2e__/static-rendering/app/metadata-async/[id].tsx b/apps/router-e2e/__e2e__/static-rendering/app/metadata-async/[id].tsx
new file mode 100644
index 00000000000000..235f28667df49a
--- /dev/null
+++ b/apps/router-e2e/__e2e__/static-rendering/app/metadata-async/[id].tsx
@@ -0,0 +1,15 @@
+import type { GenerateMetadataFunction, Metadata } from 'expo-router/server';
+import { Text } from 'react-native';
+
+export const generateMetadata: GenerateMetadataFunction = async (request, params) => {
+ const pathname = new URL(request.url).pathname;
+
+ return {
+ title: `Async Metadata ${params.id}`,
+ description: `Async metadata for ${pathname}`,
+ } satisfies Metadata;
+};
+
+export default function AsyncMetadataPage() {
+ return Async Metadata;
+}
diff --git a/apps/router-e2e/__e2e__/static-rendering/app/metadata.tsx b/apps/router-e2e/__e2e__/static-rendering/app/metadata.tsx
new file mode 100644
index 00000000000000..22030074c705cd
--- /dev/null
+++ b/apps/router-e2e/__e2e__/static-rendering/app/metadata.tsx
@@ -0,0 +1,31 @@
+import Head from 'expo-router/head';
+import { Text } from 'react-native';
+import type { GenerateMetadataFunction, Metadata } from 'expo-router/server';
+
+export const generateMetadata: GenerateMetadataFunction = async () => {
+ return {
+ title: 'Metadata Page',
+ description: 'Page with generateMetadata',
+ keywords: ['metadata', 'e2e'],
+ openGraph: {
+ title: 'Metadata OG Title',
+ description: 'Metadata OG Description',
+ },
+ twitter: {
+ card: 'summary',
+ title: 'Metadata Twitter Title',
+ },
+ } satisfies Metadata;
+};
+
+export default function MetadataPage() {
+ return (
+ <>
+ {/* The
component is here to check that the app doesn't crash when using it with `generateMetadata()` */}
+
+
+
+ Metadata
+ >
+ );
+}
diff --git a/packages/@expo/cli/CHANGELOG.md b/packages/@expo/cli/CHANGELOG.md
index 7a061838cbcc11..0c50068cd59ce6 100644
--- a/packages/@expo/cli/CHANGELOG.md
+++ b/packages/@expo/cli/CHANGELOG.md
@@ -15,6 +15,8 @@
- Enable parallel CocoaPods code signing to speed up device builds. ([#43529](https://github.com/expo/expo/pull/43529) by [@evanbacon](https://github.com/evanbacon))
- Prompt before clearing native folders when we detect project as a native module ([#44458](https://github.com/expo/expo/pull/44458) by [@kitten](https://github.com/kitten))
- Rewrite @react-navigation/core to expo-router for library compatibility ([#45039](https://github.com/expo/expo/pull/45039) by [@Ubax](https://github.com/Ubax))
+- Use stream rendering in SSR ([#43963](https://github.com/expo/expo/pull/43963) by [@hassankhan](https://github.com/hassankhan))
+- Add support for metadata in streaming SSR ([#44731](https://github.com/expo/expo/pull/44731) by [@hassankhan](https://github.com/hassankhan))
### 🐛 Bug fixes
diff --git a/packages/@expo/cli/e2e/__tests__/export/__snapshots__/server-rendering.test.ts.snap b/packages/@expo/cli/e2e/__tests__/export/__snapshots__/server-rendering.test.ts.snap
index b26f06adfd563b..441214f607ac52 100644
--- a/packages/@expo/cli/e2e/__tests__/export/__snapshots__/server-rendering.test.ts.snap
+++ b/packages/@expo/cli/e2e/__tests__/export/__snapshots__/server-rendering.test.ts.snap
@@ -1,7 +1,31 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
+exports[`exports server expo serve requests injects \`generateMetadata()\` result into the initial server HTML 1`] = `
+[
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "Metadata Page",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+]
+`;
+
exports[`exports server expo serve requests supports usePathname in +html files 1`] = `
-"
-
-
-
-