{
  "manifest_version": "1.0.0",
  "template": {
    "id": "0fff90d4-89df-4c27-906c-c623afde8960",
    "slug": "syllogic",
    "name": "Syllogic",
    "description": "Self-host your own personal finance app",
    "url": "https://railway.com/deploy/syllogic",
    "upstream": {
      "image": "ghcr.io/syllogic-ai/syllogic-frontend:v1.0.1"
    }
  },
  "status": "unvalidated",
  "validated_at": null,
  "success_rate_30d": null,
  "services": [
    {
      "name": "redis",
      "source": {
        "image": "redis:7-alpine"
      },
      "needs_volume": true,
      "volume_mount_path": "/data",
      "http": false
    },
    {
      "name": "postgres",
      "source": {
        "image": "ghcr.io/railwayapp-templates/postgres-ssl:16"
      },
      "needs_volume": true,
      "volume_mount_path": "/var/lib/postgresql/data",
      "http": false
    },
    {
      "name": "backend",
      "source": {
        "image": "ghcr.io/syllogic-ai/syllogic-backend:v1.0.1"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "worker",
      "source": {
        "image": "ghcr.io/syllogic-ai/syllogic-backend:v1.0.1"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "mcp",
      "source": {
        "image": "ghcr.io/syllogic-ai/syllogic-backend:v1.0.1"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "beat",
      "source": {
        "image": "ghcr.io/syllogic-ai/syllogic-backend:v1.0.1"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "app",
      "source": {
        "image": "ghcr.io/syllogic-ai/syllogic-frontend:v1.0.1"
      },
      "needs_volume": true,
      "volume_mount_path": "/data/uploads",
      "http": true
    }
  ],
  "required_inputs": [
    {
      "key": "PGDATA",
      "service": "postgres",
      "description": "PGDATA",
      "secret": false,
      "strategy": "default",
      "default": "/var/lib/postgresql/data/pgdata"
    },
    {
      "key": "POSTGRES_DB",
      "service": "postgres",
      "description": "Name of the db",
      "secret": false,
      "strategy": "default",
      "default": "finance_db"
    },
    {
      "key": "POSTGRES_USER",
      "service": "postgres",
      "description": "user of db",
      "secret": false,
      "strategy": "default",
      "default": "financeuser"
    },
    {
      "key": "POSTGRES_PASSWORD",
      "service": "postgres",
      "description": "password of db",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "PORT",
      "service": "backend",
      "description": "Port of backend",
      "secret": false,
      "strategy": "default",
      "default": "8080"
    },
    {
      "key": "REDIS_URL",
      "service": "backend",
      "description": "Redis url",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "DATABASE_URL",
      "service": "backend",
      "description": "Database url",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FRONTEND_URL",
      "service": "backend",
      "description": "Frontend url",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "PROCESS_TYPE",
      "service": "backend",
      "description": "process type",
      "secret": false,
      "strategy": "default",
      "default": "api"
    },
    {
      "key": "OPENAI_API_KEY",
      "service": "backend",
      "description": "OpenAI API key.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "API_DOCS_ENABLED",
      "service": "backend",
      "description": "API docs",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "MCP_UPSTREAM_URL",
      "service": "backend",
      "description": "MCP upstream url",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "CORS_ALLOW_ORIGINS",
      "service": "backend",
      "description": "CORS origins",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "INTERNAL_AUTH_SECRET",
      "service": "backend",
      "description": "auth secret",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "REDIS_URL",
      "service": "worker",
      "description": "redis url",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "DATABASE_URL",
      "service": "worker",
      "description": "db url",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FRONTEND_URL",
      "service": "worker",
      "description": "Frontend URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "PROCESS_TYPE",
      "service": "worker",
      "description": "process type",
      "secret": false,
      "strategy": "default",
      "default": "worker"
    },
    {
      "key": "OPENAI_API_KEY",
      "service": "worker",
      "description": "OpenAI API key.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "API_DOCS_ENABLED",
      "service": "worker",
      "description": "API docs",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "CORS_ALLOW_ORIGINS",
      "service": "worker",
      "description": "CORS origins",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "PORT",
      "service": "mcp",
      "description": "Port",
      "secret": false,
      "strategy": "default",
      "default": "8001"
    },
    {
      "key": "DATABASE_URL",
      "service": "mcp",
      "description": "db url",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "PROCESS_TYPE",
      "service": "mcp",
      "description": "Process role (mcp).",
      "secret": false,
      "strategy": "default",
      "default": "mcp"
    },
    {
      "key": "OPENAI_API_KEY",
      "service": "mcp",
      "description": "OpenAI API key.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REDIS_URL",
      "service": "beat",
      "description": "redis url",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "DATABASE_URL",
      "service": "beat",
      "description": "Database URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FRONTEND_URL",
      "service": "beat",
      "description": "Frontend URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "PROCESS_TYPE",
      "service": "beat",
      "description": "process type",
      "secret": false,
      "strategy": "default",
      "default": "beat"
    },
    {
      "key": "OPENAI_API_KEY",
      "service": "beat",
      "description": "OpenAI API key.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "API_DOCS_ENABLED",
      "service": "beat",
      "description": "API docs",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "CORS_ALLOW_ORIGINS",
      "service": "beat",
      "description": "CORS origins",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "PORT",
      "service": "app",
      "description": "Port",
      "secret": false,
      "strategy": "default",
      "default": "3000"
    },
    {
      "key": "APP_URL",
      "service": "app",
      "description": "App listen port.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "NODE_ENV",
      "service": "app",
      "description": "Node runtime environment.",
      "secret": false,
      "strategy": "default",
      "default": "production"
    },
    {
      "key": "BACKEND_URL",
      "service": "app",
      "description": "Backend Port config",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "DATABASE_URL",
      "service": "app",
      "description": "Database URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "OPENAI_API_KEY",
      "service": "app",
      "description": "OpenAI API key.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "BETTER_AUTH_URL",
      "service": "app",
      "description": "auth url",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "RAILWAY_RUN_UID",
      "service": "app",
      "description": "railway",
      "secret": false,
      "strategy": "default",
      "default": "0"
    },
    {
      "key": "LOGO_DEV_API_KEY",
      "service": "app",
      "description": "Logo.dev API key.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "MCP_UPSTREAM_URL",
      "service": "app",
      "description": "MCP Server upstream URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "STORAGE_PROVIDER",
      "service": "app",
      "description": "storage provider",
      "secret": false,
      "strategy": "default",
      "default": "local"
    },
    {
      "key": "BETTER_AUTH_SECRET",
      "service": "app",
      "description": "auth secret",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "LOCAL_STORAGE_PATH",
      "service": "app",
      "description": "local storage path",
      "secret": false,
      "strategy": "default",
      "default": "/data/uploads"
    },
    {
      "key": "INTERNAL_AUTH_SECRET",
      "service": "app",
      "description": "Internal auth secret",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "NEXT_PUBLIC_BETTER_AUTH_URL",
      "service": "app",
      "description": "next public url",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "MCP_PROXY_RATE_LIMIT_WINDOW_MS",
      "service": "app",
      "description": "Rate limit window for MCP requests",
      "secret": false,
      "strategy": "default",
      "default": "60000"
    },
    {
      "key": "MCP_PROXY_RATE_LIMIT_MAX_REQUESTS",
      "service": "app",
      "description": "Rate limit for MCP requests",
      "secret": false,
      "strategy": "default",
      "default": "240"
    }
  ],
  "deploy": {
    "mcp": {
      "server": "railway",
      "tool": "deploy_template",
      "args": {
        "template_code": "syllogic"
      }
    },
    "cli": "railway deploy --template syllogic",
    "api": {
      "method": "POST",
      "path": "/graphql/v2",
      "body": {
        "query": "mutation templateDeploy($input: TemplateDeployV2Input!) { templateDeployV2(input: $input) { projectId workflowId } }",
        "variables": {
          "input": {
            "templateId": "0fff90d4-89df-4c27-906c-c623afde8960",
            "serializedConfig": {
              "buckets": {},
              "services": {
                "2d77239e-9ca1-4684-9bf0-865ec662aa00": {
                  "icon": "https://e7.pngegg.com/pngimages/66/424/png-clipart-redis-distributed-cache-database-caching-wrapper-angle-logo.png",
                  "name": "redis",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "redis:7-alpine"
                  },
                  "variables": {},
                  "volumeMounts": {
                    "2d77239e-9ca1-4684-9bf0-865ec662aa00": {
                      "mountPath": "/data"
                    }
                  },
                  "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."
                  }
                },
                "418a0e78-27ed-402d-9d34-bbbc14548f86": {
                  "icon": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/29/Postgresql_elephant.svg/960px-Postgresql_elephant.svg.png",
                  "name": "postgres",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": "",
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "ghcr.io/railwayapp-templates/postgres-ssl:16"
                  },
                  "variables": {
                    "PGDATA": {
                      "isOptional": false,
                      "description": "PGDATA",
                      "defaultValue": "/var/lib/postgresql/data/pgdata"
                    },
                    "POSTGRES_DB": {
                      "isOptional": false,
                      "description": "Name of the db",
                      "defaultValue": "finance_db"
                    },
                    "POSTGRES_USER": {
                      "isOptional": false,
                      "description": "user of db",
                      "defaultValue": "financeuser"
                    },
                    "POSTGRES_PASSWORD": {
                      "isOptional": false,
                      "description": "password of db",
                      "defaultValue": "{{POSTGRES_PASSWORD}}"
                    }
                  },
                  "networking": {},
                  "volumeMounts": {
                    "418a0e78-27ed-402d-9d34-bbbc14548f86": {
                      "mountPath": "/var/lib/postgresql/data"
                    }
                  },
                  "haTemplateCode": "postgres-ha",
                  "haConversionConfig": {
                    "edge": {
                      "label": "Reverse Proxy",
                      "options": [
                        2,
                        3,
                        4,
                        5
                      ],
                      "nodeLabel": "HAProxy",
                      "description": "Routes traffic to the primary",
                      "defaultValue": 3
                    },
                    "replica": {
                      "label": "Replicas",
                      "options": [
                        2,
                        3,
                        4,
                        5,
                        6,
                        7
                      ],
                      "nodeLabel": "Postgres",
                      "description": "Streaming replicas for automatic failover",
                      "defaultValue": 2
                    },
                    "internal": {
                      "label": "Coordinator Nodes",
                      "options": [
                        3,
                        5,
                        7,
                        9
                      ],
                      "nodeLabel": "etcd",
                      "defaultValue": 3
                    },
                    "description": "This will convert your Postgres database to an HA cluster with Patroni failover and etcd consensus."
                  }
                },
                "716b974a-3072-4645-ac1f-d91d14dded6e": {
                  "icon": "https://www.citypng.com/public/uploads/preview/hd-python-logo-symbol-transparent-png-735811696257415dbkifcuokn.png",
                  "name": "backend",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "ghcr.io/syllogic-ai/syllogic-backend:v1.0.1"
                  },
                  "variables": {
                    "PORT": {
                      "description": "Port of backend",
                      "defaultValue": "8080"
                    },
                    "REDIS_URL": {
                      "isOptional": false,
                      "description": "Redis url",
                      "defaultValue": "redis://${{redis.RAILWAY_PRIVATE_DOMAIN}}:6379/0"
                    },
                    "DATABASE_URL": {
                      "isOptional": false,
                      "description": "Database url",
                      "defaultValue": "postgresql://financeuser:${{postgres.POSTGRES_PASSWORD}}@${{postgres.RAILWAY_PRIVATE_DOMAIN}}:5432/finance_db?sslmode=require"
                    },
                    "FRONTEND_URL": {
                      "isOptional": false,
                      "description": "Frontend url",
                      "defaultValue": "https://${{app.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "PROCESS_TYPE": {
                      "description": "process type",
                      "defaultValue": "api"
                    },
                    "OPENAI_API_KEY": {
                      "isOptional": false,
                      "description": "OpenAI API key.",
                      "defaultValue": "${{shared.OPENAI_API_KEY}}"
                    },
                    "API_DOCS_ENABLED": {
                      "isOptional": false,
                      "description": "API docs",
                      "defaultValue": "false"
                    },
                    "MCP_UPSTREAM_URL": {
                      "description": "MCP upstream url",
                      "defaultValue": "http://${{mcp.RAILWAY_PRIVATE_DOMAIN}}:8001/mcp"
                    },
                    "CORS_ALLOW_ORIGINS": {
                      "isOptional": false,
                      "description": "CORS origins",
                      "defaultValue": "https://${{app.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "INTERNAL_AUTH_SECRET": {
                      "isOptional": false,
                      "description": "auth secret",
                      "defaultValue": "{{INTERNAL_AUTH_SECRET}}"
                    }
                  }
                },
                "9bc08cff-e2a3-4208-a025-8b4fe38da169": {
                  "icon": "https://upload.wikimedia.org/wikipedia/commons/1/19/Celery_logo.png",
                  "name": "worker",
                  "deploy": {
                    "startCommand": "celery -A celery_app worker --loglevel=info --concurrency=4",
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "ghcr.io/syllogic-ai/syllogic-backend:v1.0.1"
                  },
                  "variables": {
                    "REDIS_URL": {
                      "isOptional": false,
                      "description": "redis url",
                      "defaultValue": "redis://${{redis.RAILWAY_PRIVATE_DOMAIN}}:6379/0"
                    },
                    "DATABASE_URL": {
                      "isOptional": false,
                      "description": "db url",
                      "defaultValue": "postgresql://financeuser:${{postgres.POSTGRES_PASSWORD}}@${{postgres.RAILWAY_PRIVATE_DOMAIN}}:5432/finance_db?sslmode=require"
                    },
                    "FRONTEND_URL": {
                      "isOptional": false,
                      "description": "Frontend URL",
                      "defaultValue": "https://${{app.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "PROCESS_TYPE": {
                      "description": "process type",
                      "defaultValue": "worker"
                    },
                    "OPENAI_API_KEY": {
                      "isOptional": false,
                      "description": "OpenAI API key.",
                      "defaultValue": "${{shared.OPENAI_API_KEY}}"
                    },
                    "API_DOCS_ENABLED": {
                      "isOptional": false,
                      "description": "API docs",
                      "defaultValue": "false"
                    },
                    "CORS_ALLOW_ORIGINS": {
                      "isOptional": false,
                      "description": "CORS origins",
                      "defaultValue": "https://${{app.RAILWAY_PUBLIC_DOMAIN}}"
                    }
                  }
                },
                "abfc58b4-4dee-4a0d-93d2-8beb8b41047b": {
                  "icon": "https://avatars.githubusercontent.com/u/182288589?s=200&v=4",
                  "name": "mcp",
                  "deploy": {
                    "startCommand": "uvicorn mcp_server:app --host 0.0.0.0 --port 8001",
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "ghcr.io/syllogic-ai/syllogic-backend:v1.0.1"
                  },
                  "variables": {
                    "PORT": {
                      "description": "Port",
                      "defaultValue": "8001"
                    },
                    "DATABASE_URL": {
                      "isOptional": false,
                      "description": "db url",
                      "defaultValue": "postgresql://financeuser:${{postgres.POSTGRES_PASSWORD}}@${{postgres.RAILWAY_PRIVATE_DOMAIN}}:5432/finance_db?sslmode=require"
                    },
                    "PROCESS_TYPE": {
                      "description": "Process role (mcp).",
                      "defaultValue": "mcp"
                    },
                    "OPENAI_API_KEY": {
                      "isOptional": false,
                      "description": "OpenAI API key.",
                      "defaultValue": "${{shared.OPENAI_API_KEY}}"
                    }
                  }
                },
                "add5b9bc-1d36-4373-9903-7c106e9a2025": {
                  "icon": "https://upload.wikimedia.org/wikipedia/commons/1/19/Celery_logo.png",
                  "name": "beat",
                  "deploy": {
                    "startCommand": "celery -A celery_app beat --loglevel=info",
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "ghcr.io/syllogic-ai/syllogic-backend:v1.0.1"
                  },
                  "variables": {
                    "REDIS_URL": {
                      "isOptional": false,
                      "description": "redis url",
                      "defaultValue": "redis://${{redis.RAILWAY_PRIVATE_DOMAIN}}:6379/0"
                    },
                    "DATABASE_URL": {
                      "isOptional": false,
                      "description": "Database URL",
                      "defaultValue": "postgresql://financeuser:${{postgres.POSTGRES_PASSWORD}}@${{postgres.RAILWAY_PRIVATE_DOMAIN}}:5432/finance_db?sslmode=require"
                    },
                    "FRONTEND_URL": {
                      "isOptional": false,
                      "description": "Frontend URL",
                      "defaultValue": "https://${{app.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "PROCESS_TYPE": {
                      "description": "process type",
                      "defaultValue": "beat"
                    },
                    "OPENAI_API_KEY": {
                      "isOptional": false,
                      "description": "OpenAI API key.",
                      "defaultValue": "${{shared.OPENAI_API_KEY}}"
                    },
                    "API_DOCS_ENABLED": {
                      "isOptional": false,
                      "description": "API docs",
                      "defaultValue": "false"
                    },
                    "CORS_ALLOW_ORIGINS": {
                      "isOptional": false,
                      "description": "CORS origins",
                      "defaultValue": "https://${{app.RAILWAY_PUBLIC_DOMAIN}}"
                    }
                  }
                },
                "f49a3929-c210-4289-ac75-b07e8754651f": {
                  "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSV9uzErWz9EXqZDxZ5lP9aYpMz8eK6rr5X3w&s",
                  "name": "app",
                  "deploy": {
                    "startCommand": "/bin/sh -lc \"mkdir -p /data/uploads/profile /data/uploads/logos /data/uploads/imports /data/uploads/people && chmod -R u+rwX,g+rwX /data/uploads && node scripts/migrate.js && exec node_modules/.bin/next start -p ${PORT:-3000} -H 0.0.0.0\"",
                    "healthcheckPath": "/api/health",
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "ghcr.io/syllogic-ai/syllogic-frontend:v1.0.1"
                  },
                  "variables": {
                    "PORT": {
                      "description": "Port",
                      "defaultValue": "3000"
                    },
                    "APP_URL": {
                      "description": "App listen port.",
                      "defaultValue": "https://${{app.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "NODE_ENV": {
                      "description": "Node runtime environment.",
                      "defaultValue": "production"
                    },
                    "BACKEND_URL": {
                      "description": "Backend Port config",
                      "defaultValue": "http://${{backend.RAILWAY_PRIVATE_DOMAIN}}:8080"
                    },
                    "DATABASE_URL": {
                      "isOptional": false,
                      "description": "Database URL",
                      "defaultValue": "postgresql://financeuser:${{postgres.POSTGRES_PASSWORD}}@${{postgres.RAILWAY_PRIVATE_DOMAIN}}:5432/finance_db?sslmode=require"
                    },
                    "OPENAI_API_KEY": {
                      "isOptional": false,
                      "description": "OpenAI API key.",
                      "defaultValue": "${{shared.OPENAI_API_KEY}}"
                    },
                    "BETTER_AUTH_URL": {
                      "description": "auth url",
                      "defaultValue": "https://${{app.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "RAILWAY_RUN_UID": {
                      "description": "railway",
                      "defaultValue": "0"
                    },
                    "LOGO_DEV_API_KEY": {
                      "description": "Logo.dev API key.",
                      "defaultValue": "${{shared.LOGO_DEV_API_KEY}}"
                    },
                    "MCP_UPSTREAM_URL": {
                      "description": "MCP Server upstream URL",
                      "defaultValue": "http://${{mcp.RAILWAY_PRIVATE_DOMAIN}}:8001/mcp"
                    },
                    "STORAGE_PROVIDER": {
                      "description": "storage provider",
                      "defaultValue": "local"
                    },
                    "BETTER_AUTH_SECRET": {
                      "description": "auth secret",
                      "defaultValue": "{{BETTER_AUTH_SECRET}}"
                    },
                    "LOCAL_STORAGE_PATH": {
                      "description": "local storage path",
                      "defaultValue": "/data/uploads"
                    },
                    "INTERNAL_AUTH_SECRET": {
                      "description": "Internal auth secret",
                      "defaultValue": "${{backend.INTERNAL_AUTH_SECRET}}"
                    },
                    "NEXT_PUBLIC_BETTER_AUTH_URL": {
                      "description": "next public url",
                      "defaultValue": "https://${{app.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "MCP_PROXY_RATE_LIMIT_WINDOW_MS": {
                      "description": "Rate limit window for MCP requests",
                      "defaultValue": "60000"
                    },
                    "MCP_PROXY_RATE_LIMIT_MAX_REQUESTS": {
                      "description": "Rate limit for MCP requests",
                      "defaultValue": "240"
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>": {}
                    }
                  },
                  "volumeMounts": {
                    "f49a3929-c210-4289-ac75-b07e8754651f": {
                      "mountPath": "/data/uploads"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "post_deploy": {
    "healthcheck": {
      "service": "app",
      "method": "GET",
      "path": "/api/health",
      "expect_status": 200
    }
  },
  "resources": {
    "expected_services": 7,
    "needs_volume": true
  },
  "generated_at": "2026-09-07T17:54:24.783Z",
  "generator_version": "0.1.0"
}
