{
  "manifest_version": "1.0.0",
  "template": {
    "id": "bce16e9f-0944-4eb2-98a1-631b9021d9c9",
    "slug": "automem-ai-memory-service",
    "name": "AutoMem - AI Memory Service",
    "description": "Graph-vector memory service for AI assistants: https://automem.ai/",
    "url": "https://railway.com/deploy/automem-ai-memory-service",
    "upstream": {
      "image": "ghcr.io/verygoodplugins/mcp-automem:stable"
    }
  },
  "services": [
    {
      "name": "mcp-automem",
      "source": {
        "image": "ghcr.io/verygoodplugins/mcp-automem:stable"
      },
      "needs_volume": false,
      "http": true
    },
    {
      "name": "qdrant",
      "source": {
        "image": "qdrant/qdrant"
      },
      "needs_volume": true,
      "volume_mount_path": "/qdrant/storage",
      "http": false
    },
    {
      "name": "automem",
      "source": {
        "image": "ghcr.io/verygoodplugins/automem:stable"
      },
      "needs_volume": false,
      "http": true
    },
    {
      "name": "falkordb",
      "source": {
        "image": "falkordb/falkordb:latest"
      },
      "needs_volume": true,
      "volume_mount_path": "/var/lib/falkordb/data",
      "http": true
    }
  ],
  "required_inputs": [
    {
      "key": "PORT",
      "service": "mcp-automem",
      "description": "MCP bridge port.",
      "secret": false,
      "strategy": "default",
      "default": "8080"
    },
    {
      "key": "AUTOMEM_API_URL",
      "service": "mcp-automem",
      "description": "Internal URL for the AutoMem API service.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "AUTOMEM_API_TOKEN",
      "service": "mcp-automem",
      "description": "Reuse the main API token from memory-service.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "HEALTH_TIMEOUT_MS",
      "service": "mcp-automem",
      "description": "Timeout for health probes against the AutoMem API.",
      "secret": false,
      "strategy": "default",
      "default": "5000"
    },
    {
      "key": "UPSTREAM_TIMEOUT_MS",
      "service": "mcp-automem",
      "description": "Timeout for upstream AutoMem API calls.",
      "secret": false,
      "strategy": "default",
      "default": "15000"
    },
    {
      "key": "UPSTREAM_MAX_RETRIES",
      "service": "mcp-automem",
      "description": "Retry count for transient upstream failures.",
      "secret": false,
      "strategy": "default",
      "default": "5"
    },
    {
      "key": "HEALTH_PROBE_INTERVAL_MS",
      "service": "mcp-automem",
      "description": "Background health probe interval in milliseconds.",
      "secret": false,
      "strategy": "default",
      "default": "30000"
    },
    {
      "key": "PORT",
      "service": "qdrant",
      "description": "Qdrant HTTP API port.",
      "secret": false,
      "strategy": "default",
      "default": "6333"
    },
    {
      "key": "QDRANT__SERVICE__HOST",
      "service": "qdrant",
      "description": "Required on Railway. Enables dual-stack IPv6/IPv4 binding for internal networking.",
      "secret": false,
      "strategy": "default",
      "default": "::"
    },
    {
      "key": "PORT",
      "service": "automem",
      "description": "API port. Required so internal services like mcp-automem can connect reliably.",
      "secret": false,
      "strategy": "default",
      "default": "8001"
    },
    {
      "key": "QDRANT_HOST",
      "service": "automem",
      "description": "Internal hostname for the in-project Qdrant service.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "QDRANT_PORT",
      "service": "automem",
      "description": "Qdrant port for internal networking.",
      "secret": false,
      "strategy": "default",
      "default": "6333"
    },
    {
      "key": "VECTOR_SIZE",
      "service": "automem",
      "description": "Default embedding dimension. Matches voyage-4 and the current recommended default.",
      "secret": false,
      "strategy": "default",
      "default": "1024"
    },
    {
      "key": "VOYAGE_MODEL",
      "service": "automem",
      "description": "Voyage embedding model. voyage-4 with VECTOR_SIZE=1024 is the current recommended default.",
      "secret": false,
      "strategy": "default",
      "default": "voyage-4"
    },
    {
      "key": "FALKORDB_HOST",
      "service": "automem",
      "description": "Internal hostname for the FalkorDB service.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FALKORDB_PORT",
      "service": "automem",
      "description": "FalkorDB port.",
      "secret": false,
      "strategy": "default",
      "default": "6379"
    },
    {
      "key": "FALKORDB_GRAPH",
      "service": "automem",
      "description": "Graph name used for memory storage.",
      "secret": false,
      "strategy": "default",
      "default": "memories"
    },
    {
      "key": "ADMIN_API_TOKEN",
      "service": "automem",
      "description": "Admin token for /enrichment and /admin endpoints.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "EMBEDDING_MODEL",
      "service": "automem",
      "description": "OpenAI embedding model used when OpenAI is selected. Use text-embedding-3-small for 1536d.",
      "secret": false,
      "strategy": "default",
      "default": "text-embedding-3-small"
    },
    {
      "key": "AUTOMEM_API_TOKEN",
      "service": "automem",
      "description": "API token for memory operations. Use in MCP clients and direct API calls.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "FALKORDB_PASSWORD",
      "service": "automem",
      "description": "Password pulled from the FalkorDB service.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "QDRANT_COLLECTION",
      "service": "automem",
      "description": "Qdrant collection name for embeddings.",
      "secret": false,
      "strategy": "default",
      "default": "memories"
    },
    {
      "key": "EMBEDDING_PROVIDER",
      "service": "automem",
      "description": "Default provider strategy. Prefers Voyage if VOYAGE_API_KEY is set, then OpenAI, then local fallbacks.",
      "secret": false,
      "strategy": "default",
      "default": "auto"
    },
    {
      "key": "ENABLE_GRAPH_VIEWER",
      "service": "automem",
      "description": "Keep /viewer compatibility routes enabled on the API.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "CLASSIFICATION_MODEL",
      "service": "automem",
      "description": "Default classification model for memory typing. Cheap and aligned with current code defaults.",
      "secret": false,
      "strategy": "default",
      "default": "gpt-5.4-mini"
    },
    {
      "key": "VECTOR_SIZE_AUTODETECT",
      "service": "automem",
      "description": "Safely adopt an existing Qdrant collection dimension instead of failing on mismatch.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "PORT",
      "service": "falkordb",
      "description": "Service port exposed by Railway for FalkorDB.",
      "secret": false,
      "strategy": "default",
      "default": "6379"
    },
    {
      "key": "REDIS_ARGS",
      "service": "falkordb",
      "description": "Persistence settings: snapshot + append-only log.",
      "secret": false,
      "strategy": "default",
      "default": "--save 60 1 --appendonly yes --appendfsync everysec"
    },
    {
      "key": "FALKOR_PORT",
      "service": "falkordb",
      "description": "FalkorDB Redis protocol port.",
      "secret": false,
      "strategy": "default",
      "default": "6379"
    },
    {
      "key": "FALKOR_PASSWORD",
      "service": "falkordb",
      "description": "Auto-generated password for FalkorDB access.",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "FALKOR_USERNAME",
      "service": "falkordb",
      "description": "Default FalkorDB username.",
      "secret": false,
      "strategy": "default",
      "default": "default"
    }
  ],
  "deploy": {
    "mcp": {
      "server": "railway",
      "tool": "deploy_template",
      "args": {
        "template_code": "automem-ai-memory-service"
      }
    },
    "cli": "railway deploy --template automem-ai-memory-service",
    "api": {
      "method": "POST",
      "path": "/graphql/v2",
      "body": {
        "query": "mutation templateDeploy($input: TemplateDeployV2Input!) { templateDeployV2(input: $input) { projectId workflowId } }",
        "variables": {
          "input": {
            "templateId": "bce16e9f-0944-4eb2-98a1-631b9021d9c9",
            "serializedConfig": {
              "services": {
                "4f847376-1a10-41b8-9906-19eb77fe2558": {
                  "icon": "https://automem.ai/favicon.svg",
                  "name": "mcp-automem",
                  "deploy": {
                    "healthcheckPath": "/health"
                  },
                  "source": {
                    "image": "ghcr.io/verygoodplugins/mcp-automem:stable",
                    "autoUpdates": {
                      "type": "patch",
                      "schedule": [
                        {
                          "day": 0,
                          "endHour": 6,
                          "startHour": 2
                        },
                        {
                          "day": 1,
                          "endHour": 6,
                          "startHour": 2
                        },
                        {
                          "day": 2,
                          "endHour": 6,
                          "startHour": 2
                        },
                        {
                          "day": 3,
                          "endHour": 6,
                          "startHour": 2
                        },
                        {
                          "day": 4,
                          "endHour": 6,
                          "startHour": 2
                        },
                        {
                          "day": 5,
                          "endHour": 6,
                          "startHour": 2
                        },
                        {
                          "day": 6,
                          "endHour": 6,
                          "startHour": 2
                        }
                      ]
                    }
                  },
                  "variables": {
                    "PORT": {
                      "description": "MCP bridge port.",
                      "defaultValue": "8080"
                    },
                    "AUTOMEM_API_URL": {
                      "description": "Internal URL for the AutoMem API service.",
                      "defaultValue": "http://${{ automem.RAILWAY_PRIVATE_DOMAIN }}:8001"
                    },
                    "AUTOMEM_API_TOKEN": {
                      "description": "Reuse the main API token from memory-service.",
                      "defaultValue": "${{ automem.AUTOMEM_API_TOKEN }}"
                    },
                    "HEALTH_TIMEOUT_MS": {
                      "description": "Timeout for health probes against the AutoMem API.",
                      "defaultValue": "5000"
                    },
                    "UPSTREAM_TIMEOUT_MS": {
                      "description": "Timeout for upstream AutoMem API calls.",
                      "defaultValue": "15000"
                    },
                    "UPSTREAM_MAX_RETRIES": {
                      "description": "Retry count for transient upstream failures.",
                      "defaultValue": "5"
                    },
                    "HEALTH_PROBE_INTERVAL_MS": {
                      "description": "Background health probe interval in milliseconds.",
                      "defaultValue": "30000"
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>:8080": {
                        "port": 8080
                      }
                    }
                  }
                },
                "659561dd-2d79-496c-af71-336e1e7ffe3e": {
                  "icon": "https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/user_files/Vec9NwWHVhPfcIA13JVAB9rhAgwzvzit_157f6775a84e1fae8b4c803a487bdbcfc529c18533a28f5cb894faf6560b0576.png",
                  "name": "qdrant",
                  "source": {
                    "image": "qdrant/qdrant"
                  },
                  "variables": {
                    "PORT": {
                      "description": "Qdrant HTTP API port.",
                      "defaultValue": "6333"
                    },
                    "QDRANT__SERVICE__HOST": {
                      "description": "Required on Railway. Enables dual-stack IPv6/IPv4 binding for internal networking.",
                      "defaultValue": "::"
                    }
                  },
                  "volumeMounts": {
                    "659561dd-2d79-496c-af71-336e1e7ffe3e": {
                      "mountPath": "/qdrant/storage",
                      "backupSchedules": [
                        "DAILY"
                      ]
                    }
                  }
                },
                "a5f3f8b6-0262-4813-a6ae-ca26ad0f569f": {
                  "icon": "https://automem.ai/favicon.svg",
                  "name": "automem",
                  "deploy": {
                    "healthcheckPath": "/health"
                  },
                  "source": {
                    "image": "ghcr.io/verygoodplugins/automem:stable",
                    "autoUpdates": {
                      "type": "patch",
                      "schedule": [
                        {
                          "day": 0,
                          "endHour": 6,
                          "startHour": 2
                        },
                        {
                          "day": 1,
                          "endHour": 6,
                          "startHour": 2
                        },
                        {
                          "day": 2,
                          "endHour": 6,
                          "startHour": 2
                        },
                        {
                          "day": 3,
                          "endHour": 6,
                          "startHour": 2
                        },
                        {
                          "day": 4,
                          "endHour": 6,
                          "startHour": 2
                        },
                        {
                          "day": 5,
                          "endHour": 6,
                          "startHour": 2
                        },
                        {
                          "day": 6,
                          "endHour": 6,
                          "startHour": 2
                        }
                      ]
                    }
                  },
                  "variables": {
                    "PORT": {
                      "description": "API port. Required so internal services like mcp-automem can connect reliably.",
                      "defaultValue": "8001"
                    },
                    "QDRANT_URL": {
                      "isOptional": true,
                      "description": "Optional override for Qdrant Cloud. Leave blank to use the in-project qdrant service instead.",
                      "defaultValue": ""
                    },
                    "QDRANT_HOST": {
                      "description": "Internal hostname for the in-project Qdrant service.",
                      "defaultValue": "${{ qdrant.RAILWAY_PRIVATE_DOMAIN }}"
                    },
                    "QDRANT_PORT": {
                      "description": "Qdrant port for internal networking.",
                      "defaultValue": "6333"
                    },
                    "VECTOR_SIZE": {
                      "description": "Default embedding dimension. Matches voyage-4 and the current recommended default.",
                      "defaultValue": "1024"
                    },
                    "VOYAGE_MODEL": {
                      "isOptional": true,
                      "description": "Voyage embedding model. voyage-4 with VECTOR_SIZE=1024 is the current recommended default.",
                      "defaultValue": "voyage-4"
                    },
                    "FALKORDB_HOST": {
                      "description": "Internal hostname for the FalkorDB service.",
                      "defaultValue": "${{ falkordb.RAILWAY_PRIVATE_DOMAIN }}"
                    },
                    "FALKORDB_PORT": {
                      "description": "FalkorDB port.",
                      "defaultValue": "6379"
                    },
                    "FALKORDB_GRAPH": {
                      "description": "Graph name used for memory storage.",
                      "defaultValue": "memories"
                    },
                    "OPENAI_API_KEY": {
                      "isOptional": true,
                      "description": "Optional OpenAI key for embeddings and classification. Required unless you use Voyage or another provider.",
                      "defaultValue": ""
                    },
                    "QDRANT_API_KEY": {
                      "isOptional": true,
                      "description": "Optional Qdrant API key. Only needed for Qdrant Cloud or protected external Qdrant.",
                      "defaultValue": ""
                    },
                    "VOYAGE_API_KEY": {
                      "isOptional": true,
                      "description": "Optional Voyage API key. If set, EMBEDDING_PROVIDER=auto will prefer Voyage.",
                      "defaultValue": ""
                    },
                    "ADMIN_API_TOKEN": {
                      "description": "Admin token for /enrichment and /admin endpoints.",
                      "defaultValue": "{{ADMIN_API_TOKEN}}"
                    },
                    "EMBEDDING_MODEL": {
                      "isOptional": true,
                      "description": "OpenAI embedding model used when OpenAI is selected. Use text-embedding-3-small for 1536d.",
                      "defaultValue": "text-embedding-3-small"
                    },
                    "OPENAI_BASE_URL": {
                      "isOptional": true,
                      "description": "Optional custom OpenAI-compatible endpoint (OpenRouter, LiteLLM, vLLM, Azure, etc.).",
                      "defaultValue": ""
                    },
                    "GRAPH_VIEWER_URL": {
                      "isOptional": true,
                      "description": "Optional standalone graph-viewer URL. Leave blank unless you deploy the public viewer service (https://github.com/verygoodplugins/automem-graph-viewer).",
                      "defaultValue": ""
                    },
                    "AUTOMEM_API_TOKEN": {
                      "description": "API token for memory operations. Use in MCP clients and direct API calls.",
                      "defaultValue": "{{AUTOMEM_API_TOKEN}}"
                    },
                    "FALKORDB_PASSWORD": {
                      "description": "Password pulled from the FalkorDB service.",
                      "defaultValue": "${{ falkordb.FALKOR_PASSWORD }}"
                    },
                    "QDRANT_COLLECTION": {
                      "description": "Qdrant collection name for embeddings.",
                      "defaultValue": "memories"
                    },
                    "EMBEDDING_PROVIDER": {
                      "description": "Default provider strategy. Prefers Voyage if VOYAGE_API_KEY is set, then OpenAI, then local fallbacks.",
                      "defaultValue": "auto"
                    },
                    "ENABLE_GRAPH_VIEWER": {
                      "isOptional": true,
                      "description": "Keep /viewer compatibility routes enabled on the API.",
                      "defaultValue": "true"
                    },
                    "CLASSIFICATION_MODEL": {
                      "isOptional": true,
                      "description": "Default classification model for memory typing. Cheap and aligned with current code defaults.",
                      "defaultValue": "gpt-5.4-mini"
                    },
                    "VECTOR_SIZE_AUTODETECT": {
                      "description": "Safely adopt an existing Qdrant collection dimension instead of failing on mismatch.",
                      "defaultValue": "true"
                    },
                    "VIEWER_ALLOWED_ORIGINS": {
                      "isOptional": true,
                      "description": "Optional comma-separated CORS allowlist for the standalone graph-viewer.",
                      "defaultValue": ""
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>:8001": {
                        "port": 8001
                      }
                    }
                  }
                },
                "b0e29c45-bd5e-4830-9bbb-cc934841f6de": {
                  "icon": "https://files.isdev.co/api/public/dl/_8kKqA9Z/RailwayIcons/FalkorDB.png",
                  "name": "falkordb",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": ""
                  },
                  "source": {
                    "image": "falkordb/falkordb:latest"
                  },
                  "variables": {
                    "PORT": {
                      "description": "Service port exposed by Railway for FalkorDB.",
                      "defaultValue": "6379"
                    },
                    "REDIS_ARGS": {
                      "isOptional": false,
                      "description": "Persistence settings: snapshot + append-only log.",
                      "defaultValue": "--save 60 1 --appendonly yes --appendfsync everysec"
                    },
                    "FALKOR_PORT": {
                      "isOptional": false,
                      "description": "FalkorDB Redis protocol port.",
                      "defaultValue": "6379"
                    },
                    "FALKOR_PASSWORD": {
                      "isOptional": false,
                      "description": "Auto-generated password for FalkorDB access.",
                      "defaultValue": "{{FALKOR_PASSWORD}}"
                    },
                    "FALKOR_USERNAME": {
                      "description": "Default FalkorDB username.",
                      "defaultValue": "default"
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>": {}
                    }
                  },
                  "volumeMounts": {
                    "b0e29c45-bd5e-4830-9bbb-cc934841f6de": {
                      "mountPath": "/var/lib/falkordb/data",
                      "backupSchedules": [
                        "DAILY"
                      ]
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "post_deploy": {
    "healthcheck": {
      "service": "mcp-automem",
      "method": "GET",
      "path": "/health",
      "expect_status": 200
    }
  },
  "resources": {
    "expected_services": 4,
    "needs_volume": true
  },
  "generated_at": "2026-09-11T22:14:37.124Z",
  "generator_version": "0.1.0",
  "status": "validated",
  "validated_at": "2026-09-12T01:02:29.032Z",
  "success_rate_30d": 1,
  "validation": {
    "last_run_id": "run_48e2b5a938414596a201",
    "checks": [
      {
        "name": "workflow_completed",
        "passed": true
      },
      {
        "name": "all_services_deployed",
        "passed": true
      },
      {
        "name": "healthcheck",
        "passed": true
      },
      {
        "name": "stays_up",
        "passed": true
      }
    ],
    "typical_ready_seconds": 127,
    "typical_build_seconds": 0,
    "typical_start_seconds": 10,
    "slowest_service": "mcp-automem"
  }
}
