{"$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```\nowner: personal\n```\n\n**Group Example:**\n\n```\nowner:\n  group: 5723117\n```\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://siriuslatte.github.io/lithos/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://siriuslatte.github.io/lithos/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://siriuslatte.github.io/lithos/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```\nenvironments:\n  - label: dev\n    targetNamePrefix: environmentLabel\n  - label: prod\n```\n\n**Custom Example:**\n\n```\nenvironments:\n  - label: dev\n    targetNamePrefix:\n      custom: 'Prefix: '\n  - label: prod\n```\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://siriuslatte.github.io/lithos/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","vr"]},"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. Must be a minimum of 25. |\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://siriuslatte.github.io/lithos/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. Must be a minimum of 25. |\n\n**Enabled Example:**\n\n```\ntarget:\n  experience:\n    configuration:\n      paidAccess:\n        price: 100\n```\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://siriuslatte.github.io/lithos/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```\ntarget:\n  experience:\n    configuration:\n      privateServers: free\n```\n\n**Enabled for Price Example:**\n\n```\ntarget:\n  experience:\n    configuration:\n      privateServers:\n        price: 100\n```\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```\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"},"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```\ntarget:\n  experience:\n    configuration:\n      avatarAssetOverrides:\n        face: 7699174\n        shirt: 5382048848\n        pants: 5611120855\n```\n"}},"additionalProperties":false,"title":"configuration","markdownDescription":"The Experience's Roblox configuration.\n\n**Example:**\n\n```\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> 💡 In order to configure the name and description of an experience, use the\n> [`name`](https://siriuslatte.github.io/lithos/docs/configuration/reference#target-experience-places-label-configuration-name) and\n> [`description`](https://siriuslatte.github.io/lithos/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```\ntarget:\n  experience:\n    places:\n      start:\n        file: game.rbxlx\n        configuration:\n          serverFill: maximum\n```\n\n**Reserved Slots Example:**\n\n```\ntarget:\n  experience:\n    places:\n      start:\n        file: game.rbxlx\n        configuration:\n          serverFill:\n            reservedSlots: 5\n```\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```\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"},"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```\ntarget:\n  experience:\n    socialLinks:\n      - title: Follow on Twitter\n        url: https://twitter.com/blakemdev\n```\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```\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"},"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```\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"},"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\">Each user can create up to 5 badges for free every day. After that, badges cost 100 Robux each. By\ndefault, Mantle does not have permission to make purchases with Robux, so if you go over your daily\nquota, you will need to use the `--allow-purchases` flag to create them.</Callout>\n\nBecause Roblox does not offer any way to delete badges, when a badge is \"deleted\" by Mantle, it is\nupdated 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```\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> ⚠️ Each user can create up to 5 badges for free every day. After that, badges cost 100 Robux each. By\n> default, Mantle does not have permission to make purchases with Robux, so if you go over your daily\n> quota, you will need to use the `--allow-purchases` flag to create them.\n\nBecause Roblox does not offer any way to delete badges, when a badge is \"deleted\" by Mantle, it is\nupdated 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\">Roblox provides each user a monthly quota of audio uploads. Mantle will let you know each time it\nuploads an audio asset how many uploads you have left and when your quota will reset.</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```\ntarget:\n  experience:\n    assets:\n      - assets/*\n      - file: marketing/icon.png\n        name: game-icon\n```\n\n> ⚠️ Roblox provides each user a monthly quota of audio uploads. Mantle will let you know each time it\n> uploads an audio asset how many uploads you have left and when your quota will reset.\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"},"spatialVoice":{"description":"Spatial voice configuration.\n","type":"object","required":["enabled"],"properties":{"enabled":{"description":"Whether or not spatial voice is enabled for the experience.\n","type":"boolean","title":"enabled","markdownDescription":"Whether or not spatial voice is enabled for the experience.\n"}},"additionalProperties":false,"title":"spatialVoice","markdownDescription":"Spatial voice configuration.\n"},"notifications":{"description":"Notification strings for your experience.\n\nBy default, the name of each notification (which is only visible to you in the creator portal) is set\nto the label of the notification config. You can override this by setting the `name` property.\n\n```yaml filename=\"Example\"\ntarget:\n  experience:\n    notifications:\n      customInvitePrompt:\n        content: '{displayName} is inviting you to join {experienceName}!'\n```\n\n```yaml filename=\"Example with custom name\"\ntarget:\n  experience:\n    notifications:\n      customInvitePrompt:\n        name: Custom Invite Prompt\n        content: '{displayName} is inviting you to join {experienceName}!'\n```\n","type":"object","additionalProperties":{"type":"object","required":["content"],"properties":{"name":{"description":"The display name of the notification string on the Roblox website.\n","type":"string","title":"name","markdownDescription":"The display name of the notification string on the Roblox website.\n"},"content":{"description":"The content of the notification string.\nMust include `{experienceName}` placeholder and may include `{displayName}` placeholder once.\n","type":"string","title":"content","markdownDescription":"The content of the notification string.\nMust include `{experienceName}` placeholder and may include `{displayName}` placeholder once.\n"}},"additionalProperties":false},"title":"notifications","markdownDescription":"Notification strings for your experience.\n\nBy default, the name of each notification (which is only visible to you in the creator portal) is set\nto the label of the notification config. You can override this by setting the `name` property.\n\n**Example:**\n\n```\ntarget:\n  experience:\n    notifications:\n      customInvitePrompt:\n        content: '{displayName} is inviting you to join {experienceName}!'\n```\n\n**Example with custom name:**\n\n```\ntarget:\n  experience:\n    notifications:\n      customInvitePrompt:\n        name: Custom Invite Prompt\n        content: '{displayName} is inviting you to join {experienceName}!'\n```\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://siriuslatte.github.io/lithos/docs/configuration/reference#environments--targetnameprefix) and\n[`targetAccess`](https://siriuslatte.github.io/lithos/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```\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"},"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","vr"]},"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. Must be a minimum of 25. |\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://siriuslatte.github.io/lithos/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. Must be a minimum of 25. |\n\n**Enabled Example:**\n\n```\ntarget:\n  experience:\n    configuration:\n      paidAccess:\n        price: 100\n```\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://siriuslatte.github.io/lithos/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```\ntarget:\n  experience:\n    configuration:\n      privateServers: free\n```\n\n**Enabled for Price Example:**\n\n```\ntarget:\n  experience:\n    configuration:\n      privateServers:\n        price: 100\n```\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```\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"},"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```\ntarget:\n  experience:\n    configuration:\n      avatarAssetOverrides:\n        face: 7699174\n        shirt: 5382048848\n        pants: 5611120855\n```\n"}},"additionalProperties":false,"title":"configuration","markdownDescription":"The Experience's Roblox configuration.\n\n**Example:**\n\n```\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> 💡 In order to configure the name and description of an experience, use the\n> [`name`](https://siriuslatte.github.io/lithos/docs/configuration/reference#target-experience-places-label-configuration-name) and\n> [`description`](https://siriuslatte.github.io/lithos/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```\ntarget:\n  experience:\n    places:\n      start:\n        file: game.rbxlx\n        configuration:\n          serverFill: maximum\n```\n\n**Reserved Slots Example:**\n\n```\ntarget:\n  experience:\n    places:\n      start:\n        file: game.rbxlx\n        configuration:\n          serverFill:\n            reservedSlots: 5\n```\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```\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"},"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```\ntarget:\n  experience:\n    socialLinks:\n      - title: Follow on Twitter\n        url: https://twitter.com/blakemdev\n```\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```\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"},"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```\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"},"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\">Each user can create up to 5 badges for free every day. After that, badges cost 100 Robux each. By\ndefault, Mantle does not have permission to make purchases with Robux, so if you go over your daily\nquota, you will need to use the `--allow-purchases` flag to create them.</Callout>\n\nBecause Roblox does not offer any way to delete badges, when a badge is \"deleted\" by Mantle, it is\nupdated 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```\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> ⚠️ Each user can create up to 5 badges for free every day. After that, badges cost 100 Robux each. By\n> default, Mantle does not have permission to make purchases with Robux, so if you go over your daily\n> quota, you will need to use the `--allow-purchases` flag to create them.\n\nBecause Roblox does not offer any way to delete badges, when a badge is \"deleted\" by Mantle, it is\nupdated 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\">Roblox provides each user a monthly quota of audio uploads. Mantle will let you know each time it\nuploads an audio asset how many uploads you have left and when your quota will reset.</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```\ntarget:\n  experience:\n    assets:\n      - assets/*\n      - file: marketing/icon.png\n        name: game-icon\n```\n\n> ⚠️ Roblox provides each user a monthly quota of audio uploads. Mantle will let you know each time it\n> uploads an audio asset how many uploads you have left and when your quota will reset.\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"},"spatialVoice":{"description":"Spatial voice configuration.\n","type":"object","required":["enabled"],"properties":{"enabled":{"description":"Whether or not spatial voice is enabled for the experience.\n","type":"boolean","title":"enabled","markdownDescription":"Whether or not spatial voice is enabled for the experience.\n"}},"additionalProperties":false,"title":"spatialVoice","markdownDescription":"Spatial voice configuration.\n"},"notifications":{"description":"Notification strings for your experience.\n\nBy default, the name of each notification (which is only visible to you in the creator portal) is set\nto the label of the notification config. You can override this by setting the `name` property.\n\n```yaml filename=\"Example\"\ntarget:\n  experience:\n    notifications:\n      customInvitePrompt:\n        content: '{displayName} is inviting you to join {experienceName}!'\n```\n\n```yaml filename=\"Example with custom name\"\ntarget:\n  experience:\n    notifications:\n      customInvitePrompt:\n        name: Custom Invite Prompt\n        content: '{displayName} is inviting you to join {experienceName}!'\n```\n","type":"object","additionalProperties":{"type":"object","required":["content"],"properties":{"name":{"description":"The display name of the notification string on the Roblox website.\n","type":"string","title":"name","markdownDescription":"The display name of the notification string on the Roblox website.\n"},"content":{"description":"The content of the notification string.\nMust include `{experienceName}` placeholder and may include `{displayName}` placeholder once.\n","type":"string","title":"content","markdownDescription":"The content of the notification string.\nMust include `{experienceName}` placeholder and may include `{displayName}` placeholder once.\n"}},"additionalProperties":false},"title":"notifications","markdownDescription":"Notification strings for your experience.\n\nBy default, the name of each notification (which is only visible to you in the creator portal) is set\nto the label of the notification config. You can override this by setting the `name` property.\n\n**Example:**\n\n```\ntarget:\n  experience:\n    notifications:\n      customInvitePrompt:\n        content: '{displayName} is inviting you to join {experienceName}!'\n```\n\n**Example with custom name:**\n\n```\ntarget:\n  experience:\n    notifications:\n      customInvitePrompt:\n        name: Custom Invite Prompt\n        content: '{displayName} is inviting you to join {experienceName}!'\n```\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```\ntarget:\n  experience: {}\n```\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| `localKey: <key>`  | Mantle will save and load its state to and from a local file using the provided key with the format `<key>.mantle-state.yml`.                                                                                         |\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=\"Custom Local State Example\"\nstate:\n  localKey: pirate-wars\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"]},{"type":"object","required":["localKey"],"properties":{"localKey":{"type":"string","title":"localKey"}},"additionalProperties":false},{"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```\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"},"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}],"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| `localKey: <key>`  | Mantle will save and load its state to and from a local file using the provided key with the format `<key>.mantle-state.yml`.                                                                                                                             |\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://siriuslatte.github.io/lithos/docs/remote-state) guide. |\n\n**Local State Example (Default):**\n\n```\nstate: local\n```\n\n**Custom Local State Example:**\n\n```\nstate:\n  localKey: pirate-wars\n```\n\n**Remote State Example:**\n\n```\nstate:\n  remote:\n    region: us-west-1\n    bucket: my-mantle-states\n    key: pirate-wars\n```\n"}},"additionalProperties":false}