{
  "manifest_version": "1.0.0",
  "template": {
    "id": "a7b673d6-7b8d-462f-8112-8478b76baef4",
    "slug": "cloudcli",
    "name": "CloudCLI",
    "description": "Claude Code and Codex in any browser or phone. Your own login, repos kept.",
    "url": "https://railway.com/deploy/cloudcli",
    "upstream": {
      "image": "node:22-bookworm"
    }
  },
  "status": "unvalidated",
  "validated_at": null,
  "success_rate_30d": null,
  "services": [
    {
      "name": "CloudCLI",
      "source": {
        "image": "node:22-bookworm"
      },
      "needs_volume": true,
      "volume_mount_path": "/home/node",
      "http": true
    }
  ],
  "required_inputs": [
    {
      "key": "PORT",
      "service": "CloudCLI",
      "description": "CloudCLI's web port. Leave as is.",
      "secret": false,
      "strategy": "default",
      "default": "3001"
    },
    {
      "key": "CLOUDCLI_PASSWORD",
      "service": "CloudCLI",
      "description": "Your CloudCLI sign-in password (8 characters or more). To change it later, change it here and redeploy: every browser is then signed out.",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "CLOUDCLI_USERNAME",
      "service": "CloudCLI",
      "description": "Your CloudCLI sign-in name (3 characters or more). To change it later, change it here and redeploy.",
      "secret": false,
      "strategy": "ask_user"
    }
  ],
  "deploy": {
    "mcp": {
      "server": "railway",
      "tool": "deploy_template",
      "args": {
        "template_code": "cloudcli"
      }
    },
    "cli": "railway deploy --template cloudcli",
    "api": {
      "method": "POST",
      "path": "/graphql/v2",
      "body": {
        "query": "mutation templateDeploy($input: TemplateDeployV2Input!) { templateDeployV2(input: $input) { projectId workflowId } }",
        "variables": {
          "input": {
            "templateId": "a7b673d6-7b8d-462f-8112-8478b76baef4",
            "serializedConfig": {
              "buckets": {},
              "services": {
                "84ceb2c5-8e68-496d-ab4a-0b0cd10c0cba": {
                  "icon": "https://cdn.jsdelivr.net/gh/mikedepo/railway-template-assets@a6c2febdab3adf03a52646f0f85117e766bfa51c/service-icons/cloudcli.svg",
                  "name": "CloudCLI",
                  "deploy": {
                    "startCommand": "/bin/sh -c \"echo IyEvYmluL2Jhc2gKIyBTdGFydCBDbG91ZENMSSBvbiBSYWlsd2F5LiBSdW5zIGFzIHJvb3QgdG8gcHJlcGFyZSB0aGUgdm9sdW1lIGF0IC9ob21lL25vZGUsIGluc3RhbGxzIENsb3VkQ0xJLAojIENsYXVkZSBDb2RlLCBDb2RleCBhbmQgdGhlIEdpdEh1YiBDTEkgaW50byB0aGUgaG9tZSBmb2xkZXIgb24gZmlyc3Qgc3RhcnQsIGFwcGxpZXMgdGhlIGxvZ2luIGZyb20gdGhlCiMgZGVwbG95IGZvcm0sIHRoZW4gcnVucyBDbG91ZENMSSBhcyB0aGUgaW1hZ2UncyBub2RlIHVzZXIuIEV2ZXJ5dGhpbmcgaW5zdGFsbGVkIGxpdmVzIG9uIHRoZSB2b2x1bWUuCiMgVGhlIHRlbXBsYXRlJ3Mgc3RhcnQgY29tbWFuZCBpcyB0aGlzIGZpbGUgYmFzZTY0LWVuY29kZWQgKGJ1aWxkLXN0YXJ0LWNvbW1hbmQubWpzKS4KCiMgQ2xvdWRDTEkgaXMgcGlubmVkOyBhIG5ld2VyIG9uZSBpbnN0YWxsZWQgd2l0aCBDbG91ZENMSSdzIG93biBVcGRhdGUgYnV0dG9uIGlzIGtlcHQuCkNMT1VEQ0xJX1ZFUlNJT049MS4zNy43CkdIX1ZFUlNJT049Mi4xMDMuMwoKSD0vaG9tZS9ub2RlClNUQVRFPSRILy5sb2NhbC9zdGF0ZS9yYWlsd2F5LXNldHVwCmV4cG9ydCBIT01FPSRIIFVTRVI9bm9kZSBMT0dOQU1FPW5vZGUgU0hFTEw9L2Jpbi9iYXNoCmV4cG9ydCBOUE1fQ09ORklHX1BSRUZJWD0kSC8ubnBtLWdsb2JhbApleHBvcnQgUEFUSD0iJEgvLmxvY2FsL2JpbjokSC8ubnBtLWdsb2JhbC9iaW46JFBBVEgiCkFQUD0kTlBNX0NPTkZJR19QUkVGSVgvbGliL25vZGVfbW9kdWxlcy9AY2xvdWRjbGktYWkvY2xvdWRjbGkKZXhwb3J0IERBVEFCQVNFX1BBVEg9JEgvLmNsb3VkY2xpL2F1dGguZGIKCkFTX05PREU9InNldHByaXYgLS1yZXVpZD1ub2RlIC0tcmVnaWQ9bm9kZSAtLWluaXQtZ3JvdXBzIgphc19ub2RlKCkgeyAkQVNfTk9ERSAiJEAiOyB9CiMgUmFpbHdheSBjYW4gZHJvcCBhIGNvbnRhaW5lcidzIGZpcnN0IGxvZyBsaW5lcywgc28gdGhlIGxvZyBhbHNvIGdvZXMgdG8gYSBmaWxlIGluIHRoZSBob21lIGZvbGRlci4KbG9nKCkgeyBlY2hvICJbc2V0dXBdICQqIjsgZWNobyAiJChkYXRlIC11ICslRlQlVFopICQqIiA+PiAiJFNUQVRFL3NldHVwLmxvZyI7IH0KCiMgQSBuZXcgUmFpbHdheSB2b2x1bWUgaXMgb3duZWQgYnkgcm9vdCBhbmQgaG9sZHMgbG9zdCtmb3VuZDsgdGhlIGltYWdlJ3Mgb3duIGhvbWUgaXMgaGlkZGVuIGJ5IGl0LgpybWRpciAiJEgvbG9zdCtmb3VuZCIgMj4vZGV2L251bGwKY2hvd24gbm9kZTpub2RlICIkSCIKY2QgIiRIIiB8fCBleGl0IDEKYXNfbm9kZSBta2RpciAtcCAiJEgvLmxvY2FsL2JpbiIgIiRILy5ucG0tZ2xvYmFsIiAiJEgvLmNsb3VkY2xpIiAiJFNUQVRFIgpmb3IgZiBpbiAuYmFzaHJjIC5wcm9maWxlIC5iYXNoX2xvZ291dDsgZG8KICBbIC1lICIkSC8kZiIgXSB8fCBhc19ub2RlIGNwICIvZXRjL3NrZWwvJGYiICIkSC8kZiIKZG9uZQojIExvZ2luIHNoZWxscyByZXNldCBQQVRIIGZyb20gL2V0Yy9wcm9maWxlOyBrZWVwIHRoZSBob21lIGZvbGRlcidzIHRvb2xzIGZpcnN0IHRoZXJlIHRvby4KZ3JlcCAtcSAncmFpbHdheS1zZXR1cCcgIiRILy5wcm9maWxlIiB8fAogIGVjaG8gJ2V4cG9ydCBQQVRIPSIkSE9NRS8ubG9jYWwvYmluOiRIT01FLy5ucG0tZ2xvYmFsL2JpbjokUEFUSCIgTlBNX0NPTkZJR19QUkVGSVg9IiRIT01FLy5ucG0tZ2xvYmFsIiAjIHJhaWx3YXktc2V0dXAnID4+ICIkSC8ucHJvZmlsZSIKCiMgVGhlIHRvb2xzIHRha2UgYWJvdXQgMi41IEdCLCBtb3JlIHRoYW4gdGhlIDAuNSBHQiB2b2x1bWUgb2YgRnJlZSBhbmQgVHJpYWwgcGxhbnMuIFJhdGhlciB0aGFuIGZhaWwgdGhlCiMgZGVwbG95LCBhbnN3ZXIgZXZlcnkgcmVxdWVzdCAoYW5kIHRoZSBoZWFsdGggY2hlY2spIHdpdGggdGhlIHJlYXNvbiBhbmQgdGhlIGZpeC4KVk9MVU1FX01CPSQoZGYgLVBtICIkSCIgfCBhd2sgJ05SID09IDIgeyBwcmludCAkMiB9JykKaWYgWyAiJHtWT0xVTUVfTUI6LTB9IiAtbHQgMzAwMCBdOyB0aGVuCiAgZXhwb3J0IE1FU1NBR0U9IkNsb3VkQ0xJIHdpdGggQ2xhdWRlIENvZGUgYW5kIENvZGV4IG5lZWRzIGFib3V0IDIuNSBHQiBvZiBkaXNrLCBhbmQgdGhpcyB2b2x1bWUgaG9sZHMgJFZPTFVNRV9NQiBNQiAoRnJlZSBhbmQgVHJpYWwgcGxhbnMgZ2V0IDAuNSBHQikuIERlcGxveSBpdCBvbiBhIEhvYmJ5IG9yIFBybyBwbGFuLiIKICBsb2cgIiRNRVNTQUdFIgogIGV4ZWMgbm9kZSAtZSAicmVxdWlyZSgnaHR0cCcpLmNyZWF0ZVNlcnZlcigocSwgcykgPT4gcy5lbmQocHJvY2Vzcy5lbnYuTUVTU0FHRSArICdcbicpKS5saXN0ZW4ocHJvY2Vzcy5lbnYuUE9SVCB8fCAzMDAxKSIKZmkKCmFwcF92ZXJzaW9uKCkgeyBub2RlIC1wICJyZXF1aXJlKCckQVBQL3BhY2thZ2UuanNvbicpLnZlcnNpb24iIDI+L2Rldi9udWxsOyB9CklOU1RBTExFRD0kKGFwcF92ZXJzaW9uKQpOUE1fUEFDS0FHRVM9CmlmIFsgLXogIiRJTlNUQUxMRUQiIF0gfHwgWyAhIC1lICIkTlBNX0NPTkZJR19QUkVGSVgvYmluL2Nsb3VkY2xpIiBdIHx8IHsgWyAiJElOU1RBTExFRCIgIT0gIiRDTE9VRENMSV9WRVJTSU9OIiBdICYmCiAgWyAiJChwcmludGYgJyVzXG4lc1xuJyAiJElOU1RBTExFRCIgIiRDTE9VRENMSV9WRVJTSU9OIiB8IHNvcnQgLVYgfCBoZWFkIC1uMSkiID0gIiRJTlNUQUxMRUQiIF07IH07IHRoZW4KICBOUE1fUEFDS0FHRVM9IiBAY2xvdWRjbGktYWkvY2xvdWRjbGlAJENMT1VEQ0xJX1ZFUlNJT04iCmZpCiMgQ29kZXggYW5kIENsYXVkZSBDb2RlIHVwZGF0ZSB0aGVtc2VsdmVzIGludG8gdGhlIHNhbWUgcGxhY2VzIChucG0gcHJlZml4LCB+Ly5sb2NhbCkgbGF0ZXIuClsgLWUgIiROUE1fQ09ORklHX1BSRUZJWC9iaW4vY29kZXgiIF0gfHwgTlBNX1BBQ0tBR0VTPSIkTlBNX1BBQ0tBR0VTIEBvcGVuYWkvY29kZXgiCgojIERvd25sb2FkcyBydW4gaW4gcGFyYWxsZWwuIEEgZmFpbGVkIG9uZSBuZXZlciBibG9ja3MgQ2xvdWRDTEk6IHRoZSBuZXh0IHN0YXJ0IHRyaWVzIGFnYWluLgppZiBbICEgLWUgIiRILy5sb2NhbC9iaW4vY2xhdWRlIiBdOyB0aGVuCiAgTkVXPTEKICAoIGxvZyAiaW5zdGFsbGluZyBDbGF1ZGUgQ29kZSAobmF0aXZlIGluc3RhbGxlcikiCiAgICBhc19ub2RlIGJhc2ggLWMgJ3NldCAtbyBwaXBlZmFpbDsgY3VybCAtZnNTTCAtLXJldHJ5IDIgaHR0cHM6Ly9jbGF1ZGUuYWkvaW5zdGFsbC5zaCB8IGJhc2gnIFwKICAgICAgPiAiJFNUQVRFL2NsYXVkZS1pbnN0YWxsLmxvZyIgMj4mMSAmJiBbIC1lICIkSC8ubG9jYWwvYmluL2NsYXVkZSIgXSAmJgogICAgICBsb2cgIkNsYXVkZSBDb2RlICQoYXNfbm9kZSAiJEgvLmxvY2FsL2Jpbi9jbGF1ZGUiIC0tdmVyc2lvbiAyPi9kZXYvbnVsbCkgcmVhZHkiIHx8CiAgICAgIGxvZyAiQ2xhdWRlIENvZGUgaW5zdGFsbCBmYWlsZWQgKHNlZSAkU1RBVEUvY2xhdWRlLWluc3RhbGwubG9nKTsgaXQgd2lsbCBiZSByZXRyaWVkIGF0IHRoZSBuZXh0IHN0YXJ0IiApICYKZmkKaWYgWyAhIC1lICIkSC8ubG9jYWwvYmluL2doIiBdOyB0aGVuCiAgTkVXPTEKICAoIEFSQ0g9JChkcGtnIC0tcHJpbnQtYXJjaGl0ZWN0dXJlKQogICAgbG9nICJpbnN0YWxsaW5nIEdpdEh1YiBDTEkgJEdIX1ZFUlNJT04iCiAgICBhc19ub2RlIGJhc2ggLWMgInNldCAtbyBwaXBlZmFpbDsgcm0gLXJmICRILy5sb2NhbC9zaGFyZS9naCAmJiBta2RpciAtcCAkSC8ubG9jYWwvc2hhcmUvZ2ggJiYKICAgICAgY3VybCAtZnNTTCAtLXJldHJ5IDIgLS1tYXgtdGltZSAxODAgXAogICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9jbGkvY2xpL3JlbGVhc2VzL2Rvd25sb2FkL3YkR0hfVkVSU0lPTi9naF8ke0dIX1ZFUlNJT059X2xpbnV4XyRBUkNILnRhci5neiB8CiAgICAgIHRhciAteHogLUMgJEgvLmxvY2FsL3NoYXJlL2doIC0tc3RyaXAtY29tcG9uZW50cz0xICYmCiAgICAgIGxuIC1zZiAkSC8ubG9jYWwvc2hhcmUvZ2gvYmluL2doICRILy5sb2NhbC9iaW4vZ2giICYmCiAgICAgIGxvZyAiJChhc19ub2RlIGdoIC0tdmVyc2lvbiB8IGhlYWQgLW4xKSByZWFkeSIgfHwKICAgICAgbG9nICJHaXRIdWIgQ0xJIGluc3RhbGwgZmFpbGVkOyBpdCB3aWxsIGJlIHJldHJpZWQgYXQgdGhlIG5leHQgc3RhcnQiICkgJgpmaQppZiBbIC1uICIkTlBNX1BBQ0tBR0VTIiBdOyB0aGVuCiAgTkVXPTEKICBsb2cgImluc3RhbGxpbmckTlBNX1BBQ0tBR0VTIHdpdGggbnBtIgogIGFzX25vZGUgbnBtIGluc3RhbGwgLWcgLS1jYWNoZSAvdG1wL25wbS1jYWNoZSAtLW5vLWF1ZGl0IC0tbm8tZnVuZCAtLW5vLXVwZGF0ZS1ub3RpZmllciAtLWxvZ2xldmVsPWVycm9yICROUE1fUEFDS0FHRVMgJiYKICAgIGxvZyAiaW5zdGFsbGVkJE5QTV9QQUNLQUdFUyIgfHwgbG9nICJucG0gaW5zdGFsbCBmYWlsZWQgZm9yJE5QTV9QQUNLQUdFUyIKICBybSAtcmYgL3RtcC9ucG0tY2FjaGUKZmkKd2FpdAoKaWYgWyAteiAiJChhcHBfdmVyc2lvbikiIF07IHRoZW4KICBsb2cgIkNsb3VkQ0xJIGlzIG5vdCBpbnN0YWxsZWQgYW5kIGNvdWxkIG5vdCBiZSBpbnN0YWxsZWQ7IHJldHJ5aW5nIGluIDMwIHNlY29uZHMiCiAgc2xlZXAgMzAKICBleGl0IDEKZmkKCiMgVGhlIGxvZ2luIGNvbWVzIGZyb20gdGhlIGRlcGxveSBmb3JtLiBDbG91ZENMSSdzIG93biBmaXJzdC1ydW4gcGFnZSBsZXRzIHdob2V2ZXIgb3BlbnMgdGhlIFVSTCBmaXJzdAojIGNyZWF0ZSB0aGUgYWNjb3VudCwgc28gdGhlIGFjY291bnQgZXhpc3RzIGJlZm9yZSB0aGUgcHVibGljIHBvcnQgb3BlbnMsIGFuZCBpdHMgdXNlcm5hbWUgYW5kIHBhc3N3b3JkCiMgZm9sbG93IENMT1VEQ0xJX1VTRVJOQU1FIGFuZCBDTE9VRENMSV9QQVNTV09SRCBhdCBldmVyeSBzdGFydCAoY2hhbmdlIHRoZW0gaW4gVmFyaWFibGVzIHRvIHJlc2V0IHRoZW0pLgpzeW5jX2xvZ2luKCkgewogIGFzX25vZGUgZW52IENMT1VEQ0xJX1VTRVJOQU1FPSIkQ0xPVURDTElfVVNFUk5BTUUiIENMT1VEQ0xJX1BBU1NXT1JEPSIkQ0xPVURDTElfUEFTU1dPUkQiIEFQUD0iJEFQUCIgbm9kZSAtIDw8J0VPRicKY29uc3QgeyBjcmVhdGVSZXF1aXJlIH0gPSByZXF1aXJlKCdtb2R1bGUnKTsKY29uc3QgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJyk7CmNvbnN0IHJlcSA9IGNyZWF0ZVJlcXVpcmUocHJvY2Vzcy5lbnYuQVBQICsgJy9wYWNrYWdlLmpzb24nKTsKY29uc3QgRGF0YWJhc2UgPSByZXEoJ2JldHRlci1zcWxpdGUzJyk7CmNvbnN0IGJjcnlwdCA9IHJlcSgnYmNyeXB0Jyk7CmNvbnN0IGRiID0gbmV3IERhdGFiYXNlKHByb2Nlc3MuZW52LkRBVEFCQVNFX1BBVEgpOwppZiAoIWRiLnByZXBhcmUoIlNFTEVDVCAxIEZST00gc3FsaXRlX21hc3RlciBXSEVSRSB0eXBlID0gJ3RhYmxlJyBBTkQgbmFtZSA9ICd1c2VycyciKS5nZXQoKSkgcHJvY2Vzcy5leGl0KDMpOwpsZXQgdXNlcm5hbWUgPSBwcm9jZXNzLmVudi5DTE9VRENMSV9VU0VSTkFNRSB8fCAnJzsKbGV0IHBhc3N3b3JkID0gcHJvY2Vzcy5lbnYuQ0xPVURDTElfUEFTU1dPUkQgfHwgJyc7CmNvbnN0IHVzZXIgPSBkYi5wcmVwYXJlKCdTRUxFQ1QgaWQsIHVzZXJuYW1lLCBwYXNzd29yZF9oYXNoIEZST00gdXNlcnMgT1JERVIgQlkgaWQgTElNSVQgMScpLmdldCgpOwpjb25zdCBzYXkgPSAobSkgPT4gY29uc29sZS5sb2coJ1tzZXR1cF0gJyArIG0pOwppZiAoIXVzZXJuYW1lIHx8ICFwYXNzd29yZCkgewogIGlmICh1c2VyKSB7IHNheSgnQ0xPVURDTElfVVNFUk5BTUUgb3IgQ0xPVURDTElfUEFTU1dPUkQgaXMgZW1wdHk7IGtlZXBpbmcgdGhlIGV4aXN0aW5nIGxvZ2luJyk7IHByb2Nlc3MuZXhpdCgwKTsgfQogIC8vIE5ldmVyIGxlYXZlIHRoZSBmaXJzdC1ydW4gcGFnZSBvcGVuIHRvIHdob2V2ZXIgY29tZXMgZmlyc3Q6IGxvY2sgdGhlIGFwcCB1bnRpbCB0aGUgdmFyaWFibGVzIGFyZSBzZXQuCiAgdXNlcm5hbWUgPSAnYWRtaW4nOwogIHBhc3N3b3JkID0gY3J5cHRvLnJhbmRvbUJ5dGVzKDI0KS50b1N0cmluZygnYmFzZTY0dXJsJyk7CiAgc2F5KCdDTE9VRENMSV9VU0VSTkFNRSBvciBDTE9VRENMSV9QQVNTV09SRCBpcyBlbXB0eTogdGhlIGFwcCBpcyBsb2NrZWQuIFNldCBib3RoIGluIFZhcmlhYmxlcyBhbmQgcmVkZXBsb3kuJyk7Cn0KaWYgKHBhc3N3b3JkLmxlbmd0aCA8IDgpIHNheSgnV2FybmluZzogdGhlIHBhc3N3b3JkIGlzIHNob3J0ZXIgdGhhbiA4IGNoYXJhY3RlcnMuIFNldCBhIGxvbmdlciBDTE9VRENMSV9QQVNTV09SRCBpbiBWYXJpYWJsZXMuJyk7CmlmICghdXNlcikgewogIGRiLnByZXBhcmUoJ0lOU0VSVCBJTlRPIHVzZXJzICh1c2VybmFtZSwgcGFzc3dvcmRfaGFzaCkgVkFMVUVTICg/LCA/KScpLnJ1bih1c2VybmFtZSwgYmNyeXB0Lmhhc2hTeW5jKHBhc3N3b3JkLCAxMikpOwogIHNheShgTG9naW4gIiR7dXNlcm5hbWV9IiBjcmVhdGVkYCk7Cn0gZWxzZSBpZiAodXNlci51c2VybmFtZSAhPT0gdXNlcm5hbWUgfHwgIWJjcnlwdC5jb21wYXJlU3luYyhwYXNzd29yZCwgdXNlci5wYXNzd29yZF9oYXNoKSkgewogIGRiLnByZXBhcmUoJ1VQREFURSB1c2VycyBTRVQgdXNlcm5hbWUgPSA/LCBwYXNzd29yZF9oYXNoID0gPyBXSEVSRSBpZCA9ID8nKS5ydW4odXNlcm5hbWUsIGJjcnlwdC5oYXNoU3luYyhwYXNzd29yZCwgMTIpLCB1c2VyLmlkKTsKICBkYi5wcmVwYXJlKCJERUxFVEUgRlJPTSBhcHBfY29uZmlnIFdIRVJFIGtleSA9ICdqd3Rfc2VjcmV0JyIpLnJ1bigpOwogIHNheShgTG9naW4gY2hhbmdlZCB0byAiJHt1c2VybmFtZX0iIGZyb20gdGhlIGRlcGxveSB2YXJpYWJsZXM7IGV2ZXJ5IGJyb3dzZXIgd2FzIHNpZ25lZCBvdXRgKTsKfSBlbHNlIHsKICBzYXkoYExvZ2luICIke3VzZXJuYW1lfSIgdW5jaGFuZ2VkYCk7Cn0KRU9GCn0KCnN5bmNfbG9naW4KaWYgWyAkPyAtZXEgMyBdOyB0aGVuCiAgIyBGaXJzdCBzdGFydDogbGV0IENsb3VkQ0xJIGNyZWF0ZSBpdHMgZGF0YWJhc2Ugb24gYSBsb29wYmFjay1vbmx5IHBvcnQsIHRoZW4gYWRkIHRoZSBsb2dpbi4KICBsb2cgImNyZWF0aW5nIENsb3VkQ0xJJ3MgZGF0YWJhc2Ugb24gYSBwcml2YXRlIHBvcnQiCiAgJEFTX05PREUgZW52IFNFUlZFUl9QT1JUPTM5ODcxIEhPU1Q9MTI3LjAuMC4xIGNsb3VkY2xpIHN0YXJ0ID4gIiRTVEFURS9maXJzdC1zdGFydC5sb2ciIDI+JjEgJgogIHBpZD0kIQogIGZvciBfIGluICQoc2VxIDEgNjApOyBkbwogICAgY3VybCAtZnMgaHR0cDovLzEyNy4wLjAuMTozOTg3MS9oZWFsdGggPiAvZGV2L251bGwgJiYgYnJlYWsKICAgIGtpbGwgLTAgIiRwaWQiIDI+L2Rldi9udWxsIHx8IGJyZWFrCiAgICBzbGVlcCAxCiAgZG9uZQogIGtpbGwgIiRwaWQiIDI+L2Rldi9udWxsCiAgd2FpdCAiJHBpZCIgMj4vZGV2L251bGwKICBpZiAhIHN5bmNfbG9naW47IHRoZW4KICAgIGxvZyAiY291bGQgbm90IGNyZWF0ZSB0aGUgbG9naW4gKHNlZSAkU1RBVEUvZmlyc3Qtc3RhcnQubG9nKTsgcmV0cnlpbmcgaW4gMzAgc2Vjb25kcyIKICAgIHNsZWVwIDMwCiAgICBleGl0IDEKICBmaQpmaQojIFRoZSB3ZWIgbG9naW4gc3RheXMgb3V0IG9mIHRoZSBlbnZpcm9ubWVudCB0aGF0IHRlcm1pbmFscyBhbmQgYWdlbnRzIGluaGVyaXQuCnVuc2V0IENMT1VEQ0xJX1VTRVJOQU1FIENMT1VEQ0xJX1BBU1NXT1JECgojIGdpdCBhbmQgZ2ggdXNlIHRoZSBvcHRpb25hbCBHaXRIdWIgdG9rZW4gZnJvbSB0aGUgZGVwbG95IGZvcm0uCmlmIFsgLW4gIiRHSF9UT0tFTiIgXSAmJiBbIC1lICIkSC8ubG9jYWwvYmluL2doIiBdOyB0aGVuCiAgYXNfbm9kZSBnaCBhdXRoIHNldHVwLWdpdCA+IC9kZXYvbnVsbCAyPiYxICYmIGxvZyAiZ2l0IHVzZXMgR0hfVE9LRU4gZm9yIGdpdGh1Yi5jb20iCmZpCgojIFVucGFja2luZyBsZWF2ZXMgc2V2ZXJhbCBodW5kcmVkIE1CIG9mIHBhZ2UgY2FjaGUsIHdoaWNoIFJhaWx3YXkncyBtZXRyaWNzIGNvdW50IGFzIG1lbW9yeSB1bnRpbCB0aGUKIyBjb250YWluZXIgcmVzdGFydHMuIERyb3AgdGhlIG5ldyBmaWxlcyBmcm9tIHRoZSBjYWNoZSBpbiB0aGUgYmFja2dyb3VuZCBvbmNlIENsb3VkQ0xJIGhhcyBzdGFydGVkIChkcm9wcGVkCiMgZWFybGllciwgaXRzIG93biBzdGFydCByZWFkcyB0aGVtIGJhY2spOyB0aGV5IGFyZSByZWFkIGJhY2sgd2hlbiB1c2VkLgppZiBbIC1uICIke05FVzotfSIgXTsgdGhlbgogICggc2xlZXAgNjAKICBweXRob24zIC1JIC0gIiROUE1fQ09ORklHX1BSRUZJWCIgIiRILy5sb2NhbC9zaGFyZSIgPDwnRU9GJwppbXBvcnQgb3MsIHN5cwpmb3IgdG9wIGluIHN5cy5hcmd2WzE6XToKICAgIGZvciBmb2xkZXIsIF8sIGZpbGVzIGluIG9zLndhbGsodG9wKToKICAgICAgICBmb3IgbmFtZSBpbiBmaWxlczoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZmQgPSBvcy5vcGVuKG9zLnBhdGguam9pbihmb2xkZXIsIG5hbWUpLCBvcy5PX1JET05MWSB8IG9zLk9fTk9GT0xMT1cpCiAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgb3MuZnN5bmMoZmQpCiAgICAgICAgICAgICAgICBvcy5wb3NpeF9mYWR2aXNlKGZkLCAwLCAwLCBvcy5QT1NJWF9GQURWX0RPTlRORUVEKQogICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgb3MuY2xvc2UoZmQpCkVPRgogICkgJgpmaQoKZXhwb3J0IFNFUlZFUl9QT1JUPSIke1BPUlQ6LTMwMDF9IiBIT1NUPTAuMC4wLjAKbG9nICJzdGFydGluZyBDbG91ZENMSSAkKGFwcF92ZXJzaW9uKSBvbiBwb3J0ICRTRVJWRVJfUE9SVCIKJEFTX05PREUgY2xvdWRjbGkgc3RhcnQgJgpjaGlsZD0kIQojIGJhc2ggc3RheXMgYXMgUElEIDEgc28gcHJvY2Vzc2VzIGxlZnQgYmVoaW5kIGJ5IHRlcm1pbmFscyBhcmUgcmVhcGVkLCBhbmQgcGFzc2VzIFJhaWx3YXkncyBzdG9wIG9uLgp0cmFwICdraWxsIC1URVJNICIkY2hpbGQiIDI+L2Rldi9udWxsJyBURVJNIElOVApzdGF0dXM9MAp3aGlsZSBraWxsIC0wICIkY2hpbGQiIDI+L2Rldi9udWxsOyBkbwogIHdhaXQgIiRjaGlsZCIKICBzdGF0dXM9JD8KZG9uZQpleGl0ICIkc3RhdHVzIgo= | base64 -d > /tmp/start.sh && exec bash /tmp/start.sh\"",
                    "healthcheckPath": "/health",
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "node:22-bookworm"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "description": "CloudCLI's web port. Leave as is.",
                      "defaultValue": "3001"
                    },
                    "GH_TOKEN": {
                      "isOptional": true,
                      "description": "Optional GitHub token, so git and gh can clone and push your private repos. A fine-grained token limited to the repos you work on is safest. You can also run gh auth login in the Shell tab instead.",
                      "defaultValue": ""
                    },
                    "CLOUDCLI_PASSWORD": {
                      "isOptional": false,
                      "description": "Your CloudCLI sign-in password (8 characters or more). To change it later, change it here and redeploy: every browser is then signed out.",
                      "defaultValue": "{{CLOUDCLI_PASSWORD}}"
                    },
                    "CLOUDCLI_USERNAME": {
                      "isOptional": false,
                      "description": "Your CloudCLI sign-in name (3 characters or more). To change it later, change it here and redeploy.",
                      "defaultValue": "{{CLOUDCLI_USERNAME}}"
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>:3001": {
                        "port": 3001
                      }
                    }
                  },
                  "volumeMounts": {
                    "84ceb2c5-8e68-496d-ab4a-0b0cd10c0cba": {
                      "mountPath": "/home/node"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "post_deploy": {
    "healthcheck": {
      "service": "CloudCLI",
      "method": "GET",
      "path": "/health",
      "expect_status": 200
    }
  },
  "resources": {
    "expected_services": 1,
    "needs_volume": true
  },
  "generated_at": "2026-11-01T22:15:09.422Z",
  "generator_version": "0.1.0"
}
