{"$schema":"https://json-schema.org/draft/2020-12/schema","$id":"https://3000cloud.com/schema/v1.json","title":"3000cloud.json","description":"Deployment manifest for 3000cloud. Structural subset — the deploy API additionally enforces cross-field rules (web services bind $PORT, egress entries are FQDNs, SQLite needs a /data volume, ...).","type":"object","properties":{"schemaVersion":{"type":"number","const":1},"name":{"type":"string","pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$","description":"App name — becomes the <name>.3000cloud.app subdomain. pick a name that describes the app itself (e.g. \"acme-notes\", \"team-wiki\") — names that impersonate the platform, its sign-in, billing, support or infrastructure surfaces, or a well-known provider, are reserved because every app is served at <name>.3000cloud.app","not":{"anyOf":[{"enum":["account","accounts","auth","authorize","id","identity","login","logout","mfa","oauth","oidc","password","passwords","profile","register","reset","secure","session","signin","signon","signout","signup","sso","token","tokens","user","users","verify","bill","billing","checkout","invoice","invoices","pay","payment","payments","plan","plans","price","pricing","purchase","refund","subscribe","subscription","upgrade","wallet","abuse","contact","feedback","help","legal","privacy","report","security","support","terms","tos","trust","changelog","docs","documentation","faq","landing","reference","schema","www","admin","administrator","api","app","apps","console","dashboard","manage","mcp","operator","owner","panel","platform","portal","root","settings","sudo","system","webmaster","assets","backup","beta","cdn","ci","cluster","control","ctrl","demo","dev","edge","email","gateway","health","infra","ingress","internal","kube","kubernetes","local","localhost","logs","mail","metrics","monitoring","mx","nameserver","ns","ns1","ns2","ops","preview","prod","production","proxy","registry","sandbox","smtp","stage","staging","static","status","storage","test","testing","vpn","webhook","webhooks"]},{"pattern":"3000cloud"},{"pattern":"cloudflare"},{"pattern":"google"},{"pattern":"stripe"},{"pattern":"twilio"}]}},"region":{"default":"us","type":"string","enum":["us","eu"]},"services":{"minItems":1,"maxItems":5,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$"},"type":{"default":"web","type":"string","enum":["web","worker","static"]},"root":{"type":"string","minLength":1,"maxLength":256},"runtime":{"type":"object","propertyNames":{"type":"string","pattern":"^(node|python|go|ruby|php|java|rust|bun|deno|elixir)$"},"additionalProperties":{"type":"string","pattern":"^\\d+(\\.\\d+){0,2}$"}},"packageManager":{"type":"string","enum":["pip","uv","poetry","pipenv","npm","pnpm","yarn","bun"]},"aptPackages":{"maxItems":50,"type":"array","items":{"type":"string","pattern":"^[a-z0-9][a-z0-9+.-]*$"}},"install":{"type":"string","minLength":1,"maxLength":4096},"build":{"type":"string","minLength":1,"maxLength":4096},"start":{"type":"string","minLength":1,"maxLength":4096},"port":{"type":"integer","minimum":1,"maximum":65535},"healthCheckPath":{"type":"string","maxLength":256,"pattern":"^\\/\\S*$"},"preDeploy":{"type":"string","minLength":1,"maxLength":4096},"framework":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]*$"},"static":{"type":"object","properties":{"dir":{"type":"string","minLength":1,"maxLength":256},"urlPrefix":{"default":"/","type":"string","maxLength":256,"pattern":"^\\/\\S*$"}},"required":["dir"],"additionalProperties":false}},"required":["name"],"additionalProperties":false}},"env":{"type":"object","propertyNames":{"type":"string","pattern":"^[A-Z_][A-Z0-9_]*$"},"additionalProperties":{"type":"object","properties":{"description":{"type":"string","maxLength":500},"value":{"type":"string","maxLength":4096},"required":{"type":"boolean"},"generator":{"type":"string","const":"secret"},"fromDatabase":{"type":"boolean"}},"additionalProperties":false}},"volumes":{"maxItems":4,"type":"array","items":{"type":"object","properties":{"mountPath":{"type":"string","maxLength":256},"sizeGB":{"type":"integer","minimum":1,"maximum":500}},"required":["mountPath","sizeGB"],"additionalProperties":false}},"db":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"sqlite"},"path":{"default":"/data/app.db","type":"string","maxLength":256,"pattern":"^\\/data\\/\\S+$"}},"required":["kind"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"postgres"}},"required":["kind"],"additionalProperties":false}]},"cron":{"maxItems":20,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$"},"schedule":{"type":"string"},"command":{"type":"string","minLength":1,"maxLength":4096},"deadline":{"type":"integer","minimum":1,"maximum":86400}},"required":["name","schedule","command"],"additionalProperties":false}},"egress":{"default":[],"maxItems":100,"type":"array","items":{"type":"string","minLength":1}},"access":{"default":{"mode":"secret-link"},"type":"object","properties":{"mode":{"type":"string","enum":["public","secret-link","password","oidc-allowlist"]},"allow":{"maxItems":200,"type":"array","items":{"type":"string"}},"requestAccess":{"type":"boolean"}},"required":["mode"],"additionalProperties":false},"resources":{"default":{"tier":"starter"},"type":"object","properties":{"tier":{"type":"string","enum":["starter","base","plus","pro"]}},"required":["tier"],"additionalProperties":false},"lockfileHashes":{"type":"object","propertyNames":{"type":"string","minLength":1,"maxLength":256},"additionalProperties":{"type":"string","pattern":"^sha256:[0-9a-f]{64}$"}}},"required":["schemaVersion","name","services"],"additionalProperties":false}