{
  "manifest_version": "1.0.0",
  "template": {
    "id": "e8802f8e-65e7-4308-b164-d136e341bb92",
    "slug": "autogpt-platform",
    "name": "AutoGPT Platform",
    "description": "No-code AI agent builder. Build, run, and schedule agents you fully own",
    "url": "https://railway.com/deploy/autogpt-platform",
    "upstream": {
      "image": "ghcr.io/hmseeb/autogpt-railway-frontend:autogpt-platform-beta-v0.7.0"
    }
  },
  "services": [
    {
      "name": "frontend",
      "source": {
        "image": "ghcr.io/hmseeb/autogpt-railway-frontend:autogpt-platform-beta-v0.7.0"
      },
      "needs_volume": false,
      "http": true
    },
    {
      "name": "rabbitmq",
      "source": {
        "image": "rabbitmq:4.1.4"
      },
      "needs_volume": true,
      "volume_mount_path": "/var/lib/rabbitmq",
      "http": false
    },
    {
      "name": "postgres",
      "source": {
        "image": "pgvector/pgvector:pg15"
      },
      "needs_volume": true,
      "volume_mount_path": "/var/lib/postgresql/data",
      "http": false
    },
    {
      "name": "redis",
      "source": {
        "image": "redis:7"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "backend",
      "source": {
        "image": "ghcr.io/hmseeb/autogpt-railway-backend:autogpt-platform-beta-v0.7.0"
      },
      "needs_volume": true,
      "volume_mount_path": "/app/autogpt_platform/backend/workspaces",
      "http": true
    }
  ],
  "required_inputs": [
    {
      "key": "PORT",
      "service": "frontend",
      "description": "Provide a value for PORT.",
      "secret": false,
      "strategy": "default",
      "default": "3000"
    },
    {
      "key": "DATABASE_URL",
      "service": "frontend",
      "description": "Provide a value for DATABASE_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "AUTH_DB_SCHEMA",
      "service": "frontend",
      "description": "Provide a value for AUTH_DB_SCHEMA.",
      "secret": false,
      "strategy": "default",
      "default": "platform"
    },
    {
      "key": "AGPT_SERVER_URL",
      "service": "frontend",
      "description": "Provide a value for AGPT_SERVER_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "BETTER_AUTH_URL",
      "service": "frontend",
      "description": "Provide a value for BETTER_AUTH_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "AGPT_WS_SERVER_URL",
      "service": "frontend",
      "description": "Provide a value for AGPT_WS_SERVER_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "BETTER_AUTH_SECRET",
      "service": "frontend",
      "description": "Provide a value for BETTER_AUTH_SECRET.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "NEXT_PUBLIC_AGPT_SERVER_URL",
      "service": "frontend",
      "description": "Provide a value for NEXT_PUBLIC_AGPT_SERVER_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "NEXT_PUBLIC_FRONTEND_BASE_URL",
      "service": "frontend",
      "description": "Provide a value for NEXT_PUBLIC_FRONTEND_BASE_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "NEXT_PUBLIC_AGPT_WS_SERVER_URL",
      "service": "frontend",
      "description": "Provide a value for NEXT_PUBLIC_AGPT_WS_SERVER_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "AUTH_REQUIRE_EMAIL_VERIFICATION",
      "service": "frontend",
      "description": "Provide a value for AUTH_REQUIRE_EMAIL_VERIFICATION.",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "RABBITMQ_DEFAULT_PASS",
      "service": "rabbitmq",
      "description": "Provide a value for RABBITMQ_DEFAULT_PASS.",
      "secret": false,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "RABBITMQ_DEFAULT_USER",
      "service": "rabbitmq",
      "description": "Provide a value for RABBITMQ_DEFAULT_USER.",
      "secret": false,
      "strategy": "default",
      "default": "autogpt"
    },
    {
      "key": "PGDATA",
      "service": "postgres",
      "description": "Provide a value for PGDATA.",
      "secret": false,
      "strategy": "default",
      "default": "/var/lib/postgresql/data/pgdata"
    },
    {
      "key": "POSTGRES_DB",
      "service": "postgres",
      "description": "Provide a value for POSTGRES_DB.",
      "secret": false,
      "strategy": "default",
      "default": "postgres"
    },
    {
      "key": "POSTGRES_PASSWORD",
      "service": "postgres",
      "description": "Provide a value for POSTGRES_PASSWORD.",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "PORT",
      "service": "backend",
      "description": "Provide a value for PORT.",
      "secret": false,
      "strategy": "default",
      "default": "8080"
    },
    {
      "key": "DB_HOST",
      "service": "backend",
      "description": "Provide a value for DB_HOST.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "DB_NAME",
      "service": "backend",
      "description": "Provide a value for DB_NAME.",
      "secret": false,
      "strategy": "default",
      "default": "postgres"
    },
    {
      "key": "DB_PASS",
      "service": "backend",
      "description": "Provide a value for DB_PASS.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DB_PORT",
      "service": "backend",
      "description": "Provide a value for DB_PORT.",
      "secret": false,
      "strategy": "default",
      "default": "5432"
    },
    {
      "key": "DB_USER",
      "service": "backend",
      "description": "Provide a value for DB_USER.",
      "secret": false,
      "strategy": "default",
      "default": "postgres"
    },
    {
      "key": "DIRECT_URL",
      "service": "backend",
      "description": "Provide a value for DIRECT_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "REDIS_HOST",
      "service": "backend",
      "description": "Provide a value for REDIS_HOST.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "REDIS_PORT",
      "service": "backend",
      "description": "Provide a value for REDIS_PORT.",
      "secret": false,
      "strategy": "default",
      "default": "6379"
    },
    {
      "key": "DATABASE_URL",
      "service": "backend",
      "description": "Provide a value for DATABASE_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "JWT_JWKS_URL",
      "service": "backend",
      "description": "Provide a value for JWT_JWKS_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "RABBITMQ_HOST",
      "service": "backend",
      "description": "Provide a value for RABBITMQ_HOST.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "RABBITMQ_PORT",
      "service": "backend",
      "description": "Provide a value for RABBITMQ_PORT.",
      "secret": false,
      "strategy": "default",
      "default": "5672"
    },
    {
      "key": "ENCRYPTION_KEY",
      "service": "backend",
      "description": "Provide a value for ENCRYPTION_KEY.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "JWT_VERIFY_KEY",
      "service": "backend",
      "description": "Provide a value for JWT_VERIFY_KEY.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "FRONTEND_BASE_URL",
      "service": "backend",
      "description": "Provide a value for FRONTEND_BASE_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "PLATFORM_BASE_URL",
      "service": "backend",
      "description": "Provide a value for PLATFORM_BASE_URL.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "RABBITMQ_DEFAULT_PASS",
      "service": "backend",
      "description": "Provide a value for RABBITMQ_DEFAULT_PASS.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "RABBITMQ_DEFAULT_USER",
      "service": "backend",
      "description": "Provide a value for RABBITMQ_DEFAULT_USER.",
      "secret": false,
      "strategy": "default",
      "default": "autogpt"
    },
    {
      "key": "CLAMAV_SERVICE_ENABLED",
      "service": "backend",
      "description": "Provide a value for CLAMAV_SERVICE_ENABLED.",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "UNSUBSCRIBE_SECRET_KEY",
      "service": "backend",
      "description": "Provide a value for UNSUBSCRIBE_SECRET_KEY.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "BACKEND_CORS_ALLOW_ORIGINS",
      "service": "backend",
      "description": "Provide a value for BACKEND_CORS_ALLOW_ORIGINS.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    }
  ],
  "deploy": {
    "mcp": {
      "server": "railway",
      "tool": "deploy_template",
      "args": {
        "template_code": "autogpt-platform"
      }
    },
    "cli": "railway deploy --template autogpt-platform",
    "api": {
      "method": "POST",
      "path": "/graphql/v2",
      "body": {
        "query": "mutation templateDeploy($input: TemplateDeployV2Input!) { templateDeployV2(input: $input) { projectId workflowId } }",
        "variables": {
          "input": {
            "templateId": "e8802f8e-65e7-4308-b164-d136e341bb92",
            "serializedConfig": {
              "buckets": {},
              "services": {
                "40af75df-5ef4-4204-9027-b16d61923628": {
                  "icon": "https://avatars.githubusercontent.com/u/130738209",
                  "name": "frontend",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": "/",
                    "restartPolicyType": "ALWAYS",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "ghcr.io/hmseeb/autogpt-railway-frontend:autogpt-platform-beta-v0.7.0"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "defaultValue": "3000"
                    },
                    "DATABASE_URL": {
                      "isOptional": false,
                      "defaultValue": "postgresql://postgres:${{postgres.POSTGRES_PASSWORD}}@${{postgres.RAILWAY_PRIVATE_DOMAIN}}:5432/postgres"
                    },
                    "AUTH_DB_SCHEMA": {
                      "isOptional": false,
                      "defaultValue": "platform"
                    },
                    "AGPT_SERVER_URL": {
                      "isOptional": false,
                      "defaultValue": "https://${{backend.RAILWAY_PUBLIC_DOMAIN}}/api"
                    },
                    "BETTER_AUTH_URL": {
                      "isOptional": false,
                      "defaultValue": "https://${{RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "AGPT_WS_SERVER_URL": {
                      "isOptional": false,
                      "defaultValue": "wss://${{backend.RAILWAY_PUBLIC_DOMAIN}}/ws"
                    },
                    "BETTER_AUTH_SECRET": {
                      "isOptional": false,
                      "defaultValue": "{{BETTER_AUTH_SECRET}}"
                    },
                    "NEXT_PUBLIC_AGPT_SERVER_URL": {
                      "isOptional": false,
                      "defaultValue": "https://${{backend.RAILWAY_PUBLIC_DOMAIN}}/api"
                    },
                    "NEXT_PUBLIC_FRONTEND_BASE_URL": {
                      "isOptional": false,
                      "defaultValue": "https://${{RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "NEXT_PUBLIC_AGPT_WS_SERVER_URL": {
                      "isOptional": false,
                      "defaultValue": "wss://${{backend.RAILWAY_PUBLIC_DOMAIN}}/ws"
                    },
                    "AUTH_REQUIRE_EMAIL_VERIFICATION": {
                      "isOptional": false,
                      "defaultValue": "false"
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>:3000": {
                        "port": 3000
                      }
                    }
                  }
                },
                "75ff3e2b-428d-4c9f-9457-37ecd94c8046": {
                  "icon": "https://cdn.simpleicons.org/rabbitmq",
                  "name": "rabbitmq",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": null,
                    "restartPolicyType": "ALWAYS",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "rabbitmq:4.1.4"
                  },
                  "variables": {
                    "RABBITMQ_DEFAULT_PASS": {
                      "isOptional": false,
                      "defaultValue": "{{RABBITMQ_DEFAULT_PASS}}"
                    },
                    "RABBITMQ_DEFAULT_USER": {
                      "isOptional": false,
                      "defaultValue": "autogpt"
                    }
                  },
                  "volumeMounts": {
                    "75ff3e2b-428d-4c9f-9457-37ecd94c8046": {
                      "mountPath": "/var/lib/rabbitmq"
                    }
                  }
                },
                "76a92f05-16b8-4dce-adf4-73b29cff92d1": {
                  "icon": "https://devicons.railway.com/i/postgresql.svg",
                  "name": "postgres",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": null,
                    "restartPolicyType": "ALWAYS",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "pgvector/pgvector:pg15"
                  },
                  "variables": {
                    "PGDATA": {
                      "isOptional": false,
                      "defaultValue": "/var/lib/postgresql/data/pgdata"
                    },
                    "POSTGRES_DB": {
                      "isOptional": false,
                      "defaultValue": "postgres"
                    },
                    "POSTGRES_PASSWORD": {
                      "isOptional": false,
                      "defaultValue": "{{POSTGRES_PASSWORD}}"
                    }
                  },
                  "volumeMounts": {
                    "76a92f05-16b8-4dce-adf4-73b29cff92d1": {
                      "mountPath": "/var/lib/postgresql/data"
                    }
                  }
                },
                "991fe5da-91c7-420c-a965-36e59bf8264c": {
                  "icon": "https://devicons.railway.com/i/redis.svg",
                  "name": "redis",
                  "deploy": {
                    "startCommand": "/bin/sh -c \"redis-server --port 6379 --cluster-enabled yes --cluster-config-file /tmp/nodes.conf --cluster-require-full-coverage no --cluster-announce-hostname $RAILWAY_PRIVATE_DOMAIN --cluster-preferred-endpoint-type hostname --protected-mode no & until redis-cli -p 6379 ping >/dev/null 2>&1; do sleep 1; done; redis-cli -p 6379 cluster addslotsrange 0 16383 || true; wait\"",
                    "healthcheckPath": null,
                    "restartPolicyType": "ALWAYS",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "redis:7"
                  },
                  "variables": {},
                  "haTemplateCode": "redis-ha",
                  "haConversionConfig": {
                    "edge": {
                      "label": "Reverse Proxies",
                      "options": [
                        1,
                        2
                      ],
                      "nodeLabel": "HAProxy",
                      "description": "HAProxy instances routing writes to the primary",
                      "defaultValue": 2
                    },
                    "replica": {
                      "label": "Redis Replicas",
                      "options": [
                        2,
                        3,
                        4,
                        5
                      ],
                      "nodeLabel": "Redis",
                      "description": "Nodes running Redis + colocated Sentinel",
                      "defaultValue": 2
                    },
                    "internal": null,
                    "description": "This will convert your Redis instance to an HA cluster with Sentinel failover and HAProxy routing to the primary."
                  }
                },
                "a5e696c5-8db2-418b-a554-32c9d45bb7bc": {
                  "icon": "https://avatars.githubusercontent.com/u/130738209",
                  "name": "backend",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": "/health",
                    "restartPolicyType": "ALWAYS",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "ghcr.io/hmseeb/autogpt-railway-backend:autogpt-platform-beta-v0.7.0"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "defaultValue": "8080"
                    },
                    "DB_HOST": {
                      "isOptional": false,
                      "defaultValue": "${{postgres.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "DB_NAME": {
                      "isOptional": false,
                      "defaultValue": "postgres"
                    },
                    "DB_PASS": {
                      "isOptional": false,
                      "defaultValue": "${{postgres.POSTGRES_PASSWORD}}"
                    },
                    "DB_PORT": {
                      "isOptional": false,
                      "defaultValue": "5432"
                    },
                    "DB_USER": {
                      "isOptional": false,
                      "defaultValue": "postgres"
                    },
                    "DIRECT_URL": {
                      "isOptional": false,
                      "defaultValue": "postgresql://postgres:${{postgres.POSTGRES_PASSWORD}}@${{postgres.RAILWAY_PRIVATE_DOMAIN}}:5432/postgres?connect_timeout=60&schema=platform"
                    },
                    "REDIS_HOST": {
                      "isOptional": false,
                      "defaultValue": "${{redis.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "REDIS_PORT": {
                      "isOptional": false,
                      "defaultValue": "6379"
                    },
                    "CHAT_API_KEY": {
                      "isOptional": true,
                      "description": "The key for the endpoint in CHAT_BASE_URL. Only needed if you set that.",
                      "defaultValue": ""
                    },
                    "DATABASE_URL": {
                      "isOptional": false,
                      "defaultValue": "postgresql://postgres:${{postgres.POSTGRES_PASSWORD}}@${{postgres.RAILWAY_PRIVATE_DOMAIN}}:5432/postgres?connect_timeout=60&schema=platform"
                    },
                    "JWT_JWKS_URL": {
                      "isOptional": false,
                      "defaultValue": "https://${{frontend.RAILWAY_PUBLIC_DOMAIN}}/api/auth/jwks"
                    },
                    "CHAT_BASE_URL": {
                      "isOptional": true,
                      "description": "Optional. Any OpenAI-compatible endpoint that should write the replies, including OpenAI itself (https://api.openai.com/v1) or your own Ollama or vLLM server. Pair with CHAT_API_KEY. Covers the conversation only.",
                      "defaultValue": ""
                    },
                    "RABBITMQ_HOST": {
                      "isOptional": false,
                      "defaultValue": "${{rabbitmq.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "RABBITMQ_PORT": {
                      "isOptional": false,
                      "defaultValue": "5672"
                    },
                    "ENCRYPTION_KEY": {
                      "isOptional": false,
                      "defaultValue": "{{ENCRYPTION_KEY}}"
                    },
                    "JWT_VERIFY_KEY": {
                      "isOptional": false,
                      "defaultValue": "{{JWT_VERIFY_KEY}}"
                    },
                    "ANTHROPIC_API_KEY": {
                      "isOptional": true,
                      "description": "Optional. Use Anthropic to write the replies instead of OpenRouter. Covers the conversation only, so pair it with an OpenRouter key above if you also want web search.",
                      "defaultValue": ""
                    },
                    "FRONTEND_BASE_URL": {
                      "isOptional": false,
                      "defaultValue": "https://${{frontend.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "PLATFORM_BASE_URL": {
                      "isOptional": false,
                      "defaultValue": "https://${{RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "OPEN_ROUTER_API_KEY": {
                      "isOptional": true,
                      "description": "RECOMMENDED, and the only single credential that gives a complete assistant. Get one at openrouter.ai/keys. The assistant's web search and the marketplace search both run through OpenRouter no matter which model writes the replies, so without this they report themselves unavailable.",
                      "defaultValue": ""
                    },
                    "RABBITMQ_DEFAULT_PASS": {
                      "isOptional": false,
                      "defaultValue": "${{rabbitmq.RABBITMQ_DEFAULT_PASS}}"
                    },
                    "RABBITMQ_DEFAULT_USER": {
                      "isOptional": false,
                      "defaultValue": "autogpt"
                    },
                    "CLAMAV_SERVICE_ENABLED": {
                      "isOptional": false,
                      "defaultValue": "false"
                    },
                    "UNSUBSCRIBE_SECRET_KEY": {
                      "isOptional": false,
                      "defaultValue": "{{UNSUBSCRIBE_SECRET_KEY}}"
                    },
                    "CLAUDE_CODE_OAUTH_TOKEN": {
                      "isOptional": true,
                      "description": "Optional. Use your own Claude Pro or Max subscription to write the replies: run 'claude setup-token' on a machine signed in to Claude Code and paste the result. Covers the conversation only, so pair it with an OpenRouter key above if you also want web search. Personal instances only, a consumer subscription is not licensed to serve other people.",
                      "defaultValue": ""
                    },
                    "BACKEND_CORS_ALLOW_ORIGINS": {
                      "isOptional": false,
                      "defaultValue": "[\"https://${{frontend.RAILWAY_PUBLIC_DOMAIN}}\"]"
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>:8080": {
                        "port": 8080
                      }
                    }
                  },
                  "volumeMounts": {
                    "a5e696c5-8db2-418b-a554-32c9d45bb7bc": {
                      "mountPath": "/app/autogpt_platform/backend/workspaces"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "post_deploy": {
    "healthcheck": {
      "service": "frontend",
      "method": "GET",
      "path": "/",
      "expect_status": 200
    }
  },
  "resources": {
    "expected_services": 5,
    "needs_volume": true
  },
  "generated_at": "2026-09-10T16:14:52.212Z",
  "generator_version": "0.1.0",
  "status": "degraded",
  "validated_at": "2026-09-05T12:05:28.025Z",
  "success_rate_30d": 0,
  "validation": {
    "last_run_id": "run_d05fb0c8a93648479172",
    "checks": [
      {
        "name": "workflow_completed",
        "passed": true
      },
      {
        "name": "all_services_deployed",
        "passed": false,
        "detail": "SUCCESS,FAILED,SUCCESS,SUCCESS,SUCCESS"
      }
    ]
  }
}
