{
  "manifest_version": "1.0.0",
  "template": {
    "id": "3f31920f-330c-4bed-aa11-72e9e659918e",
    "slug": "static-site",
    "name": "Static Site",
    "description": "Deploy a Static Site to a Bucket with Functions on Railway",
    "url": "https://railway.com/deploy/static-site",
    "upstream": {
      "image": "ghcr.io/railwayapp/function-bun:1.3.0"
    }
  },
  "services": [
    {
      "name": "Server",
      "source": {
        "image": "ghcr.io/railwayapp/function-bun:1.3.0"
      },
      "needs_volume": false,
      "http": true
    },
    {
      "name": "Builder",
      "source": {
        "image": "ghcr.io/railwayapp/function-bun:1.3.0"
      },
      "needs_volume": false,
      "http": false
    }
  ],
  "required_inputs": [
    {
      "key": "S3_BUCKET",
      "service": "Server",
      "description": "Provide a value for S3_BUCKET.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_REGION",
      "service": "Server",
      "description": "Provide a value for S3_REGION.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_ENDPOINT",
      "service": "Server",
      "description": "Provide a value for S3_ENDPOINT.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_ACCESS_KEY_ID",
      "service": "Server",
      "description": "Provide a value for S3_ACCESS_KEY_ID.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_SECRET_ACCESS_KEY",
      "service": "Server",
      "description": "Provide a value for S3_SECRET_ACCESS_KEY.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REPO",
      "service": "Builder",
      "description": "Provide a value for REPO.",
      "secret": false,
      "strategy": "default",
      "default": "https://github.com/roicort/launchpad"
    },
    {
      "key": "BRANCH",
      "service": "Builder",
      "description": "Provide a value for BRANCH.",
      "secret": false,
      "strategy": "default",
      "default": "main"
    },
    {
      "key": "S3_BUCKET",
      "service": "Builder",
      "description": "Provide a value for S3_BUCKET.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_REGION",
      "service": "Builder",
      "description": "Provide a value for S3_REGION.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_ENDPOINT",
      "service": "Builder",
      "description": "Provide a value for S3_ENDPOINT.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_ACCESS_KEY_ID",
      "service": "Builder",
      "description": "Provide a value for S3_ACCESS_KEY_ID.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_SECRET_ACCESS_KEY",
      "service": "Builder",
      "description": "Provide a value for S3_SECRET_ACCESS_KEY.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    }
  ],
  "deploy": {
    "mcp": {
      "server": "railway",
      "tool": "deploy_template",
      "args": {
        "template_code": "static-site"
      }
    },
    "cli": "railway deploy --template static-site",
    "api": {
      "method": "POST",
      "path": "/graphql/v2",
      "body": {
        "query": "mutation templateDeploy($input: TemplateDeployV2Input!) { templateDeployV2(input: $input) { projectId workflowId } }",
        "variables": {
          "input": {
            "templateId": "3f31920f-330c-4bed-aa11-72e9e659918e",
            "serializedConfig": {
              "buckets": {
                "3a01b8bd-aee6-4aa6-ab6a-5e3798d0eb86": {
                  "name": "Bucket"
                }
              },
              "services": {
                "872711a2-23ca-41e5-ba98-e51a867220ea": {
                  "name": "Server",
                  "deploy": {
                    "startCommand": "./run.sh Ly8gaW5kZXgudHN4CmltcG9ydCB7IEhvbm8gfSBmcm9tICJob25vIjsKaW1wb3J0IHsgY29ycyB9IGZyb20gImhvbm8vY29ycyI7CmltcG9ydCB7IFMzQ2xpZW50IH0gZnJvbSAiYnVuIjsKaW1wb3J0IHsgc3RyZWFtIH0gZnJvbSAiaG9uby9zdHJlYW1pbmciOwoKY29uc3QgYXBwID0gbmV3IEhvbm8oKTsKCi8vIENvbmZpZ3VyYWNpw7NuIFMzCmNvbnN0IGNsaWVudCA9IG5ldyBTM0NsaWVudCh7CiAgYWNjZXNzS2V5SWQ6IEJ1bi5lbnYuUzNfQUNDRVNTX0tFWV9JRCwKICBzZWNyZXRBY2Nlc3NLZXk6IEJ1bi5lbnYuUzNfU0VDUkVUX0FDQ0VTU19LRVksCiAgYnVja2V0OiBCdW4uZW52LlMzX0JVQ0tFVCwKICBlbmRwb2ludDogQnVuLmVudi5TM19FTkRQT0lOVCwKfSk7CgovLyBIYWJpbGl0YXIgQ09SUyBwYXJhIHRvZGFzIGxhcyBydXRhcwphcHAudXNlKCIvKiIsIGNvcnMoKSk7CgovLyBSdXRhIGNhdGNoLWFsbAphcHAuZ2V0KCIvKiIsIGFzeW5jIChjKSA9PiB7CiAgbGV0IHBhdGhuYW1lID0gYy5yZXEucGF0aDsKICBsZXQgczNmaWxlID0gY2xpZW50LmZpbGUocGF0aG5hbWUpOwoKICAvLyBTaSB0ZXJtaW5hIGVuICIvIiBvIGVzIGxhIHJhw616LCBhZ3JlZ2FyIGluZGV4Lmh0bWwKICBpZiAocGF0aG5hbWUgPT09ICIvIiB8fCBwYXRobmFtZS5lbmRzV2l0aCgiLyIpKSB7CiAgICBwYXRobmFtZSArPSAiaW5kZXguaHRtbCI7CiAgICBzM2ZpbGUgPSBjbGllbnQuZmlsZShwYXRobmFtZSk7CiAgfQoKICAvLyBTaSBubyBleGlzdGUsIGludGVudGFyIGFncmVnYXIgaW5kZXguaHRtbCBwYXJhIHJ1dGFzIHNpbiBzbGFzaAogIGlmICghKGF3YWl0IHMzZmlsZS5leGlzdHMoKSkgJiYgIXBhdGhuYW1lLmVuZHNXaXRoKCIuaHRtbCIpKSB7CiAgICBjb25zdCBpbmRleEZpbGUgPSBjbGllbnQuZmlsZShwYXRobmFtZSArICIvaW5kZXguaHRtbCIpOwogICAgaWYgKGF3YWl0IGluZGV4RmlsZS5leGlzdHMoKSkgewogICAgICBwYXRobmFtZSArPSAiL2luZGV4Lmh0bWwiOwogICAgICBzM2ZpbGUgPSBpbmRleEZpbGU7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gYy5ub3RGb3VuZCgpOwogICAgfQogIH0KCiAgLy8gT2J0ZW5lciBtZXRhZGF0YQogIGNvbnN0IG1ldGEgPSBhd2FpdCBzM2ZpbGUuc3RhdCgpOwoKICAvLyBDb250ZW50LVR5cGUgY29uIGZhbGxiYWNrCiAgYy5oZWFkZXIoIkNvbnRlbnQtVHlwZSIsIG1ldGEudHlwZSB8fCAidGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Iik7CgogIC8vIEVUYWcgeSBMYXN0LU1vZGlmaWVkCiAgaWYgKG1ldGEuZXRhZykgYy5oZWFkZXIoIkVUYWciLCBtZXRhLmV0YWcpOwogIGlmIChtZXRhLmxhc3RNb2RpZmllZCkKICAgIGMuaGVhZGVyKCJMYXN0LU1vZGlmaWVkIiwgbWV0YS5sYXN0TW9kaWZpZWQudG9VVENTdHJpbmcoKSk7CgogIC8vIENhY2hlIHDDumJsaWNhIDEgaG9yYQogIGMuaGVhZGVyKCJDYWNoZS1Db250cm9sIiwgInB1YmxpYywgbWF4LWFnZT0zNjAwIik7CgogIC8vIFN0cmVhbSBkZWwgYXJjaGl2bwogIHJldHVybiBzdHJlYW0oYywgYXN5bmMgKHN0cmVhbSkgPT4gewogICAgYXdhaXQgc3RyZWFtLnBpcGUoczNmaWxlLnN0cmVhbSgpKTsKICB9KTsKfSk7CgovLyBTZXJ2aXIgQnVuCkJ1bi5zZXJ2ZSh7CiAgcG9ydDogQnVuLmVudi5QT1JUID8gTnVtYmVyKEJ1bi5lbnYuUE9SVCkgOiAzMDAwLAogIGZldGNoOiBhcHAuZmV0Y2gsCn0pOwo="
                  },
                  "source": {
                    "image": "ghcr.io/railwayapp/function-bun:1.3.0"
                  },
                  "variables": {
                    "S3_BUCKET": {
                      "defaultValue": "${{Bucket.BUCKET}}"
                    },
                    "S3_REGION": {
                      "defaultValue": "${{Bucket.REGION}}"
                    },
                    "S3_ENDPOINT": {
                      "defaultValue": "${{Bucket.ENDPOINT}}"
                    },
                    "S3_ACCESS_KEY_ID": {
                      "defaultValue": "${{Bucket.ACCESS_KEY_ID}}"
                    },
                    "S3_SECRET_ACCESS_KEY": {
                      "defaultValue": "${{Bucket.SECRET_ACCESS_KEY}}"
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>:8080": {
                        "port": 8080
                      }
                    }
                  }
                },
                "add12925-006c-4ee9-a293-5dba705f0237": {
                  "name": "Builder",
                  "deploy": {
                    "startCommand": "./run.sh Ly8gaW5kZXgudHN4IChCdW4gcnVudGltZSwgUmFpbHdheS1mcmllbmRseSkKaW1wb3J0IHsgbWtkdGVtcCwgcmVhZGRpciwgd3JpdGVGaWxlIH0gZnJvbSAibm9kZTpmcy9wcm9taXNlcyI7CmltcG9ydCB7IGpvaW4gfSBmcm9tICJub2RlOnBhdGgiOwppbXBvcnQgeyB0bXBkaXIgfSBmcm9tICJub2RlOm9zIjsKaW1wb3J0IHsgUzNDbGllbnQgfSBmcm9tICJidW4iOwppbXBvcnQgeyAkIH0gZnJvbSAiYnVuIjsKaW1wb3J0IHVuemlwcGVyIGZyb20gInVuemlwcGVyIjsKCi8vIC0tLSBlbnYgLS0tCmNvbnN0IFJFUE8gPSBwcm9jZXNzLmVudi5SRVBPOwpjb25zdCBCUkFOQ0ggPSBwcm9jZXNzLmVudi5CUkFOQ0g7CmlmICghUkVQTykgdGhyb3cgbmV3IEVycm9yKCJSRVBPIGVudiB2YXIgaXMgcmVxdWlyZWQiKTsKaWYgKCFCUkFOQ0gpIHRocm93IG5ldyBFcnJvcigiQlJBTkNIIGVudiB2YXIgaXMgcmVxdWlyZWQiKTsKCmNvbnN0IEJVSUxEX0RJUiA9ICJkaXN0IjsKCi8vIC0tLSB0ZW1wIHdvcmtzcGFjZSAtLS0KY29uc3Qgd29ya2RpciA9IGF3YWl0IG1rZHRlbXAoam9pbih0bXBkaXIoKSwgInNpdGUtYnVpbGQtIikpOwpjb25zb2xlLmxvZygiV29ya2luZyBkaXI6Iiwgd29ya2Rpcik7CgovLyAtLS0gZG93bmxvYWQgcmVwbyBhcyBaSVAgLS0tCmNvbnN0IHppcFVybCA9IGAke1JFUE99L2FyY2hpdmUvcmVmcy9oZWFkcy8ke0JSQU5DSH0uemlwYDsKY29uc29sZS5sb2coIkRvd25sb2FkaW5nIHJlcG8gemlwOiIsIHppcFVybCk7Cgpjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh6aXBVcmwpOwppZiAoIXJlcy5vaykKICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBmZXRjaCByZXBvOiAke3Jlcy5zdGF0dXN9ICR7cmVzLnN0YXR1c1RleHR9YCk7Cgpjb25zdCBidWZmZXIgPSBCdWZmZXIuZnJvbShhd2FpdCByZXMuYXJyYXlCdWZmZXIoKSk7CmNvbnN0IHppcFBhdGggPSBqb2luKHdvcmtkaXIsICJyZXBvLnppcCIpOwphd2FpdCB3cml0ZUZpbGUoemlwUGF0aCwgYnVmZmVyKTsKCi8vIC0tLSBleHRyYWN0IFpJUCAtLS0KYXdhaXQgdW56aXBwZXIuT3Blbi5maWxlKHppcFBhdGgpLnRoZW4oKGQpID0+IGQuZXh0cmFjdCh7IHBhdGg6IHdvcmtkaXIgfSkpOwpjb25zb2xlLmxvZygiUmVwbyBleHRyYWN0ZWQiKTsKCi8vIC0tLSBmaW5kIGV4dHJhY3RlZCBmb2xkZXIgLS0tCmNvbnN0IGV4dHJhY3RlZEZvbGRlcnMgPSBhd2FpdCByZWFkZGlyKHdvcmtkaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTsKY29uc3QgcmVwb0ZvbGRlciA9IGV4dHJhY3RlZEZvbGRlcnMuZmluZCgoZCkgPT4gZC5pc0RpcmVjdG9yeSgpKT8ubmFtZTsKaWYgKCFyZXBvRm9sZGVyKSB0aHJvdyBuZXcgRXJyb3IoIkNvdWxkIG5vdCBmaW5kIGV4dHJhY3RlZCByZXBvIGZvbGRlciIpOwoKY29uc3QgcmVwb1BhdGggPSBqb2luKHdvcmtkaXIsIHJlcG9Gb2xkZXIpOwpwcm9jZXNzLmNoZGlyKHJlcG9QYXRoKTsKCi8vIC0tLSBpbnN0YWxsICsgYnVpbGQgLS0tCmNvbnNvbGUubG9nKCJJbnN0YWxsaW5nIGRlcGVuZGVuY2llcy4uLiIpOwphd2FpdCAkYGJ1biBpbnN0YWxsYDsKCmNvbnNvbGUubG9nKCJCdWlsZGluZyBzaXRlLi4uIik7CmF3YWl0ICRgYnVuIHJ1biBidWlsZGA7CgovLyAtLS0gUzMgY2xpZW50IC0tLQpjb25zdCBzMyA9IG5ldyBTM0NsaWVudCh7CiAgYWNjZXNzS2V5SWQ6IHByb2Nlc3MuZW52LlMzX0FDQ0VTU19LRVlfSUQhLAogIHNlY3JldEFjY2Vzc0tleTogcHJvY2Vzcy5lbnYuUzNfU0VDUkVUX0FDQ0VTU19LRVkhLAogIGJ1Y2tldDogcHJvY2Vzcy5lbnYuUzNfQlVDS0VUISwKICBlbmRwb2ludDogcHJvY2Vzcy5lbnYuUzNfRU5EUE9JTlQsCn0pOwoKLy8gLS0tIGRlbGV0ZSBhbGwgZmlsZXMgaW4gYnVja2V0IC0tLQpjb25zb2xlLmxvZygiRGVsZXRpbmcgYWxsIGZpbGVzIGluIGJ1Y2tldC4uLiIpOwoKLy8gTcOpdG9kbyBwYXJhIGJvcnJhciB0b2RvIGVsIGJ1Y2tldCBjb24gcGFnaW5hY2nDs24KYXN5bmMgZnVuY3Rpb24gZGVsZXRlQWxsRmlsZXMoKSB7CiAgbGV0IGxpc3RSZXNwb25zZSA9IGF3YWl0IFMzQ2xpZW50Lmxpc3QobnVsbCwgewogICAgYWNjZXNzS2V5SWQ6IHByb2Nlc3MuZW52LlMzX0FDQ0VTU19LRVlfSUQhLAogICAgc2VjcmV0QWNjZXNzS2V5OiBwcm9jZXNzLmVudi5TM19TRUNSRVRfQUNDRVNTX0tFWSEsCiAgICBidWNrZXQ6IHByb2Nlc3MuZW52LlMzX0JVQ0tFVCEsCiAgICBlbmRwb2ludDogcHJvY2Vzcy5lbnYuUzNfRU5EUE9JTlQsCiAgfSk7CgogIGRvIHsKICAgIGlmIChsaXN0UmVzcG9uc2UuY29udGVudHMpIHsKICAgICAgZm9yIChjb25zdCBvYmogb2YgbGlzdFJlc3BvbnNlLmNvbnRlbnRzKSB7CiAgICAgICAgY29uc29sZS5sb2coIkRlbGV0aW5nOiIsIG9iai5rZXkpOwogICAgICAgIGF3YWl0IHMzLmRlbGV0ZShvYmoua2V5KTsKICAgICAgfQogICAgfQoKICAgIGlmIChsaXN0UmVzcG9uc2UuaXNUcnVuY2F0ZWQpIHsKICAgICAgbGlzdFJlc3BvbnNlID0gYXdhaXQgUzNDbGllbnQubGlzdCgKICAgICAgICB7CiAgICAgICAgICBjb250aW51YXRpb25Ub2tlbjogbGlzdFJlc3BvbnNlLm5leHRDb250aW51YXRpb25Ub2tlbiwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIGFjY2Vzc0tleUlkOiBwcm9jZXNzLmVudi5TM19BQ0NFU1NfS0VZX0lEISwKICAgICAgICAgIHNlY3JldEFjY2Vzc0tleTogcHJvY2Vzcy5lbnYuUzNfU0VDUkVUX0FDQ0VTU19LRVkhLAogICAgICAgICAgYnVja2V0OiBwcm9jZXNzLmVudi5TM19CVUNLRVQhLAogICAgICAgICAgZW5kcG9pbnQ6IHByb2Nlc3MuZW52LlMzX0VORFBPSU5ULAogICAgICAgIH0KICAgICAgKTsKICAgIH0gZWxzZSB7CiAgICAgIGJyZWFrOwogICAgfQogIH0gd2hpbGUgKHRydWUpOwp9Cgphd2FpdCBkZWxldGVBbGxGaWxlcygpOwoKLy8gLS0tIHVwbG9hZCBkaXJlY3RvcnkgLS0tCmFzeW5jIGZ1bmN0aW9uIHVwbG9hZERpcihkaXI6IHN0cmluZywgcHJlZml4ID0gIiIpIHsKICBmb3IgKGNvbnN0IGVudHJ5IG9mIGF3YWl0IHJlYWRkaXIoZGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHsKICAgIGNvbnN0IGZ1bGxQYXRoID0gam9pbihkaXIsIGVudHJ5Lm5hbWUpOwogICAgY29uc3Qga2V5ID0gcHJlZml4ID8gYCR7cHJlZml4fS8ke2VudHJ5Lm5hbWV9YCA6IGVudHJ5Lm5hbWU7CgogICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHsKICAgICAgYXdhaXQgdXBsb2FkRGlyKGZ1bGxQYXRoLCBrZXkpOwogICAgfSBlbHNlIHsKICAgICAgY29uc29sZS5sb2coIlVwbG9hZGluZzoiLCBrZXkpOwogICAgICBhd2FpdCBzMy5maWxlKGtleSkud3JpdGUoQnVuLmZpbGUoZnVsbFBhdGgpKTsKICAgIH0KICB9Cn0KCi8vIC0tLSB1cGxvYWQgYnVpbGQgLS0tCmNvbnNvbGUubG9nKGBVcGxvYWRpbmcgJHtCVUlMRF9ESVJ9LyB0byBTMy4uLmApOwphd2FpdCB1cGxvYWREaXIoam9pbihyZXBvUGF0aCwgQlVJTERfRElSKSk7Cgpjb25zb2xlLmxvZygiQnVpbGQgKyB1cGxvYWQgY29tcGxldGUg4pyFIik7CnByb2Nlc3MuZXhpdCgwKTsK"
                  },
                  "source": {
                    "image": "ghcr.io/railwayapp/function-bun:1.3.0"
                  },
                  "variables": {
                    "REPO": {
                      "defaultValue": "https://github.com/roicort/launchpad"
                    },
                    "BRANCH": {
                      "defaultValue": "main"
                    },
                    "S3_BUCKET": {
                      "defaultValue": "${{Bucket.BUCKET}}"
                    },
                    "S3_REGION": {
                      "defaultValue": "${{Bucket.REGION}}"
                    },
                    "S3_ENDPOINT": {
                      "defaultValue": "${{Bucket.ENDPOINT}}"
                    },
                    "S3_ACCESS_KEY_ID": {
                      "defaultValue": "${{Bucket.ACCESS_KEY_ID}}"
                    },
                    "S3_SECRET_ACCESS_KEY": {
                      "defaultValue": "${{Bucket.SECRET_ACCESS_KEY}}"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "post_deploy": {},
  "resources": {
    "expected_services": 2,
    "needs_volume": false
  },
  "generated_at": "2026-09-20T16:14:49.616Z",
  "generator_version": "0.1.0",
  "status": "degraded",
  "validated_at": "2026-09-18T14:03:30.147Z",
  "success_rate_30d": 0,
  "validation": {
    "last_run_id": "run_3ba6b8a7c0c64934aac3",
    "checks": [
      {
        "name": "workflow_completed",
        "passed": false,
        "detail": "Your workspace has been restricted. Please contact support to resolve this."
      }
    ]
  }
}
