{
  "$schema": "https://playground.wordpress.net/blueprint-schema.json",
  "description": "Independent PreviewReady demonstration: install GenerateBlocks from WordPress.org and create a focused, disposable product preview.",
  "landingPage": "/previewready-generateblocks-demo/",
  "preferredVersions": {
    "php": "8.3",
    "wp": "latest"
  },
  "features": {
    "networking": true
  },
  "steps": [
    {
      "step": "installPlugin",
      "pluginData": {
        "resource": "wordpress.org/plugins",
        "slug": "generateblocks"
      },
      "options": {
        "activate": true
      }
    },
    {
      "step": "setSiteOptions",
      "options": {
        "blogname": "GenerateBlocks · Live Preview Demo",
        "blogdescription": "A disposable, independently authored Blueprint demonstration",
        "permalink_structure": "/%postname%/"
      }
    },
    {
      "step": "runPHP",
      "code": "<?php\nrequire_once '/wordpress/wp-load.php';\nrequire_once ABSPATH . 'wp-admin/includes/plugin.php';\n\nif ( ! is_plugin_active( 'generateblocks/plugin.php' ) ) {\n    throw new RuntimeException( 'GenerateBlocks was not activated.' );\n}\n\n$source_content = base64_decode( 'PCEtLSB3cDpodG1sIC0tPgo8bWFpbiBjbGFzcz0icHJldmlld3JlYWR5LWRlbW8iIHN0eWxlPSJiYWNrZ3JvdW5kOiMwNzExMWY7Y29sb3I6I2U4ZjBmZjttYXJnaW46MCBjYWxjKDUwJSAtIDUwdncpO21pbi1oZWlnaHQ6MTAwdmg7cGFkZGluZzpjbGFtcCgzMnB4LDZ2dyw4NHB4KSAyMHB4O2ZvbnQtZmFtaWx5OnN5c3RlbS11aSwtYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCwnU2Vnb2UgVUknLHNhbnMtc2VyaWYiPgogIDxkaXYgc3R5bGU9ImJveC1zaXppbmc6Ym9yZGVyLWJveDttYXgtd2lkdGg6MTEyMHB4O21hcmdpbjowIGF1dG8iPgogICAgPHAgc3R5bGU9ImNvbG9yOiM2MWU2YmM7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6ODAwO2xldHRlci1zcGFjaW5nOi4xNmVtO21hcmdpbjowIDAgMThweDt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2UiPkxJVkUgUFJFVklFVyBCTFVFUFJJTlQgwrcgSU5ERVBFTkRFTlQgREVNT05TVFJBVElPTjwvcD4KICAgIDxoMSBzdHlsZT0iY29sb3I6I2ZmZjtmb250LXNpemU6Y2xhbXAoNDJweCw3dncsNzhweCk7Zm9udC13ZWlnaHQ6NzgwO2xldHRlci1zcGFjaW5nOi0uMDU1ZW07bGluZS1oZWlnaHQ6Ljk4O21hcmdpbjowO21heC13aWR0aDo5NjBweCI+VHVybiBhIHBsdWdpbiBsaXN0aW5nIGludG8gYSB0cnktYmVmb3JlLWluc3RhbGwgZXhwZXJpZW5jZS48L2gxPgogICAgPHAgc3R5bGU9ImNvbG9yOiNiOGM4ZTE7Zm9udC1zaXplOmNsYW1wKDE4cHgsMi40dncsMjRweCk7bGluZS1oZWlnaHQ6MS41NTttYXJnaW46MjhweCAwIDA7bWF4LXdpZHRoOjgyMHB4Ij5UaGlzIHRlbXBvcmFyeSBXb3JkUHJlc3Mgc2l0ZSB3YXMgYXNzZW1ibGVkIGluIHlvdXIgYnJvd3NlciBmcm9tIG9uZSBwdWJsaWMgSlNPTiBmaWxlLiBHZW5lcmF0ZUJsb2NrcyB3YXMgZmV0Y2hlZCBmcm9tIFdvcmRQcmVzcy5vcmcsIGFjdGl2YXRlZCwgYW5kIHBsYWNlZCBiZXNpZGUgYSBmb2N1c2VkIHRlc3QgcGFnZSBhdXRvbWF0aWNhbGx5LjwvcD4KICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6cmVwZWF0KGF1dG8tZml0LG1pbm1heCgxODBweCwxZnIpKTtnYXA6MTJweDttYXJnaW46MzhweCAwIDAiPgogICAgICA8cCBzdHlsZT0iYmFja2dyb3VuZDojMGQyMDM0O2JvcmRlcjoxcHggc29saWQgIzFmM2M1NTtib3JkZXItcmFkaXVzOjk5OXB4O2NvbG9yOiNkY2VjZmY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NzAwO21hcmdpbjowO3BhZGRpbmc6MTJweCAxNnB4O3RleHQtYWxpZ246Y2VudGVyIj7inJMgT2ZmaWNpYWwgZGlyZWN0b3J5IGluc3RhbGw8L3A+CiAgICAgIDxwIHN0eWxlPSJiYWNrZ3JvdW5kOiMwZDIwMzQ7Ym9yZGVyOjFweCBzb2xpZCAjMWYzYzU1O2JvcmRlci1yYWRpdXM6OTk5cHg7Y29sb3I6I2RjZWNmZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo3MDA7bWFyZ2luOjA7cGFkZGluZzoxMnB4IDE2cHg7dGV4dC1hbGlnbjpjZW50ZXIiPuKckyBObyBzZXJ2ZXIgc2V0dXA8L3A+CiAgICAgIDxwIHN0eWxlPSJiYWNrZ3JvdW5kOiMwZDIwMzQ7Ym9yZGVyOjFweCBzb2xpZCAjMWYzYzU1O2JvcmRlci1yYWRpdXM6OTk5cHg7Y29sb3I6I2RjZWNmZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo3MDA7bWFyZ2luOjA7cGFkZGluZzoxMnB4IDE2cHg7dGV4dC1hbGlnbjpjZW50ZXIiPuKckyBEaXNwb3NhYmxlIHNhbmRib3g8L3A+CiAgICA8L2Rpdj4KICAgIDxzZWN0aW9uIHN0eWxlPSJkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOnJlcGVhdChhdXRvLWZpdCxtaW5tYXgoMzAwcHgsMWZyKSk7Z2FwOjIwcHg7bWFyZ2luOmNsYW1wKDQ2cHgsN3Z3LDc4cHgpIDAgMCI+CiAgICAgIDxhcnRpY2xlIHN0eWxlPSJiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCgxNDVkZWcsIzEwMjUzYSwjMGIxYTJhKTtib3JkZXI6MXB4IHNvbGlkICMyMTQyNWQ7Ym9yZGVyLXJhZGl1czoyNHB4O3BhZGRpbmc6Y2xhbXAoMjZweCw0dncsNDZweCk7Ym94LXNoYWRvdzowIDI4cHggODBweCByZ2JhKDAsMCwwLC4yNCkiPgogICAgICAgIDxwIHN0eWxlPSJjb2xvcjojNjFlNmJjO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjgwMDtsZXR0ZXItc3BhY2luZzouMTVlbTttYXJnaW46MCAwIDE2cHgiPldIQVQgVEhFIEJMVUVQUklOVCBESUQ8L3A+CiAgICAgICAgPGgyIHN0eWxlPSJjb2xvcjojZmZmO2ZvbnQtc2l6ZTpjbGFtcCgyOHB4LDR2dyw0MnB4KTtsZXR0ZXItc3BhY2luZzotLjAzNWVtO2xpbmUtaGVpZ2h0OjEuMDg7bWFyZ2luOjAiPkEgY2xlYW4gZmlyc3QtcnVuIHN0b3J54oCUbm90IGEgYmxhbmsgZGFzaGJvYXJkLjwvaDI+CiAgICAgICAgPHAgc3R5bGU9ImNvbG9yOiNiOGM4ZTE7Zm9udC1zaXplOjE3cHg7bGluZS1oZWlnaHQ6MS43O21hcmdpbjoyMnB4IDAgMCI+SXQgaW5zdGFsbGVkIGFuZCBhY3RpdmF0ZWQgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHJlbGVhc2UsIGNyZWF0ZWQgdGhpcyBvcmllbnRhdGlvbiBwYWdlLCBjb25maWd1cmVkIGEgZnJvbnQgcGFnZSwgYW5kIHNpZ25lZCB5b3UgaW50byBhbiBpc29sYXRlZCBhZG1pbmlzdHJhdG9yIHNlc3Npb24uIE9wZW4gdGhlIGVkaXRvciwgYWRkIGEgYmxvY2ssIGFuZCBzZWFyY2ggZm9yIEdlbmVyYXRlQmxvY2tzIHRvIGV2YWx1YXRlIGl0cyBjb250cm9scyBkaXJlY3RseS48L3A+CiAgICAgICAgPGEgc3R5bGU9ImFsaWduLWl0ZW1zOmNlbnRlcjtiYWNrZ3JvdW5kOiM2MWU2YmM7Ym9yZGVyLXJhZGl1czoxMnB4O2NvbG9yOiMwNjIwMTY7ZGlzcGxheTppbmxpbmUtZmxleDtmb250LXNpemU6MTZweDtmb250LXdlaWdodDo4MDA7bWFyZ2luOjI4cHggMCAwO3BhZGRpbmc6MTRweCAyMHB4O3RleHQtZGVjb3JhdGlvbjpub25lIiBocmVmPSIvd3AtYWRtaW4vcG9zdC5waHA/cG9zdD1fX1BBR0VfSURfXyZhbXA7YWN0aW9uPWVkaXQiPk9wZW4gdGhlIGJsb2NrIGVkaXRvciDihpI8L2E+CiAgICAgIDwvYXJ0aWNsZT4KICAgICAgPGFzaWRlIHN0eWxlPSJiYWNrZ3JvdW5kOiNmNGY3ZmI7Ym9yZGVyLXJhZGl1czoyNHB4O2NvbG9yOiMwYTFhMjk7cGFkZGluZzpjbGFtcCgyNnB4LDR2dyw0MnB4KSI+CiAgICAgICAgPHAgc3R5bGU9ImNvbG9yOiMxNjc4NWU7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6ODAwO2xldHRlci1zcGFjaW5nOi4xNWVtO21hcmdpbjowIDAgMTZweCI+VkVSSUZZIElUIFlPVVJTRUxGPC9wPgogICAgICAgIDxoMiBzdHlsZT0iY29sb3I6IzBhMWEyOTtmb250LXNpemU6Y2xhbXAoMjhweCw0dncsNDJweCk7bGV0dGVyLXNwYWNpbmc6LS4wMzVlbTtsaW5lLWhlaWdodDoxLjA4O21hcmdpbjowIj5UaGUgcHJvb2YgaXMgaW50ZXJhY3RpdmUuPC9oMj4KICAgICAgICA8cCBzdHlsZT0iYm9yZGVyLXRvcDoxcHggc29saWQgI2NmZGFlNTtjb2xvcjojMmM0MDU0O2ZvbnQtc2l6ZToxNnB4O2xpbmUtaGVpZ2h0OjEuNTU7bWFyZ2luOjI0cHggMCAwO3BhZGRpbmc6MThweCAwIDAiPjAxIMK3IFZpc2l0IFBsdWdpbnMgYW5kIGNvbmZpcm0gR2VuZXJhdGVCbG9ja3MgaXMgYWN0aXZlLjwvcD4KICAgICAgICA8cCBzdHlsZT0iYm9yZGVyLXRvcDoxcHggc29saWQgI2NmZGFlNTtjb2xvcjojMmM0MDU0O2ZvbnQtc2l6ZToxNnB4O2xpbmUtaGVpZ2h0OjEuNTU7bWFyZ2luOjE1cHggMCAwO3BhZGRpbmc6MThweCAwIDAiPjAyIMK3IE9wZW4gdGhlIGVkaXRvciwgc2VsZWN0IEFkZCBibG9jaywgYW5kIHNlYXJjaCBHZW5lcmF0ZUJsb2Nrcy48L3A+CiAgICAgICAgPHAgc3R5bGU9ImJvcmRlci10b3A6MXB4IHNvbGlkICNjZmRhZTU7Y29sb3I6IzJjNDA1NDtmb250LXNpemU6MTZweDtsaW5lLWhlaWdodDoxLjU1O21hcmdpbjoxNXB4IDAgMDtwYWRkaW5nOjE4cHggMCAwIj4wMyDCtyBBZGQgYW5kIGNoYW5nZSBibG9ja3MgZnJlZWx5LiBDbG9zaW5nIHRoZSB0YWIgZGlzY2FyZHMgdGhlIHNhbmRib3guPC9wPgogICAgICAgIDxhIHN0eWxlPSJjb2xvcjojMTE2MTQ5O2Rpc3BsYXk6aW5saW5lLWZsZXg7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6ODAwO21hcmdpbjoyMnB4IDAgMDt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO3RleHQtZGVjb3JhdGlvbi10aGlja25lc3M6MnB4O3RleHQtdW5kZXJsaW5lLW9mZnNldDo1cHgiIGhyZWY9Ii93cC1hZG1pbi9wbHVnaW5zLnBocCI+Q2hlY2sgdGhlIGFjdGl2ZSBwbHVnaW4g4oaSPC9hPgogICAgICA8L2FzaWRlPgogICAgPC9zZWN0aW9uPgogICAgPHAgc3R5bGU9ImJvcmRlci10b3A6MXB4IHNvbGlkICMxZDM0NDk7Y29sb3I6IzgxOTdiMjtmb250LXNpemU6MTNweDtsaW5lLWhlaWdodDoxLjY1O21hcmdpbjo1NHB4IDAgMDttYXgtd2lkdGg6OTAwcHg7cGFkZGluZzoyOHB4IDAgMCI+SW5kZXBlbmRlbnQgc2FtcGxlOiBQcmV2aWV3UmVhZHkgYXV0aG9yZWQgdGhpcyBkZW1vbnN0cmF0aW9uIGZyb20gcHVibGljIG1hdGVyaWFscy4gSXQgd2FzIG5vdCBjb21taXNzaW9uZWQsIHJldmlld2VkLCBvciBlbmRvcnNlZCBieSBHZW5lcmF0ZVByZXNzLCBHZW5lcmF0ZUJsb2Nrcywgb3IgV29yZFByZXNzLm9yZy4gUHJvZHVjdCBuYW1lcyBpZGVudGlmeSB0aGUgc29mdHdhcmUgYmVpbmcgZGVtb25zdHJhdGVkLiBObyBwcm9kdWN0aW9uIHNpdGUgb3IgcHJpdmF0ZSBkYXRhIGlzIHVzZWQuPC9wPgogIDwvZGl2Pgo8L21haW4+CjwhLS0gL3dwOmh0bWwgLS0+', true );\nif ( false === $source_content ) {\n    throw new RuntimeException( 'The embedded demo page could not be decoded.' );\n}\n\n$slug = 'previewready-generateblocks-demo';\n$existing = get_page_by_path( $slug, OBJECT, 'page' );\n$admin_user = get_user_by( 'login', 'admin' );\n$author_id = $admin_user ? (int) $admin_user->ID : 0;\n$page_id = $existing ? (int) $existing->ID : wp_insert_post(\n    array(\n        'post_title'     => 'GenerateBlocks Live Preview Demo',\n        'post_name'      => $slug,\n        'post_content'   => '',\n        'post_status'    => 'publish',\n        'post_type'      => 'page',\n        'post_author'    => $author_id,\n        'comment_status' => 'closed',\n        'ping_status'    => 'closed',\n    ),\n    true\n);\nif ( is_wp_error( $page_id ) ) {\n    throw new RuntimeException( $page_id->get_error_message() );\n}\n\n$content = str_replace( '__PAGE_ID__', (string) $page_id, $source_content );\n$updated_page_id = wp_update_post(\n    array(\n        'ID'             => (int) $page_id,\n        'post_title'     => 'GenerateBlocks Live Preview Demo',\n        'post_name'      => $slug,\n        'post_content'   => $content,\n        'post_status'    => 'publish',\n        'post_type'      => 'page',\n        'post_author'    => $author_id,\n        'comment_status' => 'closed',\n        'ping_status'    => 'closed',\n    ),\n    true\n);\nif ( is_wp_error( $updated_page_id ) ) {\n    throw new RuntimeException( $updated_page_id->get_error_message() );\n}\n\nupdate_option( 'show_on_front', 'page' );\nupdate_option( 'page_on_front', (int) $page_id );\nupdate_option( 'page_for_posts', 0 );\nflush_rewrite_rules( false );\n?>"
    },
    {
      "step": "login",
      "username": "admin",
      "password": "password"
    }
  ]
}
