{
  "manifest_version": "1.0.0",
  "template": {
    "id": "fd9f89ae-0945-4709-ae5e-847b73f6f36d",
    "slug": "trendradar-automated-news-monitoring-and",
    "name": "TrendRadar — Automated News Monitoring & Daily Intelligence",
    "description": "trendradar, automated news crawling, summaries, RSS tracking, web reports.",
    "url": "https://railway.com/deploy/trendradar-automated-news-monitoring-and",
    "upstream": {
      "repo_url": "https://github.com/XavTo/caddy-zero-trust"
    }
  },
  "services": [
    {
      "name": "trendradar-mcp",
      "source": {
        "image": "wantcat/trendradar-mcp:3.1"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "mcp-gateway",
      "source": {
        "repo": "https://github.com/XavTo/caddy-zero-trust"
      },
      "needs_volume": false,
      "http": true
    },
    {
      "name": "trendradar",
      "source": {
        "image": "wantcat/trendradar:5.0"
      },
      "needs_volume": true,
      "volume_mount_path": "/app/config",
      "http": false
    },
    {
      "name": "S3-gateway",
      "source": {
        "repo": "https://github.com/XavTo/caddy-zero-trust"
      },
      "needs_volume": false,
      "http": true
    },
    {
      "name": "s3manager",
      "source": {
        "image": "cloudlena/s3manager"
      },
      "needs_volume": false,
      "http": true
    }
  ],
  "required_inputs": [
    {
      "key": "PORT",
      "service": "trendradar-mcp",
      "description": "Port exposed by the service (used by the HTTP server)",
      "secret": false,
      "strategy": "default",
      "default": "3333"
    },
    {
      "key": "S3_REGION",
      "service": "trendradar-mcp",
      "description": "S3 region of the Railway bucket",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_BUCKET_NAME",
      "service": "trendradar-mcp",
      "description": "Name of the Railway S3 bucket",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_ENDPOINT_URL",
      "service": "trendradar-mcp",
      "description": "S3-compatible endpoint URL (Railway storage)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "STORAGE_BACKEND",
      "service": "trendradar-mcp",
      "description": "Storage backend mode (remote = S3)",
      "secret": false,
      "strategy": "default",
      "default": "remote"
    },
    {
      "key": "S3_ACCESS_KEY_ID",
      "service": "trendradar-mcp",
      "description": "S3 access key for bucket authentication",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_SECRET_ACCESS_KEY",
      "service": "trendradar-mcp",
      "description": "S3 secret key for bucket authentication",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "AUTH_PASS",
      "service": "mcp-gateway",
      "description": "Password for HTTP basic authentication",
      "secret": false,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "AUTH_USER",
      "service": "mcp-gateway",
      "description": "Username for HTTP basic authentication",
      "secret": false,
      "strategy": "default",
      "default": "admin"
    },
    {
      "key": "DOMAIN_NAME",
      "service": "mcp-gateway",
      "description": "Public domain exposed by Railway",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "UPSTREAM_URL",
      "service": "mcp-gateway",
      "description": "Internal upstream service (TrendRadar MCP)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "RUN_MODE",
      "service": "trendradar",
      "description": "Execution mode (cron = scheduled runs)",
      "secret": false,
      "strategy": "default",
      "default": "cron"
    },
    {
      "key": "S3_REGION",
      "service": "trendradar",
      "description": "Railway S3 region",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REPORT_MODE",
      "service": "trendradar",
      "description": "Report generation mode (daily summary)",
      "secret": false,
      "strategy": "default",
      "default": "daily"
    },
    {
      "key": "DISPLAY_MODE",
      "service": "trendradar",
      "description": "Report display mode (keyword-based filtering)",
      "secret": false,
      "strategy": "default",
      "default": "keyword"
    },
    {
      "key": "CRON_SCHEDULE",
      "service": "trendradar",
      "description": "Cron schedule for TrendRadar execution, every 30 min",
      "secret": false,
      "strategy": "default",
      "default": "*/30 * * * *"
    },
    {
      "key": "IMMEDIATE_RUN",
      "service": "trendradar",
      "description": "Run immediately on container startup",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "ENABLE_CRAWLER",
      "service": "trendradar",
      "description": "Enable news and platform crawling",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "S3_BUCKET_NAME",
      "service": "trendradar",
      "description": "Railway S3 bucket name",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_ENDPOINT_URL",
      "service": "trendradar",
      "description": "Railway S3 endpoint URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "STORAGE_BACKEND",
      "service": "trendradar",
      "description": "Use remote storage backend (S3-compatible)",
      "secret": false,
      "strategy": "default",
      "default": "remote"
    },
    {
      "key": "ENABLE_WEBSERVER",
      "service": "trendradar",
      "description": "Disable built-in local web server (bucket-based access used)",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "S3_ACCESS_KEY_ID",
      "service": "trendradar",
      "description": "S3 access key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "ENABLE_NOTIFICATION",
      "service": "trendradar",
      "description": "Enable notifications (requires channels to be configured)",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "S3_SECRET_ACCESS_KEY",
      "service": "trendradar",
      "description": "S3 secret key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "AUTH_PASS",
      "service": "S3-gateway",
      "description": "Password for HTTP basic authentication",
      "secret": false,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "AUTH_USER",
      "service": "S3-gateway",
      "description": "Username for HTTP basic authentication",
      "secret": false,
      "strategy": "default",
      "default": "admin"
    },
    {
      "key": "DOMAIN_NAME",
      "service": "S3-gateway",
      "description": "Public domain exposed by Railway",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "UPSTREAM_URL",
      "service": "S3-gateway",
      "description": "Internal upstream service (S3 manager / bucket proxy)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "PORT",
      "service": "s3manager",
      "description": "Port exposed by the S3 gateway service",
      "secret": false,
      "strategy": "default",
      "default": "8080"
    },
    {
      "key": "REGION",
      "service": "s3manager",
      "description": "S3 region (auto-detected by Railway)",
      "secret": false,
      "strategy": "default",
      "default": "auto"
    },
    {
      "key": "USE_SSL",
      "service": "s3manager",
      "description": "Enable SSL/TLS for S3 connections",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "ENDPOINT",
      "service": "s3manager",
      "description": "Railway S3-compatible storage endpoint, without \"http://\"",
      "secret": false,
      "strategy": "default",
      "default": "storage.railway.app"
    },
    {
      "key": "ACCESS_KEY_ID",
      "service": "s3manager",
      "description": "S3 access key for authentication",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SECRET_ACCESS_KEY",
      "service": "s3manager",
      "description": "S3 secret key for authentication",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    }
  ],
  "deploy": {
    "mcp": {
      "server": "railway",
      "tool": "deploy_template",
      "args": {
        "template_code": "trendradar-automated-news-monitoring-and"
      }
    },
    "cli": "railway deploy --template trendradar-automated-news-monitoring-and",
    "api": {
      "method": "POST",
      "path": "/graphql/v2",
      "body": {
        "query": "mutation templateDeploy($input: TemplateDeployV2Input!) { templateDeployV2(input: $input) { projectId workflowId } }",
        "variables": {
          "input": {
            "templateId": "fd9f89ae-0945-4709-ae5e-847b73f6f36d",
            "serializedConfig": {
              "buckets": {
                "7c22fe82-e0c1-4a73-adc6-0389736c02ec": {
                  "name": "Railway-bucket"
                }
              },
              "services": {
                "2c6ab143-9f5e-48a3-944a-081bf41dc72f": {
                  "icon": "https://upload.wikimedia.org/wikipedia/commons/6/63/Star%2A.svg",
                  "name": "trendradar-mcp",
                  "deploy": {
                    "startCommand": "/bin/sh -lc 'set -eux; sync_f() { t=\"$1\"; u=\"$2\"; c=\"${3:-}\"; mkdir -p \"$(dirname \"$t\")\"; if [ -n \"$c\" ]; then echo \"$c\" > \"$t\"; else python3 -c \"import urllib.request as u; u.urlretrieve(\\\"$u\\\", \\\"$t\\\")\"; fi; }; sync_f \"/app/config/config.yaml\" \"https://raw.githubusercontent.com/sansan0/TrendRadar/master/config/config.yaml\" \"${CONFIG_YAML_FILE:-}\"; sync_f \"/app/config/frequency_words.txt\" \"https://raw.githubusercontent.com/sansan0/TrendRadar/master/config/frequency_words.txt\" \"${FREQUENCY_WORDS_FILE:-}\"; sync_f \"/app/config/ai_analysis_prompt.txt\" \"https://raw.githubusercontent.com/sansan0/TrendRadar/master/config/ai_analysis_prompt.txt\" \"${AI_PROMPT_FILE:-}\"; cd /app && python3 -m mcp_server.server --transport http --port 3333'",
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "wantcat/trendradar-mcp:3.1"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "description": "Port exposed by the service (used by the HTTP server)",
                      "defaultValue": "3333"
                    },
                    "S3_REGION": {
                      "isOptional": false,
                      "description": "S3 region of the Railway bucket",
                      "defaultValue": "${{Railway-bucket.REGION}}"
                    },
                    "AI_PROMPT_FILE": {
                      "isOptional": true,
                      "description": "Customizes the AI analysis prompt. This tells the LLM how to summarize news, detect sentiment, and identify emerging trends from the raw data collected by the crawler.",
                      "defaultValue": ""
                    },
                    "S3_BUCKET_NAME": {
                      "isOptional": false,
                      "description": "Name of the Railway S3 bucket",
                      "defaultValue": "${{Railway-bucket.BUCKET}}"
                    },
                    "S3_ENDPOINT_URL": {
                      "isOptional": false,
                      "description": "S3-compatible endpoint URL (Railway storage)",
                      "defaultValue": "${{Railway-bucket.ENDPOINT}}"
                    },
                    "STORAGE_BACKEND": {
                      "isOptional": false,
                      "description": "Storage backend mode (remote = S3)",
                      "defaultValue": "remote"
                    },
                    "CONFIG_YAML_FILE": {
                      "isOptional": true,
                      "description": "Overwrites the default config.yaml settings. It controls core system behaviors such as crawl depth, request intervals, storage paths, and integration settings for various news sources.",
                      "defaultValue": ""
                    },
                    "S3_ACCESS_KEY_ID": {
                      "isOptional": false,
                      "description": "S3 access key for bucket authentication",
                      "defaultValue": "${{Railway-bucket.ACCESS_KEY_ID}}"
                    },
                    "FREQUENCY_WORDS_FILE": {
                      "isOptional": true,
                      "description": "Defines the list of keywords and filtering rules. Use this to specify which topics you want to track (e.g., \"AI\", \"Nvidia\") and which words to exclude (e.g., \"clickbait\"). It supports regex and group aliasing.",
                      "defaultValue": ""
                    },
                    "S3_SECRET_ACCESS_KEY": {
                      "isOptional": false,
                      "description": "S3 secret key for bucket authentication",
                      "defaultValue": "${{Railway-bucket.SECRET_ACCESS_KEY}}"
                    }
                  }
                },
                "4049a2d4-13bd-457a-bb52-6c97ca6bb8ef": {
                  "icon": "https://media.rubrion.ai/railway/icons/caddy.svg",
                  "name": "mcp-gateway",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "repo": "https://github.com/XavTo/caddy-zero-trust",
                    "rootDirectory": null
                  },
                  "variables": {
                    "AUTH_PASS": {
                      "isOptional": false,
                      "description": "Password for HTTP basic authentication",
                      "defaultValue": "{{AUTH_PASS}}"
                    },
                    "AUTH_USER": {
                      "isOptional": false,
                      "description": "Username for HTTP basic authentication",
                      "defaultValue": "admin"
                    },
                    "DOMAIN_NAME": {
                      "isOptional": false,
                      "description": "Public domain exposed by Railway",
                      "defaultValue": "${{RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "UPSTREAM_URL": {
                      "isOptional": false,
                      "description": "Internal upstream service (TrendRadar MCP)",
                      "defaultValue": "${{trendradar-mcp.RAILWAY_PRIVATE_DOMAIN}}:3333"
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>:80": {
                        "port": 80
                      }
                    }
                  }
                },
                "550629cc-f890-4870-ba40-d0622c079603": {
                  "icon": "https://upload.wikimedia.org/wikipedia/commons/6/63/Star%2A.svg",
                  "name": "trendradar",
                  "deploy": {
                    "startCommand": "/bin/sh -lc 'set -eux; mkdir -p /app/config; sync_f() { target=\"$1\"; url=\"$2\"; content=\"${3:-}\"; if [ -n \"$content\" ]; then echo \"$content\" > \"$target\"; echo \"Config $target chargee depuis variable.\"; else wget -qO \"$target\" \"$url\" || python3 -c \"import urllib.request as u; u.urlretrieve(\\\"$url\\\", \\\"$target\\\")\"; echo \"Config $target telechargee depuis GitHub.\"; fi; }; sync_f \"/app/config/config.yaml\" \"https://raw.githubusercontent.com/sansan0/TrendRadar/master/config/config.yaml\" \"${CONFIG_YAML_FILE:-}\"; sync_f \"/app/config/frequency_words.txt\" \"https://raw.githubusercontent.com/sansan0/TrendRadar/master/config/frequency_words.txt\" \"${FREQUENCY_WORDS_FILE:-}\"; sync_f \"/app/config/ai_analysis_prompt.txt\" \"https://raw.githubusercontent.com/sansan0/TrendRadar/master/config/ai_analysis_prompt.txt\" \"${AI_PROMPT_FILE:-}\"; printf \"import os,time,pathlib,mimetypes,boto3\\nfrom botocore.config import Config\\nb=pathlib.Path(\\\"/app/output\\\")\\nallow={\\\".html\\\",\\\".css\\\",\\\".js\\\",\\\".json\\\",\\\".png\\\",\\\".jpg\\\",\\\".txt\\\"}\\nbkt=os.environ.get(\\\"S3_BUCKET_NAME\\\")\\npref=os.environ.get(\\\"S3_REPORT_PREFIX\\\",\\\"web\\\").strip(\\\"/\\\")+\\\"/\\\"\\ns3=boto3.client(\\\"s3\\\",endpoint_url=os.environ.get(\\\"S3_ENDPOINT_URL\\\"),region_name=os.environ.get(\\\"S3_REGION\\\"),aws_access_key_id=os.environ.get(\\\"S3_ACCESS_KEY_ID\\\"),aws_secret_access_key=os.environ.get(\\\"S3_SECRET_ACCESS_KEY\\\"),config=Config(signature_version=\\\"s3v4\\\"))\\nwhile True:\\n try:\\n  if b.exists():\\n   for p in b.rglob(\\\"*\\\"):\\n    if p.is_file() and p.suffix.lower() in allow:\\n     k=pref+p.relative_to(b).as_posix();ct,_=mimetypes.guess_type(p.name)\\n     if p.suffix==\\\".html\\\":ct=\\\"text/html;charset=utf-8\\\"\\n     e={\\\"ContentType\\\":ct} if ct else None\\n     s3.upload_file(str(p),bkt,k,ExtraArgs=e)\\n  time.sleep(60)\\n except Exception as e:print(e);time.sleep(60)\" > /app/upload_s3.py; python3 /app/upload_s3.py & exec /entrypoint.sh'",
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "wantcat/trendradar:5.0"
                  },
                  "variables": {
                    "RUN_MODE": {
                      "isOptional": false,
                      "description": "Execution mode (cron = scheduled runs)",
                      "defaultValue": "cron"
                    },
                    "S3_REGION": {
                      "isOptional": false,
                      "description": "Railway S3 region",
                      "defaultValue": "${{Railway-bucket.REGION}}"
                    },
                    "REPORT_MODE": {
                      "isOptional": false,
                      "description": "Report generation mode (daily summary)",
                      "defaultValue": "daily"
                    },
                    "DISPLAY_MODE": {
                      "isOptional": false,
                      "description": "Report display mode (keyword-based filtering)",
                      "defaultValue": "keyword"
                    },
                    "CRON_SCHEDULE": {
                      "isOptional": false,
                      "description": "Cron schedule for TrendRadar execution, every 30 min",
                      "defaultValue": "*/30 * * * *"
                    },
                    "IMMEDIATE_RUN": {
                      "isOptional": false,
                      "description": "Run immediately on container startup",
                      "defaultValue": "true"
                    },
                    "AI_PROMPT_FILE": {
                      "isOptional": true,
                      "description": "Customizes the AI analysis prompt. This tells the LLM how to summarize news, detect sentiment, and identify emerging trends from the raw data collected by the crawler.",
                      "defaultValue": ""
                    },
                    "ENABLE_CRAWLER": {
                      "isOptional": false,
                      "description": "Enable news and platform crawling",
                      "defaultValue": "true"
                    },
                    "S3_BUCKET_NAME": {
                      "isOptional": false,
                      "description": "Railway S3 bucket name",
                      "defaultValue": "${{Railway-bucket.BUCKET}}"
                    },
                    "S3_ENDPOINT_URL": {
                      "isOptional": false,
                      "description": "Railway S3 endpoint URL",
                      "defaultValue": "${{Railway-bucket.ENDPOINT}}"
                    },
                    "STORAGE_BACKEND": {
                      "isOptional": false,
                      "description": "Use remote storage backend (S3-compatible)",
                      "defaultValue": "remote"
                    },
                    "CONFIG_YAML_FILE": {
                      "isOptional": true,
                      "description": "Overwrites the default config.yaml settings. It controls core system behaviors such as crawl depth, request intervals, storage paths, and integration settings for various news sources.",
                      "defaultValue": ""
                    },
                    "ENABLE_WEBSERVER": {
                      "isOptional": false,
                      "description": "Disable built-in local web server (bucket-based access used)",
                      "defaultValue": "false"
                    },
                    "S3_ACCESS_KEY_ID": {
                      "isOptional": false,
                      "description": "S3 access key",
                      "defaultValue": "${{Railway-bucket.ACCESS_KEY_ID}}"
                    },
                    "ENABLE_NOTIFICATION": {
                      "isOptional": false,
                      "description": "Enable notifications (requires channels to be configured)",
                      "defaultValue": "true"
                    },
                    "FREQUENCY_WORDS_FILE": {
                      "isOptional": true,
                      "description": "Defines the list of keywords and filtering rules. Use this to specify which topics you want to track (e.g., \"AI\", \"Nvidia\") and which words to exclude (e.g., \"clickbait\"). It supports regex and group aliasing.",
                      "defaultValue": ""
                    },
                    "S3_SECRET_ACCESS_KEY": {
                      "isOptional": false,
                      "description": "S3 secret key",
                      "defaultValue": "${{Railway-bucket.SECRET_ACCESS_KEY}}"
                    }
                  },
                  "volumeMounts": {
                    "550629cc-f890-4870-ba40-d0622c079603": {
                      "mountPath": "/app/config"
                    }
                  }
                },
                "7241a37c-b103-41d8-958a-1b2f443fc692": {
                  "icon": "https://media.rubrion.ai/railway/icons/caddy.svg",
                  "name": "S3-gateway",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "repo": "https://github.com/XavTo/caddy-zero-trust",
                    "rootDirectory": null
                  },
                  "variables": {
                    "AUTH_PASS": {
                      "isOptional": false,
                      "description": "Password for HTTP basic authentication",
                      "defaultValue": "{{AUTH_PASS}}"
                    },
                    "AUTH_USER": {
                      "isOptional": false,
                      "description": "Username for HTTP basic authentication",
                      "defaultValue": "admin"
                    },
                    "DOMAIN_NAME": {
                      "isOptional": false,
                      "description": "Public domain exposed by Railway",
                      "defaultValue": "${{RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "UPSTREAM_URL": {
                      "isOptional": false,
                      "description": "Internal upstream service (S3 manager / bucket proxy)",
                      "defaultValue": "http://${{s3manager.RAILWAY_PRIVATE_DOMAIN}}:8080"
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>:80": {
                        "port": 80
                      }
                    }
                  }
                },
                "9ca2afa0-81df-4651-9472-a19a49b099d7": {
                  "icon": "https://upload.wikimedia.org/wikipedia/commons/b/bc/Amazon-S3-Logo.svg",
                  "name": "s3manager",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "cloudlena/s3manager"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "description": "Port exposed by the S3 gateway service",
                      "defaultValue": "8080"
                    },
                    "REGION": {
                      "isOptional": false,
                      "description": "S3 region (auto-detected by Railway)",
                      "defaultValue": "auto"
                    },
                    "USE_SSL": {
                      "isOptional": false,
                      "description": "Enable SSL/TLS for S3 connections",
                      "defaultValue": "true"
                    },
                    "ENDPOINT": {
                      "isOptional": false,
                      "description": "Railway S3-compatible storage endpoint, without \"http://\"",
                      "defaultValue": "storage.railway.app"
                    },
                    "ACCESS_KEY_ID": {
                      "isOptional": false,
                      "description": "S3 access key for authentication",
                      "defaultValue": "${{Railway-bucket.ACCESS_KEY_ID}}"
                    },
                    "SECRET_ACCESS_KEY": {
                      "isOptional": false,
                      "description": "S3 secret key for authentication",
                      "defaultValue": "${{Railway-bucket.SECRET_ACCESS_KEY}}"
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>": {}
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "post_deploy": {},
  "resources": {
    "expected_services": 5,
    "needs_volume": true
  },
  "generated_at": "2026-09-22T22:14:50.114Z",
  "generator_version": "0.1.0",
  "status": "degraded",
  "validated_at": "2026-09-20T21:57:05.544Z",
  "success_rate_30d": 0,
  "validation": {
    "last_run_id": "run_a3e93d6aef984734b7d5",
    "checks": [
      {
        "name": "workflow_completed",
        "passed": false,
        "detail": "Your workspace has been restricted. Please contact support to resolve this."
      }
    ]
  }
}
