{
  "manifest_version": "1.0.0",
  "template": {
    "id": "d7d8eb01-991d-43c6-9866-180d1f6c20f5",
    "slug": "librechat-official",
    "name": "LibreChat",
    "description": "Open-source ChatGPT clone: multi-model, agents, search, multi-user auth",
    "url": "https://railway.com/deploy/librechat-official",
    "upstream": {
      "image": "ghcr.io/danny-avila/librechat-dev:latest"
    }
  },
  "status": "unvalidated",
  "validated_at": null,
  "success_rate_30d": null,
  "services": [
    {
      "name": "VectorDB",
      "source": {
        "image": "pgvector/pgvector:pg16"
      },
      "needs_volume": true,
      "volume_mount_path": "/var/lib/postgresql/data",
      "http": false
    },
    {
      "name": "RAG API",
      "source": {
        "image": "ghcr.io/danny-avila/librechat-rag-api-dev-lite:latest"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "LibreChat",
      "source": {
        "image": "ghcr.io/danny-avila/librechat-dev:latest"
      },
      "needs_volume": false,
      "http": true
    },
    {
      "name": "Meilisearch",
      "source": {
        "image": "getmeili/meilisearch:v1.11.3"
      },
      "needs_volume": true,
      "volume_mount_path": "/meili_data",
      "http": false
    },
    {
      "name": "MongoDB",
      "source": {
        "image": "mongo"
      },
      "needs_volume": true,
      "volume_mount_path": "/data/db",
      "http": false
    }
  ],
  "required_inputs": [
    {
      "key": "PGDATA",
      "service": "VectorDB",
      "description": "PostgreSQL data directory inside the mounted volume",
      "secret": false,
      "strategy": "default",
      "default": "/var/lib/postgresql/data/pgdata"
    },
    {
      "key": "POSTGRES_DB",
      "service": "VectorDB",
      "description": "Name of the vector database used by the RAG API",
      "secret": false,
      "strategy": "default",
      "default": "railway"
    },
    {
      "key": "POSTGRES_USER",
      "service": "VectorDB",
      "description": "PostgreSQL superuser for the vector database",
      "secret": false,
      "strategy": "default",
      "default": "postgres"
    },
    {
      "key": "POSTGRES_PASSWORD",
      "service": "VectorDB",
      "description": "Auto-generated PostgreSQL password",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "PORT",
      "service": "RAG API",
      "description": "Port the RAG API listens on; referenced by LibreChat RAG_API_URL",
      "secret": false,
      "strategy": "default",
      "default": "8000"
    },
    {
      "key": "DB_HOST",
      "service": "RAG API",
      "description": "Private hostname of the VectorDB service",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "DB_PORT",
      "service": "RAG API",
      "description": "PostgreSQL port on the VectorDB service",
      "secret": false,
      "strategy": "default",
      "default": "5432"
    },
    {
      "key": "JWT_SECRET",
      "service": "RAG API",
      "description": "Shared secret used to validate JWTs issued by LibreChat",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "POSTGRES_DB",
      "service": "RAG API",
      "description": "Vector database name, mirrored from the VectorDB service",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DEBUG_RAG_API",
      "service": "RAG API",
      "description": "Enable verbose RAG API logging",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "POSTGRES_USER",
      "service": "RAG API",
      "description": "PostgreSQL user, mirrored from the VectorDB service",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "POSTGRES_PASSWORD",
      "service": "RAG API",
      "description": "PostgreSQL password, mirrored from the VectorDB service",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "RAG_OPENAI_API_KEY",
      "service": "RAG API",
      "description": "Embeddings API key for file uploads/RAG. The placeholder lets the service boot; replace it with a real OpenAI key to enable file search.",
      "secret": true,
      "strategy": "default",
      "default": "sk-placeholder-replace-to-enable-rag"
    },
    {
      "key": "EMBEDDINGS_PROVIDER",
      "service": "RAG API",
      "description": "Embeddings backend used to index uploaded files",
      "secret": false,
      "strategy": "default",
      "default": "openai"
    },
    {
      "key": "HOST",
      "service": "LibreChat",
      "description": "Interface LibreChat binds to inside the container",
      "secret": false,
      "strategy": "default",
      "default": "0.0.0.0"
    },
    {
      "key": "SEARCH",
      "service": "LibreChat",
      "description": "Enable search in messages and conversations via Meilisearch",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "CREDS_IV",
      "service": "LibreChat",
      "description": "AES initialization vector. Must be exactly 32 hex characters (16 bytes).",
      "secret": false,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "NO_INDEX",
      "service": "LibreChat",
      "description": "Ask search engines not to index this deployment",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "APP_TITLE",
      "service": "LibreChat",
      "description": "Application name shown in the UI and browser tab",
      "secret": false,
      "strategy": "default",
      "default": "LibreChat"
    },
    {
      "key": "CREDS_KEY",
      "service": "LibreChat",
      "description": "AES-256 key for encrypting stored user credentials. Must be exactly 64 hex characters (32 bytes).",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "ENDPOINTS",
      "service": "LibreChat",
      "description": "Comma-separated list of available endpoints",
      "secret": false,
      "strategy": "default",
      "default": "openAI,agents,assistants,google,anthropic,custom"
    },
    {
      "key": "LOGIN_MAX",
      "service": "LibreChat",
      "description": "Max logins allowed per IP per LOGIN_WINDOW",
      "secret": false,
      "strategy": "default",
      "default": "7"
    },
    {
      "key": "MONGO_URI",
      "service": "LibreChat",
      "description": "MongoDB connection string over the Railway private network",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "GOOGLE_KEY",
      "service": "LibreChat",
      "description": "Google Gemini API key; user_provided lets each user enter their own",
      "secret": true,
      "strategy": "default",
      "default": "user_provided"
    },
    {
      "key": "JWT_SECRET",
      "service": "LibreChat",
      "description": "Secret used to sign access tokens; also shared with the RAG API",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "MEILI_HOST",
      "service": "LibreChat",
      "description": "Meilisearch URL on the private network",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "CONFIG_PATH",
      "service": "LibreChat",
      "description": "Pinned librechat.yaml. Uses local file storage and env-based provider keys.",
      "secret": false,
      "strategy": "default",
      "default": "https://raw.githubusercontent.com/LibreChat-AI/librechat-config-yaml/c0c64090b6e06bc4c1764e424bdc282de718bdbc/librechat-env-l.yaml"
    },
    {
      "key": "RAG_API_URL",
      "service": "LibreChat",
      "description": "RAG API URL on the private network",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "TITLE_CONVO",
      "service": "LibreChat",
      "description": "Auto-generate conversation titles",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "TRUST_PROXY",
      "service": "LibreChat",
      "description": "Trust Railway reverse proxy so client IPs resolve correctly",
      "secret": false,
      "strategy": "default",
      "default": "1"
    },
    {
      "key": "XAI_API_KEY",
      "service": "LibreChat",
      "description": "xAI (Grok) API key; user_provided lets each user enter their own in the UI",
      "secret": true,
      "strategy": "default",
      "default": "user_provided"
    },
    {
      "key": "BAN_DURATION",
      "service": "LibreChat",
      "description": "Ban duration in milliseconds (default: 2 hours)",
      "secret": false,
      "strategy": "default",
      "default": "7200000"
    },
    {
      "key": "BAN_INTERVAL",
      "service": "LibreChat",
      "description": "Ban triggers when violation score reaches this threshold",
      "secret": false,
      "strategy": "default",
      "default": "20"
    },
    {
      "key": "GITHUB_TOKEN",
      "service": "LibreChat",
      "description": "GitHub Models token",
      "secret": true,
      "strategy": "default",
      "default": "user_provided"
    },
    {
      "key": "GROQ_API_KEY",
      "service": "LibreChat",
      "description": "Groq API key",
      "secret": true,
      "strategy": "default",
      "default": "user_provided"
    },
    {
      "key": "LOGIN_WINDOW",
      "service": "LibreChat",
      "description": "Login rate limit window in minutes",
      "secret": false,
      "strategy": "default",
      "default": "5"
    },
    {
      "key": "REGISTER_MAX",
      "service": "LibreChat",
      "description": "Max registrations allowed per IP per REGISTER_WINDOW",
      "secret": false,
      "strategy": "default",
      "default": "5"
    },
    {
      "key": "AI302_API_KEY",
      "service": "LibreChat",
      "description": "302AI API key",
      "secret": true,
      "strategy": "default",
      "default": "user_provided"
    },
    {
      "key": "CHECK_BALANCE",
      "service": "LibreChat",
      "description": "Enable token balance enforcement per user",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "DEBUG_CONSOLE",
      "service": "LibreChat",
      "description": "Enable verbose server output in the console (not recommended for production)",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "DEBUG_LOGGING",
      "service": "LibreChat",
      "description": "Enable verbose application logs (not recommended for production)",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "DOMAIN_CLIENT",
      "service": "LibreChat",
      "description": "Public URL of the frontend",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "DOMAIN_SERVER",
      "service": "LibreChat",
      "description": "Public URL of the backend",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "UNIFY_API_KEY",
      "service": "LibreChat",
      "description": "Unify API key",
      "secret": true,
      "strategy": "default",
      "default": "user_provided"
    },
    {
      "key": "APIPIE_API_KEY",
      "service": "LibreChat",
      "description": "APIpie API key",
      "secret": true,
      "strategy": "default",
      "default": "user_provided"
    },
    {
      "key": "BAN_VIOLATIONS",
      "service": "LibreChat",
      "description": "Enable banning users for violations",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "COHERE_API_KEY",
      "service": "LibreChat",
      "description": "Cohere API key",
      "secret": true,
      "strategy": "default",
      "default": "user_provided"
    },
    {
      "key": "MESSAGE_IP_MAX",
      "service": "LibreChat",
      "description": "Max messages per IP per MESSAGE_IP_WINDOW",
      "secret": false,
      "strategy": "default",
      "default": "40"
    },
    {
      "key": "NVIDIA_API_KEY",
      "service": "LibreChat",
      "description": "NVIDIA NIM API key",
      "secret": true,
      "strategy": "default",
      "default": "user_provided"
    },
    {
      "key": "OPENAI_API_KEY",
      "service": "LibreChat",
      "description": "OpenAI API key; user_provided lets each user enter their own",
      "secret": true,
      "strategy": "default",
      "default": "user_provided"
    },
    {
      "key": "OPENROUTER_KEY",
      "service": "LibreChat",
      "description": "OpenRouter API key",
      "secret": true,
      "strategy": "default",
      "default": "user_provided"
    },
    {
      "key": "SESSION_EXPIRY",
      "service": "LibreChat",
      "description": "Access token lifetime in milliseconds",
      "secret": false,
      "strategy": "default",
      "default": "900000"
    },
    {
      "key": "KLUSTER_API_KEY",
      "service": "LibreChat",
      "description": "Kluster.ai API key",
      "secret": true,
      "strategy": "default",
      "default": "user_provided"
    },
    {
      "key": "MISTRAL_API_KEY",
      "service": "LibreChat",
      "description": "Mistral API key",
      "secret": true,
      "strategy": "default",
      "default": "user_provided"
    },
    {
      "key": "NANOGPT_API_KEY",
      "service": "LibreChat",
      "description": "NanoGPT API key",
      "secret": true,
      "strategy": "default",
      "default": "user_provided"
    },
    {
      "key": "REGISTER_WINDOW",
      "service": "LibreChat",
      "description": "Registration rate limit window in minutes",
      "secret": false,
      "strategy": "default",
      "default": "60"
    },
    {
      "key": "DEEPSEEK_API_KEY",
      "service": "LibreChat",
      "description": "API key for DeepSeek",
      "secret": true,
      "strategy": "default",
      "default": "user_provided"
    },
    {
      "key": "LIMIT_MESSAGE_IP",
      "service": "LibreChat",
      "description": "Enable IP-based message rate limiting",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "MEILI_MASTER_KEY",
      "service": "LibreChat",
      "description": "Meilisearch master key; mirrored into the Meilisearch service",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "MESSAGE_USER_MAX",
      "service": "LibreChat",
      "description": "Max messages per user per MESSAGE_USER_WINDOW",
      "secret": false,
      "strategy": "default",
      "default": "40"
    },
    {
      "key": "ALLOW_EMAIL_LOGIN",
      "service": "LibreChat",
      "description": "Enable or disable email/password login",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "ANTHROPIC_API_KEY",
      "service": "LibreChat",
      "description": "Anthropic API key; user_provided lets each user enter their own",
      "secret": true,
      "strategy": "default",
      "default": "user_provided"
    },
    {
      "key": "FIREWORKS_API_KEY",
      "service": "LibreChat",
      "description": "Fireworks AI API key",
      "secret": true,
      "strategy": "default",
      "default": "user_provided"
    },
    {
      "key": "HUGGINGFACE_TOKEN",
      "service": "LibreChat",
      "description": "HuggingFace access token",
      "secret": true,
      "strategy": "default",
      "default": "user_provided"
    },
    {
      "key": "MESSAGE_IP_WINDOW",
      "service": "LibreChat",
      "description": "IP message rate limit window in minutes",
      "secret": false,
      "strategy": "default",
      "default": "1"
    },
    {
      "key": "SAMBANOVA_API_KEY",
      "service": "LibreChat",
      "description": "SambaNova API key",
      "secret": true,
      "strategy": "default",
      "default": "user_provided"
    },
    {
      "key": "ALLOW_REGISTRATION",
      "service": "LibreChat",
      "description": "Enable or disable email registration of new users",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "ALLOW_SOCIAL_LOGIN",
      "service": "LibreChat",
      "description": "Enable social login (configure provider client IDs/secrets below)",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "ASSISTANTS_API_KEY",
      "service": "LibreChat",
      "description": "OpenAI Assistants API key",
      "secret": true,
      "strategy": "default",
      "default": "user_provided"
    },
    {
      "key": "HYPERBOLIC_API_KEY",
      "service": "LibreChat",
      "description": "Hyperbolic API key",
      "secret": true,
      "strategy": "default",
      "default": "user_provided"
    },
    {
      "key": "JWT_REFRESH_SECRET",
      "service": "LibreChat",
      "description": "Secret used to sign refresh tokens",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "LIMIT_MESSAGE_USER",
      "service": "LibreChat",
      "description": "Enable user-based message rate limiting",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "MEILI_NO_ANALYTICS",
      "service": "LibreChat",
      "description": "Disable anonymized telemetry analytics for Meilisearch",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "PERPLEXITY_API_KEY",
      "service": "LibreChat",
      "description": "Perplexity API key",
      "secret": true,
      "strategy": "default",
      "default": "user_provided"
    },
    {
      "key": "TOGETHERAI_API_KEY",
      "service": "LibreChat",
      "description": "Together AI API key",
      "secret": true,
      "strategy": "default",
      "default": "user_provided"
    },
    {
      "key": "GITHUB_CALLBACK_URL",
      "service": "LibreChat",
      "description": "GitHub OAuth callback path",
      "secret": false,
      "strategy": "default",
      "default": "/oauth/github/callback"
    },
    {
      "key": "GOOGLE_CALLBACK_URL",
      "service": "LibreChat",
      "description": "Google OAuth callback path",
      "secret": false,
      "strategy": "default",
      "default": "/oauth/google/callback"
    },
    {
      "key": "MESSAGE_USER_WINDOW",
      "service": "LibreChat",
      "description": "User message rate limit window in minutes",
      "secret": false,
      "strategy": "default",
      "default": "1"
    },
    {
      "key": "DISCORD_CALLBACK_URL",
      "service": "LibreChat",
      "description": "Discord OAuth callback path",
      "secret": false,
      "strategy": "default",
      "default": "/oauth/discord/callback"
    },
    {
      "key": "REFRESH_TOKEN_EXPIRY",
      "service": "LibreChat",
      "description": "Refresh token lifetime in milliseconds",
      "secret": true,
      "strategy": "default",
      "default": "604800000"
    },
    {
      "key": "LOGIN_VIOLATION_SCORE",
      "service": "LibreChat",
      "description": "Score added to the ban counter for a failed login",
      "secret": false,
      "strategy": "default",
      "default": "1"
    },
    {
      "key": "CONCURRENT_MESSAGE_MAX",
      "service": "LibreChat",
      "description": "Max concurrent messages per user",
      "secret": false,
      "strategy": "default",
      "default": "2"
    },
    {
      "key": "MESSAGE_VIOLATION_SCORE",
      "service": "LibreChat",
      "description": "Score added to the ban counter when a message limit is exceeded",
      "secret": false,
      "strategy": "default",
      "default": "1"
    },
    {
      "key": "ALLOW_SOCIAL_REGISTRATION",
      "service": "LibreChat",
      "description": "Allow new users to register via social login",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "LIMIT_CONCURRENT_MESSAGES",
      "service": "LibreChat",
      "description": "Limit concurrent messages per user",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "CONCURRENT_VIOLATION_SCORE",
      "service": "LibreChat",
      "description": "Score added to the ban counter for exceeding concurrent messages",
      "secret": false,
      "strategy": "default",
      "default": "1"
    },
    {
      "key": "NON_BROWSER_VIOLATION_SCORE",
      "service": "LibreChat",
      "description": "Score added to the ban counter for non-browser requests",
      "secret": false,
      "strategy": "default",
      "default": "20"
    },
    {
      "key": "REGISTRATION_VIOLATION_SCORE",
      "service": "LibreChat",
      "description": "Score added to the ban counter for registration abuse",
      "secret": false,
      "strategy": "default",
      "default": "1"
    },
    {
      "key": "MEILI_ENV",
      "service": "Meilisearch",
      "description": "Meilisearch environment; production disables the bundled web UI",
      "secret": false,
      "strategy": "default",
      "default": "production"
    },
    {
      "key": "MEILI_DB_PATH",
      "service": "Meilisearch",
      "description": "Meilisearch index directory inside the mounted volume",
      "secret": false,
      "strategy": "default",
      "default": "/meili_data/data.ms"
    },
    {
      "key": "MEILI_HTTP_ADDR",
      "service": "Meilisearch",
      "description": "Listen address; [::] binds all interfaces for Railway private networking",
      "secret": false,
      "strategy": "default",
      "default": "[::]:7700"
    },
    {
      "key": "MEILI_MASTER_KEY",
      "service": "Meilisearch",
      "description": "Master key, mirrored from LibreChat so both services agree",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "MEILI_NO_ANALYTICS",
      "service": "Meilisearch",
      "description": "Disable anonymized Meilisearch telemetry",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "MONGOHOST",
      "service": "MongoDB",
      "description": "Private hostname of this MongoDB service",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "MONGOPORT",
      "service": "MongoDB",
      "description": "MongoDB listening port",
      "secret": false,
      "strategy": "default",
      "default": "27017"
    },
    {
      "key": "MONGOUSER",
      "service": "MongoDB",
      "description": "MongoDB root username",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "MONGO_URL",
      "service": "MongoDB",
      "description": "Public connection string via the Railway TCP proxy",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "MONGOPASSWORD",
      "service": "MongoDB",
      "description": "MongoDB root password",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "MONGO_PRIVATE_URL",
      "service": "MongoDB",
      "description": "Private-network connection string consumed by LibreChat",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "MONGO_INITDB_ROOT_PASSWORD",
      "service": "MongoDB",
      "description": "Auto-generated root password created on first boot",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "MONGO_INITDB_ROOT_USERNAME",
      "service": "MongoDB",
      "description": "Root username created on first boot",
      "secret": false,
      "strategy": "default",
      "default": "mongo"
    }
  ],
  "deploy": {
    "mcp": {
      "server": "railway",
      "tool": "deploy_template",
      "args": {
        "template_code": "librechat-official"
      }
    },
    "cli": "railway deploy --template librechat-official",
    "api": {
      "method": "POST",
      "path": "/graphql/v2",
      "body": {
        "query": "mutation templateDeploy($input: TemplateDeployV2Input!) { templateDeployV2(input: $input) { projectId workflowId } }",
        "variables": {
          "input": {
            "templateId": "d7d8eb01-991d-43c6-9866-180d1f6c20f5",
            "serializedConfig": {
              "services": {
                "06d33db4-f00c-4303-bfe1-c20cd1081596": {
                  "icon": "https://www.svgrepo.com/show/303301/postgresql-logo.svg",
                  "name": "VectorDB",
                  "source": {
                    "image": "pgvector/pgvector:pg16"
                  },
                  "variables": {
                    "PGDATA": {
                      "description": "PostgreSQL data directory inside the mounted volume",
                      "defaultValue": "/var/lib/postgresql/data/pgdata"
                    },
                    "POSTGRES_DB": {
                      "description": "Name of the vector database used by the RAG API",
                      "defaultValue": "railway"
                    },
                    "POSTGRES_USER": {
                      "description": "PostgreSQL superuser for the vector database",
                      "defaultValue": "postgres"
                    },
                    "POSTGRES_PASSWORD": {
                      "description": "Auto-generated PostgreSQL password",
                      "defaultValue": "{{POSTGRES_PASSWORD}}"
                    }
                  },
                  "networking": {},
                  "volumeMounts": {
                    "06d33db4-f00c-4303-bfe1-c20cd1081596": {
                      "mountPath": "/var/lib/postgresql/data"
                    }
                  }
                },
                "33936c41-cf49-4347-b65e-5eaf2f7b6f01": {
                  "icon": "https://www.librechat.ai/librechat.svg",
                  "name": "RAG API",
                  "deploy": {
                    "healthcheckPath": "/health"
                  },
                  "source": {
                    "image": "ghcr.io/danny-avila/librechat-rag-api-dev-lite:latest"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "description": "Port the RAG API listens on; referenced by LibreChat RAG_API_URL",
                      "defaultValue": "8000"
                    },
                    "DB_HOST": {
                      "isOptional": false,
                      "description": "Private hostname of the VectorDB service",
                      "defaultValue": "${{VectorDB.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "DB_PORT": {
                      "isOptional": false,
                      "description": "PostgreSQL port on the VectorDB service",
                      "defaultValue": "5432"
                    },
                    "JWT_SECRET": {
                      "description": "Shared secret used to validate JWTs issued by LibreChat",
                      "defaultValue": "${{LibreChat.JWT_SECRET}}"
                    },
                    "POSTGRES_DB": {
                      "isOptional": false,
                      "description": "Vector database name, mirrored from the VectorDB service",
                      "defaultValue": "${{VectorDB.POSTGRES_DB}}"
                    },
                    "DEBUG_RAG_API": {
                      "description": "Enable verbose RAG API logging",
                      "defaultValue": "false"
                    },
                    "POSTGRES_USER": {
                      "description": "PostgreSQL user, mirrored from the VectorDB service",
                      "defaultValue": "${{VectorDB.POSTGRES_USER}}"
                    },
                    "POSTGRES_PASSWORD": {
                      "description": "PostgreSQL password, mirrored from the VectorDB service",
                      "defaultValue": "${{VectorDB.POSTGRES_PASSWORD}}"
                    },
                    "RAG_OPENAI_API_KEY": {
                      "isOptional": true,
                      "description": "Embeddings API key for file uploads/RAG. The placeholder lets the service boot; replace it with a real OpenAI key to enable file search.",
                      "defaultValue": "sk-placeholder-replace-to-enable-rag"
                    },
                    "EMBEDDINGS_PROVIDER": {
                      "description": "Embeddings backend used to index uploaded files",
                      "defaultValue": "openai"
                    }
                  },
                  "networking": {}
                },
                "36434ca0-937a-44ab-b381-44894ce8fb2c": {
                  "icon": "https://raw.githubusercontent.com/danny-avila/LibreChat/refs/heads/main/client/public/assets/logo.svg",
                  "name": "LibreChat",
                  "build": {},
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": "/health"
                  },
                  "source": {
                    "image": "ghcr.io/danny-avila/librechat-dev:latest"
                  },
                  "variables": {
                    "HOST": {
                      "isOptional": false,
                      "description": "Interface LibreChat binds to inside the container",
                      "defaultValue": "0.0.0.0"
                    },
                    "PROXY": {
                      "isOptional": true,
                      "description": "Proxy URL used by all endpoints (leave empty if not needed)",
                      "defaultValue": ""
                    },
                    "SEARCH": {
                      "isOptional": false,
                      "description": "Enable search in messages and conversations via Meilisearch",
                      "defaultValue": "true"
                    },
                    "CREDS_IV": {
                      "isOptional": false,
                      "description": "AES initialization vector. Must be exactly 32 hex characters (16 bytes).",
                      "defaultValue": "{{CREDS_IV}}"
                    },
                    "NO_INDEX": {
                      "isOptional": false,
                      "description": "Ask search engines not to index this deployment",
                      "defaultValue": "true"
                    },
                    "APP_TITLE": {
                      "isOptional": false,
                      "description": "Application name shown in the UI and browser tab",
                      "defaultValue": "LibreChat"
                    },
                    "CREDS_KEY": {
                      "isOptional": false,
                      "description": "AES-256 key for encrypting stored user credentials. Must be exactly 64 hex characters (32 bytes).",
                      "defaultValue": "{{CREDS_KEY}}"
                    },
                    "ENDPOINTS": {
                      "isOptional": false,
                      "description": "Comma-separated list of available endpoints",
                      "defaultValue": "openAI,agents,assistants,google,anthropic,custom"
                    },
                    "LOGIN_MAX": {
                      "isOptional": false,
                      "description": "Max logins allowed per IP per LOGIN_WINDOW",
                      "defaultValue": "7"
                    },
                    "MONGO_URI": {
                      "isOptional": false,
                      "description": "MongoDB connection string over the Railway private network",
                      "defaultValue": "${{MongoDB.MONGO_PRIVATE_URL}}"
                    },
                    "GOOGLE_KEY": {
                      "isOptional": false,
                      "description": "Google Gemini API key; user_provided lets each user enter their own",
                      "defaultValue": "user_provided"
                    },
                    "JWT_SECRET": {
                      "isOptional": false,
                      "description": "Secret used to sign access tokens; also shared with the RAG API",
                      "defaultValue": "{{JWT_SECRET}}"
                    },
                    "MEILI_HOST": {
                      "description": "Meilisearch URL on the private network",
                      "defaultValue": "http://${{Meilisearch.RAILWAY_PRIVATE_DOMAIN}}:7700"
                    },
                    "CONFIG_PATH": {
                      "isOptional": true,
                      "description": "Pinned librechat.yaml. Uses local file storage and env-based provider keys.",
                      "defaultValue": "https://raw.githubusercontent.com/LibreChat-AI/librechat-config-yaml/c0c64090b6e06bc4c1764e424bdc282de718bdbc/librechat-env-l.yaml"
                    },
                    "RAG_API_URL": {
                      "isOptional": false,
                      "description": "RAG API URL on the private network",
                      "defaultValue": "http://${{\"RAG API\".RAILWAY_PRIVATE_DOMAIN}}:8000"
                    },
                    "TITLE_CONVO": {
                      "isOptional": false,
                      "description": "Auto-generate conversation titles",
                      "defaultValue": "true"
                    },
                    "TRUST_PROXY": {
                      "description": "Trust Railway reverse proxy so client IPs resolve correctly",
                      "defaultValue": "1"
                    },
                    "XAI_API_KEY": {
                      "isOptional": false,
                      "description": "xAI (Grok) API key; user_provided lets each user enter their own in the UI",
                      "defaultValue": "user_provided"
                    },
                    "BAN_DURATION": {
                      "isOptional": false,
                      "description": "Ban duration in milliseconds (default: 2 hours)",
                      "defaultValue": "7200000"
                    },
                    "BAN_INTERVAL": {
                      "isOptional": false,
                      "description": "Ban triggers when violation score reaches this threshold",
                      "defaultValue": "20"
                    },
                    "GITHUB_TOKEN": {
                      "isOptional": false,
                      "description": "GitHub Models token",
                      "defaultValue": "user_provided"
                    },
                    "GROQ_API_KEY": {
                      "isOptional": true,
                      "description": "Groq API key",
                      "defaultValue": "user_provided"
                    },
                    "LOGIN_WINDOW": {
                      "isOptional": false,
                      "description": "Login rate limit window in minutes",
                      "defaultValue": "5"
                    },
                    "REGISTER_MAX": {
                      "isOptional": false,
                      "description": "Max registrations allowed per IP per REGISTER_WINDOW",
                      "defaultValue": "5"
                    },
                    "AI302_API_KEY": {
                      "isOptional": false,
                      "description": "302AI API key",
                      "defaultValue": "user_provided"
                    },
                    "CHECK_BALANCE": {
                      "isOptional": false,
                      "description": "Enable token balance enforcement per user",
                      "defaultValue": "false"
                    },
                    "CUSTOM_FOOTER": {
                      "isOptional": true,
                      "description": "Custom footer text displayed in the UI",
                      "defaultValue": ""
                    },
                    "DEBUG_CONSOLE": {
                      "isOptional": false,
                      "description": "Enable verbose server output in the console (not recommended for production)",
                      "defaultValue": "false"
                    },
                    "DEBUG_LOGGING": {
                      "isOptional": false,
                      "description": "Enable verbose application logs (not recommended for production)",
                      "defaultValue": "false"
                    },
                    "DOMAIN_CLIENT": {
                      "description": "Public URL of the frontend",
                      "defaultValue": "https://${{RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "DOMAIN_SERVER": {
                      "description": "Public URL of the backend",
                      "defaultValue": "https://${{RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "UNIFY_API_KEY": {
                      "isOptional": false,
                      "description": "Unify API key",
                      "defaultValue": "user_provided"
                    },
                    "APIPIE_API_KEY": {
                      "isOptional": false,
                      "description": "APIpie API key",
                      "defaultValue": "user_provided"
                    },
                    "BAN_VIOLATIONS": {
                      "isOptional": false,
                      "description": "Enable banning users for violations",
                      "defaultValue": "true"
                    },
                    "COHERE_API_KEY": {
                      "isOptional": false,
                      "description": "Cohere API key",
                      "defaultValue": "user_provided"
                    },
                    "MESSAGE_IP_MAX": {
                      "isOptional": false,
                      "description": "Max messages per IP per MESSAGE_IP_WINDOW",
                      "defaultValue": "40"
                    },
                    "NVIDIA_API_KEY": {
                      "isOptional": false,
                      "description": "NVIDIA NIM API key",
                      "defaultValue": "user_provided"
                    },
                    "OPENAI_API_KEY": {
                      "isOptional": false,
                      "description": "OpenAI API key; user_provided lets each user enter their own",
                      "defaultValue": "user_provided"
                    },
                    "OPENROUTER_KEY": {
                      "isOptional": true,
                      "description": "OpenRouter API key",
                      "defaultValue": "user_provided"
                    },
                    "SESSION_EXPIRY": {
                      "isOptional": false,
                      "description": "Access token lifetime in milliseconds",
                      "defaultValue": "900000"
                    },
                    "KLUSTER_API_KEY": {
                      "isOptional": false,
                      "description": "Kluster.ai API key",
                      "defaultValue": "user_provided"
                    },
                    "MISTRAL_API_KEY": {
                      "isOptional": true,
                      "description": "Mistral API key",
                      "defaultValue": "user_provided"
                    },
                    "NANOGPT_API_KEY": {
                      "isOptional": false,
                      "description": "NanoGPT API key",
                      "defaultValue": "user_provided"
                    },
                    "REGISTER_WINDOW": {
                      "isOptional": false,
                      "description": "Registration rate limit window in minutes",
                      "defaultValue": "60"
                    },
                    "DEEPSEEK_API_KEY": {
                      "description": "API key for DeepSeek",
                      "defaultValue": "user_provided"
                    },
                    "GITHUB_CLIENT_ID": {
                      "isOptional": true,
                      "description": "GitHub OAuth client ID (only needed if social login is enabled)",
                      "defaultValue": ""
                    },
                    "GOOGLE_CLIENT_ID": {
                      "isOptional": true,
                      "description": "Google OAuth client ID (only needed if social login is enabled)",
                      "defaultValue": ""
                    },
                    "LIMIT_MESSAGE_IP": {
                      "isOptional": false,
                      "description": "Enable IP-based message rate limiting",
                      "defaultValue": "true"
                    },
                    "MEILI_MASTER_KEY": {
                      "isOptional": false,
                      "description": "Meilisearch master key; mirrored into the Meilisearch service",
                      "defaultValue": "{{MEILI_MASTER_KEY}}"
                    },
                    "MESSAGE_USER_MAX": {
                      "isOptional": false,
                      "description": "Max messages per user per MESSAGE_USER_WINDOW",
                      "defaultValue": "40"
                    },
                    "ALLOW_EMAIL_LOGIN": {
                      "isOptional": false,
                      "description": "Enable or disable email/password login",
                      "defaultValue": "true"
                    },
                    "ANTHROPIC_API_KEY": {
                      "isOptional": false,
                      "description": "Anthropic API key; user_provided lets each user enter their own",
                      "defaultValue": "user_provided"
                    },
                    "DISCORD_CLIENT_ID": {
                      "isOptional": true,
                      "description": "Discord OAuth client ID (only needed if social login is enabled)",
                      "defaultValue": ""
                    },
                    "FIREWORKS_API_KEY": {
                      "isOptional": true,
                      "description": "Fireworks AI API key",
                      "defaultValue": "user_provided"
                    },
                    "HUGGINGFACE_TOKEN": {
                      "isOptional": false,
                      "description": "HuggingFace access token",
                      "defaultValue": "user_provided"
                    },
                    "MESSAGE_IP_WINDOW": {
                      "isOptional": false,
                      "description": "IP message rate limit window in minutes",
                      "defaultValue": "1"
                    },
                    "SAMBANOVA_API_KEY": {
                      "isOptional": false,
                      "description": "SambaNova API key",
                      "defaultValue": "user_provided"
                    },
                    "ALLOW_REGISTRATION": {
                      "isOptional": false,
                      "description": "Enable or disable email registration of new users",
                      "defaultValue": "true"
                    },
                    "ALLOW_SOCIAL_LOGIN": {
                      "isOptional": false,
                      "description": "Enable social login (configure provider client IDs/secrets below)",
                      "defaultValue": "false"
                    },
                    "ASSISTANTS_API_KEY": {
                      "isOptional": false,
                      "description": "OpenAI Assistants API key",
                      "defaultValue": "user_provided"
                    },
                    "HYPERBOLIC_API_KEY": {
                      "isOptional": false,
                      "description": "Hyperbolic API key",
                      "defaultValue": "user_provided"
                    },
                    "JWT_REFRESH_SECRET": {
                      "isOptional": false,
                      "description": "Secret used to sign refresh tokens",
                      "defaultValue": "{{JWT_REFRESH_SECRET}}"
                    },
                    "LIMIT_MESSAGE_USER": {
                      "isOptional": false,
                      "description": "Enable user-based message rate limiting",
                      "defaultValue": "false"
                    },
                    "MEILI_NO_ANALYTICS": {
                      "isOptional": false,
                      "description": "Disable anonymized telemetry analytics for Meilisearch",
                      "defaultValue": "true"
                    },
                    "PERPLEXITY_API_KEY": {
                      "isOptional": true,
                      "description": "Perplexity API key",
                      "defaultValue": "user_provided"
                    },
                    "TOGETHERAI_API_KEY": {
                      "isOptional": true,
                      "description": "Together AI API key",
                      "defaultValue": "user_provided"
                    },
                    "GITHUB_CALLBACK_URL": {
                      "isOptional": true,
                      "description": "GitHub OAuth callback path",
                      "defaultValue": "/oauth/github/callback"
                    },
                    "GOOGLE_CALLBACK_URL": {
                      "isOptional": true,
                      "description": "Google OAuth callback path",
                      "defaultValue": "/oauth/google/callback"
                    },
                    "MESSAGE_USER_WINDOW": {
                      "isOptional": false,
                      "description": "User message rate limit window in minutes",
                      "defaultValue": "1"
                    },
                    "DISCORD_CALLBACK_URL": {
                      "isOptional": true,
                      "description": "Discord OAuth callback path",
                      "defaultValue": "/oauth/discord/callback"
                    },
                    "GITHUB_CLIENT_SECRET": {
                      "isOptional": true,
                      "description": "GitHub OAuth client secret",
                      "defaultValue": ""
                    },
                    "GOOGLE_CLIENT_SECRET": {
                      "isOptional": true,
                      "description": "Google OAuth client secret",
                      "defaultValue": ""
                    },
                    "REFRESH_TOKEN_EXPIRY": {
                      "isOptional": false,
                      "description": "Refresh token lifetime in milliseconds",
                      "defaultValue": "604800000"
                    },
                    "DISCORD_CLIENT_SECRET": {
                      "isOptional": true,
                      "description": "Discord OAuth client secret",
                      "defaultValue": ""
                    },
                    "LOGIN_VIOLATION_SCORE": {
                      "isOptional": false,
                      "description": "Score added to the ban counter for a failed login",
                      "defaultValue": "1"
                    },
                    "CONCURRENT_MESSAGE_MAX": {
                      "isOptional": false,
                      "description": "Max concurrent messages per user",
                      "defaultValue": "2"
                    },
                    "MESSAGE_VIOLATION_SCORE": {
                      "isOptional": false,
                      "description": "Score added to the ban counter when a message limit is exceeded",
                      "defaultValue": "1"
                    },
                    "ALLOW_SOCIAL_REGISTRATION": {
                      "isOptional": false,
                      "description": "Allow new users to register via social login",
                      "defaultValue": "false"
                    },
                    "LIMIT_CONCURRENT_MESSAGES": {
                      "isOptional": false,
                      "description": "Limit concurrent messages per user",
                      "defaultValue": "true"
                    },
                    "CONCURRENT_VIOLATION_SCORE": {
                      "isOptional": false,
                      "description": "Score added to the ban counter for exceeding concurrent messages",
                      "defaultValue": "1"
                    },
                    "NON_BROWSER_VIOLATION_SCORE": {
                      "isOptional": false,
                      "description": "Score added to the ban counter for non-browser requests",
                      "defaultValue": "20"
                    },
                    "REGISTRATION_VIOLATION_SCORE": {
                      "isOptional": false,
                      "description": "Score added to the ban counter for registration abuse",
                      "defaultValue": "1"
                    }
                  },
                  "networking": {
                    "tcpProxies": {},
                    "serviceDomains": {
                      "<hasDomain>": {}
                    }
                  },
                  "volumeMounts": {}
                },
                "aed0f74b-ea38-45cf-a9b6-b6660df625d8": {
                  "icon": "https://raw.githubusercontent.com/meilisearch/meilisearch/refs/heads/main/assets/logo.svg",
                  "name": "Meilisearch",
                  "build": {},
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": null
                  },
                  "source": {
                    "image": "getmeili/meilisearch:v1.11.3"
                  },
                  "variables": {
                    "MEILI_ENV": {
                      "isOptional": false,
                      "description": "Meilisearch environment; production disables the bundled web UI",
                      "defaultValue": "production"
                    },
                    "MEILI_DB_PATH": {
                      "isOptional": false,
                      "description": "Meilisearch index directory inside the mounted volume",
                      "defaultValue": "/meili_data/data.ms"
                    },
                    "MEILI_HTTP_ADDR": {
                      "isOptional": false,
                      "description": "Listen address; [::] binds all interfaces for Railway private networking",
                      "defaultValue": "[::]:7700"
                    },
                    "MEILI_MASTER_KEY": {
                      "isOptional": false,
                      "description": "Master key, mirrored from LibreChat so both services agree",
                      "defaultValue": "${{LibreChat.MEILI_MASTER_KEY}}"
                    },
                    "MEILI_NO_ANALYTICS": {
                      "isOptional": false,
                      "description": "Disable anonymized Meilisearch telemetry",
                      "defaultValue": "true"
                    }
                  },
                  "networking": {},
                  "volumeMounts": {
                    "aed0f74b-ea38-45cf-a9b6-b6660df625d8": {
                      "mountPath": "/meili_data"
                    }
                  }
                },
                "ca89bcfa-b863-4fec-8d6f-2fd17d3d2131": {
                  "icon": "https://devicons.railway.app/mongodb",
                  "name": "MongoDB",
                  "build": {},
                  "deploy": {
                    "startCommand": "docker-entrypoint.sh mongod --ipv6 --bind_ip ::,0.0.0.0",
                    "healthcheckPath": null
                  },
                  "source": {
                    "image": "mongo"
                  },
                  "variables": {
                    "MONGOHOST": {
                      "isOptional": false,
                      "description": "Private hostname of this MongoDB service",
                      "defaultValue": "${{RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "MONGOPORT": {
                      "isOptional": false,
                      "description": "MongoDB listening port",
                      "defaultValue": "27017"
                    },
                    "MONGOUSER": {
                      "isOptional": false,
                      "description": "MongoDB root username",
                      "defaultValue": "${{MONGO_INITDB_ROOT_USERNAME}}"
                    },
                    "MONGO_URL": {
                      "isOptional": false,
                      "description": "Public connection string via the Railway TCP proxy",
                      "defaultValue": "mongodb://${{MONGO_INITDB_ROOT_USERNAME}}:${{MONGO_INITDB_ROOT_PASSWORD}}@${{RAILWAY_TCP_PROXY_DOMAIN}}:${{RAILWAY_TCP_PROXY_PORT}}"
                    },
                    "MONGOPASSWORD": {
                      "isOptional": false,
                      "description": "MongoDB root password",
                      "defaultValue": "${{MONGO_INITDB_ROOT_PASSWORD}}"
                    },
                    "MONGO_PRIVATE_URL": {
                      "isOptional": false,
                      "description": "Private-network connection string consumed by LibreChat",
                      "defaultValue": "mongodb://${{MONGO_INITDB_ROOT_USERNAME}}:${{MONGO_INITDB_ROOT_PASSWORD}}@${{RAILWAY_PRIVATE_DOMAIN}}:27017"
                    },
                    "MONGO_INITDB_ROOT_PASSWORD": {
                      "isOptional": false,
                      "description": "Auto-generated root password created on first boot",
                      "defaultValue": "{{MONGO_INITDB_ROOT_PASSWORD}}"
                    },
                    "MONGO_INITDB_ROOT_USERNAME": {
                      "isOptional": false,
                      "description": "Root username created on first boot",
                      "defaultValue": "mongo"
                    }
                  },
                  "networking": {},
                  "volumeMounts": {
                    "ca89bcfa-b863-4fec-8d6f-2fd17d3d2131": {
                      "mountPath": "/data/db"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "post_deploy": {
    "healthcheck": {
      "service": "LibreChat",
      "method": "GET",
      "path": "/health",
      "expect_status": 200
    }
  },
  "resources": {
    "expected_services": 5,
    "needs_volume": true
  },
  "generated_at": "2026-09-07T23:54:17.958Z",
  "generator_version": "0.1.0"
}
