{
  "manifest_version": "1.0.0",
  "template": {
    "id": "d8073237-65ac-4e75-9c01-be244de69411",
    "slug": "boopity",
    "name": "Boopity",
    "description": "Bookings, clients, pets and payments for independent pet sitters",
    "url": "https://railway.com/deploy/boopity",
    "upstream": {
      "image": "ghcr.io/artwork-not-final/boopity@sha256:70407d584f7d8fc9b3df673996e4fcdf82a194ecd3bff07a44c2f118ecec763a"
    }
  },
  "services": [
    {
      "name": "Boopity",
      "source": {
        "image": "ghcr.io/artwork-not-final/boopity@sha256:70407d584f7d8fc9b3df673996e4fcdf82a194ecd3bff07a44c2f118ecec763a"
      },
      "needs_volume": true,
      "volume_mount_path": "/data",
      "http": true
    }
  ],
  "required_inputs": [
    {
      "key": "PORT",
      "service": "Boopity",
      "description": "Internal app port. Leave this as 3000.",
      "secret": false,
      "strategy": "default",
      "default": "3000"
    },
    {
      "key": "APP_URL",
      "service": "Boopity",
      "description": "Your website address, filled in automatically by Railway.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "DATA_DIR",
      "service": "Boopity",
      "description": "Where Boopity saves records on the included data volume. Leave unchanged.",
      "secret": false,
      "strategy": "default",
      "default": "/data/boopity"
    },
    {
      "key": "RAILWAY_RUN_UID",
      "service": "Boopity",
      "description": "Prepares the data volume, then runs Boopity as a non-root user. Leave unchanged.",
      "secret": false,
      "strategy": "default",
      "default": "0"
    }
  ],
  "deploy": {
    "mcp": {
      "server": "railway",
      "tool": "deploy_template",
      "args": {
        "template_code": "boopity"
      }
    },
    "cli": "railway deploy --template boopity",
    "api": {
      "method": "POST",
      "path": "/graphql/v2",
      "body": {
        "query": "mutation templateDeploy($input: TemplateDeployV2Input!) { templateDeployV2(input: $input) { projectId workflowId } }",
        "variables": {
          "input": {
            "templateId": "d8073237-65ac-4e75-9c01-be244de69411",
            "serializedConfig": {
              "services": {
                "ac9ed634-f767-407c-bdbf-8b0b30e3ad12": {
                  "name": "Boopity",
                  "deploy": {
                    "startCommand": "node --input-type=module -e 'import {constants,mkdirSync,openSync,fchownSync,fchmodSync,closeSync} from \"node:fs\";const d=\"/data/boopity\";if(process.env.DATA_DIR!==d)throw Error(\"Unexpected data directory\");if(process.getuid()===0){try{mkdirSync(d,{mode:448})}catch(e){if(e.code!==\"EEXIST\")throw e}const fd=openSync(d,constants.O_RDONLY|constants.O_DIRECTORY|constants.O_NOFOLLOW);try{fchownSync(fd,1000,1000);fchmodSync(fd,448)}finally{closeSync(fd)}process.setgroups([]);process.setgid(1000);process.setuid(1000)}if(process.getuid()!==1000||process.getgid()!==1000)throw Error(\"Boopity must run as UID/GID 1000\");await import(\"/app/dist/server/index.mjs\");'"
                  },
                  "source": {
                    "image": "ghcr.io/artwork-not-final/boopity@sha256:70407d584f7d8fc9b3df673996e4fcdf82a194ecd3bff07a44c2f118ecec763a"
                  },
                  "variables": {
                    "PORT": {
                      "description": "Internal app port. Leave this as 3000.",
                      "defaultValue": "3000"
                    },
                    "APP_URL": {
                      "description": "Your website address, filled in automatically by Railway.",
                      "defaultValue": "https://${{RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "DATA_DIR": {
                      "description": "Where Boopity saves records on the included data volume. Leave unchanged.",
                      "defaultValue": "/data/boopity"
                    },
                    "RAILWAY_RUN_UID": {
                      "description": "Prepares the data volume, then runs Boopity as a non-root user. Leave unchanged.",
                      "defaultValue": "0"
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>:3000": {
                        "port": 3000
                      }
                    }
                  },
                  "volumeMounts": {
                    "ac9ed634-f767-407c-bdbf-8b0b30e3ad12": {
                      "mountPath": "/data"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "post_deploy": {},
  "resources": {
    "expected_services": 1,
    "needs_volume": true
  },
  "generated_at": "2026-10-10T22:14:40.111Z",
  "generator_version": "0.1.0",
  "status": "validated",
  "validated_at": "2026-10-10T22:09:37.642Z",
  "success_rate_30d": 1,
  "validation": {
    "last_run_id": "run_3d6b64af827d4337b20a",
    "checks": [
      {
        "name": "workflow_completed",
        "passed": true
      },
      {
        "name": "all_services_deployed",
        "passed": true
      },
      {
        "name": "stays_up",
        "passed": true
      }
    ],
    "typical_ready_seconds": 17,
    "typical_build_seconds": 0,
    "typical_start_seconds": 0,
    "slowest_service": "Boopity"
  }
}
