{
  "manifest_version": "1.0.0",
  "template": {
    "id": "4c136cba-bb2d-43be-b26d-b8e5acb1683a",
    "slug": "opencode-2-web-phone",
    "name": "OpenCode 2 (web + phone)",
    "description": "Always-on OpenCode 2 for your browser and phone, with git and GitHub ready.",
    "url": "https://railway.com/deploy/opencode-2-web-phone",
    "upstream": {
      "image": "ghcr.io/anomalyco/opencode:2.2.4"
    }
  },
  "status": "unvalidated",
  "validated_at": null,
  "success_rate_30d": null,
  "services": [
    {
      "name": "OpenCode",
      "source": {
        "image": "ghcr.io/anomalyco/opencode:2.2.4"
      },
      "needs_volume": true,
      "volume_mount_path": "/root",
      "http": true
    }
  ],
  "required_inputs": [
    {
      "key": "PORT",
      "service": "OpenCode",
      "description": "OpenCode's web port. Leave as is.",
      "secret": false,
      "strategy": "default",
      "default": "4096"
    },
    {
      "key": "OPENCODE_PASSWORD",
      "service": "OpenCode",
      "description": "Your sign-in password for the web app, OpenCode Desktop and the terminal (8 characters or more). OpenCode will not start without it. To change it later, change it here and redeploy.",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    }
  ],
  "deploy": {
    "mcp": {
      "server": "railway",
      "tool": "deploy_template",
      "args": {
        "template_code": "opencode-2-web-phone"
      }
    },
    "cli": "railway deploy --template opencode-2-web-phone",
    "api": {
      "method": "POST",
      "path": "/graphql/v2",
      "body": {
        "query": "mutation templateDeploy($input: TemplateDeployV2Input!) { templateDeployV2(input: $input) { projectId workflowId } }",
        "variables": {
          "input": {
            "templateId": "4c136cba-bb2d-43be-b26d-b8e5acb1683a",
            "serializedConfig": {
              "buckets": {},
              "services": {
                "f93317a4-c719-4e66-8158-3c99fe96b1a4": {
                  "icon": "https://cdn.jsdelivr.net/gh/mikedepo/railway-template-assets@6d43a901b61fb5eedf5d81572f71c1bbaae20be4/service-icons/opencode.svg",
                  "name": "OpenCode",
                  "deploy": {
                    "startCommand": "/bin/sh -c \"echo IyEvYmluL3NoCiMgU3RhcnQgT3BlbkNvZGUgMiBvbiBSYWlsd2F5IGZyb20gdGhlIG9mZmljaWFsIGltYWdlIChBbHBpbmUsIHJ1bnMgYXMgcm9vdCkuCiMgVGhlIHZvbHVtZSBpcyByb290J3MgaG9tZSwgc28gc2lnbi1pbnMsIHNlc3Npb25zLCBjb25maWcgYW5kIHRoZSB3b3Jrc3BhY2Ugc3Vydml2ZSByZWRlcGxveXMuCiMgVGhlIHRlbXBsYXRlJ3Mgc3RhcnQgY29tbWFuZCBpcyB0aGlzIGZpbGUgYmFzZTY0LWVuY29kZWQgKGJ1aWxkLXN0YXJ0LWNvbW1hbmQubWpzIHByaW50cyBpdCkuCgpIPS9yb290CldTPSRIL3dvcmtzcGFjZQpTVEFURT0kSC8ubG9jYWwvc3RhdGUvcmFpbHdheS1zZXR1cApBUEtfQ0FDSEU9JEgvLmNhY2hlL2FwawpQQUNLQUdFUz0idGluaSBnaXQgZ2l0aHViLWNsaSBvcGVuc3NoLWNsaWVudC1kZWZhdWx0IGJhc2ggY3VybCIKCmxvZygpIHsgZWNobyAiW3NldHVwXSAkKiI7IH0KCiMgVGhlIHNlcnZlciBpcyBwdWJsaWMgYW5kIHJ1bnMgY29tbWFuZHMsIHNvIGl0IG5ldmVyIHN0YXJ0cyB3aXRob3V0IGEgcmVhbCBwYXNzd29yZC4KaWYgWyAteiAiJE9QRU5DT0RFX1BBU1NXT1JEIiBdOyB0aGVuCiAgbG9nICJPUEVOQ09ERV9QQVNTV09SRCBpcyBlbXB0eS4gU2V0IGl0IGluIHRoZSBzZXJ2aWNlJ3MgVmFyaWFibGVzIGFuZCByZWRlcGxveTsgT3BlbkNvZGUgd2lsbCBub3Qgc3RhcnQgd2l0aG91dCBpdC4iCiAgZXhpdCAxCmZpCmlmIFsgIiR7I09QRU5DT0RFX1BBU1NXT1JEfSIgLWx0IDggXTsgdGhlbgogIGxvZyAiT1BFTkNPREVfUEFTU1dPUkQgaXMgc2hvcnRlciB0aGFuIDggY2hhcmFjdGVycy4gQ2hvb3NlIGEgbG9uZ2VyIG9uZSBhbmQgcmVkZXBsb3kuIgogIGV4aXQgMQpmaQp1bnNldCBPUEVOQ09ERV9TRVJWRVJfUEFTU1dPUkQKCiMgUmFpbHdheSBsZWF2ZXMgYW4gZW1wdHkgb3B0aW9uYWwgZmllbGQgb3V0LCBidXQgYW4gZW1wdHkgdmFsdWUgY2FuIHN0aWxsIGFycml2ZTsgZHJvcCBpdCBzbyBubyB0b29sIHJlYWRzIGl0IGFzIGEga2V5Lgpmb3IgdiBpbiBBTlRIUk9QSUNfQVBJX0tFWSBPUEVOQUlfQVBJX0tFWSBPUEVOUk9VVEVSX0FQSV9LRVkgR0lUSFVCX1RPS0VOIEdIX1RPS0VOIEdJVF9SRVBPIEdJVF9VU0VSX05BTUUgR0lUX1VTRVJfRU1BSUwgRVhUUkFfUEFDS0FHRVM7IGRvCiAgZXZhbCAiWyAtbiBcIlwkJHZcIiBdIHx8IHVuc2V0ICR2Igpkb25lCiMgT3BlbkNvZGUgcmVhZHMgR0lUSFVCX1RPS0VOIGFzIGEgR2l0SHViIENvcGlsb3Qgc2lnbi1pbiBhbmQgdGhlbiBtYWtlcyBhIENvcGlsb3QgbW9kZWwgdGhlIGRlZmF1bHQsIHdoaWNoIGZhaWxzIGZvciBhCiMgdG9rZW4gd2l0aG91dCBDb3BpbG90IGFjY2Vzcy4gZ2ggcmVhZHMgR0hfVE9LRU4sIHdoaWNoIG5vIG1vZGVsIHByb3ZpZGVyIHVzZXMsIHNvIGhhbmQgdGhlIHRva2VuIG92ZXIgdW5kZXIgdGhhdCBuYW1lLgpbIC1uICIkR0lUSFVCX1RPS0VOIiBdICYmIGV4cG9ydCBHSF9UT0tFTj0iJHtHSF9UT0tFTjotJEdJVEhVQl9UT0tFTn0iCnVuc2V0IEdJVEhVQl9UT0tFTgoKcm1kaXIgIiRIL2xvc3QrZm91bmQiIDI+L2Rldi9udWxsCm1rZGlyIC1wICIkV1MiICIkU1RBVEUiICIkQVBLX0NBQ0hFIgoKIyBUaGUgaW1hZ2Ugc2hpcHMgb25seSBPcGVuQ29kZSBhbmQgcmlwZ3JlcC4gSW5zdGFsbCB0aGUgdG9vbHMgZXZlcnkgc3RhcnQgKHRoZSByb290IGZpbGVzeXN0ZW0gaXMgbmV3IGVhY2ggZGVwbG95KTsKIyBwYWNrYWdlcyBhcmUgY2FjaGVkIG9uIHRoZSB2b2x1bWUsIHNvIGEgc3RhcnQgd2l0aG91dCBuZXR3b3JrIHN0aWxsIGdldHMgdGhlbS4KYXBrX2FkZCgpIHsKICBPVVQ9JChhcGsgYWRkIC0tcXVpZXQgLS1uby1wcm9ncmVzcyAtLWNhY2hlLWRpciAiJEFQS19DQUNIRSIgIiRAIiAyPiYxKSB8fAogICAgT1VUPSQoYXBrIGFkZCAtLXF1aWV0IC0tbm8tcHJvZ3Jlc3MgLS1uby1uZXR3b3JrIC0tY2FjaGUtZGlyICIkQVBLX0NBQ0hFIiAiJEAiIDI+JjEpIHx8IHsKICAgICAgZWNobyAiJE9VVCIgfCB0YWlsIC1uIDUKICAgICAgcmV0dXJuIDEKICAgIH0KfQppZiBhcGtfYWRkICRQQUNLQUdFUzsgdGhlbgogIGxvZyAidG9vbHMgcmVhZHk6ICQoZ2l0IC0tdmVyc2lvbiksIGdoICQoZ2ggLS12ZXJzaW9uIHwgaGVhZCAtbiAxIHwgY3V0IC1kJyAnIC1mMyksIGJhc2gsIGN1cmwiCmVsc2UKICBsb2cgImNvdWxkIG5vdCBpbnN0YWxsIGdpdCwgZ2ggYW5kIHRpbmk7IE9wZW5Db2RlIHN0YXJ0cyB3aXRob3V0IHRoZW0gYW5kIHRoZSBuZXh0IHN0YXJ0IHRyaWVzIGFnYWluIgpmaQppZiBbIC1uICIkRVhUUkFfUEFDS0FHRVMiIF07IHRoZW4KICBhcGtfYWRkICRFWFRSQV9QQUNLQUdFUyAmJiBsb2cgImV4dHJhIHBhY2thZ2VzIHJlYWR5OiAkRVhUUkFfUEFDS0FHRVMiIHx8CiAgICBsb2cgImNvdWxkIG5vdCBpbnN0YWxsIEVYVFJBX1BBQ0tBR0VTICgkRVhUUkFfUEFDS0FHRVMpOyBjaGVjayB0aGUgbmFtZXMgYXQgcGtncy5hbHBpbmVsaW51eC5vcmciCmZpCgppZiBjb21tYW5kIC12IGdpdCA+L2Rldi9udWxsOyB0aGVuCiAgWyAtbiAiJChnaXQgY29uZmlnIC0tZ2xvYmFsIGluaXQuZGVmYXVsdEJyYW5jaCkiIF0gfHwgZ2l0IGNvbmZpZyAtLWdsb2JhbCBpbml0LmRlZmF1bHRCcmFuY2ggbWFpbgogIFsgLW4gIiRHSVRfVVNFUl9OQU1FIiBdICYmIGdpdCBjb25maWcgLS1nbG9iYWwgdXNlci5uYW1lICIkR0lUX1VTRVJfTkFNRSIKICBbIC1uICIkR0lUX1VTRVJfRU1BSUwiIF0gJiYgZ2l0IGNvbmZpZyAtLWdsb2JhbCB1c2VyLmVtYWlsICIkR0lUX1VTRVJfRU1BSUwiCgogICMgR2l0SHViOiBnaCByZWFkcyBHSF9UT0tFTiBmcm9tIHRoZSBlbnZpcm9ubWVudCwgYW5kIGdpdCBhc2tzIGdoIGZvciBjcmVkZW50aWFscyBvbiBnaXRodWIuY29tLgogIGlmIFsgLW4gIiRHSF9UT0tFTiIgXSAmJiBjb21tYW5kIC12IGdoID4vZGV2L251bGw7IHRoZW4KICAgIGdoIGF1dGggc2V0dXAtZ2l0IC0taG9zdG5hbWUgZ2l0aHViLmNvbSA+L2Rldi9udWxsIDI+JjEgfHwKICAgICAgZ2l0IGNvbmZpZyAtLWdsb2JhbCBjcmVkZW50aWFsLmh0dHBzOi8vZ2l0aHViLmNvbS5oZWxwZXIgJyEvdXNyL2Jpbi9naCBhdXRoIGdpdC1jcmVkZW50aWFsJwogICAgbG9nICJHaXRIdWIgc2lnbi1pbiBmb3IgZ2l0IGFuZCBnaDogZnJvbSBHSVRIVUJfVE9LRU4iCiAgICAjIENvbW1pdCBhcyB0aGUgdG9rZW4ncyBHaXRIdWIgdXNlciAod2l0aCBHaXRIdWIncyBwcml2YXRlIG5vcmVwbHkgYWRkcmVzcykgdW5sZXNzIGEgbmFtZSBhbmQgZW1haWwgYXJlIHNldC4KICAgIGlmIFsgLXogIiQoZ2l0IGNvbmZpZyAtLWdsb2JhbCB1c2VyLmVtYWlsKSIgXTsgdGhlbgogICAgICBpZiBNRT0kKHRpbWVvdXQgMjAgZ2ggYXBpIHVzZXIgLS1qcSAnWy5pZCwgLmxvZ2luLCAoLm5hbWUgLy8gIiIpXSB8IEB0c3YnIDI+L2Rldi9udWxsKSAmJiBbIC1uICIkTUUiIF07IHRoZW4KICAgICAgICBJRD0kKGVjaG8gIiRNRSIgfCBjdXQgLWYxKQogICAgICAgIExPR0lOPSQoZWNobyAiJE1FIiB8IGN1dCAtZjIpCiAgICAgICAgTkFNRT0kKGVjaG8gIiRNRSIgfCBjdXQgLWYzKQogICAgICAgIGdpdCBjb25maWcgLS1nbG9iYWwgdXNlci5uYW1lICIke05BTUU6LSRMT0dJTn0iCiAgICAgICAgZ2l0IGNvbmZpZyAtLWdsb2JhbCB1c2VyLmVtYWlsICIkSUQrJExPR0lOQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbSIKICAgICAgICBsb2cgImdpdCBjb21taXRzIGFzICR7TkFNRTotJExPR0lOfSAoR2l0SHViIHVzZXIgJExPR0lOKSIKICAgICAgZWxzZQogICAgICAgIGxvZyAiR2l0SHViIGRpZCBub3QgYWNjZXB0IEdJVEhVQl9UT0tFTjsgcmVwbGFjZSBpdCBpbiB0aGUgc2VydmljZSdzIFZhcmlhYmxlcyAoZ2l0IGFuZCBnaCBuZWVkIGEgdmFsaWQgdG9rZW4gZm9yIHByaXZhdGUgcmVwb3MpIgogICAgICBmaQogICAgZmkKICBmaQpmaQoKIyBGaXJzdCBib290LCBpbiB0aGUgYmFja2dyb3VuZCBzbyBPcGVuQ29kZSBzdGFydHMgYXQgb25jZToKIyAtIGNsb25lIEdJVF9SRVBPIChvd25lci9uYW1lIG9yIGEgZ2l0IFVSTCkgaW50byB0aGUgd29ya3NwYWNlOyBhIGZhaWxlZCBjbG9uZSBpcyByZXRyaWVkIGF0IHRoZSBuZXh0IHN0YXJ0LgojIC0gYSBicm93c2VyIHRoYXQgaGFzIG5ldmVyIHVzZWQgdGhpcyBzZXJ2ZXIgaGFzIG5vIHByb2plY3QsIHNvIGl0cyBOZXcgc2Vzc2lvbiBidXR0b24gZG9lcyBub3RoaW5nLiBPbmUgc2Vzc2lvbgojICAgaW4gdGhlIHdvcmtzcGFjZSAob3IgdGhlIGNsb25lZCByZXBvKSBnaXZlcyB0aGUgZmlyc3QgdmlzaXQgc29tZXRoaW5nIHRvIG9wZW47IGNyZWF0ZWQgb25jZSBwZXIgdm9sdW1lLgpjbG9uZV9yZXBvKCkgewogIGNhc2UgIiRHSVRfUkVQTyIgaW4KICAgICo6Ly8qIHwgZ2l0QCopIFVSTD0kR0lUX1JFUE8gOzsKICAgICovKikgVVJMPSJodHRwczovL2dpdGh1Yi5jb20vJEdJVF9SRVBPLmdpdCIgOzsKICAgICopIFVSTD0gOzsKICBlc2FjCiAgTkFNRT0kKGJhc2VuYW1lICIkR0lUX1JFUE8iIC5naXQpCiAgaWYgWyAteiAiJFVSTCIgXSB8fCBbIC16ICIkTkFNRSIgXTsgdGhlbgogICAgbG9nICJHSVRfUkVQTyBzaG91bGQgbG9vayBsaWtlIG93bmVyL25hbWUgb3IgaHR0cHM6Ly9naXRodWIuY29tL293bmVyL25hbWU7IG5vdGhpbmcgY2xvbmVkIgogICAgcmV0dXJuIDEKICBmaQogIFJFUE9fRElSPSRXUy8kTkFNRQogIFsgLWQgIiRSRVBPX0RJUiIgXSAmJiByZXR1cm4gMAogIHJtIC1yZiAiJFJFUE9fRElSLnBhcnRpYWwiCiAgaWYgR0lUX1RFUk1JTkFMX1BST01QVD0wIGdpdCBjbG9uZSAtLXF1aWV0ICIkVVJMIiAiJFJFUE9fRElSLnBhcnRpYWwiIDI+JjEgJiYgbXYgIiRSRVBPX0RJUi5wYXJ0aWFsIiAiJFJFUE9fRElSIjsgdGhlbgogICAgbG9nICJjbG9uZWQgJEdJVF9SRVBPIGludG8gJFJFUE9fRElSIgogIGVsc2UKICAgIHJtIC1yZiAiJFJFUE9fRElSLnBhcnRpYWwiCiAgICBsb2cgImNvdWxkIG5vdCBjbG9uZSAkR0lUX1JFUE87IGNoZWNrIHRoZSBuYW1lIGFuZCBHSVRIVUJfVE9LRU4sIHRoZW4gcmVkZXBsb3kiCiAgICByZXR1cm4gMQogIGZpCn0Kc3RhcnRfc2Vzc2lvbigpIHsKICBbIC1lICIkU1RBVEUvc3RhcnQtc2Vzc2lvbiIgXSAmJiByZXR1cm4gMAogIEFQST0iaHR0cDovLzEyNy4wLjAuMToke1BPUlQ6LTQwOTZ9L2FwaS9zZXNzaW9uIgogIGk9MAogIHdoaWxlIFsgJGkgLWx0IDEyMCBdOyBkbwogICAgWyAiJChjdXJsIC1zIC1vIC9kZXYvbnVsbCAtdyAnJXtodHRwX2NvZGV9JyAtdSAib3BlbmNvZGU6JE9QRU5DT0RFX1BBU1NXT1JEIiAiJEFQSSIpIiA9IDIwMCBdICYmIGJyZWFrCiAgICBpPSQoKGkgKyAxKSkKICAgIHNsZWVwIDEKICBkb25lCiAgaWYgY3VybCAtc2YgLW8gL2Rldi9udWxsIC11ICJvcGVuY29kZTokT1BFTkNPREVfUEFTU1dPUkQiIC1IICdjb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb24nIC1YIFBPU1QgIiRBUEkiIFwKICAgIC1kICJ7XCJ0aXRsZVwiOlwiU3RhcnQgaGVyZVwiLFwibG9jYXRpb25cIjp7XCJkaXJlY3RvcnlcIjpcIiQxXCJ9fSI7IHRoZW4KICAgIHRvdWNoICIkU1RBVEUvc3RhcnQtc2Vzc2lvbiIKICAgIGxvZyAiY3JlYXRlZCB0aGUgU3RhcnQgaGVyZSBzZXNzaW9uIGluICQxIgogIGZpCn0KKAogIERJUj0kV1MKICBpZiBbIC1uICIkR0lUX1JFUE8iIF0gJiYgY29tbWFuZCAtdiBnaXQgPi9kZXYvbnVsbCAmJiBjbG9uZV9yZXBvOyB0aGVuIERJUj0kUkVQT19ESVI7IGZpCiAgY29tbWFuZCAtdiBjdXJsID4vZGV2L251bGwgJiYgc3RhcnRfc2Vzc2lvbiAiJERJUiIKKSAmCgpjZCAiJFdTIiB8fCBleGl0IDEKY29tbWFuZCAtdiBiYXNoID4vZGV2L251bGwgJiYgZXhwb3J0IFNIRUxMPS9iaW4vYmFzaAojIFRvb2xzIGluc3RhbGxlZCBpbnRvIHRoZSBob21lIGZvbGRlciAoQ2xhdWRlIENvZGUncyBpbnN0YWxsZXIsIHBpcCAtLXVzZXIpIGxpdmUgb24gdGhlIHZvbHVtZTsga2VlcCB0aGVtIG9uIFBBVEguCmV4cG9ydCBQQVRIPSIkSC8ubG9jYWwvYmluOiRQQVRIIgpleHBvcnQgT1BFTkNPREVfRElTQUJMRV9BVVRPVVBEQVRFPTEKbG9nICJzdGFydGluZyBPcGVuQ29kZSAkKG9wZW5jb2RlIC0tdmVyc2lvbiAyPi9kZXYvbnVsbCB8IHNlZCAncy9eb3BlbmNvZGUgLy8nKSBvbiBwb3J0ICR7UE9SVDotNDA5Nn07IHNpZ24gaW4gd2l0aCB0aGUgcGFzc3dvcmQgZnJvbSBPUEVOQ09ERV9QQVNTV09SRCIKCiMgdGluaSByZWFwcyBmaW5pc2hlZCBzaGVsbCBwcm9jZXNzZXMsIHdoaWNoIG9wZW5jb2RlIGFzIFBJRCAxIGRvZXMgbm90ICh1cHN0cmVhbSBpc3N1ZSAjNTM1NjQpLgppZiBjb21tYW5kIC12IHRpbmkgPi9kZXYvbnVsbDsgdGhlbgogIGV4ZWMgdGluaSAtLSBvcGVuY29kZSBzZXJ2ZSAtLWhvc3RuYW1lIDAuMC4wLjAgLS1wb3J0ICIke1BPUlQ6LTQwOTZ9IgpmaQpleGVjIG9wZW5jb2RlIHNlcnZlIC0taG9zdG5hbWUgMC4wLjAuMCAtLXBvcnQgIiR7UE9SVDotNDA5Nn0iCg== | base64 -d > /tmp/start.sh && exec sh /tmp/start.sh\"",
                    "healthcheckPath": "/",
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "ghcr.io/anomalyco/opencode:2.2.4"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "description": "OpenCode's web port. Leave as is.",
                      "defaultValue": "4096"
                    },
                    "GIT_REPO": {
                      "isOptional": true,
                      "description": "Optional repo cloned into the workspace on first start: owner/name or a git URL. Private repos need GITHUB_TOKEN.",
                      "defaultValue": ""
                    },
                    "GITHUB_TOKEN": {
                      "isOptional": true,
                      "description": "Optional GitHub token. Signs git and gh in to GitHub and sets your git name and email from your account. Use a fine-grained token limited to the repos the agent should touch.",
                      "defaultValue": ""
                    },
                    "EXTRA_PACKAGES": {
                      "isOptional": true,
                      "description": "Optional Alpine packages installed at every start, such as nodejs npm python3. Tools installed by hand outside the home folder are gone after a redeploy.",
                      "defaultValue": ""
                    },
                    "OPENAI_API_KEY": {
                      "isOptional": true,
                      "description": "Optional OpenAI API key. To use a ChatGPT plan instead, connect OpenAI in OpenCode and choose Codex device code.",
                      "defaultValue": ""
                    },
                    "ANTHROPIC_API_KEY": {
                      "isOptional": true,
                      "description": "Optional Anthropic API key for Claude models. You can also connect providers later in OpenCode.",
                      "defaultValue": ""
                    },
                    "OPENCODE_PASSWORD": {
                      "isOptional": false,
                      "description": "Your sign-in password for the web app, OpenCode Desktop and the terminal (8 characters or more). OpenCode will not start without it. To change it later, change it here and redeploy.",
                      "defaultValue": "{{OPENCODE_PASSWORD}}"
                    },
                    "OPENROUTER_API_KEY": {
                      "isOptional": true,
                      "description": "Optional OpenRouter API key: one key for models from many providers.",
                      "defaultValue": ""
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>:4096": {
                        "port": 4096
                      }
                    }
                  },
                  "volumeMounts": {
                    "f93317a4-c719-4e66-8158-3c99fe96b1a4": {
                      "mountPath": "/root"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "post_deploy": {
    "healthcheck": {
      "service": "OpenCode",
      "method": "GET",
      "path": "/",
      "expect_status": 200
    }
  },
  "resources": {
    "expected_services": 1,
    "needs_volume": true
  },
  "generated_at": "2026-10-30T22:14:57.013Z",
  "generator_version": "0.1.0"
}
