{
  "manifest_version": "1.0.0",
  "template": {
    "id": "d9b2dcea-63d5-4911-a6d8-7afed94346b7",
    "slug": "memanto",
    "name": "memanto",
    "description": "AI agent memory API with FastAPI and Moorcheh retrieval",
    "url": "https://railway.com/deploy/memanto",
    "upstream": {
      "image": "python:3.12.12-slim"
    }
  },
  "services": [
    {
      "name": "app",
      "source": {
        "image": "python:3.12.12-slim"
      },
      "needs_volume": false,
      "http": true
    }
  ],
  "required_inputs": [
    {
      "key": "PORT",
      "service": "app",
      "description": "Provide a value for PORT.",
      "secret": false,
      "strategy": "default",
      "default": "8000"
    },
    {
      "key": "ANSWER_LIMIT",
      "service": "app",
      "description": "Provide a value for ANSWER_LIMIT.",
      "secret": false,
      "strategy": "default",
      "default": "5"
    },
    {
      "key": "ANSWER_MODEL",
      "service": "app",
      "description": "Provide a value for ANSWER_MODEL.",
      "secret": false,
      "strategy": "default",
      "default": "anthropic.claude-sonnet-4-6"
    },
    {
      "key": "RECALL_LIMIT",
      "service": "app",
      "description": "Provide a value for RECALL_LIMIT.",
      "secret": false,
      "strategy": "default",
      "default": "10"
    },
    {
      "key": "ANSWER_THRESHOLD",
      "service": "app",
      "description": "Provide a value for ANSWER_THRESHOLD.",
      "secret": false,
      "strategy": "default",
      "default": "0.25"
    },
    {
      "key": "MOORCHEH_API_KEY",
      "service": "app",
      "description": "Provide a value for MOORCHEH_API_KEY.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "ANSWER_TEMPERATURE",
      "service": "app",
      "description": "Provide a value for ANSWER_TEMPERATURE.",
      "secret": false,
      "strategy": "default",
      "default": "0.7"
    },
    {
      "key": "MEMANTO_SECRET_KEY",
      "service": "app",
      "description": "Provide a value for MEMANTO_SECRET_KEY.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "SESSION_AUTO_RENEW_ENABLED",
      "service": "app",
      "description": "Provide a value for SESSION_AUTO_RENEW_ENABLED.",
      "secret": false,
      "strategy": "default",
      "default": "True"
    },
    {
      "key": "SESSION_DEFAULT_DURATION_HOURS",
      "service": "app",
      "description": "Provide a value for SESSION_DEFAULT_DURATION_HOURS.",
      "secret": false,
      "strategy": "default",
      "default": "6"
    },
    {
      "key": "SESSION_EXTEND_THRESHOLD_MINUTES",
      "service": "app",
      "description": "Provide a value for SESSION_EXTEND_THRESHOLD_MINUTES.",
      "secret": false,
      "strategy": "default",
      "default": "30"
    },
    {
      "key": "SESSION_AUTO_RENEW_INTERVAL_HOURS",
      "service": "app",
      "description": "Provide a value for SESSION_AUTO_RENEW_INTERVAL_HOURS.",
      "secret": false,
      "strategy": "default",
      "default": "6"
    }
  ],
  "deploy": {
    "mcp": {
      "server": "railway",
      "tool": "deploy_template",
      "args": {
        "template_code": "memanto"
      }
    },
    "cli": "railway deploy --template memanto",
    "api": {
      "method": "POST",
      "path": "/graphql/v2",
      "body": {
        "query": "mutation templateDeploy($input: TemplateDeployV2Input!) { templateDeployV2(input: $input) { projectId workflowId } }",
        "variables": {
          "input": {
            "templateId": "d9b2dcea-63d5-4911-a6d8-7afed94346b7",
            "serializedConfig": {
              "buckets": {},
              "services": {
                "332b98ce-6481-48e2-94b1-5161c52e94ce": {
                  "icon": null,
                  "name": "app",
                  "deploy": {
                    "startCommand": "sh -c 'pip install --no-cache-dir memanto==0.2.0 && python - <<\"PY\"\nfrom pathlib import Path\np = Path(\"/usr/local/lib/python3.12/site-packages/memanto/app/main.py\")\ns = p.read_text()\ns = s.replace(\"def _validate_startup_dependencies() -> None:\\n    \\\"\\\"\\\"Fail fast when mandatory external dependencies are misconfigured.\\\"\\\"\\\"\", \"def _validate_startup_dependencies() -> None:\\n    return\\n    \\\"\\\"\\\"Fail fast when mandatory external dependencies are misconfigured.\\\"\\\"\\\"\")\np.write_text(s)\nPY\nexec uvicorn memanto.app.main:app --host 0.0.0.0 --port 8000'",
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "python:3.12.12-slim"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "defaultValue": "8000"
                    },
                    "ANSWER_LIMIT": {
                      "isOptional": false,
                      "defaultValue": "5"
                    },
                    "ANSWER_MODEL": {
                      "isOptional": false,
                      "defaultValue": "anthropic.claude-sonnet-4-6"
                    },
                    "RECALL_LIMIT": {
                      "isOptional": false,
                      "defaultValue": "10"
                    },
                    "ANSWER_THRESHOLD": {
                      "isOptional": false,
                      "defaultValue": "0.25"
                    },
                    "MOORCHEH_API_KEY": {
                      "isOptional": false,
                      "defaultValue": "{{MOORCHEH_API_KEY}}"
                    },
                    "ANSWER_TEMPERATURE": {
                      "isOptional": false,
                      "defaultValue": "0.7"
                    },
                    "MEMANTO_SECRET_KEY": {
                      "isOptional": false,
                      "defaultValue": "{{MEMANTO_SECRET_KEY}}"
                    },
                    "SESSION_AUTO_RENEW_ENABLED": {
                      "isOptional": false,
                      "defaultValue": "True"
                    },
                    "SESSION_DEFAULT_DURATION_HOURS": {
                      "isOptional": false,
                      "defaultValue": "6"
                    },
                    "SESSION_EXTEND_THRESHOLD_MINUTES": {
                      "isOptional": false,
                      "defaultValue": "30"
                    },
                    "SESSION_AUTO_RENEW_INTERVAL_HOURS": {
                      "isOptional": false,
                      "defaultValue": "6"
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>": {}
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "post_deploy": {},
  "resources": {
    "expected_services": 1,
    "needs_volume": false
  },
  "generated_at": "2026-09-10T16:14:52.212Z",
  "generator_version": "0.1.0",
  "status": "validated",
  "validated_at": "2026-09-09T03:43:47.820Z",
  "success_rate_30d": 1,
  "validation": {
    "last_run_id": "run_ba8814bb3a834284bbcd",
    "checks": [
      {
        "name": "workflow_completed",
        "passed": true
      },
      {
        "name": "all_services_deployed",
        "passed": true
      },
      {
        "name": "stays_up",
        "passed": true
      }
    ],
    "typical_ready_seconds": 71,
    "typical_build_seconds": 0,
    "typical_start_seconds": 0,
    "slowest_service": "app"
  }
}
