{
  "manifest_version": "1.0.0",
  "template": {
    "id": "425e5ac9-050c-48f7-881b-8077bd3923d7",
    "slug": "webstudio",
    "name": "Webstudio",
    "description": "Advanced Open Source Website Builder",
    "url": "https://railway.com/deploy/webstudio",
    "upstream": {
      "repo_url": "https://github.com/OpenSource-Templates/Webstudio"
    }
  },
  "services": [
    {
      "name": "postgres",
      "source": {
        "repo": "https://github.com/OpenSource-Templates/Webstudio"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "publisher",
      "source": {
        "repo": "https://github.com/OpenSource-Templates/Webstudio"
      },
      "needs_volume": false,
      "http": true
    },
    {
      "name": "webstudio",
      "source": {
        "repo": "https://github.com/OpenSource-Templates/Webstudio"
      },
      "needs_volume": false,
      "http": true
    },
    {
      "name": "postgrest",
      "source": {
        "repo": "https://github.com/OpenSource-Templates/Webstudio"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "minio",
      "source": {
        "repo": "https://github.com/OpenSource-Templates/Webstudio"
      },
      "needs_volume": false,
      "http": true
    }
  ],
  "required_inputs": [
    {
      "key": "PGDATA",
      "service": "postgres",
      "description": "Must sit under the volume mount /var/lib/postgresql.",
      "secret": false,
      "strategy": "default",
      "default": "/var/lib/postgresql/data"
    },
    {
      "key": "POSTGRES_DB",
      "service": "postgres",
      "description": "Database name. init.sql runs only on empty PGDATA.",
      "secret": false,
      "strategy": "default",
      "default": "webstudio"
    },
    {
      "key": "POSTGRES_USER",
      "service": "postgres",
      "description": "Superuser. Matches DATABASE_URL.",
      "secret": false,
      "strategy": "default",
      "default": "postgres"
    },
    {
      "key": "POSTGRES_PASSWORD",
      "service": "postgres",
      "description": "Same secret as the builder. Do not generate a new one.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PORT",
      "service": "publisher",
      "description": "Provide a value for PORT.",
      "secret": false,
      "strategy": "default",
      "default": "8080"
    },
    {
      "key": "DOMAIN",
      "service": "publisher",
      "description": "Public domain where Betterlytics is accessible. Railway automatically provides this domain.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "BUILDER_HOST",
      "service": "publisher",
      "description": "Wait-for host.",
      "secret": false,
      "strategy": "default",
      "default": "webstudio.railway.internal"
    },
    {
      "key": "BUILDER_PORT",
      "service": "publisher",
      "description": "Wait-for port. Builder binds Railway PORT.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PUBLISHER_HOST",
      "service": "publisher",
      "description": "Same suffix the builder uses. Point a wildcard custom domain here for project.yourdomain.com.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "BUILDER_INTERNAL_URL",
      "service": "publisher",
      "description": "HTTP to the builder over private DNS. Never https and never localhost.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "TRPC_SERVER_API_TOKEN",
      "service": "publisher",
      "description": "Must match the builder.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PORT",
      "service": "webstudio",
      "description": "Provide a value for PORT.",
      "secret": false,
      "strategy": "default",
      "default": "8080"
    },
    {
      "key": "DOMAIN",
      "service": "webstudio",
      "description": "Public domain where Betterlytics is accessible. Railway automatically provides this domain.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "S3_ACL",
      "service": "webstudio",
      "description": "Objects are anonymously downloadable.",
      "secret": false,
      "strategy": "default",
      "default": "public-read"
    },
    {
      "key": "FEATURES",
      "service": "webstudio",
      "description": "Compose-compat alias used by some image builds.",
      "secret": false,
      "strategy": "default",
      "default": "*"
    },
    {
      "key": "NODE_ENV",
      "service": "webstudio",
      "description": "Remix production mode.",
      "secret": false,
      "strategy": "default",
      "default": "production"
    },
    {
      "key": "DEV_LOGIN",
      "service": "webstudio",
      "description": "Enables email+password login. Password is the value of AUTH_SECRET.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "S3_BUCKET",
      "service": "webstudio",
      "description": "Object bucket created on first MinIO boot.",
      "secret": false,
      "strategy": "default",
      "default": "webstudio-assets"
    },
    {
      "key": "S3_REGION",
      "service": "webstudio",
      "description": "Dummy region required by the AWS SDK. MinIO ignores it.",
      "secret": false,
      "strategy": "default",
      "default": "us-east-1"
    },
    {
      "key": "USER_PLAN",
      "service": "webstudio",
      "description": "Plan granted to every user on this instance.",
      "secret": false,
      "strategy": "default",
      "default": "Pro"
    },
    {
      "key": "DIRECT_URL",
      "service": "webstudio",
      "description": "Prisma direct URL. Same as DATABASE_URL; there is no PgBouncer.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "MINIO_HOST",
      "service": "webstudio",
      "description": "Wait-for target.",
      "secret": false,
      "strategy": "default",
      "default": "minio.railway.internal"
    },
    {
      "key": "MINIO_PORT",
      "service": "webstudio",
      "description": "MinIO listens on Railway PORT.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "AUTH_SECRET",
      "service": "webstudio",
      "description": "Session cookie signing key. With DEV_LOGIN=true this is also the login password.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "S3_ENDPOINT",
      "service": "webstudio",
      "description": "Public path-style S3 URL so canvas images load in the browser.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "DATABASE_URL",
      "service": "webstudio",
      "description": "Prisma URL over private IPv6 DNS. sslmode=disable because Railway private net is plain HTTP.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FEATURE_FLAGS",
      "service": "webstudio",
      "description": "Enable all builder feature flags.",
      "secret": false,
      "strategy": "default",
      "default": "*"
    },
    {
      "key": "POSTGREST_URL",
      "service": "webstudio",
      "description": "Internal PostgREST base URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "POSTGRES_HOST",
      "service": "webstudio",
      "description": "Wait-for target. Change only if you rename the service.",
      "secret": false,
      "strategy": "default",
      "default": "postgres.railway.internal"
    },
    {
      "key": "POSTGRES_PORT",
      "service": "webstudio",
      "description": "Postgres port on the private network.",
      "secret": false,
      "strategy": "default",
      "default": "5432"
    },
    {
      "key": "DEPLOYMENT_URL",
      "service": "webstudio",
      "description": "Public builder URL, no trailing slash. Cookies and OAuth callbacks.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "POSTGREST_HOST",
      "service": "webstudio",
      "description": "Wait-for target.",
      "secret": false,
      "strategy": "default",
      "default": "postgrest.railway.internal"
    },
    {
      "key": "POSTGREST_PORT",
      "service": "webstudio",
      "description": "PostgREST private port.",
      "secret": false,
      "strategy": "default",
      "default": "3000"
    },
    {
      "key": "PUBLISHER_HOST",
      "service": "webstudio",
      "description": "Suffix for published project hosts. Replace with a wildcard custom domain for real sites.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "DEV_LOGIN_EMAIL",
      "service": "webstudio",
      "description": "First login email. Change this.",
      "secret": false,
      "strategy": "default",
      "default": "admin@example.com"
    },
    {
      "key": "MINIO_ROOT_USER",
      "service": "webstudio",
      "description": "MinIO access key. Must match S3_ACCESS_KEY_ID.",
      "secret": false,
      "strategy": "default",
      "default": "webstudio"
    },
    {
      "key": "PGRST_JWT_SECRET",
      "service": "webstudio",
      "description": "HS256 secret for PostgREST JWTs. Must be at least 64 characters.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "S3_ACCESS_KEY_ID",
      "service": "webstudio",
      "description": "Same value as MINIO_ROOT_USER.",
      "secret": true,
      "strategy": "default",
      "default": "webstudio"
    },
    {
      "key": "AUTH_WS_CLIENT_ID",
      "service": "webstudio",
      "description": "OAuth client id for the Webstudio CLI (webstudio link).",
      "secret": false,
      "strategy": "default",
      "default": "self-hosted"
    },
    {
      "key": "POSTGRES_PASSWORD",
      "service": "webstudio",
      "description": "Generated once. Postgres and PostgREST must reference this, not mint a second secret.",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "MINIO_ROOT_PASSWORD",
      "service": "webstudio",
      "description": "MinIO secret key. Must match S3_SECRET_ACCESS_KEY.",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "S3_SECRET_ACCESS_KEY",
      "service": "webstudio",
      "description": "Same secret as MINIO_ROOT_PASSWORD.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "AUTH_WS_CLIENT_SECRET",
      "service": "webstudio",
      "description": "OAuth client secret for the CLI. Required in production.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "TRPC_SERVER_API_TOKEN",
      "service": "webstudio",
      "description": "Shared service token between builder and publisher.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "DEPLOYMENT_ENVIRONMENT",
      "service": "webstudio",
      "description": "Required. Never set development on Railway.",
      "secret": false,
      "strategy": "default",
      "default": "production"
    },
    {
      "key": "MAX_ASSETS_PER_PROJECT",
      "service": "webstudio",
      "description": "Upload cap per project.",
      "secret": false,
      "strategy": "default",
      "default": "50"
    },
    {
      "key": "SELF_HOSTED_PUBLISHER_URL",
      "service": "webstudio",
      "description": "Internal publish API. Port 4000, not the public site-proxy port.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "PORT",
      "service": "postgrest",
      "description": "Railway often does not publish it on the private DNS mesh",
      "secret": false,
      "strategy": "default",
      "default": "3000"
    },
    {
      "key": "PGRST_DB_URI",
      "service": "postgrest",
      "description": "Direct Postgres URI over private DNS.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "POSTGRES_HOST",
      "service": "postgrest",
      "description": "Wait-for target.",
      "secret": false,
      "strategy": "default",
      "default": "postgres.railway.internal"
    },
    {
      "key": "POSTGRES_PORT",
      "service": "postgrest",
      "description": "Postgres port.",
      "secret": false,
      "strategy": "default",
      "default": "5432"
    },
    {
      "key": "PGRST_DB_SCHEMAS",
      "service": "postgrest",
      "description": "Exposed schema.",
      "secret": false,
      "strategy": "default",
      "default": "public"
    },
    {
      "key": "PGRST_JWT_SECRET",
      "service": "postgrest",
      "description": "Must match the builder.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PGRST_SERVER_HOST",
      "service": "postgrest",
      "description": "Listen on IPv4 and IPv6. Railway private DNS is IPv6.",
      "secret": false,
      "strategy": "default",
      "default": "*"
    },
    {
      "key": "PGRST_SERVER_PORT",
      "service": "postgrest",
      "description": "Private port. Do not give this service a public domain.",
      "secret": false,
      "strategy": "default",
      "default": "3000"
    },
    {
      "key": "PGRST_DB_ANON_ROLE",
      "service": "postgrest",
      "description": "Role used for PostgREST requests.",
      "secret": false,
      "strategy": "default",
      "default": "anon"
    },
    {
      "key": "PORT",
      "service": "minio",
      "description": "Service Port",
      "secret": false,
      "strategy": "default",
      "default": "9900"
    },
    {
      "key": "DOMAIN",
      "service": "minio",
      "description": "Public domain where Betterlytics is accessible. Railway automatically provides this domain.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "S3_BUCKET",
      "service": "minio",
      "description": "Created on first boot with anonymous download.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "MINIO_UPDATE",
      "service": "minio",
      "description": "Disable in-container update checks.",
      "secret": false,
      "strategy": "default",
      "default": "off"
    },
    {
      "key": "MINIO_BROWSER",
      "service": "minio",
      "description": "Console is not exposed. API only.",
      "secret": false,
      "strategy": "default",
      "default": "off"
    },
    {
      "key": "MINIO_ROOT_USER",
      "service": "minio",
      "description": "Access key. Same as S3_ACCESS_KEY_ID.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "MINIO_ROOT_PASSWORD",
      "service": "minio",
      "description": "Secret key. Same as S3_SECRET_ACCESS_KEY.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    }
  ],
  "deploy": {
    "mcp": {
      "server": "railway",
      "tool": "deploy_template",
      "args": {
        "template_code": "webstudio"
      }
    },
    "cli": "railway deploy --template webstudio",
    "api": {
      "method": "POST",
      "path": "/graphql/v2",
      "body": {
        "query": "mutation templateDeploy($input: TemplateDeployV2Input!) { templateDeployV2(input: $input) { projectId workflowId } }",
        "variables": {
          "input": {
            "templateId": "425e5ac9-050c-48f7-881b-8077bd3923d7",
            "serializedConfig": {
              "services": {
                "1a25bdea-a347-41e0-8a5d-e555c3ed8c51": {
                  "icon": "https://devicons.railway.com/i/postgresql.svg",
                  "name": "postgres",
                  "source": {
                    "repo": "OpenSource-Templates/Webstudio",
                    "rootDirectory": "/postgres"
                  },
                  "variables": {
                    "PGDATA": {
                      "description": "Must sit under the volume mount /var/lib/postgresql.",
                      "defaultValue": "/var/lib/postgresql/data"
                    },
                    "POSTGRES_DB": {
                      "description": "Database name. init.sql runs only on empty PGDATA.",
                      "defaultValue": "webstudio"
                    },
                    "POSTGRES_USER": {
                      "description": "Superuser. Matches DATABASE_URL.",
                      "defaultValue": "postgres"
                    },
                    "POSTGRES_PASSWORD": {
                      "description": "Same secret as the builder. Do not generate a new one.",
                      "defaultValue": "${{webstudio.POSTGRES_PASSWORD}}"
                    }
                  }
                },
                "1e810fcc-e7b3-4c36-adc3-bbc70808fb21": {
                  "name": "publisher",
                  "source": {
                    "repo": "OpenSource-Templates/Webstudio",
                    "rootDirectory": "/publisher"
                  },
                  "variables": {
                    "PORT": {
                      "defaultValue": "8080"
                    },
                    "DOMAIN": {
                      "description": "Public domain where Betterlytics is accessible. Railway automatically provides this domain.",
                      "defaultValue": "${{RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "BUILDER_HOST": {
                      "description": "Wait-for host.",
                      "defaultValue": "webstudio.railway.internal"
                    },
                    "BUILDER_PORT": {
                      "description": "Wait-for port. Builder binds Railway PORT.",
                      "defaultValue": "${{webstudio.PORT}}"
                    },
                    "PUBLISHER_HOST": {
                      "description": "Same suffix the builder uses. Point a wildcard custom domain here for project.yourdomain.com.",
                      "defaultValue": "${{publisher.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "BUILDER_INTERNAL_URL": {
                      "description": "HTTP to the builder over private DNS. Never https and never localhost.",
                      "defaultValue": "http://${{webstudio.RAILWAY_PRIVATE_DOMAIN}}:${{webstudio.PORT}}"
                    },
                    "TRPC_SERVER_API_TOKEN": {
                      "description": "Must match the builder.",
                      "defaultValue": "${{webstudio.TRPC_SERVER_API_TOKEN}}"
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>:8080": {
                        "port": 8080
                      }
                    }
                  }
                },
                "8bc42750-8fbc-4684-9f25-732a2ea6699f": {
                  "icon": "https://thesvg.org/icons/webstudio/default.svg",
                  "name": "webstudio",
                  "source": {
                    "repo": "OpenSource-Templates/Webstudio",
                    "rootDirectory": "/webstudio"
                  },
                  "variables": {
                    "PORT": {
                      "defaultValue": "8080"
                    },
                    "DOMAIN": {
                      "description": "Public domain where Betterlytics is accessible. Railway automatically provides this domain.",
                      "defaultValue": "${{RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "S3_ACL": {
                      "description": "Objects are anonymously downloadable.",
                      "defaultValue": "public-read"
                    },
                    "FEATURES": {
                      "description": "Compose-compat alias used by some image builds.",
                      "defaultValue": "*"
                    },
                    "NODE_ENV": {
                      "description": "Remix production mode.",
                      "defaultValue": "production"
                    },
                    "DEV_LOGIN": {
                      "description": "Enables email+password login. Password is the value of AUTH_SECRET.",
                      "defaultValue": "true"
                    },
                    "S3_BUCKET": {
                      "description": "Object bucket created on first MinIO boot.",
                      "defaultValue": "webstudio-assets"
                    },
                    "S3_REGION": {
                      "description": "Dummy region required by the AWS SDK. MinIO ignores it.",
                      "defaultValue": "us-east-1"
                    },
                    "USER_PLAN": {
                      "description": "Plan granted to every user on this instance.",
                      "defaultValue": "Pro"
                    },
                    "DIRECT_URL": {
                      "description": "Prisma direct URL. Same as DATABASE_URL; there is no PgBouncer.",
                      "defaultValue": "postgresql://postgres:${{webstudio.POSTGRES_PASSWORD}}@${{postgres.RAILWAY_PRIVATE_DOMAIN}}:5432/webstudio?sslmode=disable"
                    },
                    "MINIO_HOST": {
                      "description": "Wait-for target.",
                      "defaultValue": "minio.railway.internal"
                    },
                    "MINIO_PORT": {
                      "description": "MinIO listens on Railway PORT.",
                      "defaultValue": "${{minio.PORT}}"
                    },
                    "AUTH_SECRET": {
                      "description": "Session cookie signing key. With DEV_LOGIN=true this is also the login password.",
                      "defaultValue": "{{AUTH_SECRET}}"
                    },
                    "S3_ENDPOINT": {
                      "description": "Public path-style S3 URL so canvas images load in the browser.",
                      "defaultValue": "https://${{minio.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "DATABASE_URL": {
                      "description": "Prisma URL over private IPv6 DNS. sslmode=disable because Railway private net is plain HTTP.",
                      "defaultValue": "postgresql://postgres:${{webstudio.POSTGRES_PASSWORD}}@${{postgres.RAILWAY_PRIVATE_DOMAIN}}:5432/webstudio?sslmode=disable"
                    },
                    "FEATURE_FLAGS": {
                      "description": "Enable all builder feature flags.",
                      "defaultValue": "*"
                    },
                    "POSTGREST_URL": {
                      "description": "Internal PostgREST base URL.",
                      "defaultValue": "http://${{postgrest.RAILWAY_PRIVATE_DOMAIN}}:3000"
                    },
                    "POSTGRES_HOST": {
                      "description": "Wait-for target. Change only if you rename the service.",
                      "defaultValue": "postgres.railway.internal"
                    },
                    "POSTGRES_PORT": {
                      "description": "Postgres port on the private network.",
                      "defaultValue": "5432"
                    },
                    "DEPLOYMENT_URL": {
                      "description": "Public builder URL, no trailing slash. Cookies and OAuth callbacks.",
                      "defaultValue": "https://${{RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "POSTGREST_HOST": {
                      "description": "Wait-for target.",
                      "defaultValue": "postgrest.railway.internal"
                    },
                    "POSTGREST_PORT": {
                      "description": "PostgREST private port.",
                      "defaultValue": "3000"
                    },
                    "PUBLISHER_HOST": {
                      "description": "Suffix for published project hosts. Replace with a wildcard custom domain for real sites.",
                      "defaultValue": "${{publisher.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "DEV_LOGIN_EMAIL": {
                      "description": "First login email. Change this.",
                      "defaultValue": "admin@example.com"
                    },
                    "MINIO_ROOT_USER": {
                      "description": "MinIO access key. Must match S3_ACCESS_KEY_ID.",
                      "defaultValue": "webstudio"
                    },
                    "PGRST_JWT_SECRET": {
                      "description": "HS256 secret for PostgREST JWTs. Must be at least 64 characters.",
                      "defaultValue": "{{PGRST_JWT_SECRET}}"
                    },
                    "S3_ACCESS_KEY_ID": {
                      "description": "Same value as MINIO_ROOT_USER.",
                      "defaultValue": "webstudio"
                    },
                    "AUTH_WS_CLIENT_ID": {
                      "description": "OAuth client id for the Webstudio CLI (webstudio link).",
                      "defaultValue": "self-hosted"
                    },
                    "POSTGRES_PASSWORD": {
                      "description": "Generated once. Postgres and PostgREST must reference this, not mint a second secret.",
                      "defaultValue": "{{POSTGRES_PASSWORD}}"
                    },
                    "MINIO_ROOT_PASSWORD": {
                      "description": "MinIO secret key. Must match S3_SECRET_ACCESS_KEY.",
                      "defaultValue": "{{MINIO_ROOT_PASSWORD}}"
                    },
                    "S3_SECRET_ACCESS_KEY": {
                      "description": "Same secret as MINIO_ROOT_PASSWORD.",
                      "defaultValue": "${{webstudio.MINIO_ROOT_PASSWORD}}"
                    },
                    "AUTH_WS_CLIENT_SECRET": {
                      "description": "OAuth client secret for the CLI. Required in production.",
                      "defaultValue": "{{AUTH_WS_CLIENT_SECRET}}"
                    },
                    "TRPC_SERVER_API_TOKEN": {
                      "description": "Shared service token between builder and publisher.",
                      "defaultValue": "{{TRPC_SERVER_API_TOKEN}}"
                    },
                    "DEPLOYMENT_ENVIRONMENT": {
                      "description": "Required. Never set development on Railway.",
                      "defaultValue": "production"
                    },
                    "MAX_ASSETS_PER_PROJECT": {
                      "description": "Upload cap per project.",
                      "defaultValue": "50"
                    },
                    "SELF_HOSTED_PUBLISHER_URL": {
                      "description": "Internal publish API. Port 4000, not the public site-proxy port.",
                      "defaultValue": "http://${{publisher.RAILWAY_PRIVATE_DOMAIN}}:4000"
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>:8080": {
                        "port": 8080
                      }
                    }
                  }
                },
                "b55000dd-8287-41f1-9210-2c2fbc7991ce": {
                  "icon": "https://docs.postgrest.org/en/v16/_static/favicon.ico",
                  "name": "postgrest",
                  "source": {
                    "repo": "OpenSource-Templates/Webstudio",
                    "rootDirectory": "/postgrest"
                  },
                  "variables": {
                    "PORT": {
                      "description": "Railway often does not publish it on the private DNS mesh",
                      "defaultValue": "3000"
                    },
                    "PGRST_DB_URI": {
                      "description": "Direct Postgres URI over private DNS.",
                      "defaultValue": "postgresql://postgres:${{webstudio.POSTGRES_PASSWORD}}@${{postgres.RAILWAY_PRIVATE_DOMAIN}}:5432/webstudio"
                    },
                    "POSTGRES_HOST": {
                      "description": "Wait-for target.",
                      "defaultValue": "postgres.railway.internal"
                    },
                    "POSTGRES_PORT": {
                      "description": "Postgres port.",
                      "defaultValue": "5432"
                    },
                    "PGRST_DB_SCHEMAS": {
                      "description": "Exposed schema.",
                      "defaultValue": "public"
                    },
                    "PGRST_JWT_SECRET": {
                      "description": "Must match the builder.",
                      "defaultValue": "${{webstudio.PGRST_JWT_SECRET}}"
                    },
                    "PGRST_SERVER_HOST": {
                      "description": "Listen on IPv4 and IPv6. Railway private DNS is IPv6.",
                      "defaultValue": "*"
                    },
                    "PGRST_SERVER_PORT": {
                      "description": "Private port. Do not give this service a public domain.",
                      "defaultValue": "3000"
                    },
                    "PGRST_DB_ANON_ROLE": {
                      "description": "Role used for PostgREST requests.",
                      "defaultValue": "anon"
                    }
                  }
                },
                "e8804b2f-b3a5-40f5-a9ac-24b72d0b51b0": {
                  "icon": "https://devicons.railway.com/i/minio.svg",
                  "name": "minio",
                  "source": {
                    "repo": "OpenSource-Templates/Webstudio",
                    "rootDirectory": "/minio"
                  },
                  "variables": {
                    "PORT": {
                      "description": "Service Port",
                      "defaultValue": "9900"
                    },
                    "DOMAIN": {
                      "description": "Public domain where Betterlytics is accessible. Railway automatically provides this domain.",
                      "defaultValue": "${{RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "S3_BUCKET": {
                      "description": "Created on first boot with anonymous download.",
                      "defaultValue": "${{webstudio.S3_BUCKET}}"
                    },
                    "MINIO_UPDATE": {
                      "description": "Disable in-container update checks.",
                      "defaultValue": "off"
                    },
                    "MINIO_BROWSER": {
                      "description": "Console is not exposed. API only.",
                      "defaultValue": "off"
                    },
                    "MINIO_ROOT_USER": {
                      "description": "Access key. Same as S3_ACCESS_KEY_ID.",
                      "defaultValue": "${{webstudio.MINIO_ROOT_USER}}"
                    },
                    "MINIO_ROOT_PASSWORD": {
                      "description": "Secret key. Same as S3_SECRET_ACCESS_KEY.",
                      "defaultValue": "${{webstudio.MINIO_ROOT_PASSWORD}}"
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>:9900": {
                        "port": 9900
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "post_deploy": {},
  "resources": {
    "expected_services": 5,
    "needs_volume": false
  },
  "generated_at": "2026-09-20T16:14:49.616Z",
  "generator_version": "0.1.0",
  "status": "degraded",
  "validated_at": "2026-09-19T13:29:17.424Z",
  "success_rate_30d": 0.3333,
  "validation": {
    "last_run_id": "run_fec16d75dc37496eb199",
    "checks": [
      {
        "name": "workflow_completed",
        "passed": true
      },
      {
        "name": "all_services_deployed",
        "passed": false,
        "detail": "BUILDING,BUILDING,BUILDING,BUILDING,FAILED"
      }
    ],
    "typical_ready_seconds": 126,
    "typical_build_seconds": 51,
    "typical_start_seconds": 20,
    "slowest_service": "webstudio"
  }
}
