{"$schema":"http://json-schema.org/draft-07/schema#","title":"Config","type":"object","required":["environments","target"],"properties":{"owner":{"description":"The owner of the resources that will be created.\n\n| Value         | Description                                                     |\n| ------------- | --------------------------------------------------------------- |\n| `'personal'`  | All resources will be created in the authorizer user's account. |\n| `group: <id>` | All resources will be created in the specified group's account. |\n\n```yaml filename=\"Personal Example (Default)\"\nowner: personal\n```\n\n```yaml filename=\"Group Example\"\nowner:\n  group: 5723117\n```\n","default":"'personal'","oneOf":[{"type":"string","enum":["personal"]},{"type":"object","required":["group"],"properties":{"group":{"type":"integer","format":"uint64","minimum":0,"title":"group"}},"additionalProperties":false}],"x-skip-properties":true,"title":"owner","markdownDescription":"The owner of the resources that will be created.\n\n| Value         | Description                                                     |\n| ------------- | --------------------------------------------------------------- |\n| `'personal'`  | All resources will be created in the authorizer user's account. |\n| `group: <id>` | All resources will be created in the specified group's account. |\n\n**Personal Example (Default):**\n\n    owner: personal\n\n**Group Example:**\n\n    owner:\n      group: 5723117\n"},"payments":{"description":"Determines which account should make payments when creating resources\nthat cost Robux. Note that Mantle will never make purchases unless the\n`--allow-purchases` flag is enabled.\n\n| Value        | Description                                                                                                                                                                                                                                                              |\n| ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |\n| `'owner'`    | All payments will come from the balance of the user or group specified by the [`owner`](#owner) property.                                                                                                                                                                |\n| `'personal'` | All payments will come from the balance of the authorized user.                                                                                                                                                                                                          |\n| `'group'`    | All payments will come from the balance of the group specified by the [`owner`](#owner) property. Payments can only be set to `'group'` when the owner is also set to a group because Roblox does not currently allow groups to pay for resources outside of themselves. |\n","default":"'owner'","type":"string","enum":["owner","personal","group"],"title":"payments","markdownDescription":"Determines which account should make payments when creating resources\nthat cost Robux. Note that Mantle will never make purchases unless the\n`--allow-purchases` flag is enabled.\n\n| Value        | Description                                                                                                                                                                                                                                                                                                                          |\n| ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |\n| `'owner'`    | All payments will come from the balance of the user or group specified by the [`owner`](https://mantledeploy.vercel.app/docs/configuration/reference#owner) property.                                                                                                                                                                |\n| `'personal'` | All payments will come from the balance of the authorized user.                                                                                                                                                                                                                                                                      |\n| `'group'`    | All payments will come from the balance of the group specified by the [`owner`](https://mantledeploy.vercel.app/docs/configuration/reference#owner) property. Payments can only be set to `'group'` when the owner is also set to a group because Roblox does not currently allow groups to pay for resources outside of themselves. |\n"},"environments":{"description":"The list of environments which Mantle can deploy to.\n\n```yaml filename=\"Example\"\nenvironments:\n  - label: staging\n    branches: [dev, dev/*]\n    targetOverrides:\n      configuration:\n        icon: marketing/beta-game-icon.png\n  - label: production\n    branches: [main]\n    targetAccess: public\n```\n","type":"array","items":{"type":"object","required":["label"],"properties":{"label":{"description":"The label of the environment that is used to identify the environment\nvia the `--environment` flag. Must be unique across all environments.\n","type":"string","title":"label","markdownDescription":"The label of the environment that is used to identify the environment\nvia the `--environment` flag. Must be unique across all environments.\n"},"branches":{"description":"An array of file globs to match against Git branches. If the\n`--environment` flag is not specified, Mantle will pick the first\nenvironment which contains a matching file glob for the current Git\nbranch. If no environments match, Mantle will exit with a success code.\n","type":"array","items":{"type":"string"},"title":"branches","markdownDescription":"An array of file globs to match against Git branches. If the\n`--environment` flag is not specified, Mantle will pick the first\nenvironment which contains a matching file glob for the current Git\nbranch. If no environments match, Mantle will exit with a success code.\n"},"tagCommit":{"description":"Whether or not to tag the commit with place file versions after\nsuccessful deployments. It is recommended to only enable this on your\nproduction environment. Tags will be of the format `<label>-v<version>`\nwhere `<label>` is the label of the place and `<version>` is the place's\nRoblox version.\n\nFor example, a start place with Roblox version 23 would have the tag\n`start-v23`.\n","type":"boolean","title":"tagCommit","markdownDescription":"Whether or not to tag the commit with place file versions after\nsuccessful deployments. It is recommended to only enable this on your\nproduction environment. Tags will be of the format `<label>-v<version>`\nwhere `<label>` is the label of the place and `<version>` is the place's\nRoblox version.\n\nFor example, a start place with Roblox version 23 would have the tag\n`start-v23`.\n"},"targetNamePrefix":{"description":"Adds a prefix to the target's name configuration. The implementation is dependent on the\ntarget's type. For Experience targets, all place names will be updated with the prefix.\n\n| Value                | Description                                                                                                                                                                                                                                                                                                                                |\n| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |\n| `'environmentLabel'` | The target name prefix will use the format `[<ENVIRONMENT>] ` where `<ENVIRONMENT>` is the value of the environment's [`label`](#environments--label) property in all caps. For example, if the environment's label was `'dev'` and the target's name was \"Made with Mantle\", the resulting target name will be \"\\[DEV] Made with Mantle\". |\n| `custom: <prefix>`   | The target name prefix will be the supplied value.                                                                                                                                                                                                                                                                                         |\n\n```yaml filename=\"Environment Label Example\"\nenvironments:\n  - label: dev\n    targetNamePrefix: environmentLabel\n  - label: prod\n```\n\n```yaml filename=\"Custom Example\"\nenvironments:\n  - label: dev\n    targetNamePrefix:\n      custom: 'Prefix: '\n  - label: prod\n```\n","oneOf":[{"type":"string","enum":["environmentLabel"]},{"type":"object","required":["custom"],"properties":{"custom":{"type":"string","title":"custom"}},"additionalProperties":false}],"x-skip-properties":true,"title":"targetNamePrefix","markdownDescription":"Adds a prefix to the target's name configuration. The implementation is dependent on the\ntarget's type. For Experience targets, all place names will be updated with the prefix.\n\n| Value                | Description                                                                                                                                                                                                                                                                                                                                                                                            |\n| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |\n| `'environmentLabel'` | The target name prefix will use the format `[<ENVIRONMENT>] ` where `<ENVIRONMENT>` is the value of the environment's [`label`](https://mantledeploy.vercel.app/docs/configuration/reference#environments--label) property in all caps. For example, if the environment's label was `'dev'` and the target's name was \"Made with Mantle\", the resulting target name will be \"\\[DEV] Made with Mantle\". |\n| `custom: <prefix>`   | The target name prefix will be the supplied value.                                                                                                                                                                                                                                                                                                                                                     |\n\n**Environment Label Example:**\n\n    environments:\n      - label: dev\n        targetNamePrefix: environmentLabel\n      - label: prod\n\n**Custom Example:**\n\n    environments:\n      - label: dev\n        targetNamePrefix:\n          custom: 'Prefix: '\n      - label: prod\n"},"targetAccess":{"description":"Overrides the target's access. The implementation is dependent on the\ntarget's type. For Experience targets, the\n[`playability`](#target-experience-configuration-playability) property\nwill be overridden.\n\n| Value       | Description                                                                               |\n| ----------- | ----------------------------------------------------------------------------------------- |\n| `'public'`  | The target will be accessible to all Roblox users.                                        |\n| `'private'` | The target will only be accessible to the authorized user.                                |\n| `'friends'` | The target will only be accessible to the authorized user and that user's Roblox friends. |\n","type":"string","enum":["public","private","friends"],"title":"targetAccess","markdownDescription":"Overrides the target's access. The implementation is dependent on the\ntarget's type. For Experience targets, the\n[`playability`](https://mantledeploy.vercel.app/docs/configuration/reference#target-experience-configuration-playability) property\nwill be overridden.\n\n| Value       | Description                                                                               |\n| ----------- | ----------------------------------------------------------------------------------------- |\n| `'public'`  | The target will be accessible to all Roblox users.                                        |\n| `'private'` | The target will only be accessible to the authorized user.                                |\n| `'friends'` | The target will only be accessible to the authorized user and that user's Roblox friends. |\n"},"targetOverrides":{"description":"Environment-specific overrides for the target resource definition. This\nwill override all configuration, including changes made by the\n[`targetNamePrefix`](#environments--targetnameprefix) and\n[`targetAccess`](#environments--targetaccess) properties.\n\nOverride the target configuration. Should match the type of the target\nconfiguration.\n","anyOf":[{"type":"object","properties":{"configuration":{"description":"The Experience's Roblox configuration.\n\n```yaml filename=\"Example\"\ntarget:\n  experience:\n    configuration:\n      genre: naval\n      playableDevices: [computer]\n      playability: private\n      privateServerPrice: 0\n      enableStudioAccessToApis: true\n      icon: marketing/game-icon.png\n      thumbnails:\n        - marketing/game-thumbnail-fall-update.png\n        - marketing/game-thumbnail-default.png\n```\n\n<Callout type=\"default\">In order to configure the name and description of an experience, use the\n[`name`](#target-experience-places-label-configuration-name) and\n[`description`](#target-experience-places-label-configuration-description)\nproperties of the experience's start place</Callout>\n","type":"object","properties":{"genre":{"description":"The experience's genre.\n","default":"'all'","type":"string","enum":["all","adventure","building","comedy","fighting","fps","horror","medieval","military","naval","rpg","sciFi","sports","townAndCity","western"],"title":"genre","markdownDescription":"The experience's genre.\n"},"playableDevices":{"description":"The devices that the experience can be played on.\n","default":"['computer', 'phone', 'tablet']","type":"array","items":{"type":"string","enum":["computer","phone","tablet","console"]},"title":"playableDevices","markdownDescription":"The devices that the experience can be played on.\n"},"playability":{"description":"Determines who has access to play the experience.\n\n| Value       | Description                                                                                 |\n| ----------- | ------------------------------------------------------------------------------------------- |\n| `'public'`  | The experience will be playable by all Roblox users.                                        |\n| `'private'` | The experience will only be playable by the authorized user.                                |\n| `'friends'` | The experience will only be playable to the authorized user and that user's Roblox friends. |\n","default":"'private'","type":"string","enum":["public","private","friends"],"title":"playability","markdownDescription":"Determines who has access to play the experience.\n\n| Value       | Description                                                                                 |\n| ----------- | ------------------------------------------------------------------------------------------- |\n| `'public'`  | The experience will be playable by all Roblox users.                                        |\n| `'private'` | The experience will only be playable by the authorized user.                                |\n| `'friends'` | The experience will only be playable to the authorized user and that user's Roblox friends. |\n"},"paidAccess":{"description":"Determines whether or not paid access is be enabled, and if it is, how\nmuch it costs. This should not be enabled when\n[`privateServers`](#target-experience-configuration-privateservers) are\nalso enabled as they are incompatible.\n\n| Value            | Description                                                             |\n| ---------------- | ----------------------------------------------------------------------- |\n| `'disabled'`     | Paid access will be disabled.                                           |\n| `price: <price>` | Paid access will be enabled and will cost the provided number of Robux. |\n\n```yaml filename=\"Enabled Example\"\ntarget:\n  experience:\n    configuration:\n      paidAccess:\n        price: 100\n```\n","default":"'disabled'","oneOf":[{"type":"string","enum":["disabled"]},{"type":"object","required":["price"],"properties":{"price":{"type":"integer","format":"uint32","minimum":0,"title":"price"}},"additionalProperties":false}],"x-skip-properties":true,"title":"paidAccess","markdownDescription":"Determines whether or not paid access is be enabled, and if it is, how\nmuch it costs. This should not be enabled when\n[`privateServers`](https://mantledeploy.vercel.app/docs/configuration/reference#target-experience-configuration-privateservers) are\nalso enabled as they are incompatible.\n\n| Value            | Description                                                             |\n| ---------------- | ----------------------------------------------------------------------- |\n| `'disabled'`     | Paid access will be disabled.                                           |\n| `price: <price>` | Paid access will be enabled and will cost the provided number of Robux. |\n\n**Enabled Example:**\n\n    target:\n      experience:\n        configuration:\n          paidAccess:\n            price: 100\n"},"privateServers":{"description":"Determines whether or not private servers are enabled, and if they are,\nhow much they cost. This should not be enabled when\n[`paidAccess`](#target-experience-configuration-paidaccess) is also\nenabled as they are incompatible.\n\n| Value            | Description                                                                 |\n| ---------------- | --------------------------------------------------------------------------- |\n| `'disabled'`     | Private servers will be disabled.                                           |\n| `'free'`         | Private servers will be enabled and will be free to purchase.               |\n| `price: <price>` | Private servers will be enabled and will cost the provided number of Robux. |\n\n```yaml filename=\"Enabled for Free Example\"\ntarget:\n  experience:\n    configuration:\n      privateServers: free\n```\n\n```yaml filename=\"Enabled for Price Example\"\ntarget:\n  experience:\n    configuration:\n      privateServers:\n        price: 100\n```\n","default":"'disabled'","oneOf":[{"type":"string","enum":["disabled","free"]},{"type":"object","required":["price"],"properties":{"price":{"type":"integer","format":"uint32","minimum":0,"title":"price"}},"additionalProperties":false}],"x-skip-properties":true,"title":"privateServers","markdownDescription":"Determines whether or not private servers are enabled, and if they are,\nhow much they cost. This should not be enabled when\n[`paidAccess`](https://mantledeploy.vercel.app/docs/configuration/reference#target-experience-configuration-paidaccess) is also\nenabled as they are incompatible.\n\n| Value            | Description                                                                 |\n| ---------------- | --------------------------------------------------------------------------- |\n| `'disabled'`     | Private servers will be disabled.                                           |\n| `'free'`         | Private servers will be enabled and will be free to purchase.               |\n| `price: <price>` | Private servers will be enabled and will cost the provided number of Robux. |\n\n**Enabled for Free Example:**\n\n    target:\n      experience:\n        configuration:\n          privateServers: free\n\n**Enabled for Price Example:**\n\n    target:\n      experience:\n        configuration:\n          privateServers:\n            price: 100\n"},"enableStudioAccessToApis":{"description":"Whether or not studio should be able to use Roblox APIs for this place.\n","default":"false","type":"boolean","title":"enableStudioAccessToApis","markdownDescription":"Whether or not studio should be able to use Roblox APIs for this place.\n"},"allowThirdPartySales":{"description":"Whether or not this experience should allow third-party sales.\n","default":"false","type":"boolean","title":"allowThirdPartySales","markdownDescription":"Whether or not this experience should allow third-party sales.\n"},"allowThirdPartyTeleports":{"description":"Whether or not this experience should allow third-party teleports.\n","default":"false","type":"boolean","title":"allowThirdPartyTeleports","markdownDescription":"Whether or not this experience should allow third-party teleports.\n"},"avatarType":{"description":"The types of avatars that players can use in this experience.\n","default":"'r15'","type":"string","enum":["r6","r15","playerChoice"],"title":"avatarType","markdownDescription":"The types of avatars that players can use in this experience.\n"},"avatarAnimationType":{"description":"The type of avatar animation that players can use in this experience.\n","default":"'playerChoice'","type":"string","enum":["standard","playerChoice"],"title":"avatarAnimationType","markdownDescription":"The type of avatar animation that players can use in this experience.\n"},"avatarCollisionType":{"description":"The type of avatar collision that players can use in this experience.\n","default":"'outerBox'","type":"string","enum":["outerBox","innerBox"],"title":"avatarCollisionType","markdownDescription":"The type of avatar collision that players can use in this experience.\n"},"avatarScaleConstraints":{"description":"The scale constraints to apply to player avatars in the experience.\nDefaults to Roblox's defaults. Each entry may include a `min`, `max`, or\nboth. If one is excluded, the default will be used.\n\nSupported properties: `bodyType`, `head`, `height`, `proportions`,\n`width`.\n\n```yaml filename=\"Example\"\ntarget:\n  experience:\n    configuration:\n      avatarScaleConstraints:\n        height:\n          min: 0.95\n        width:\n          max: 0.9\n        proportions:\n          min: 30\n          max: 50\n```\n","type":"object","properties":{"height":{"description":"The constraints to apply to the height of the avatar.\n","type":"object","properties":{"min":{"description":"The minimum value (float)\n","type":"number","format":"float","title":"min","markdownDescription":"The minimum value (float)\n"},"max":{"description":"The maximum value (float)\n","type":"number","format":"float","title":"max","markdownDescription":"The maximum value (float)\n"}},"additionalProperties":false,"title":"height","markdownDescription":"The constraints to apply to the height of the avatar.\n"},"width":{"description":"The constraints to apply to the width of the avatar.\n","type":"object","properties":{"min":{"description":"The minimum value (float)\n","type":"number","format":"float","title":"min","markdownDescription":"The minimum value (float)\n"},"max":{"description":"The maximum value (float)\n","type":"number","format":"float","title":"max","markdownDescription":"The maximum value (float)\n"}},"additionalProperties":false,"title":"width","markdownDescription":"The constraints to apply to the width of the avatar.\n"},"head":{"description":"The constraints to apply to the head of the avatar.\n","type":"object","properties":{"min":{"description":"The minimum value (float)\n","type":"number","format":"float","title":"min","markdownDescription":"The minimum value (float)\n"},"max":{"description":"The maximum value (float)\n","type":"number","format":"float","title":"max","markdownDescription":"The maximum value (float)\n"}},"additionalProperties":false,"title":"head","markdownDescription":"The constraints to apply to the head of the avatar.\n"},"bodyType":{"description":"The constraints to apply to the body type of the avatar.\n","type":"object","properties":{"min":{"description":"The minimum value (float)\n","type":"number","format":"float","title":"min","markdownDescription":"The minimum value (float)\n"},"max":{"description":"The maximum value (float)\n","type":"number","format":"float","title":"max","markdownDescription":"The maximum value (float)\n"}},"additionalProperties":false,"title":"bodyType","markdownDescription":"The constraints to apply to the body type of the avatar.\n"},"proportions":{"description":"The constraints to apply to the proportions of the avatar.\n","type":"object","properties":{"min":{"description":"The minimum value (float)\n","type":"number","format":"float","title":"min","markdownDescription":"The minimum value (float)\n"},"max":{"description":"The maximum value (float)\n","type":"number","format":"float","title":"max","markdownDescription":"The maximum value (float)\n"}},"additionalProperties":false,"title":"proportions","markdownDescription":"The constraints to apply to the proportions of the avatar.\n"}},"additionalProperties":false,"x-skip-properties":true,"title":"avatarScaleConstraints","markdownDescription":"The scale constraints to apply to player avatars in the experience.\nDefaults to Roblox's defaults. Each entry may include a `min`, `max`, or\nboth. If one is excluded, the default will be used.\n\nSupported properties: `bodyType`, `head`, `height`, `proportions`,\n`width`.\n\n**Example:**\n\n    target:\n      experience:\n        configuration:\n          avatarScaleConstraints:\n            height:\n              min: 0.95\n            width:\n              max: 0.9\n            proportions:\n              min: 30\n              max: 50\n"},"avatarAssetOverrides":{"description":"The asset overrides to apply to player avatars in the experience.\nDefaults to Roblox's defaults.\n\nSupported properties: `face`, `head`, `leftArm`, `leftLeg`, `rightArm`,\n`rightLeg`, `torso`, `tshirt`, `shirt`, `pants`\n\n```yaml filename=\"Example\"\ntarget:\n  experience:\n    configuration:\n      avatarAssetOverrides:\n        face: 7699174\n        shirt: 5382048848\n        pants: 5611120855\n```\n","type":"object","properties":{"face":{"description":"The asset ID to override the avatar's face.\n","type":"integer","format":"uint64","minimum":0,"title":"face","markdownDescription":"The asset ID to override the avatar's face.\n"},"head":{"description":"The asset ID to override the avatar's head.\n","type":"integer","format":"uint64","minimum":0,"title":"head","markdownDescription":"The asset ID to override the avatar's head.\n"},"torso":{"description":"The asset ID to override the avatar's torso.\n","type":"integer","format":"uint64","minimum":0,"title":"torso","markdownDescription":"The asset ID to override the avatar's torso.\n"},"leftArm":{"description":"The asset ID to override the avatar's left arm.\n","type":"integer","format":"uint64","minimum":0,"title":"leftArm","markdownDescription":"The asset ID to override the avatar's left arm.\n"},"rightArm":{"description":"The asset ID to override the avatar's right arm.\n","type":"integer","format":"uint64","minimum":0,"title":"rightArm","markdownDescription":"The asset ID to override the avatar's right arm.\n"},"leftLeg":{"description":"The asset ID to override the avatar's left leg.\n","type":"integer","format":"uint64","minimum":0,"title":"leftLeg","markdownDescription":"The asset ID to override the avatar's left leg.\n"},"rightLeg":{"description":"The asset ID to override the avatar's right leg.\n","type":"integer","format":"uint64","minimum":0,"title":"rightLeg","markdownDescription":"The asset ID to override the avatar's right leg.\n"},"tshirt":{"description":"The asset ID to override the avatar's t-shirt.\n","type":"integer","format":"uint64","minimum":0,"title":"tshirt","markdownDescription":"The asset ID to override the avatar's t-shirt.\n"},"shirt":{"description":"The asset ID to override the avatar's shirt.\n","type":"integer","format":"uint64","minimum":0,"title":"shirt","markdownDescription":"The asset ID to override the avatar's shirt.\n"},"pants":{"description":"The asset ID to override the avatar's pants.\n","type":"integer","format":"uint64","minimum":0,"title":"pants","markdownDescription":"The asset ID to override the avatar's pants.\n"}},"additionalProperties":false,"x-skip-properties":true,"title":"avatarAssetOverrides","markdownDescription":"The asset overrides to apply to player avatars in the experience.\nDefaults to Roblox's defaults.\n\nSupported properties: `face`, `head`, `leftArm`, `leftLeg`, `rightArm`,\n`rightLeg`, `torso`, `tshirt`, `shirt`, `pants`\n\n**Example:**\n\n    target:\n      experience:\n        configuration:\n          avatarAssetOverrides:\n            face: 7699174\n            shirt: 5382048848\n            pants: 5611120855\n"}},"additionalProperties":false,"title":"configuration","markdownDescription":"The Experience's Roblox configuration.\n\n**Example:**\n\n    target:\n      experience:\n        configuration:\n          genre: naval\n          playableDevices: [computer]\n          playability: private\n          privateServerPrice: 0\n          enableStudioAccessToApis: true\n          icon: marketing/game-icon.png\n          thumbnails:\n            - marketing/game-thumbnail-fall-update.png\n            - marketing/game-thumbnail-default.png\n\n> 💡 In order to configure the name and description of an experience, use the\n> [`name`](https://mantledeploy.vercel.app/docs/configuration/reference#target-experience-places-label-configuration-name) and\n> [`description`](https://mantledeploy.vercel.app/docs/configuration/reference#target-experience-places-label-configuration-description)\n> properties of the experience's start place\n"},"places":{"description":"The experience's places. There must be at least one place supplied with\nthe label `'start'`, which will be used as the start place for the\nexperience.\n\n```yaml filename=\"Example\"\ntarget:\n  experience:\n    places:\n      start:\n        file: game.rbxlx\n        configuration:\n          name: Pirate Wars!\n          description: |-\n            Duke it out on the high seas in your pirate ship!\n\n            🍂 Fall update: new cannons, new ship types!\n          maxPlayerCount: 10\n          serverFill: robloxOptimized\n```\n","type":"object","additionalProperties":{"type":"object","properties":{"file":{"description":"A file path to a Roblox place (either `.rbxl` or `.rbxlx`).\n","type":"string","title":"file","markdownDescription":"A file path to a Roblox place (either `.rbxl` or `.rbxlx`).\n"},"configuration":{"description":"A place's Roblox configuration.\n","type":"object","properties":{"name":{"description":"The display name of the place on the Roblox website and in-game. If the\nplace is an experience's start place, it will be the experience's\ndisplay name as well.\n","default":"'Untitled Game'","type":"string","title":"name","markdownDescription":"The display name of the place on the Roblox website and in-game. If the\nplace is an experience's start place, it will be the experience's\ndisplay name as well.\n"},"description":{"description":"The descirption of the place on the Roblox website and in-game. If the\nplace is an experience's start place, it will be the experience's\ndescription as well.\n","default":"'Created with Mantle'","type":"string","title":"description","markdownDescription":"The descirption of the place on the Roblox website and in-game. If the\nplace is an experience's start place, it will be the experience's\ndescription as well.\n"},"maxPlayerCount":{"description":"The maximum number of players that can be in a server for the place.\n","default":"50","type":"integer","format":"uint32","minimum":0,"title":"maxPlayerCount","markdownDescription":"The maximum number of players that can be in a server for the place.\n"},"allowCopying":{"description":"Whether or not other Roblox users can clone your place.\n","default":"false","type":"boolean","title":"allowCopying","markdownDescription":"Whether or not other Roblox users can clone your place.\n"},"serverFill":{"description":"Determines how Roblox will fill your servers.\n\n| Value                    | Description                                                                          |\n| ------------------------ | ------------------------------------------------------------------------------------ |\n| `'robloxOptimized'`      | Roblox will attempt to automatically leave some space for friends to join.           |\n| `'maximum'`              | Roblox will never leave room for friends to join.                                    |\n| `reservedSlots: <count>` | Roblox will always leave the provided number of slots available for friends to join. |\n\n```yaml filename=\"Maximum Example\"\ntarget:\n  experience:\n    places:\n      start:\n        file: game.rbxlx\n        configuration:\n          serverFill: maximum\n```\n\n```yaml filename=\"Reserved Slots Example\"\ntarget:\n  experience:\n    places:\n      start:\n        file: game.rbxlx\n        configuration:\n          serverFill:\n            reservedSlots: 5\n```\n","default":"'robloxOptimized'","oneOf":[{"type":"string","enum":["robloxOptimized","maximum"]},{"type":"object","required":["reservedSlots"],"properties":{"reservedSlots":{"type":"integer","format":"uint32","minimum":0,"title":"reservedSlots"}},"additionalProperties":false}],"x-skip-properties":true,"title":"serverFill","markdownDescription":"Determines how Roblox will fill your servers.\n\n| Value                    | Description                                                                          |\n| ------------------------ | ------------------------------------------------------------------------------------ |\n| `'robloxOptimized'`      | Roblox will attempt to automatically leave some space for friends to join.           |\n| `'maximum'`              | Roblox will never leave room for friends to join.                                    |\n| `reservedSlots: <count>` | Roblox will always leave the provided number of slots available for friends to join. |\n\n**Maximum Example:**\n\n    target:\n      experience:\n        places:\n          start:\n            file: game.rbxlx\n            configuration:\n              serverFill: maximum\n\n**Reserved Slots Example:**\n\n    target:\n      experience:\n        places:\n          start:\n            file: game.rbxlx\n            configuration:\n              serverFill:\n                reservedSlots: 5\n"}},"additionalProperties":false,"title":"configuration","markdownDescription":"A place's Roblox configuration.\n"}},"additionalProperties":false},"title":"places","markdownDescription":"The experience's places. There must be at least one place supplied with\nthe label `'start'`, which will be used as the start place for the\nexperience.\n\n**Example:**\n\n    target:\n      experience:\n        places:\n          start:\n            file: game.rbxlx\n            configuration:\n              name: Pirate Wars!\n              description: |-\n                Duke it out on the high seas in your pirate ship!\n\n                🍂 Fall update: new cannons, new ship types!\n              maxPlayerCount: 10\n              serverFill: robloxOptimized\n"},"icon":{"description":"A file path to an image that will be used as the experience's icon.\n","type":"string","title":"icon","markdownDescription":"A file path to an image that will be used as the experience's icon.\n"},"thumbnails":{"description":"An array of file paths to images that will be used as the experience's thumbnails. The order\nused here will be the order they appear on the Roblox webpage.\n","type":"array","items":{"type":"string"},"title":"thumbnails","markdownDescription":"An array of file paths to images that will be used as the experience's thumbnails. The order\nused here will be the order they appear on the Roblox webpage.\n"},"socialLinks":{"description":"A list of social links that will appear on the experience's webpage.\n\n```yaml filename=\"Example\"\ntarget:\n  experience:\n    socialLinks:\n      - title: Follow on Twitter\n        url: https://twitter.com/blakemdev\n```\n","type":"array","items":{"type":"object","required":["title","url"],"properties":{"title":{"description":"The display name of the social link on the Roblox website.\n","type":"string","title":"title","markdownDescription":"The display name of the social link on the Roblox website.\n"},"url":{"description":"The URL of the social link. Must be one of the Roblox supported social link types.\n","type":"string","format":"uri","title":"url","markdownDescription":"The URL of the social link. Must be one of the Roblox supported social link types.\n"}},"additionalProperties":false},"title":"socialLinks","markdownDescription":"A list of social links that will appear on the experience's webpage.\n\n**Example:**\n\n    target:\n      experience:\n        socialLinks:\n          - title: Follow on Twitter\n            url: https://twitter.com/blakemdev\n"},"products":{"description":"Products that can be purchased within your experience for Robux.\n\n```yaml filename=\"Example\"\ntarget:\n  experience:\n    products:\n      fiftyGold:\n        name: 50 Gold\n        description: Add 50 gold to your wallet!\n        icon: products/50-gold.png\n        price: 25\n      hundredGold:\n        name: 100 Gold\n        description: Add 100 gold to your wallet!\n        icon: products/100-gold.png\n        price: 45\n```\n\nBecause Roblox does not offer any way to delete developer products, when a product is \"deleted\"\nby Mantle, it is updated in the following ways:\n\n1.  Its description is updated to: `Name: <name>\\nDescription:\\n<description>`\n2.  Its name is updated to `zzz_Deprecated(<date-time>)` where `<date-time>` is the current\n    date-time in `YYYY-MM-DD hh::mm::ss.ns` format.\n","type":"object","additionalProperties":{"type":"object","required":["name","price"],"properties":{"name":{"description":"The display name of the developer product on the Roblox website and in the experience.\n","type":"string","title":"name","markdownDescription":"The display name of the developer product on the Roblox website and in the experience.\n"},"description":{"description":"The description of the developer product on the Roblox website and in the experience.\n","default":"''","type":"string","title":"description","markdownDescription":"The description of the developer product on the Roblox website and in the experience.\n"},"icon":{"description":"A file path to an image to use as the product's icon on the Roblox website and in the\nexperience.\n","type":"string","title":"icon","markdownDescription":"A file path to an image to use as the product's icon on the Roblox website and in the\nexperience.\n"},"price":{"description":"The price of the developer product in Robux.\n","type":"integer","format":"uint32","minimum":0,"title":"price","markdownDescription":"The price of the developer product in Robux.\n"}},"additionalProperties":false},"title":"products","markdownDescription":"Products that can be purchased within your experience for Robux.\n\n**Example:**\n\n    target:\n      experience:\n        products:\n          fiftyGold:\n            name: 50 Gold\n            description: Add 50 gold to your wallet!\n            icon: products/50-gold.png\n            price: 25\n          hundredGold:\n            name: 100 Gold\n            description: Add 100 gold to your wallet!\n            icon: products/100-gold.png\n            price: 45\n\nBecause Roblox does not offer any way to delete developer products, when a product is \"deleted\"\nby Mantle, it is updated in the following ways:\n\n1.  Its description is updated to: `Name: <name>\\nDescription:\\n<description>`\n2.  Its name is updated to `zzz_Deprecated(<date-time>)` where `<date-time>` is the current\n    date-time in `YYYY-MM-DD hh::mm::ss.ns` format.\n"},"passes":{"description":"Passes that can be purchased within your experience for Robux.\n\n```yaml filename=\"Example\"\ntarget:\n  experience:\n    passes:\n      shipOfTheLine:\n        name: Ship of the Line\n        description: Get the best ship in the game!\n        icon: passes/ship-of-the-line.png\n        price: 499\n```\n\nBecause Roblox does not offer any way to delete game passes, when a pass is \"deleted\" by\nMantle, it is updated in the following ways:\n\n1.  Its description is updated to: `Name: <name>\\nPrice: <price>\\nDescription:\\n<description>`\n2.  Its name is updated to `zzz_Deprecated(<date-time>)` where `<date-time>` is the current date-time\n    in `YYYY-MM-DD hh::mm::ss.ns` format.\n","type":"object","additionalProperties":{"type":"object","required":["icon","name"],"properties":{"name":{"description":"The display name of the game pass on the Roblox website and in the experience.\n","type":"string","title":"name","markdownDescription":"The display name of the game pass on the Roblox website and in the experience.\n"},"description":{"description":"The description of the game pass on the Roblox website and in the experience.\n","default":"''","type":"string","title":"description","markdownDescription":"The description of the game pass on the Roblox website and in the experience.\n"},"icon":{"description":"A file path to an image to use as the pass's icon on the Roblox website and in the\nexperience.\n","type":"string","title":"icon","markdownDescription":"A file path to an image to use as the pass's icon on the Roblox website and in the\nexperience.\n"},"price":{"description":"The price of the game pass in Robux. If not specified, the game pass will be off-sale.\n","type":"integer","format":"uint32","minimum":0,"title":"price","markdownDescription":"The price of the game pass in Robux. If not specified, the game pass will be off-sale.\n"}},"additionalProperties":false},"title":"passes","markdownDescription":"Passes that can be purchased within your experience for Robux.\n\n**Example:**\n\n    target:\n      experience:\n        passes:\n          shipOfTheLine:\n            name: Ship of the Line\n            description: Get the best ship in the game!\n            icon: passes/ship-of-the-line.png\n            price: 499\n\nBecause Roblox does not offer any way to delete game passes, when a pass is \"deleted\" by\nMantle, it is updated in the following ways:\n\n1.  Its description is updated to: `Name: <name>\\nPrice: <price>\\nDescription:\\n<description>`\n2.  Its name is updated to `zzz_Deprecated(<date-time>)` where `<date-time>` is the current date-time\n    in `YYYY-MM-DD hh::mm::ss.ns` format.\n"},"badges":{"description":"Badges that can be awarded within your experience.\n\n```yaml filename=\"Example\"\ntarget:\n  experience:\n    badges:\n      captureFirstShip:\n        name: Capture First Ship!\n        description: You captured your first enemy ship!\n        icon: badges/capture-first-ship.png\n```\n\n<Callout type=\"warning\">By default, Mantle does not have permission to make purchases with Robux. Since creating badges\ncosts Robux, you will need to use the `--allow-purchases` flag when you want to create them.</Callout>\n\nBecause Roblox does not offer any way to delete badges, when a badge is \"deleted\" by\nMantle, it is updated in the following ways:\n\n1.  It is disabled\n2.  Its description is updated to: `Name: <name>\\nEnabled: <enabled>\\nDescription:\\n<description>`\n3.  Its name is updated to `zzz_Deprecated(<date-time>)` where `<date-time>` is the current date-time\n    in `YYYY-MM-DD hh::mm::ss.ns` format.\n","type":"object","additionalProperties":{"type":"object","required":["icon","name"],"properties":{"name":{"description":"The display name of the badge on the Roblox website and in the experience.\n","type":"string","title":"name","markdownDescription":"The display name of the badge on the Roblox website and in the experience.\n"},"description":{"description":"The description of the badge on the Roblox website and in the experience.\n","default":"''","type":"string","title":"description","markdownDescription":"The description of the badge on the Roblox website and in the experience.\n"},"icon":{"description":"A file path to an image to use as the badge's icon on the Roblox website and in the\nexperience.\n","type":"string","title":"icon","markdownDescription":"A file path to an image to use as the badge's icon on the Roblox website and in the\nexperience.\n"},"enabled":{"description":"Whether or not the badge is enabled.\n","default":"true","type":"boolean","title":"enabled","markdownDescription":"Whether or not the badge is enabled.\n"}},"additionalProperties":false},"title":"badges","markdownDescription":"Badges that can be awarded within your experience.\n\n**Example:**\n\n    target:\n      experience:\n        badges:\n          captureFirstShip:\n            name: Capture First Ship!\n            description: You captured your first enemy ship!\n            icon: badges/capture-first-ship.png\n\n> ⚠️ By default, Mantle does not have permission to make purchases with Robux. Since creating badges\n> costs Robux, you will need to use the `--allow-purchases` flag when you want to create them.\n\nBecause Roblox does not offer any way to delete badges, when a badge is \"deleted\" by\nMantle, it is updated in the following ways:\n\n1.  It is disabled\n2.  Its description is updated to: `Name: <name>\\nEnabled: <enabled>\\nDescription:\\n<description>`\n3.  Its name is updated to `zzz_Deprecated(<date-time>)` where `<date-time>` is the current date-time\n    in `YYYY-MM-DD hh::mm::ss.ns` format.\n"},"assets":{"description":"A list of assets to include in your experience.\n\nIf set to a string, the value should be a file path or glob to an asset\nor list of assets. The `rbxgameasset` name of each matched file will be\nits file name without the extension. For example,\n`assets/pirate-flag.png` will be given the `rbxgameasset` name\n`pirate-flag` and will be accessible in the experience with\n`rbxgameasset://Images/pirate-flag`.\n\nIf set to an object, `file` should be set to a file path (it will not be\ninterpreted as a glob), and `name` will be the name of the\n`rbxgameasset`.\n\n```yaml filename=\"Example\"\ntarget:\n  experience:\n    assets:\n      - assets/*\n      - file: marketing/icon.png\n        name: game-icon\n```\n\n<Callout type=\"warning\">By default, Mantle does not have permission to make purchases\nwith Robux. Since creating and updating audio assets costs Robux, you\nwill need to use the `--allow-purchases` flag when you want to create or\nupdate them.</Callout>\n\nEach file will be uploaded as the asset type matching its file\nextension. Supported asset types and their file extensions:\n\n| Asset type | File extensions                                 |\n| :--------- | :---------------------------------------------- |\n| Image      | `.bmp`, `.gif`, `.jpeg`, `.jpg`, `.png`, `.tga` |\n| Audio      | `.ogg`, `.mp3`                                  |\n","type":"array","items":{"anyOf":[{"type":"string"},{"type":"object","required":["file","name"],"properties":{"file":{"type":"string","title":"file"},"name":{"type":"string","title":"name"}}}]},"x-skip-properties":true,"title":"assets","markdownDescription":"A list of assets to include in your experience.\n\nIf set to a string, the value should be a file path or glob to an asset\nor list of assets. The `rbxgameasset` name of each matched file will be\nits file name without the extension. For example,\n`assets/pirate-flag.png` will be given the `rbxgameasset` name\n`pirate-flag` and will be accessible in the experience with\n`rbxgameasset://Images/pirate-flag`.\n\nIf set to an object, `file` should be set to a file path (it will not be\ninterpreted as a glob), and `name` will be the name of the\n`rbxgameasset`.\n\n**Example:**\n\n    target:\n      experience:\n        assets:\n          - assets/*\n          - file: marketing/icon.png\n            name: game-icon\n\n> ⚠️ By default, Mantle does not have permission to make purchases\n> with Robux. Since creating and updating audio assets costs Robux, you\n> will need to use the `--allow-purchases` flag when you want to create or\n> update them.\n\nEach file will be uploaded as the asset type matching its file\nextension. Supported asset types and their file extensions:\n\n| Asset type | File extensions                                 |\n| :--------- | :---------------------------------------------- |\n| Image      | `.bmp`, `.gif`, `.jpeg`, `.jpg`, `.png`, `.tga` |\n| Audio      | `.ogg`, `.mp3`                                  |\n"}},"additionalProperties":false}],"x-skip-properties":true,"title":"targetOverrides","markdownDescription":"Environment-specific overrides for the target resource definition. This\nwill override all configuration, including changes made by the\n[`targetNamePrefix`](https://mantledeploy.vercel.app/docs/configuration/reference#environments--targetnameprefix) and\n[`targetAccess`](https://mantledeploy.vercel.app/docs/configuration/reference#environments--targetaccess) properties.\n\nOverride the target configuration. Should match the type of the target\nconfiguration.\n"}},"additionalProperties":false},"title":"environments","markdownDescription":"The list of environments which Mantle can deploy to.\n\n**Example:**\n\n    environments:\n      - label: staging\n        branches: [dev, dev/*]\n        targetOverrides:\n          configuration:\n            icon: marketing/beta-game-icon.png\n      - label: production\n        branches: [main]\n        targetAccess: public\n"},"target":{"description":"Defines the target resource which Mantle will deploy to. Currently\nMantle only supports targeting Experiences, but in the future it will\nsupport other types like Plugins and Models.\n\n```yaml filename=\"Example\"\ntarget:\n  experience: {}\n```\n","oneOf":[{"description":"The target resource will be an Experience.\n","type":"object","required":["experience"],"properties":{"experience":{"type":"object","properties":{"configuration":{"description":"The Experience's Roblox configuration.\n\n```yaml filename=\"Example\"\ntarget:\n  experience:\n    configuration:\n      genre: naval\n      playableDevices: [computer]\n      playability: private\n      privateServerPrice: 0\n      enableStudioAccessToApis: true\n      icon: marketing/game-icon.png\n      thumbnails:\n        - marketing/game-thumbnail-fall-update.png\n        - marketing/game-thumbnail-default.png\n```\n\n<Callout type=\"default\">In order to configure the name and description of an experience, use the\n[`name`](#target-experience-places-label-configuration-name) and\n[`description`](#target-experience-places-label-configuration-description)\nproperties of the experience's start place</Callout>\n","type":"object","properties":{"genre":{"description":"The experience's genre.\n","default":"'all'","type":"string","enum":["all","adventure","building","comedy","fighting","fps","horror","medieval","military","naval","rpg","sciFi","sports","townAndCity","western"],"title":"genre","markdownDescription":"The experience's genre.\n"},"playableDevices":{"description":"The devices that the experience can be played on.\n","default":"['computer', 'phone', 'tablet']","type":"array","items":{"type":"string","enum":["computer","phone","tablet","console"]},"title":"playableDevices","markdownDescription":"The devices that the experience can be played on.\n"},"playability":{"description":"Determines who has access to play the experience.\n\n| Value       | Description                                                                                 |\n| ----------- | ------------------------------------------------------------------------------------------- |\n| `'public'`  | The experience will be playable by all Roblox users.                                        |\n| `'private'` | The experience will only be playable by the authorized user.                                |\n| `'friends'` | The experience will only be playable to the authorized user and that user's Roblox friends. |\n","default":"'private'","type":"string","enum":["public","private","friends"],"title":"playability","markdownDescription":"Determines who has access to play the experience.\n\n| Value       | Description                                                                                 |\n| ----------- | ------------------------------------------------------------------------------------------- |\n| `'public'`  | The experience will be playable by all Roblox users.                                        |\n| `'private'` | The experience will only be playable by the authorized user.                                |\n| `'friends'` | The experience will only be playable to the authorized user and that user's Roblox friends. |\n"},"paidAccess":{"description":"Determines whether or not paid access is be enabled, and if it is, how\nmuch it costs. This should not be enabled when\n[`privateServers`](#target-experience-configuration-privateservers) are\nalso enabled as they are incompatible.\n\n| Value            | Description                                                             |\n| ---------------- | ----------------------------------------------------------------------- |\n| `'disabled'`     | Paid access will be disabled.                                           |\n| `price: <price>` | Paid access will be enabled and will cost the provided number of Robux. |\n\n```yaml filename=\"Enabled Example\"\ntarget:\n  experience:\n    configuration:\n      paidAccess:\n        price: 100\n```\n","default":"'disabled'","oneOf":[{"type":"string","enum":["disabled"]},{"type":"object","required":["price"],"properties":{"price":{"type":"integer","format":"uint32","minimum":0,"title":"price"}},"additionalProperties":false}],"x-skip-properties":true,"title":"paidAccess","markdownDescription":"Determines whether or not paid access is be enabled, and if it is, how\nmuch it costs. This should not be enabled when\n[`privateServers`](https://mantledeploy.vercel.app/docs/configuration/reference#target-experience-configuration-privateservers) are\nalso enabled as they are incompatible.\n\n| Value            | Description                                                             |\n| ---------------- | ----------------------------------------------------------------------- |\n| `'disabled'`     | Paid access will be disabled.                                           |\n| `price: <price>` | Paid access will be enabled and will cost the provided number of Robux. |\n\n**Enabled Example:**\n\n    target:\n      experience:\n        configuration:\n          paidAccess:\n            price: 100\n"},"privateServers":{"description":"Determines whether or not private servers are enabled, and if they are,\nhow much they cost. This should not be enabled when\n[`paidAccess`](#target-experience-configuration-paidaccess) is also\nenabled as they are incompatible.\n\n| Value            | Description                                                                 |\n| ---------------- | --------------------------------------------------------------------------- |\n| `'disabled'`     | Private servers will be disabled.                                           |\n| `'free'`         | Private servers will be enabled and will be free to purchase.               |\n| `price: <price>` | Private servers will be enabled and will cost the provided number of Robux. |\n\n```yaml filename=\"Enabled for Free Example\"\ntarget:\n  experience:\n    configuration:\n      privateServers: free\n```\n\n```yaml filename=\"Enabled for Price Example\"\ntarget:\n  experience:\n    configuration:\n      privateServers:\n        price: 100\n```\n","default":"'disabled'","oneOf":[{"type":"string","enum":["disabled","free"]},{"type":"object","required":["price"],"properties":{"price":{"type":"integer","format":"uint32","minimum":0,"title":"price"}},"additionalProperties":false}],"x-skip-properties":true,"title":"privateServers","markdownDescription":"Determines whether or not private servers are enabled, and if they are,\nhow much they cost. This should not be enabled when\n[`paidAccess`](https://mantledeploy.vercel.app/docs/configuration/reference#target-experience-configuration-paidaccess) is also\nenabled as they are incompatible.\n\n| Value            | Description                                                                 |\n| ---------------- | --------------------------------------------------------------------------- |\n| `'disabled'`     | Private servers will be disabled.                                           |\n| `'free'`         | Private servers will be enabled and will be free to purchase.               |\n| `price: <price>` | Private servers will be enabled and will cost the provided number of Robux. |\n\n**Enabled for Free Example:**\n\n    target:\n      experience:\n        configuration:\n          privateServers: free\n\n**Enabled for Price Example:**\n\n    target:\n      experience:\n        configuration:\n          privateServers:\n            price: 100\n"},"enableStudioAccessToApis":{"description":"Whether or not studio should be able to use Roblox APIs for this place.\n","default":"false","type":"boolean","title":"enableStudioAccessToApis","markdownDescription":"Whether or not studio should be able to use Roblox APIs for this place.\n"},"allowThirdPartySales":{"description":"Whether or not this experience should allow third-party sales.\n","default":"false","type":"boolean","title":"allowThirdPartySales","markdownDescription":"Whether or not this experience should allow third-party sales.\n"},"allowThirdPartyTeleports":{"description":"Whether or not this experience should allow third-party teleports.\n","default":"false","type":"boolean","title":"allowThirdPartyTeleports","markdownDescription":"Whether or not this experience should allow third-party teleports.\n"},"avatarType":{"description":"The types of avatars that players can use in this experience.\n","default":"'r15'","type":"string","enum":["r6","r15","playerChoice"],"title":"avatarType","markdownDescription":"The types of avatars that players can use in this experience.\n"},"avatarAnimationType":{"description":"The type of avatar animation that players can use in this experience.\n","default":"'playerChoice'","type":"string","enum":["standard","playerChoice"],"title":"avatarAnimationType","markdownDescription":"The type of avatar animation that players can use in this experience.\n"},"avatarCollisionType":{"description":"The type of avatar collision that players can use in this experience.\n","default":"'outerBox'","type":"string","enum":["outerBox","innerBox"],"title":"avatarCollisionType","markdownDescription":"The type of avatar collision that players can use in this experience.\n"},"avatarScaleConstraints":{"description":"The scale constraints to apply to player avatars in the experience.\nDefaults to Roblox's defaults. Each entry may include a `min`, `max`, or\nboth. If one is excluded, the default will be used.\n\nSupported properties: `bodyType`, `head`, `height`, `proportions`,\n`width`.\n\n```yaml filename=\"Example\"\ntarget:\n  experience:\n    configuration:\n      avatarScaleConstraints:\n        height:\n          min: 0.95\n        width:\n          max: 0.9\n        proportions:\n          min: 30\n          max: 50\n```\n","type":"object","properties":{"height":{"description":"The constraints to apply to the height of the avatar.\n","type":"object","properties":{"min":{"description":"The minimum value (float)\n","type":"number","format":"float","title":"min","markdownDescription":"The minimum value (float)\n"},"max":{"description":"The maximum value (float)\n","type":"number","format":"float","title":"max","markdownDescription":"The maximum value (float)\n"}},"additionalProperties":false,"title":"height","markdownDescription":"The constraints to apply to the height of the avatar.\n"},"width":{"description":"The constraints to apply to the width of the avatar.\n","type":"object","properties":{"min":{"description":"The minimum value (float)\n","type":"number","format":"float","title":"min","markdownDescription":"The minimum value (float)\n"},"max":{"description":"The maximum value (float)\n","type":"number","format":"float","title":"max","markdownDescription":"The maximum value (float)\n"}},"additionalProperties":false,"title":"width","markdownDescription":"The constraints to apply to the width of the avatar.\n"},"head":{"description":"The constraints to apply to the head of the avatar.\n","type":"object","properties":{"min":{"description":"The minimum value (float)\n","type":"number","format":"float","title":"min","markdownDescription":"The minimum value (float)\n"},"max":{"description":"The maximum value (float)\n","type":"number","format":"float","title":"max","markdownDescription":"The maximum value (float)\n"}},"additionalProperties":false,"title":"head","markdownDescription":"The constraints to apply to the head of the avatar.\n"},"bodyType":{"description":"The constraints to apply to the body type of the avatar.\n","type":"object","properties":{"min":{"description":"The minimum value (float)\n","type":"number","format":"float","title":"min","markdownDescription":"The minimum value (float)\n"},"max":{"description":"The maximum value (float)\n","type":"number","format":"float","title":"max","markdownDescription":"The maximum value (float)\n"}},"additionalProperties":false,"title":"bodyType","markdownDescription":"The constraints to apply to the body type of the avatar.\n"},"proportions":{"description":"The constraints to apply to the proportions of the avatar.\n","type":"object","properties":{"min":{"description":"The minimum value (float)\n","type":"number","format":"float","title":"min","markdownDescription":"The minimum value (float)\n"},"max":{"description":"The maximum value (float)\n","type":"number","format":"float","title":"max","markdownDescription":"The maximum value (float)\n"}},"additionalProperties":false,"title":"proportions","markdownDescription":"The constraints to apply to the proportions of the avatar.\n"}},"additionalProperties":false,"x-skip-properties":true,"title":"avatarScaleConstraints","markdownDescription":"The scale constraints to apply to player avatars in the experience.\nDefaults to Roblox's defaults. Each entry may include a `min`, `max`, or\nboth. If one is excluded, the default will be used.\n\nSupported properties: `bodyType`, `head`, `height`, `proportions`,\n`width`.\n\n**Example:**\n\n    target:\n      experience:\n        configuration:\n          avatarScaleConstraints:\n            height:\n              min: 0.95\n            width:\n              max: 0.9\n            proportions:\n              min: 30\n              max: 50\n"},"avatarAssetOverrides":{"description":"The asset overrides to apply to player avatars in the experience.\nDefaults to Roblox's defaults.\n\nSupported properties: `face`, `head`, `leftArm`, `leftLeg`, `rightArm`,\n`rightLeg`, `torso`, `tshirt`, `shirt`, `pants`\n\n```yaml filename=\"Example\"\ntarget:\n  experience:\n    configuration:\n      avatarAssetOverrides:\n        face: 7699174\n        shirt: 5382048848\n        pants: 5611120855\n```\n","type":"object","properties":{"face":{"description":"The asset ID to override the avatar's face.\n","type":"integer","format":"uint64","minimum":0,"title":"face","markdownDescription":"The asset ID to override the avatar's face.\n"},"head":{"description":"The asset ID to override the avatar's head.\n","type":"integer","format":"uint64","minimum":0,"title":"head","markdownDescription":"The asset ID to override the avatar's head.\n"},"torso":{"description":"The asset ID to override the avatar's torso.\n","type":"integer","format":"uint64","minimum":0,"title":"torso","markdownDescription":"The asset ID to override the avatar's torso.\n"},"leftArm":{"description":"The asset ID to override the avatar's left arm.\n","type":"integer","format":"uint64","minimum":0,"title":"leftArm","markdownDescription":"The asset ID to override the avatar's left arm.\n"},"rightArm":{"description":"The asset ID to override the avatar's right arm.\n","type":"integer","format":"uint64","minimum":0,"title":"rightArm","markdownDescription":"The asset ID to override the avatar's right arm.\n"},"leftLeg":{"description":"The asset ID to override the avatar's left leg.\n","type":"integer","format":"uint64","minimum":0,"title":"leftLeg","markdownDescription":"The asset ID to override the avatar's left leg.\n"},"rightLeg":{"description":"The asset ID to override the avatar's right leg.\n","type":"integer","format":"uint64","minimum":0,"title":"rightLeg","markdownDescription":"The asset ID to override the avatar's right leg.\n"},"tshirt":{"description":"The asset ID to override the avatar's t-shirt.\n","type":"integer","format":"uint64","minimum":0,"title":"tshirt","markdownDescription":"The asset ID to override the avatar's t-shirt.\n"},"shirt":{"description":"The asset ID to override the avatar's shirt.\n","type":"integer","format":"uint64","minimum":0,"title":"shirt","markdownDescription":"The asset ID to override the avatar's shirt.\n"},"pants":{"description":"The asset ID to override the avatar's pants.\n","type":"integer","format":"uint64","minimum":0,"title":"pants","markdownDescription":"The asset ID to override the avatar's pants.\n"}},"additionalProperties":false,"x-skip-properties":true,"title":"avatarAssetOverrides","markdownDescription":"The asset overrides to apply to player avatars in the experience.\nDefaults to Roblox's defaults.\n\nSupported properties: `face`, `head`, `leftArm`, `leftLeg`, `rightArm`,\n`rightLeg`, `torso`, `tshirt`, `shirt`, `pants`\n\n**Example:**\n\n    target:\n      experience:\n        configuration:\n          avatarAssetOverrides:\n            face: 7699174\n            shirt: 5382048848\n            pants: 5611120855\n"}},"additionalProperties":false,"title":"configuration","markdownDescription":"The Experience's Roblox configuration.\n\n**Example:**\n\n    target:\n      experience:\n        configuration:\n          genre: naval\n          playableDevices: [computer]\n          playability: private\n          privateServerPrice: 0\n          enableStudioAccessToApis: true\n          icon: marketing/game-icon.png\n          thumbnails:\n            - marketing/game-thumbnail-fall-update.png\n            - marketing/game-thumbnail-default.png\n\n> 💡 In order to configure the name and description of an experience, use the\n> [`name`](https://mantledeploy.vercel.app/docs/configuration/reference#target-experience-places-label-configuration-name) and\n> [`description`](https://mantledeploy.vercel.app/docs/configuration/reference#target-experience-places-label-configuration-description)\n> properties of the experience's start place\n"},"places":{"description":"The experience's places. There must be at least one place supplied with\nthe label `'start'`, which will be used as the start place for the\nexperience.\n\n```yaml filename=\"Example\"\ntarget:\n  experience:\n    places:\n      start:\n        file: game.rbxlx\n        configuration:\n          name: Pirate Wars!\n          description: |-\n            Duke it out on the high seas in your pirate ship!\n\n            🍂 Fall update: new cannons, new ship types!\n          maxPlayerCount: 10\n          serverFill: robloxOptimized\n```\n","type":"object","additionalProperties":{"type":"object","properties":{"file":{"description":"A file path to a Roblox place (either `.rbxl` or `.rbxlx`).\n","type":"string","title":"file","markdownDescription":"A file path to a Roblox place (either `.rbxl` or `.rbxlx`).\n"},"configuration":{"description":"A place's Roblox configuration.\n","type":"object","properties":{"name":{"description":"The display name of the place on the Roblox website and in-game. If the\nplace is an experience's start place, it will be the experience's\ndisplay name as well.\n","default":"'Untitled Game'","type":"string","title":"name","markdownDescription":"The display name of the place on the Roblox website and in-game. If the\nplace is an experience's start place, it will be the experience's\ndisplay name as well.\n"},"description":{"description":"The descirption of the place on the Roblox website and in-game. If the\nplace is an experience's start place, it will be the experience's\ndescription as well.\n","default":"'Created with Mantle'","type":"string","title":"description","markdownDescription":"The descirption of the place on the Roblox website and in-game. If the\nplace is an experience's start place, it will be the experience's\ndescription as well.\n"},"maxPlayerCount":{"description":"The maximum number of players that can be in a server for the place.\n","default":"50","type":"integer","format":"uint32","minimum":0,"title":"maxPlayerCount","markdownDescription":"The maximum number of players that can be in a server for the place.\n"},"allowCopying":{"description":"Whether or not other Roblox users can clone your place.\n","default":"false","type":"boolean","title":"allowCopying","markdownDescription":"Whether or not other Roblox users can clone your place.\n"},"serverFill":{"description":"Determines how Roblox will fill your servers.\n\n| Value                    | Description                                                                          |\n| ------------------------ | ------------------------------------------------------------------------------------ |\n| `'robloxOptimized'`      | Roblox will attempt to automatically leave some space for friends to join.           |\n| `'maximum'`              | Roblox will never leave room for friends to join.                                    |\n| `reservedSlots: <count>` | Roblox will always leave the provided number of slots available for friends to join. |\n\n```yaml filename=\"Maximum Example\"\ntarget:\n  experience:\n    places:\n      start:\n        file: game.rbxlx\n        configuration:\n          serverFill: maximum\n```\n\n```yaml filename=\"Reserved Slots Example\"\ntarget:\n  experience:\n    places:\n      start:\n        file: game.rbxlx\n        configuration:\n          serverFill:\n            reservedSlots: 5\n```\n","default":"'robloxOptimized'","oneOf":[{"type":"string","enum":["robloxOptimized","maximum"]},{"type":"object","required":["reservedSlots"],"properties":{"reservedSlots":{"type":"integer","format":"uint32","minimum":0,"title":"reservedSlots"}},"additionalProperties":false}],"x-skip-properties":true,"title":"serverFill","markdownDescription":"Determines how Roblox will fill your servers.\n\n| Value                    | Description                                                                          |\n| ------------------------ | ------------------------------------------------------------------------------------ |\n| `'robloxOptimized'`      | Roblox will attempt to automatically leave some space for friends to join.           |\n| `'maximum'`              | Roblox will never leave room for friends to join.                                    |\n| `reservedSlots: <count>` | Roblox will always leave the provided number of slots available for friends to join. |\n\n**Maximum Example:**\n\n    target:\n      experience:\n        places:\n          start:\n            file: game.rbxlx\n            configuration:\n              serverFill: maximum\n\n**Reserved Slots Example:**\n\n    target:\n      experience:\n        places:\n          start:\n            file: game.rbxlx\n            configuration:\n              serverFill:\n                reservedSlots: 5\n"}},"additionalProperties":false,"title":"configuration","markdownDescription":"A place's Roblox configuration.\n"}},"additionalProperties":false},"title":"places","markdownDescription":"The experience's places. There must be at least one place supplied with\nthe label `'start'`, which will be used as the start place for the\nexperience.\n\n**Example:**\n\n    target:\n      experience:\n        places:\n          start:\n            file: game.rbxlx\n            configuration:\n              name: Pirate Wars!\n              description: |-\n                Duke it out on the high seas in your pirate ship!\n\n                🍂 Fall update: new cannons, new ship types!\n              maxPlayerCount: 10\n              serverFill: robloxOptimized\n"},"icon":{"description":"A file path to an image that will be used as the experience's icon.\n","type":"string","title":"icon","markdownDescription":"A file path to an image that will be used as the experience's icon.\n"},"thumbnails":{"description":"An array of file paths to images that will be used as the experience's thumbnails. The order\nused here will be the order they appear on the Roblox webpage.\n","type":"array","items":{"type":"string"},"title":"thumbnails","markdownDescription":"An array of file paths to images that will be used as the experience's thumbnails. The order\nused here will be the order they appear on the Roblox webpage.\n"},"socialLinks":{"description":"A list of social links that will appear on the experience's webpage.\n\n```yaml filename=\"Example\"\ntarget:\n  experience:\n    socialLinks:\n      - title: Follow on Twitter\n        url: https://twitter.com/blakemdev\n```\n","type":"array","items":{"type":"object","required":["title","url"],"properties":{"title":{"description":"The display name of the social link on the Roblox website.\n","type":"string","title":"title","markdownDescription":"The display name of the social link on the Roblox website.\n"},"url":{"description":"The URL of the social link. Must be one of the Roblox supported social link types.\n","type":"string","format":"uri","title":"url","markdownDescription":"The URL of the social link. Must be one of the Roblox supported social link types.\n"}},"additionalProperties":false},"title":"socialLinks","markdownDescription":"A list of social links that will appear on the experience's webpage.\n\n**Example:**\n\n    target:\n      experience:\n        socialLinks:\n          - title: Follow on Twitter\n            url: https://twitter.com/blakemdev\n"},"products":{"description":"Products that can be purchased within your experience for Robux.\n\n```yaml filename=\"Example\"\ntarget:\n  experience:\n    products:\n      fiftyGold:\n        name: 50 Gold\n        description: Add 50 gold to your wallet!\n        icon: products/50-gold.png\n        price: 25\n      hundredGold:\n        name: 100 Gold\n        description: Add 100 gold to your wallet!\n        icon: products/100-gold.png\n        price: 45\n```\n\nBecause Roblox does not offer any way to delete developer products, when a product is \"deleted\"\nby Mantle, it is updated in the following ways:\n\n1.  Its description is updated to: `Name: <name>\\nDescription:\\n<description>`\n2.  Its name is updated to `zzz_Deprecated(<date-time>)` where `<date-time>` is the current\n    date-time in `YYYY-MM-DD hh::mm::ss.ns` format.\n","type":"object","additionalProperties":{"type":"object","required":["name","price"],"properties":{"name":{"description":"The display name of the developer product on the Roblox website and in the experience.\n","type":"string","title":"name","markdownDescription":"The display name of the developer product on the Roblox website and in the experience.\n"},"description":{"description":"The description of the developer product on the Roblox website and in the experience.\n","default":"''","type":"string","title":"description","markdownDescription":"The description of the developer product on the Roblox website and in the experience.\n"},"icon":{"description":"A file path to an image to use as the product's icon on the Roblox website and in the\nexperience.\n","type":"string","title":"icon","markdownDescription":"A file path to an image to use as the product's icon on the Roblox website and in the\nexperience.\n"},"price":{"description":"The price of the developer product in Robux.\n","type":"integer","format":"uint32","minimum":0,"title":"price","markdownDescription":"The price of the developer product in Robux.\n"}},"additionalProperties":false},"title":"products","markdownDescription":"Products that can be purchased within your experience for Robux.\n\n**Example:**\n\n    target:\n      experience:\n        products:\n          fiftyGold:\n            name: 50 Gold\n            description: Add 50 gold to your wallet!\n            icon: products/50-gold.png\n            price: 25\n          hundredGold:\n            name: 100 Gold\n            description: Add 100 gold to your wallet!\n            icon: products/100-gold.png\n            price: 45\n\nBecause Roblox does not offer any way to delete developer products, when a product is \"deleted\"\nby Mantle, it is updated in the following ways:\n\n1.  Its description is updated to: `Name: <name>\\nDescription:\\n<description>`\n2.  Its name is updated to `zzz_Deprecated(<date-time>)` where `<date-time>` is the current\n    date-time in `YYYY-MM-DD hh::mm::ss.ns` format.\n"},"passes":{"description":"Passes that can be purchased within your experience for Robux.\n\n```yaml filename=\"Example\"\ntarget:\n  experience:\n    passes:\n      shipOfTheLine:\n        name: Ship of the Line\n        description: Get the best ship in the game!\n        icon: passes/ship-of-the-line.png\n        price: 499\n```\n\nBecause Roblox does not offer any way to delete game passes, when a pass is \"deleted\" by\nMantle, it is updated in the following ways:\n\n1.  Its description is updated to: `Name: <name>\\nPrice: <price>\\nDescription:\\n<description>`\n2.  Its name is updated to `zzz_Deprecated(<date-time>)` where `<date-time>` is the current date-time\n    in `YYYY-MM-DD hh::mm::ss.ns` format.\n","type":"object","additionalProperties":{"type":"object","required":["icon","name"],"properties":{"name":{"description":"The display name of the game pass on the Roblox website and in the experience.\n","type":"string","title":"name","markdownDescription":"The display name of the game pass on the Roblox website and in the experience.\n"},"description":{"description":"The description of the game pass on the Roblox website and in the experience.\n","default":"''","type":"string","title":"description","markdownDescription":"The description of the game pass on the Roblox website and in the experience.\n"},"icon":{"description":"A file path to an image to use as the pass's icon on the Roblox website and in the\nexperience.\n","type":"string","title":"icon","markdownDescription":"A file path to an image to use as the pass's icon on the Roblox website and in the\nexperience.\n"},"price":{"description":"The price of the game pass in Robux. If not specified, the game pass will be off-sale.\n","type":"integer","format":"uint32","minimum":0,"title":"price","markdownDescription":"The price of the game pass in Robux. If not specified, the game pass will be off-sale.\n"}},"additionalProperties":false},"title":"passes","markdownDescription":"Passes that can be purchased within your experience for Robux.\n\n**Example:**\n\n    target:\n      experience:\n        passes:\n          shipOfTheLine:\n            name: Ship of the Line\n            description: Get the best ship in the game!\n            icon: passes/ship-of-the-line.png\n            price: 499\n\nBecause Roblox does not offer any way to delete game passes, when a pass is \"deleted\" by\nMantle, it is updated in the following ways:\n\n1.  Its description is updated to: `Name: <name>\\nPrice: <price>\\nDescription:\\n<description>`\n2.  Its name is updated to `zzz_Deprecated(<date-time>)` where `<date-time>` is the current date-time\n    in `YYYY-MM-DD hh::mm::ss.ns` format.\n"},"badges":{"description":"Badges that can be awarded within your experience.\n\n```yaml filename=\"Example\"\ntarget:\n  experience:\n    badges:\n      captureFirstShip:\n        name: Capture First Ship!\n        description: You captured your first enemy ship!\n        icon: badges/capture-first-ship.png\n```\n\n<Callout type=\"warning\">By default, Mantle does not have permission to make purchases with Robux. Since creating badges\ncosts Robux, you will need to use the `--allow-purchases` flag when you want to create them.</Callout>\n\nBecause Roblox does not offer any way to delete badges, when a badge is \"deleted\" by\nMantle, it is updated in the following ways:\n\n1.  It is disabled\n2.  Its description is updated to: `Name: <name>\\nEnabled: <enabled>\\nDescription:\\n<description>`\n3.  Its name is updated to `zzz_Deprecated(<date-time>)` where `<date-time>` is the current date-time\n    in `YYYY-MM-DD hh::mm::ss.ns` format.\n","type":"object","additionalProperties":{"type":"object","required":["icon","name"],"properties":{"name":{"description":"The display name of the badge on the Roblox website and in the experience.\n","type":"string","title":"name","markdownDescription":"The display name of the badge on the Roblox website and in the experience.\n"},"description":{"description":"The description of the badge on the Roblox website and in the experience.\n","default":"''","type":"string","title":"description","markdownDescription":"The description of the badge on the Roblox website and in the experience.\n"},"icon":{"description":"A file path to an image to use as the badge's icon on the Roblox website and in the\nexperience.\n","type":"string","title":"icon","markdownDescription":"A file path to an image to use as the badge's icon on the Roblox website and in the\nexperience.\n"},"enabled":{"description":"Whether or not the badge is enabled.\n","default":"true","type":"boolean","title":"enabled","markdownDescription":"Whether or not the badge is enabled.\n"}},"additionalProperties":false},"title":"badges","markdownDescription":"Badges that can be awarded within your experience.\n\n**Example:**\n\n    target:\n      experience:\n        badges:\n          captureFirstShip:\n            name: Capture First Ship!\n            description: You captured your first enemy ship!\n            icon: badges/capture-first-ship.png\n\n> ⚠️ By default, Mantle does not have permission to make purchases with Robux. Since creating badges\n> costs Robux, you will need to use the `--allow-purchases` flag when you want to create them.\n\nBecause Roblox does not offer any way to delete badges, when a badge is \"deleted\" by\nMantle, it is updated in the following ways:\n\n1.  It is disabled\n2.  Its description is updated to: `Name: <name>\\nEnabled: <enabled>\\nDescription:\\n<description>`\n3.  Its name is updated to `zzz_Deprecated(<date-time>)` where `<date-time>` is the current date-time\n    in `YYYY-MM-DD hh::mm::ss.ns` format.\n"},"assets":{"description":"A list of assets to include in your experience.\n\nIf set to a string, the value should be a file path or glob to an asset\nor list of assets. The `rbxgameasset` name of each matched file will be\nits file name without the extension. For example,\n`assets/pirate-flag.png` will be given the `rbxgameasset` name\n`pirate-flag` and will be accessible in the experience with\n`rbxgameasset://Images/pirate-flag`.\n\nIf set to an object, `file` should be set to a file path (it will not be\ninterpreted as a glob), and `name` will be the name of the\n`rbxgameasset`.\n\n```yaml filename=\"Example\"\ntarget:\n  experience:\n    assets:\n      - assets/*\n      - file: marketing/icon.png\n        name: game-icon\n```\n\n<Callout type=\"warning\">By default, Mantle does not have permission to make purchases\nwith Robux. Since creating and updating audio assets costs Robux, you\nwill need to use the `--allow-purchases` flag when you want to create or\nupdate them.</Callout>\n\nEach file will be uploaded as the asset type matching its file\nextension. Supported asset types and their file extensions:\n\n| Asset type | File extensions                                 |\n| :--------- | :---------------------------------------------- |\n| Image      | `.bmp`, `.gif`, `.jpeg`, `.jpg`, `.png`, `.tga` |\n| Audio      | `.ogg`, `.mp3`                                  |\n","type":"array","items":{"anyOf":[{"type":"string"},{"type":"object","required":["file","name"],"properties":{"file":{"type":"string","title":"file"},"name":{"type":"string","title":"name"}}}]},"x-skip-properties":true,"title":"assets","markdownDescription":"A list of assets to include in your experience.\n\nIf set to a string, the value should be a file path or glob to an asset\nor list of assets. The `rbxgameasset` name of each matched file will be\nits file name without the extension. For example,\n`assets/pirate-flag.png` will be given the `rbxgameasset` name\n`pirate-flag` and will be accessible in the experience with\n`rbxgameasset://Images/pirate-flag`.\n\nIf set to an object, `file` should be set to a file path (it will not be\ninterpreted as a glob), and `name` will be the name of the\n`rbxgameasset`.\n\n**Example:**\n\n    target:\n      experience:\n        assets:\n          - assets/*\n          - file: marketing/icon.png\n            name: game-icon\n\n> ⚠️ By default, Mantle does not have permission to make purchases\n> with Robux. Since creating and updating audio assets costs Robux, you\n> will need to use the `--allow-purchases` flag when you want to create or\n> update them.\n\nEach file will be uploaded as the asset type matching its file\nextension. Supported asset types and their file extensions:\n\n| Asset type | File extensions                                 |\n| :--------- | :---------------------------------------------- |\n| Image      | `.bmp`, `.gif`, `.jpeg`, `.jpg`, `.png`, `.tga` |\n| Audio      | `.ogg`, `.mp3`                                  |\n"}},"additionalProperties":false,"title":"experience"}},"additionalProperties":false,"markdownDescription":"The target resource will be an Experience.\n"}],"title":"target","markdownDescription":"Defines the target resource which Mantle will deploy to. Currently\nMantle only supports targeting Experiences, but in the future it will\nsupport other types like Plugins and Models.\n\n**Example:**\n\n    target:\n      experience: {}\n"},"state":{"description":"Defines how Mantle should manage state files (locally or remotely).\n\n| Value              | Description                                                                                                                                                                                                           |\n| ------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `'local'`          | Mantle will save and load its state to and from a local `.mantle-state.yml` file.                                                                                                                                     |\n| `remote: <config>` | Mantle will save and load its state to and from a remote file stored in a cloud provider. Currently the only supported provider is Amazon S3. For more information, see the [Remote State](/docs/remote-state) guide. |\n\n```yaml filename=\"Local State Example (Default)\"\nstate: local\n```\n\n```yaml filename=\"Remote State Example\"\nstate:\n  remote:\n    region: us-west-1\n    bucket: my-mantle-states\n    key: pirate-wars\n```\n","default":"'local'","oneOf":[{"type":"string","enum":["local"]},{"description":"```yaml filename=\"Remote State Example\"\nstate:\n  remote:\n    region: us-west-1\n    bucket: my-mantle-states\n    key: pirate-wars\n```\n","type":"object","required":["remote"],"properties":{"remote":{"type":"object","required":["bucket","key","region"],"properties":{"region":{"description":"The AWS region your S3 bucket is located in. If for some reason you need\nto use a region that is not defined, you can supply a custom one:\n\n```yaml filename=\"Custom Region Example\"\nstate:\n  remote:\n    region:\n      custom:\n        name: region-name\n        endpoint: region-endpoint\n    bucket: my-mantle-states\n    key: pirate-wars\n```\n","oneOf":[{"type":"string","enum":["ap-east-1","ap-northeast-1","ap-northeast-2","ap-northeast-3","ap-south-1","ap-southeast-1","ap-southeast-2","ca-central-1","eu-central-1","eu-west-1","eu-west-2","eu-west-3","eu-north-1","eu-south-1","me-south-1","sa-east-1","us-east-1","us-east-2","us-west-1","us-west-2","us-gov-east-1","us-gov-west-1","cn-north-1","cn-northwest-1","af-south-1"]},{"type":"object","required":["custom"],"properties":{"custom":{"type":"object","required":["endpoint","name"],"properties":{"name":{"type":"string","title":"name"},"endpoint":{"type":"string","title":"endpoint"}},"title":"custom"}},"additionalProperties":false}],"x-skip-properties":true,"title":"region","markdownDescription":"The AWS region your S3 bucket is located in. If for some reason you need\nto use a region that is not defined, you can supply a custom one:\n\n**Custom Region Example:**\n\n    state:\n      remote:\n        region:\n          custom:\n            name: region-name\n            endpoint: region-endpoint\n        bucket: my-mantle-states\n        key: pirate-wars\n"},"bucket":{"description":"The name of your AWS S3 bucket.\n","type":"string","title":"bucket","markdownDescription":"The name of your AWS S3 bucket.\n"},"key":{"description":"The key to use to store your state file. The file will be named with the format\n`<key>.mantle-state.yml`.\n","type":"string","title":"key","markdownDescription":"The key to use to store your state file. The file will be named with the format\n`<key>.mantle-state.yml`.\n"}},"additionalProperties":false,"title":"remote"}},"additionalProperties":false,"markdownDescription":"**Remote State Example:**\n\n    state:\n      remote:\n        region: us-west-1\n        bucket: my-mantle-states\n        key: pirate-wars\n"}],"title":"state","markdownDescription":"Defines how Mantle should manage state files (locally or remotely).\n\n| Value              | Description                                                                                                                                                                                                                                          |\n| ------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `'local'`          | Mantle will save and load its state to and from a local `.mantle-state.yml` file.                                                                                                                                                                    |\n| `remote: <config>` | Mantle will save and load its state to and from a remote file stored in a cloud provider. Currently the only supported provider is Amazon S3. For more information, see the [Remote State](https://mantledeploy.vercel.app/docs/remote-state) guide. |\n\n**Local State Example (Default):**\n\n    state: local\n\n**Remote State Example:**\n\n    state:\n      remote:\n        region: us-west-1\n        bucket: my-mantle-states\n        key: pirate-wars\n"}},"additionalProperties":false}