{
  "manifest_version": "1.0.0",
  "template": {
    "id": "3d34edaf-f313-48fa-9b28-be4abb049a27",
    "slug": "lowcoder",
    "name": "Lowcoder | Open-Source Retool Alternative with MongoDB & Redis",
    "description": "Drag-and-drop internal tools, admin panels and dashboards, self-hosted",
    "url": "https://railway.com/deploy/lowcoder",
    "upstream": {
      "image": "lowcoderorg/lowcoder-ce-frontend:2.7.6"
    }
  },
  "status": "unvalidated",
  "validated_at": null,
  "success_rate_30d": null,
  "services": [
    {
      "name": "Redis",
      "source": {
        "image": "redis:8.10.2-alpine"
      },
      "needs_volume": true,
      "volume_mount_path": "/data",
      "http": false
    },
    {
      "name": "lowcoder-node",
      "source": {
        "image": "lowcoderorg/lowcoder-ce-node-service:2.7.6"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "lowcoder-api",
      "source": {
        "image": "lowcoderorg/lowcoder-ce-api-service:2.7.6"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "MongoDB",
      "source": {
        "image": "mongo:7.0.43"
      },
      "needs_volume": true,
      "volume_mount_path": "/data/db",
      "http": false
    },
    {
      "name": "Lowcoder",
      "source": {
        "image": "lowcoderorg/lowcoder-ce-frontend:2.7.6"
      },
      "needs_volume": false,
      "http": true
    }
  ],
  "required_inputs": [
    {
      "key": "REDIS_PASSWORD",
      "service": "Redis",
      "description": "Auto-generated Redis password",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "PORT",
      "service": "lowcoder-node",
      "description": "Port the Node service listens on - leave as is",
      "secret": false,
      "strategy": "default",
      "default": "6060"
    },
    {
      "key": "API_HOST",
      "service": "lowcoder-node",
      "description": "API service on the private network",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "NODE_OPTIONS",
      "service": "lowcoder-node",
      "description": "Node heap cap - the bundled data source plugins need about 300 MB at boot",
      "secret": false,
      "strategy": "default",
      "default": "--max-old-space-size=384"
    },
    {
      "key": "LOWCODER_NODE_SERVICE_SECRET",
      "service": "lowcoder-node",
      "description": "Encrypts data source configs exchanged with the API service (generated)",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "LOWCODER_NODE_SERVICE_SECRET_SALT",
      "service": "lowcoder-node",
      "description": "Salt for the secret above (generated)",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "PORT",
      "service": "lowcoder-api",
      "description": "Port the API service listens on - leave as is",
      "secret": false,
      "strategy": "default",
      "default": "8080"
    },
    {
      "key": "JAVA_OPTS",
      "service": "lowcoder-api",
      "description": "JVM memory caps so the API service fits in 512 MB (Trial). On Hobby you can raise -Xmx (e.g. 768m) for large query results and drop TieredStopAtLevel=1 for full JIT",
      "secret": false,
      "strategy": "default",
      "default": "-Xms64m -Xmx256m -XX:MaxMetaspaceSize=160m -XX:ReservedCodeCacheSize=48m -XX:TieredStopAtLevel=1 -XX:MaxDirectMemorySize=64m -Xss512k -XX:+UseSerialGC"
    },
    {
      "key": "MALLOC_ARENA_MAX",
      "service": "lowcoder-api",
      "description": "Limits glibc malloc arenas - keeps the JVM's native memory small",
      "secret": false,
      "strategy": "default",
      "default": "2"
    },
    {
      "key": "LOWCODER_REDIS_URL",
      "service": "lowcoder-api",
      "description": "Redis on the private network",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "LOWCODER_PUBLIC_URL",
      "service": "lowcoder-api",
      "description": "Public URL of Lowcoder (invite links, emails, OAuth callbacks) - set it to your custom domain after adding one",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "LOWCODER_MONGODB_URL",
      "service": "lowcoder-api",
      "description": "MongoDB on the private network",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "LOWCODER_API_KEY_SECRET",
      "service": "lowcoder-api",
      "description": "Signs personal API keys - changing it invalidates every key",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "LOWCODER_WORKSPACE_MODE",
      "service": "lowcoder-api",
      "description": "SAAS: every sign-up gets its own workspace. ENTERPRISE: everyone joins the first workspace",
      "secret": false,
      "strategy": "default",
      "default": "SAAS"
    },
    {
      "key": "LOWCODER_ADMIN_SMTP_PORT",
      "service": "lowcoder-api",
      "description": "SMTP port",
      "secret": false,
      "strategy": "default",
      "default": "587"
    },
    {
      "key": "LOWCODER_MAX_REQUEST_SIZE",
      "service": "lowcoder-api",
      "description": "Max upload / query request and response size",
      "secret": false,
      "strategy": "default",
      "default": "20m"
    },
    {
      "key": "LOWCODER_NODE_SERVICE_URL",
      "service": "lowcoder-api",
      "description": "Node service (JS execution and data source plugins) on the private network",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "LOWCODER_DB_ENCRYPTION_SALT",
      "service": "lowcoder-api",
      "description": "Salt for the database encryption above - never change it after first boot",
      "secret": false,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "LOWCODER_EMAIL_AUTH_ENABLED",
      "service": "lowcoder-api",
      "description": "Email + password sign-in. Keep true: the web UI hides the login and sign-up forms unless this is exactly true, and the super-admin signs in with it",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "LOWCODER_SUPERUSER_PASSWORD",
      "service": "lowcoder-api",
      "description": "Super-admin password (generated). It is re-applied on every boot, so change it here, not in the UI",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "LOWCODER_SUPERUSER_USERNAME",
      "service": "lowcoder-api",
      "description": "Your email - the super-admin login, created on first boot",
      "secret": false,
      "strategy": "ask_user"
    },
    {
      "key": "LOWCODER_NODE_SERVICE_SECRET",
      "service": "lowcoder-api",
      "description": "Shared with the Node service - encrypts data source configs passed to it",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "LOWCODER_EMAIL_SIGNUP_ENABLED",
      "service": "lowcoder-api",
      "description": "Allow new accounts to sign up with email (needed for invite links). In the default SAAS mode every sign-up gets its own isolated workspace; set false to close sign-ups",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "LOWCODER_DB_ENCRYPTION_PASSWORD",
      "service": "lowcoder-api",
      "description": "Encrypts data source credentials stored in MongoDB. BACK IT UP - changing it makes saved credentials unreadable",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "RAILWAY_HEALTHCHECK_TIMEOUT_SEC",
      "service": "lowcoder-api",
      "description": "First boot runs the MongoDB migrations before the health check can pass",
      "secret": false,
      "strategy": "default",
      "default": "600"
    },
    {
      "key": "LOWCODER_NODE_SERVICE_SECRET_SALT",
      "service": "lowcoder-api",
      "description": "Shared with the Node service",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "MONGO_INITDB_ROOT_PASSWORD",
      "service": "MongoDB",
      "description": "Auto-generated MongoDB root password",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "MONGO_INITDB_ROOT_USERNAME",
      "service": "MongoDB",
      "description": "MongoDB root user",
      "secret": false,
      "strategy": "default",
      "default": "lowcoder"
    },
    {
      "key": "RAILWAY_DEPLOYMENT_DRAINING_SECONDS",
      "service": "MongoDB",
      "description": "Time for MongoDB to shut down cleanly on redeploy",
      "secret": false,
      "strategy": "default",
      "default": "60"
    },
    {
      "key": "PORT",
      "service": "Lowcoder",
      "description": "Port the Lowcoder web server (nginx) listens on - leave as is",
      "secret": false,
      "strategy": "default",
      "default": "3000"
    },
    {
      "key": "LOWCODER_API_SERVICE_URL",
      "service": "Lowcoder",
      "description": "API service on the private network (nginx proxies /api here)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "LOWCODER_MAX_REQUEST_SIZE",
      "service": "Lowcoder",
      "description": "Max upload / request size - keep in sync with the API service",
      "secret": false,
      "strategy": "default",
      "default": "20m"
    },
    {
      "key": "LOWCODER_NODE_SERVICE_URL",
      "service": "Lowcoder",
      "description": "Node service on the private network",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "LOWCODER_MAX_QUERY_TIMEOUT",
      "service": "Lowcoder",
      "description": "Proxy timeout in seconds for long-running queries",
      "secret": false,
      "strategy": "default",
      "default": "120"
    }
  ],
  "deploy": {
    "mcp": {
      "server": "railway",
      "tool": "deploy_template",
      "args": {
        "template_code": "lowcoder"
      }
    },
    "cli": "railway deploy --template lowcoder",
    "api": {
      "method": "POST",
      "path": "/graphql/v2",
      "body": {
        "query": "mutation templateDeploy($input: TemplateDeployV2Input!) { templateDeployV2(input: $input) { projectId workflowId } }",
        "variables": {
          "input": {
            "templateId": "3d34edaf-f313-48fa-9b28-be4abb049a27",
            "serializedConfig": {
              "services": {
                "0e5119ca-f9d7-434a-8b07-85719b7b6a56": {
                  "icon": "https://devicons.railway.app/i/redis.svg",
                  "name": "Redis",
                  "build": {},
                  "deploy": {
                    "startCommand": "/bin/sh -c \"chown -R redis:redis /data && exec docker-entrypoint.sh redis-server --requirepass $REDIS_PASSWORD --appendonly yes\"",
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "redis:8.10.2-alpine"
                  },
                  "variables": {
                    "REDIS_PASSWORD": {
                      "isOptional": false,
                      "description": "Auto-generated Redis password",
                      "defaultValue": "{{REDIS_PASSWORD}}"
                    }
                  },
                  "networking": {
                    "serviceDomains": {}
                  },
                  "volumeMounts": {
                    "482b05f3-75b5-4ccf-969b-5456cd7296c0": {
                      "mountPath": "/data"
                    }
                  }
                },
                "5c578a3f-723d-4b17-9c73-ae1e4c18e979": {
                  "icon": "https://raw.githubusercontent.com/nomideusz/lowcoder-railway/main/icon.svg",
                  "name": "lowcoder-node",
                  "build": {},
                  "deploy": {
                    "startCommand": "/bin/sh -c \"cd /lowcoder/node-service/app && exec gosu lowcoder node ./build/server.js\"",
                    "healthcheckPath": "/",
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "lowcoderorg/lowcoder-ce-node-service:2.7.6"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "description": "Port the Node service listens on - leave as is",
                      "defaultValue": "6060"
                    },
                    "API_HOST": {
                      "isOptional": false,
                      "description": "API service on the private network",
                      "defaultValue": "http://${{lowcoder-api.RAILWAY_PRIVATE_DOMAIN}}:8080"
                    },
                    "NODE_OPTIONS": {
                      "isOptional": false,
                      "description": "Node heap cap - the bundled data source plugins need about 300 MB at boot",
                      "defaultValue": "--max-old-space-size=384"
                    },
                    "LOWCODER_NODE_SERVICE_SECRET": {
                      "isOptional": false,
                      "description": "Encrypts data source configs exchanged with the API service (generated)",
                      "defaultValue": "{{LOWCODER_NODE_SERVICE_SECRET}}"
                    },
                    "LOWCODER_NODE_SERVICE_SECRET_SALT": {
                      "isOptional": false,
                      "description": "Salt for the secret above (generated)",
                      "defaultValue": "{{LOWCODER_NODE_SERVICE_SECRET_SALT}}"
                    }
                  },
                  "networking": {
                    "serviceDomains": {}
                  },
                  "volumeMounts": {}
                },
                "84fc5da9-4ff4-4398-b432-42e2d1da13da": {
                  "icon": "https://raw.githubusercontent.com/nomideusz/lowcoder-railway/main/icon.svg",
                  "name": "lowcoder-api",
                  "build": {},
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": "/api/status/health",
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "lowcoderorg/lowcoder-ce-api-service:2.7.6"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "description": "Port the API service listens on - leave as is",
                      "defaultValue": "8080"
                    },
                    "JAVA_OPTS": {
                      "isOptional": false,
                      "description": "JVM memory caps so the API service fits in 512 MB (Trial). On Hobby you can raise -Xmx (e.g. 768m) for large query results and drop TieredStopAtLevel=1 for full JIT",
                      "defaultValue": "-Xms64m -Xmx256m -XX:MaxMetaspaceSize=160m -XX:ReservedCodeCacheSize=48m -XX:TieredStopAtLevel=1 -XX:MaxDirectMemorySize=64m -Xss512k -XX:+UseSerialGC"
                    },
                    "MALLOC_ARENA_MAX": {
                      "isOptional": false,
                      "description": "Limits glibc malloc arenas - keeps the JVM's native memory small",
                      "defaultValue": "2"
                    },
                    "LOWCODER_REDIS_URL": {
                      "isOptional": false,
                      "description": "Redis on the private network",
                      "defaultValue": "redis://default:${{Redis.REDIS_PASSWORD}}@${{Redis.RAILWAY_PRIVATE_DOMAIN}}:6379"
                    },
                    "LOWCODER_PUBLIC_URL": {
                      "isOptional": false,
                      "description": "Public URL of Lowcoder (invite links, emails, OAuth callbacks) - set it to your custom domain after adding one",
                      "defaultValue": "https://${{Lowcoder.RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "LOWCODER_MONGODB_URL": {
                      "isOptional": false,
                      "description": "MongoDB on the private network",
                      "defaultValue": "mongodb://${{MongoDB.MONGO_INITDB_ROOT_USERNAME}}:${{MongoDB.MONGO_INITDB_ROOT_PASSWORD}}@${{MongoDB.RAILWAY_PRIVATE_DOMAIN}}:27017/lowcoder?authSource=admin"
                    },
                    "LOWCODER_API_KEY_SECRET": {
                      "isOptional": false,
                      "description": "Signs personal API keys - changing it invalidates every key",
                      "defaultValue": "{{LOWCODER_API_KEY_SECRET}}"
                    },
                    "LOWCODER_WORKSPACE_MODE": {
                      "isOptional": false,
                      "description": "SAAS: every sign-up gets its own workspace. ENTERPRISE: everyone joins the first workspace",
                      "defaultValue": "SAAS"
                    },
                    "LOWCODER_ADMIN_SMTP_HOST": {
                      "isOptional": true,
                      "description": "Optional SMTP server for invitation and password-reset emails (Railway allows outbound SMTP on Pro only)",
                      "defaultValue": ""
                    },
                    "LOWCODER_ADMIN_SMTP_PORT": {
                      "isOptional": true,
                      "description": "SMTP port",
                      "defaultValue": "587"
                    },
                    "LOWCODER_MAX_REQUEST_SIZE": {
                      "isOptional": false,
                      "description": "Max upload / query request and response size",
                      "defaultValue": "20m"
                    },
                    "LOWCODER_NODE_SERVICE_URL": {
                      "isOptional": false,
                      "description": "Node service (JS execution and data source plugins) on the private network",
                      "defaultValue": "http://${{lowcoder-node.RAILWAY_PRIVATE_DOMAIN}}:6060"
                    },
                    "LOWCODER_DB_ENCRYPTION_SALT": {
                      "isOptional": false,
                      "description": "Salt for the database encryption above - never change it after first boot",
                      "defaultValue": "{{LOWCODER_DB_ENCRYPTION_SALT}}"
                    },
                    "LOWCODER_EMAIL_AUTH_ENABLED": {
                      "isOptional": false,
                      "description": "Email + password sign-in. Keep true: the web UI hides the login and sign-up forms unless this is exactly true, and the super-admin signs in with it",
                      "defaultValue": "true"
                    },
                    "LOWCODER_SUPERUSER_PASSWORD": {
                      "isOptional": false,
                      "description": "Super-admin password (generated). It is re-applied on every boot, so change it here, not in the UI",
                      "defaultValue": "{{LOWCODER_SUPERUSER_PASSWORD}}"
                    },
                    "LOWCODER_SUPERUSER_USERNAME": {
                      "isOptional": false,
                      "description": "Your email - the super-admin login, created on first boot",
                      "defaultValue": "{{LOWCODER_SUPERUSER_USERNAME}}"
                    },
                    "LOWCODER_ADMIN_SMTP_PASSWORD": {
                      "isOptional": true,
                      "description": "SMTP password",
                      "defaultValue": ""
                    },
                    "LOWCODER_ADMIN_SMTP_USERNAME": {
                      "isOptional": true,
                      "description": "SMTP username",
                      "defaultValue": ""
                    },
                    "LOWCODER_NODE_SERVICE_SECRET": {
                      "isOptional": false,
                      "description": "Shared with the Node service - encrypts data source configs passed to it",
                      "defaultValue": "${{lowcoder-node.LOWCODER_NODE_SERVICE_SECRET}}"
                    },
                    "LOWCODER_EMAIL_SIGNUP_ENABLED": {
                      "isOptional": false,
                      "description": "Allow new accounts to sign up with email (needed for invite links). In the default SAAS mode every sign-up gets its own isolated workspace; set false to close sign-ups",
                      "defaultValue": "true"
                    },
                    "LOWCODER_DB_ENCRYPTION_PASSWORD": {
                      "isOptional": false,
                      "description": "Encrypts data source credentials stored in MongoDB. BACK IT UP - changing it makes saved credentials unreadable",
                      "defaultValue": "{{LOWCODER_DB_ENCRYPTION_PASSWORD}}"
                    },
                    "RAILWAY_HEALTHCHECK_TIMEOUT_SEC": {
                      "isOptional": false,
                      "description": "First boot runs the MongoDB migrations before the health check can pass",
                      "defaultValue": "600"
                    },
                    "LOWCODER_NODE_SERVICE_SECRET_SALT": {
                      "isOptional": false,
                      "description": "Shared with the Node service",
                      "defaultValue": "${{lowcoder-node.LOWCODER_NODE_SERVICE_SECRET_SALT}}"
                    },
                    "LOWCODER_EMAIL_NOTIFICATIONS_SENDER": {
                      "isOptional": true,
                      "description": "Sender address for Lowcoder emails",
                      "defaultValue": ""
                    }
                  },
                  "networking": {
                    "serviceDomains": {}
                  },
                  "volumeMounts": {}
                },
                "910c7225-ae68-46a4-a670-276bf7a739dc": {
                  "icon": "https://devicons.railway.app/i/mongodb.svg",
                  "name": "MongoDB",
                  "build": {},
                  "deploy": {
                    "startCommand": "docker-entrypoint.sh mongod --bind_ip_all --ipv6 --wiredTigerCacheSizeGB 0.25",
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "mongo:7.0.43"
                  },
                  "variables": {
                    "MONGO_INITDB_ROOT_PASSWORD": {
                      "isOptional": false,
                      "description": "Auto-generated MongoDB root password",
                      "defaultValue": "{{MONGO_INITDB_ROOT_PASSWORD}}"
                    },
                    "MONGO_INITDB_ROOT_USERNAME": {
                      "isOptional": false,
                      "description": "MongoDB root user",
                      "defaultValue": "lowcoder"
                    },
                    "RAILWAY_DEPLOYMENT_DRAINING_SECONDS": {
                      "isOptional": false,
                      "description": "Time for MongoDB to shut down cleanly on redeploy",
                      "defaultValue": "60"
                    }
                  },
                  "networking": {
                    "serviceDomains": {}
                  },
                  "volumeMounts": {
                    "ff3af33a-9898-4b1a-b0a6-e5ed4b630180": {
                      "mountPath": "/data/db"
                    }
                  }
                },
                "c51cefc7-bf1a-41b6-bb84-dc535ea47121": {
                  "icon": "https://raw.githubusercontent.com/nomideusz/lowcoder-railway/main/icon.svg",
                  "name": "Lowcoder",
                  "build": {},
                  "deploy": {
                    "startCommand": "/bin/sh -c \"grep -q '^resolver' /etc/nginx/server.conf || { R=$(awk '/^nameserver/{print $2; exit}' /etc/resolv.conf); case $R in *:*) R=[$R];; esac; sed -i -e '1i resolver '$R' valid=10s;' -e 's#proxy_pass __LOWCODER_API_SERVICE_URL__;#set $lc_up __LOWCODER_API_SERVICE_URL__; proxy_pass $lc_up;#' -e 's#proxy_pass __LOWCODER_NODE_SERVICE_URL__;#set $lc_up __LOWCODER_NODE_SERVICE_URL__; proxy_pass $lc_up;#' /etc/nginx/server.conf; }; exec /docker-entrypoint.sh nginx -g 'daemon off;'\"",
                    "healthcheckPath": "/",
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "lowcoderorg/lowcoder-ce-frontend:2.7.6"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "description": "Port the Lowcoder web server (nginx) listens on - leave as is",
                      "defaultValue": "3000"
                    },
                    "LOWCODER_API_SERVICE_URL": {
                      "isOptional": false,
                      "description": "API service on the private network (nginx proxies /api here)",
                      "defaultValue": "http://${{lowcoder-api.RAILWAY_PRIVATE_DOMAIN}}:8080"
                    },
                    "LOWCODER_MAX_REQUEST_SIZE": {
                      "isOptional": false,
                      "description": "Max upload / request size - keep in sync with the API service",
                      "defaultValue": "20m"
                    },
                    "LOWCODER_NODE_SERVICE_URL": {
                      "isOptional": false,
                      "description": "Node service on the private network",
                      "defaultValue": "http://${{lowcoder-node.RAILWAY_PRIVATE_DOMAIN}}:6060"
                    },
                    "LOWCODER_MAX_QUERY_TIMEOUT": {
                      "isOptional": false,
                      "description": "Proxy timeout in seconds for long-running queries",
                      "defaultValue": "120"
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>": {}
                    }
                  },
                  "volumeMounts": {}
                }
              }
            }
          }
        }
      }
    }
  },
  "post_deploy": {
    "healthcheck": {
      "service": "Lowcoder",
      "method": "GET",
      "path": "/",
      "expect_status": 200
    }
  },
  "resources": {
    "expected_services": 5,
    "needs_volume": true
  },
  "generated_at": "2026-10-14T10:14:43.564Z",
  "generator_version": "0.1.0"
}
