diff --git a/packages/docs/site/docs/blueprints/08-examples.md b/packages/docs/site/docs/blueprints/08-examples.md
index bf409832744..58aecb10e30 100644
--- a/packages/docs/site/docs/blueprints/08-examples.md
+++ b/packages/docs/site/docs/blueprints/08-examples.md
@@ -96,6 +96,22 @@ wp_insert_post(array(
]
}} />
+## Run Symfony without WordPress
+
+Blueprints can also skip the WordPress download and boot a standalone PHP app.
+This example loads a bundled Symfony app with Composer dependencies already
+installed, so it starts without cloning a Git repository or running a Node/Sass
+build in the browser.
+
+The app demonstrates Symfony attribute routes, autowired services, Twig, and
+HttpClient. Its landing page also explains where to open the Playground file
+browser and Blueprint viewer.
+
+
+
## Enable an option on the Gutenberg Experiments page
Here: Switch on the "new admin views" feature.
diff --git a/packages/docs/site/docs/main/guides/php-frameworks.md b/packages/docs/site/docs/main/guides/php-frameworks.md
index cf2f12bc16b..9c2771b8136 100644
--- a/packages/docs/site/docs/main/guides/php-frameworks.md
+++ b/packages/docs/site/docs/main/guides/php-frameworks.md
@@ -59,7 +59,7 @@ Here is the complete embed:
"step": "unzip",
"zipFile": {
"resource": "url",
- "url": "https://wordpress.github.io/blueprints/blueprints/symfony-package-radar/symfony-package-radar.zip?v=html-api-2026-06-08"
+ "url": "https://wordpress.github.io/blueprints/blueprints/symfony-package-radar/symfony-package-radar.zip?v=wp-php-toolkit-html-2026-06-09"
},
"extractToPath": "/app"
}
diff --git a/packages/docs/site/src/components/Blueprints/BlueprintExample.mdx b/packages/docs/site/src/components/Blueprints/BlueprintExample.mdx
index ce7f5e6cab6..b0ad650543b 100644
--- a/packages/docs/site/src/components/Blueprints/BlueprintExample.mdx
+++ b/packages/docs/site/src/components/Blueprints/BlueprintExample.mdx
@@ -3,9 +3,19 @@ import CodeBlock from '@theme/CodeBlock';
{!props.justButton && (
-
- {props.display || JSON.stringify(props.blueprint, null, '\t')}
+
+ {props.display ||
+ props.blueprintUrl ||
+ JSON.stringify(props.blueprint, null, '\t')}
)}
- {!props.noButton && }
+ {!props.noButton && (
+
+ )}
diff --git a/packages/docs/site/src/components/Blueprints/BlueprintRunButton.tsx b/packages/docs/site/src/components/Blueprints/BlueprintRunButton.tsx
index 4fb976535b0..0f2c5186b38 100644
--- a/packages/docs/site/src/components/Blueprints/BlueprintRunButton.tsx
+++ b/packages/docs/site/src/components/Blueprints/BlueprintRunButton.tsx
@@ -1,8 +1,8 @@
import React from 'react';
-export function BlueprintRunButton({ blueprint }) {
+export function BlueprintRunButton({ blueprint, blueprintUrl }) {
const [isRunning, setIsRunning] = React.useState(false);
- if (!blueprint) {
+ if (!blueprint && !blueprintUrl) {
return null;
}
if (!isRunning) {
@@ -17,9 +17,15 @@ export function BlueprintRunButton({ blueprint }) {
);
}
- const url = `https://playground.wordpress.net/?mode=seamless#${btoa(
- typeof blueprint === 'string' ? blueprint : JSON.stringify(blueprint)
- )}`;
+ const url = blueprintUrl
+ ? `https://playground.wordpress.net/?mode=seamless&blueprint-url=${encodeURIComponent(
+ blueprintUrl
+ )}`
+ : `https://playground.wordpress.net/?mode=seamless#${btoa(
+ typeof blueprint === 'string'
+ ? blueprint
+ : JSON.stringify(blueprint)
+ )}`;
return (