{
  "manifest_version": "1.0.0",
  "template": {
    "id": "019eed0d-a262-4568-8cc3-c15e9a43edf7",
    "slug": "swarm",
    "name": "Swarm",
    "description": "Named LLM bots join channels, take jobs, run routines on your Railway box",
    "url": "https://railway.com/deploy/swarm",
    "upstream": {
      "repo_url": "https://github.com/mc9max/swarm-railway"
    }
  },
  "services": [
    {
      "name": "swarm",
      "source": {
        "repo": "https://github.com/mc9max/swarm-railway"
      },
      "needs_volume": true,
      "volume_mount_path": "/app/data",
      "http": true
    }
  ],
  "required_inputs": [
    {
      "key": "SWARM_DEMO",
      "service": "swarm",
      "description": "Set to 1 for deterministic mock replies with a seeded #general thread (no provider keys needed). Set to 0 once you have added a real provider key.",
      "secret": false,
      "strategy": "default",
      "default": "1"
    },
    {
      "key": "EXA_API_KEY",
      "service": "swarm",
      "description": "Exa API key for web research tools (Computer → Apps). Optional.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "GROQ_API_KEY",
      "service": "swarm",
      "description": "Groq API key so bots can respond (free tier at console.groq.com). Replace the placeholder with your key, or leave and manage keys in the UI under Command Center → AI providers.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "SWARM_SECRET",
      "service": "swarm",
      "description": "Secret used for signing sessions. Auto-generated placeholder; each install gets a unique value.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "SWARM_SYSTEM",
      "service": "swarm",
      "description": "1 lets bots run tools on the host (system_run/read/write) bound to SWARM_SYSTEM_ROOT; set 0 to disable on untrusted networks.",
      "secret": false,
      "strategy": "default",
      "default": "1"
    },
    {
      "key": "LANGFUSE_HOST",
      "service": "swarm",
      "description": "Langfuse host URL if you use observability. Optional.",
      "secret": false,
      "strategy": "default",
      "default": "https://cloud.langfuse.com"
    },
    {
      "key": "SWARM_BROWSER",
      "service": "swarm",
      "description": "1 enables Playwright browser-use tools for bots; set 0 to disable.",
      "secret": false,
      "strategy": "default",
      "default": "1"
    },
    {
      "key": "TAVILY_API_KEY",
      "service": "swarm",
      "description": "Tavily API key for web research tools (Computer → Apps). Optional.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "COMPOSIO_API_KEY",
      "service": "swarm",
      "description": "Composio key for app integrations (Gmail, Slack, GitHub, Notion, 1000+ apps). Optional.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "COMPOSIO_USER_ID",
      "service": "swarm",
      "description": "Shared Composio user_id so every bot sees the same connected accounts.",
      "secret": false,
      "strategy": "default",
      "default": "swarm-workspace"
    },
    {
      "key": "FIRECRAWL_API_KEY",
      "service": "swarm",
      "description": "Firecrawl API key for web crawl tools (Computer → Apps). Optional.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "SWARM_AGENT_MODEL",
      "service": "swarm",
      "description": "Model override applied to every agent, e.g. openai/gpt-oss-120b (Groq) or a model slug from your provider.",
      "secret": false,
      "strategy": "default",
      "default": "openai/gpt-oss-120b"
    },
    {
      "key": "OPENROUTER_API_KEY",
      "service": "swarm",
      "description": "OpenRouter key used as fallback provider if Groq fails or is unset. Manageable in the UI as well.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "LANGFUSE_PUBLIC_KEY",
      "service": "swarm",
      "description": "Langfuse public key for LLM observability. Optional.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "LANGFUSE_SECRET_KEY",
      "service": "swarm",
      "description": "Langfuse secret key for LLM observability. Optional.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "SWARM_ALLOWED_ORIGINS",
      "service": "swarm",
      "description": "Browser origins allowed to call the API (origin guard). Defaults to https:// plus your Railway public domain so the UI works on first install. Add more origins comma-separated (scheme://host) if you use a custom domain.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "SWARM_OPENAI_COMPAT_API_KEY",
      "service": "swarm",
      "description": "Key for the custom OpenAI-compatible endpoint; blank works for keyless servers.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    }
  ],
  "deploy": {
    "mcp": {
      "server": "railway",
      "tool": "deploy_template",
      "args": {
        "template_code": "swarm"
      }
    },
    "cli": "railway deploy --template swarm",
    "api": {
      "method": "POST",
      "path": "/graphql/v2",
      "body": {
        "query": "mutation templateDeploy($input: TemplateDeployV2Input!) { templateDeployV2(input: $input) { projectId workflowId } }",
        "variables": {
          "input": {
            "templateId": "019eed0d-a262-4568-8cc3-c15e9a43edf7",
            "serializedConfig": {
              "buckets": {},
              "services": {
                "28ba1823-79f4-41a5-9487-714510102ca4": {
                  "icon": null,
                  "name": "swarm",
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "repo": "https://github.com/mc9max/swarm-railway",
                    "rootDirectory": null
                  },
                  "variables": {
                    "SWARM_DEMO": {
                      "description": "Set to 1 for deterministic mock replies with a seeded #general thread (no provider keys needed). Set to 0 once you have added a real provider key.",
                      "defaultValue": "1"
                    },
                    "EXA_API_KEY": {
                      "description": "Exa API key for web research tools (Computer → Apps). Optional.",
                      "defaultValue": "{{EXA_API_KEY}}"
                    },
                    "GROQ_API_KEY": {
                      "description": "Groq API key so bots can respond (free tier at console.groq.com). Replace the placeholder with your key, or leave and manage keys in the UI under Command Center → AI providers.",
                      "defaultValue": "{{GROQ_API_KEY}}"
                    },
                    "SWARM_SECRET": {
                      "description": "Secret used for signing sessions. Auto-generated placeholder; each install gets a unique value.",
                      "defaultValue": "{{SWARM_SECRET}}"
                    },
                    "SWARM_SYSTEM": {
                      "description": "1 lets bots run tools on the host (system_run/read/write) bound to SWARM_SYSTEM_ROOT; set 0 to disable on untrusted networks.",
                      "defaultValue": "1"
                    },
                    "LANGFUSE_HOST": {
                      "description": "Langfuse host URL if you use observability. Optional.",
                      "defaultValue": "https://cloud.langfuse.com"
                    },
                    "SWARM_BROWSER": {
                      "description": "1 enables Playwright browser-use tools for bots; set 0 to disable.",
                      "defaultValue": "1"
                    },
                    "TAVILY_API_KEY": {
                      "description": "Tavily API key for web research tools (Computer → Apps). Optional.",
                      "defaultValue": "{{TAVILY_API_KEY}}"
                    },
                    "COMPOSIO_API_KEY": {
                      "description": "Composio key for app integrations (Gmail, Slack, GitHub, Notion, 1000+ apps). Optional.",
                      "defaultValue": "{{COMPOSIO_API_KEY}}"
                    },
                    "COMPOSIO_USER_ID": {
                      "description": "Shared Composio user_id so every bot sees the same connected accounts.",
                      "defaultValue": "swarm-workspace"
                    },
                    "FIRECRAWL_API_KEY": {
                      "description": "Firecrawl API key for web crawl tools (Computer → Apps). Optional.",
                      "defaultValue": "{{FIRECRAWL_API_KEY}}"
                    },
                    "SWARM_AGENT_MODEL": {
                      "description": "Model override applied to every agent, e.g. openai/gpt-oss-120b (Groq) or a model slug from your provider.",
                      "defaultValue": "openai/gpt-oss-120b"
                    },
                    "OPENROUTER_API_KEY": {
                      "description": "OpenRouter key used as fallback provider if Groq fails or is unset. Manageable in the UI as well.",
                      "defaultValue": "{{OPENROUTER_API_KEY}}"
                    },
                    "LANGFUSE_PUBLIC_KEY": {
                      "description": "Langfuse public key for LLM observability. Optional.",
                      "defaultValue": "{{LANGFUSE_PUBLIC_KEY}}"
                    },
                    "LANGFUSE_SECRET_KEY": {
                      "description": "Langfuse secret key for LLM observability. Optional.",
                      "defaultValue": "{{LANGFUSE_SECRET_KEY}}"
                    },
                    "SWARM_ALLOWED_ORIGINS": {
                      "description": "Browser origins allowed to call the API (origin guard). Defaults to https:// plus your Railway public domain so the UI works on first install. Add more origins comma-separated (scheme://host) if you use a custom domain.",
                      "defaultValue": "https://${{RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "SWARM_OPENAI_COMPAT_API_KEY": {
                      "description": "Key for the custom OpenAI-compatible endpoint; blank works for keyless servers.",
                      "defaultValue": "{{SWARM_OPENAI_COMPAT_API_KEY}}"
                    },
                    "SWARM_OPENAI_COMPAT_BASE_URL": {
                      "isOptional": true,
                      "description": "Optional. Base URL of your own OpenAI-compatible server (Ollama, LM Studio, vLLM), e.g. http://ollama.railway.internal:11434/v1. Leave empty if not using a custom provider (the Custom provider stays hidden).",
                      "defaultValue": ""
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>": {}
                    }
                  },
                  "volumeMounts": {
                    "28ba1823-79f4-41a5-9487-714510102ca4": {
                      "mountPath": "/app/data"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "post_deploy": {},
  "resources": {
    "expected_services": 1,
    "needs_volume": true
  },
  "generated_at": "2026-10-18T04:14:41.301Z",
  "generator_version": "0.1.0",
  "status": "validated",
  "validated_at": "2026-10-16T13:26:11.459Z",
  "success_rate_30d": 1,
  "validation": {
    "last_run_id": "run_da79c855b82a4e579790",
    "checks": [
      {
        "name": "workflow_completed",
        "passed": true
      },
      {
        "name": "all_services_deployed",
        "passed": true
      },
      {
        "name": "stays_up",
        "passed": true
      }
    ],
    "typical_ready_seconds": 90,
    "typical_build_seconds": 36,
    "typical_start_seconds": 10,
    "slowest_service": "swarm"
  }
}
