{
  "manifest_version": "1.0.0",
  "template": {
    "id": "b39a981d-00ec-4ed0-8db3-041de1703ee1",
    "slug": "selenium-grid",
    "name": "Selenium Grid",
    "description": "Run Chrome, Firefox, and Edge automation in parallel with Selenium Grid.",
    "url": "https://railway.com/deploy/selenium-grid",
    "upstream": {
      "image": "selenium/hub:latest"
    }
  },
  "services": [
    {
      "name": "node-edge",
      "source": {
        "image": "selenium/node-edge:latest"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "node-chrome",
      "source": {
        "image": "selenium/node-chrome:latest"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "node-firefox",
      "source": {
        "image": "selenium/node-firefox:latest"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "selenium-hub",
      "source": {
        "image": "selenium/hub:latest"
      },
      "needs_volume": false,
      "http": true
    }
  ],
  "required_inputs": [
    {
      "key": "SE_START_VNC",
      "service": "node-edge",
      "description": "Disable VNC",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "SE_START_XVFB",
      "service": "node-edge",
      "description": "Start virtual display",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "SE_START_NO_VNC",
      "service": "node-edge",
      "description": "Disable noVNC",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "SE_ENABLE_TRACING",
      "service": "node-edge",
      "description": "Disable Selenium tracing",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "SE_EVENT_BUS_HOST",
      "service": "node-edge",
      "description": "Selenium Hub private hostname",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "SE_NODE_MAX_SESSIONS",
      "service": "node-edge",
      "description": "Maximum concurrent Edge sessions",
      "secret": false,
      "strategy": "default",
      "default": "1"
    },
    {
      "key": "RAILWAY_SHM_SIZE_BYTES",
      "service": "node-edge",
      "description": "Allocate 2 GiB shared memory for Edge",
      "secret": false,
      "strategy": "default",
      "default": "2147483648"
    },
    {
      "key": "SE_NODE_SESSION_TIMEOUT",
      "service": "node-edge",
      "description": "Close stale sessions after five minutes",
      "secret": false,
      "strategy": "default",
      "default": "300"
    },
    {
      "key": "SE_EVENT_BUS_PUBLISH_PORT",
      "service": "node-edge",
      "description": "Hub Event Bus publish port",
      "secret": false,
      "strategy": "default",
      "default": "4442"
    },
    {
      "key": "SE_EVENT_BUS_SUBSCRIBE_PORT",
      "service": "node-edge",
      "description": "Hub Event Bus subscribe port",
      "secret": false,
      "strategy": "default",
      "default": "4443"
    },
    {
      "key": "SE_NODE_OVERRIDE_MAX_SESSIONS",
      "service": "node-edge",
      "description": "Keep the recommended concurrency limit",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "SE_START_VNC",
      "service": "node-chrome",
      "description": "Disable VNC to reduce resource usage",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "SE_START_XVFB",
      "service": "node-chrome",
      "description": "Start virtual display required by browser container",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "SE_START_NO_VNC",
      "service": "node-chrome",
      "description": "Disable noVNC browser viewer",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "SE_ENABLE_TRACING",
      "service": "node-chrome",
      "description": "Disable tracing to reduce overhead",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "SE_EVENT_BUS_HOST",
      "service": "node-chrome",
      "description": "Selenium Hub private hostname",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "SE_NODE_MAX_SESSIONS",
      "service": "node-chrome",
      "description": "Maximum concurrent Chrome sessions on this node",
      "secret": false,
      "strategy": "default",
      "default": "1"
    },
    {
      "key": "RAILWAY_SHM_SIZE_BYTES",
      "service": "node-chrome",
      "description": "Allocate 2 GiB shared memory for Chrome",
      "secret": false,
      "strategy": "default",
      "default": "2147483648"
    },
    {
      "key": "SE_NODE_SESSION_TIMEOUT",
      "service": "node-chrome",
      "description": "Close stale browser sessions after five minutes",
      "secret": false,
      "strategy": "default",
      "default": "300"
    },
    {
      "key": "SE_EVENT_BUS_PUBLISH_PORT",
      "service": "node-chrome",
      "description": "Hub Event Bus publish port",
      "secret": false,
      "strategy": "default",
      "default": "4442"
    },
    {
      "key": "SE_EVENT_BUS_SUBSCRIBE_PORT",
      "service": "node-chrome",
      "description": "Hub Event Bus subscribe port",
      "secret": false,
      "strategy": "default",
      "default": "4443"
    },
    {
      "key": "SE_NODE_OVERRIDE_MAX_SESSIONS",
      "service": "node-chrome",
      "description": "Keep Selenium's recommended CPU-based session limit",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "SE_START_VNC",
      "service": "node-firefox",
      "description": "Disable VNC",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "SE_START_XVFB",
      "service": "node-firefox",
      "description": "Start virtual display",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "SE_START_NO_VNC",
      "service": "node-firefox",
      "description": "Disable noVNC",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "SE_ENABLE_TRACING",
      "service": "node-firefox",
      "description": "Disable Selenium tracing",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "SE_EVENT_BUS_HOST",
      "service": "node-firefox",
      "description": "Selenium Hub private hostname",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "SE_NODE_MAX_SESSIONS",
      "service": "node-firefox",
      "description": "Maximum concurrent Firefox sessions",
      "secret": false,
      "strategy": "default",
      "default": "1"
    },
    {
      "key": "RAILWAY_SHM_SIZE_BYTES",
      "service": "node-firefox",
      "description": "Allocate 2 GiB shared memory for Firefox",
      "secret": false,
      "strategy": "default",
      "default": "2147483648"
    },
    {
      "key": "SE_NODE_SESSION_TIMEOUT",
      "service": "node-firefox",
      "description": "Close stale sessions after five minutes",
      "secret": false,
      "strategy": "default",
      "default": "300"
    },
    {
      "key": "SE_EVENT_BUS_PUBLISH_PORT",
      "service": "node-firefox",
      "description": "Hub Event Bus publish port",
      "secret": false,
      "strategy": "default",
      "default": "4442"
    },
    {
      "key": "SE_EVENT_BUS_SUBSCRIBE_PORT",
      "service": "node-firefox",
      "description": "Hub Event Bus subscribe port",
      "secret": false,
      "strategy": "default",
      "default": "4443"
    },
    {
      "key": "SE_NODE_OVERRIDE_MAX_SESSIONS",
      "service": "node-firefox",
      "description": "Keep the recommended concurrency limit",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "PORT",
      "service": "selenium-hub",
      "description": "Railway public service port for Selenium Grid",
      "secret": false,
      "strategy": "default",
      "default": "4444"
    },
    {
      "key": "SE_ENABLE_TRACING",
      "service": "selenium-hub",
      "description": "Disable OpenTelemetry tracing to reduce runtime overhead",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "SE_SESSION_RETRY_INTERVAL",
      "service": "selenium-hub",
      "description": "Interval in seconds between attempts to match queued sessions",
      "secret": false,
      "strategy": "default",
      "default": "5"
    },
    {
      "key": "SE_SESSION_REQUEST_TIMEOUT",
      "service": "selenium-hub",
      "description": "Maximum time a new session request can stay queued",
      "secret": false,
      "strategy": "default",
      "default": "300"
    }
  ],
  "deploy": {
    "mcp": {
      "server": "railway",
      "tool": "deploy_template",
      "args": {
        "template_code": "selenium-grid"
      }
    },
    "cli": "railway deploy --template selenium-grid",
    "api": {
      "method": "POST",
      "path": "/graphql/v2",
      "body": {
        "query": "mutation templateDeploy($input: TemplateDeployV2Input!) { templateDeployV2(input: $input) { projectId workflowId } }",
        "variables": {
          "input": {
            "templateId": "b39a981d-00ec-4ed0-8db3-041de1703ee1",
            "serializedConfig": {
              "services": {
                "010b8697-d825-421d-8b5e-dc615b60b3c8": {
                  "icon": "https://devicons.railway.app/edge",
                  "name": "node-edge",
                  "source": {
                    "image": "selenium/node-edge:latest"
                  },
                  "variables": {
                    "SE_START_VNC": {
                      "description": "Disable VNC",
                      "defaultValue": "false"
                    },
                    "SE_START_XVFB": {
                      "description": "Start virtual display",
                      "defaultValue": "true"
                    },
                    "SE_START_NO_VNC": {
                      "description": "Disable noVNC",
                      "defaultValue": "false"
                    },
                    "SE_ENABLE_TRACING": {
                      "description": "Disable Selenium tracing",
                      "defaultValue": "false"
                    },
                    "SE_EVENT_BUS_HOST": {
                      "description": "Selenium Hub private hostname",
                      "defaultValue": "${{selenium-hub.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "SE_NODE_MAX_SESSIONS": {
                      "description": "Maximum concurrent Edge sessions",
                      "defaultValue": "1"
                    },
                    "RAILWAY_SHM_SIZE_BYTES": {
                      "description": "Allocate 2 GiB shared memory for Edge",
                      "defaultValue": "2147483648"
                    },
                    "SE_NODE_SESSION_TIMEOUT": {
                      "description": "Close stale sessions after five minutes",
                      "defaultValue": "300"
                    },
                    "SE_EVENT_BUS_PUBLISH_PORT": {
                      "description": "Hub Event Bus publish port",
                      "defaultValue": "4442"
                    },
                    "SE_EVENT_BUS_SUBSCRIBE_PORT": {
                      "description": "Hub Event Bus subscribe port",
                      "defaultValue": "4443"
                    },
                    "SE_NODE_OVERRIDE_MAX_SESSIONS": {
                      "description": "Keep the recommended concurrency limit",
                      "defaultValue": "false"
                    }
                  }
                },
                "7a1e223c-19dd-4d38-a325-d8af35666752": {
                  "icon": "https://devicons.railway.app/chrome",
                  "name": "node-chrome",
                  "source": {
                    "image": "selenium/node-chrome:latest"
                  },
                  "variables": {
                    "SE_START_VNC": {
                      "description": "Disable VNC to reduce resource usage",
                      "defaultValue": "false"
                    },
                    "SE_START_XVFB": {
                      "description": "Start virtual display required by browser container",
                      "defaultValue": "true"
                    },
                    "SE_START_NO_VNC": {
                      "description": "Disable noVNC browser viewer",
                      "defaultValue": "false"
                    },
                    "SE_ENABLE_TRACING": {
                      "description": "Disable tracing to reduce overhead",
                      "defaultValue": "false"
                    },
                    "SE_EVENT_BUS_HOST": {
                      "description": "Selenium Hub private hostname",
                      "defaultValue": "${{selenium-hub.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "SE_NODE_MAX_SESSIONS": {
                      "description": "Maximum concurrent Chrome sessions on this node",
                      "defaultValue": "1"
                    },
                    "RAILWAY_SHM_SIZE_BYTES": {
                      "description": "Allocate 2 GiB shared memory for Chrome",
                      "defaultValue": "2147483648"
                    },
                    "SE_NODE_SESSION_TIMEOUT": {
                      "description": "Close stale browser sessions after five minutes",
                      "defaultValue": "300"
                    },
                    "SE_EVENT_BUS_PUBLISH_PORT": {
                      "description": "Hub Event Bus publish port",
                      "defaultValue": "4442"
                    },
                    "SE_EVENT_BUS_SUBSCRIBE_PORT": {
                      "description": "Hub Event Bus subscribe port",
                      "defaultValue": "4443"
                    },
                    "SE_NODE_OVERRIDE_MAX_SESSIONS": {
                      "description": "Keep Selenium's recommended CPU-based session limit",
                      "defaultValue": "false"
                    }
                  }
                },
                "ca8d7654-2ed2-4acb-97f6-812bbd8e27f3": {
                  "icon": "https://devicons.railway.app/firefox",
                  "name": "node-firefox",
                  "source": {
                    "image": "selenium/node-firefox:latest"
                  },
                  "variables": {
                    "SE_START_VNC": {
                      "description": "Disable VNC",
                      "defaultValue": "false"
                    },
                    "SE_START_XVFB": {
                      "description": "Start virtual display",
                      "defaultValue": "true"
                    },
                    "SE_START_NO_VNC": {
                      "description": "Disable noVNC",
                      "defaultValue": "false"
                    },
                    "SE_ENABLE_TRACING": {
                      "description": "Disable Selenium tracing",
                      "defaultValue": "false"
                    },
                    "SE_EVENT_BUS_HOST": {
                      "description": "Selenium Hub private hostname",
                      "defaultValue": "${{selenium-hub.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "SE_NODE_MAX_SESSIONS": {
                      "description": "Maximum concurrent Firefox sessions",
                      "defaultValue": "1"
                    },
                    "RAILWAY_SHM_SIZE_BYTES": {
                      "description": "Allocate 2 GiB shared memory for Firefox",
                      "defaultValue": "2147483648"
                    },
                    "SE_NODE_SESSION_TIMEOUT": {
                      "description": "Close stale sessions after five minutes",
                      "defaultValue": "300"
                    },
                    "SE_EVENT_BUS_PUBLISH_PORT": {
                      "description": "Hub Event Bus publish port",
                      "defaultValue": "4442"
                    },
                    "SE_EVENT_BUS_SUBSCRIBE_PORT": {
                      "description": "Hub Event Bus subscribe port",
                      "defaultValue": "4443"
                    },
                    "SE_NODE_OVERRIDE_MAX_SESSIONS": {
                      "description": "Keep the recommended concurrency limit",
                      "defaultValue": "false"
                    }
                  }
                },
                "f26af717-7968-4dae-8c3f-57e094ed84e5": {
                  "icon": "https://devicons.railway.app/selenium",
                  "name": "selenium-hub",
                  "source": {
                    "image": "selenium/hub:latest"
                  },
                  "variables": {
                    "PORT": {
                      "description": "Railway public service port for Selenium Grid",
                      "defaultValue": "4444"
                    },
                    "SE_ENABLE_TRACING": {
                      "description": "Disable OpenTelemetry tracing to reduce runtime overhead",
                      "defaultValue": "false"
                    },
                    "SE_SESSION_RETRY_INTERVAL": {
                      "description": "Interval in seconds between attempts to match queued sessions",
                      "defaultValue": "5"
                    },
                    "SE_SESSION_REQUEST_TIMEOUT": {
                      "description": "Maximum time a new session request can stay queued",
                      "defaultValue": "300"
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>:4444": {
                        "port": 4444
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "post_deploy": {},
  "resources": {
    "expected_services": 4,
    "needs_volume": false
  },
  "generated_at": "2026-09-20T10:14:37.339Z",
  "generator_version": "0.1.0",
  "status": "validated",
  "validated_at": "2026-09-19T14:31:22.867Z",
  "success_rate_30d": 1,
  "validation": {
    "last_run_id": "run_ea765687a56a448c8bc5",
    "checks": [
      {
        "name": "workflow_completed",
        "passed": true
      },
      {
        "name": "all_services_deployed",
        "passed": true
      },
      {
        "name": "stays_up",
        "passed": true
      }
    ],
    "typical_ready_seconds": 69,
    "typical_build_seconds": 0,
    "typical_start_seconds": 10,
    "slowest_service": "node-edge"
  }
}
