> For the complete documentation index, see [llms.txt](https://docs.xandtech.fr/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.xandtech.fr/home/xstash/reference/configuration-files.md).

# Default Configuration Files

Full contents of every config file XStash ships by default, for reference. These are generated the first time the plugin starts (see [Installation & Setup](/home/xstash/getting-started/getting-started.md)) — copy from here if you ever need to restore a default.

{% hint style="info" %}
`lang/messages_en.yml`, `lang/messages_fr.yml` and `plugin.yml` aren't included here since they aren't meant to be tuned like the files below — see [Installation & Setup](/home/xstash/getting-started/getting-started.md#language) for translations.
{% endhint %}

## Root

### config.yml

```yaml
# ============================================================
#                        XStash
#         Multi-module virtual storage - General config
# ============================================================

# Language used for the plugin messages.
# Files available by default: en, fr (in the /plugins/XStash/lang/ folder)
# You can add your own translations by following the same format.
language: en

# ------------------------------------------------------------
# Modules - master toggle per XStash feature. A disabled module isn't loaded at
# all (its commands/listeners are skipped). Each module keeps its own settings
# in its own subfolder (e.g. chests/config.yml), so nothing is lost by turning
# it back on later.
# ------------------------------------------------------------
modules:
  # Virtual chests: see chests/config.yml, chests/menus.yml, chests/icons.yml,
  # chests/chest-prices.yml and chests/blocked-items.yml. Includes the travel
  # backpack shortcut (chests/config.yml "travel-backpack").
  chests:
    enabled: true

  # Hypixel SkyBlock-style sacks: see sacks/sacks.yml (catalog: as many sacks and upgrade
  # tiers as you want, each with its own craftable item), sacks/config.yml (Sack of Sacks,
  # auto-collect) and sacks/menus.yml. Requires "chests" above to also be enabled - sacks
  # reuse its storage connection instead of opening a second one to the same database.
  sacks:
    enabled: true

# ------------------------------------------------------------
# Custom command names - "/xstash" (virtual chests) and "/sacks" (Sack of Sacks) always work
# no matter what, exactly as declared in plugin.yml. This section only adds EXTRA names for
# the same two commands (e.g. add "chests" below to also allow "/chests"). Free to edit,
# reorder, or empty out entirely - e.g. replace "storage" with "chests" to rename that alias.
# Applied live, including on "/xstash reload" (no server restart needed).
# ------------------------------------------------------------
commands:
  chests:
    aliases: [ xs, storage ]
  sacks:
    aliases: [ sack, sos ]

# ------------------------------------------------------------
# Storage backend - shared by every enabled module.
# ------------------------------------------------------------
storage:
  # Storage type used for player data.
  # Possible values: YAML, SQLITE, MYSQL
  type: SQLITE

  mysql:
    host: localhost
    port: 3306
    database: xstash
    username: root
    password: ""
    useSSL: false
    # Connection pool size (HikariCP)
    pool-size: 10
```

### sell-prices.yml

```yaml
# ============================================================
#                        XStash
#                   Per-item sell prices
# ============================================================
# Shared by the chest utility bar's "Sell all" button (see chests/config.yml
# "utility-bar.sell-all" and menus.yml "chest.utility-bar.sell-all") AND each sack's own "Quick
# sell" button (see sacks/config.yml "quick-sell" and sacks/menus/<id>.yml "sell-enabled") - both
# pay a player for every item that has a price listed below. Items with no entry here are simply
# skipped, never sold for 0.
#
# "material" is any Bukkit Material name (e.g. IRON_INGOT, DIAMOND, COBBLESTONE).
# "currency" is "money" (Vault) or "points" (PlayerPoints).
# "amount" is the price PER ITEM (multiplied by the stack size when sold).
#
# Renamed/custom items (unique drops, gifted items...) are never matched, even if their
# material has a price here - only plain, unmodified stacks are sold. This also means a sack
# item matched by Custom Model Data ("MATERIAL:cmd"), a PersistentDataContainer tag ("pdc:...")
# or an ExecutableItems id ("ei:...") is never sellable this way, regardless of "material".
#
# Example (uncomment and adjust to your economy):
# prices:
#   - material: COBBLESTONE
#     currency: money
#     amount: 1
#
#   - material: IRON_INGOT
#     currency: money
#     amount: 5
#
#   - material: DIAMOND
#     currency: points
#     amount: 50

prices: []

# ------------------------------------------------------------------
# Shop plugin fallback - only ever used for a material that has NO entry in "prices" above.
# Lets a server that already has its economy configured in one of these plugins skip listing
# every item twice; anything you DO list above always wins regardless of what the shop plugin
# says. Only ever active for a plugin you actually have installed - completely inert otherwise.
#
# Supported: essentials (worth.yml, via "/worth" - by far the most common, most servers already
# have this filled in), shopguiplus, economyshopgui, guishop, royaleeconomy. NOT QuickShop: it's
# built around player-run chest shops with no single global price per item (two players can sell
# the same material at two different prices), which doesn't fit "the sell price of X" at all.
#
# "economyshopgui"/"guishop"/"royaleeconomy" are best-effort integrations (no single stable
# documented API the way essentials/shopguiplus have) - check the server log on startup for a
# line confirming which class/method actually resolved, or a warning that none did.
shop-integration:
  enabled: false
  # Currency for a price coming from a shop plugin (they only ever give a raw number, no
  # currency of their own) - "money" (Vault) or "points" (PlayerPoints).
  currency: money
  # Tried in this order, first one installed AND that knows the item wins. Remove/reorder freely.
  order:
    - essentials
    - shopguiplus
    - economyshopgui
    - guishop
    - royaleeconomy

# ------------------------------------------------------------------
# Sell boost - a permission-driven bonus on top of whatever price was found above (from "prices"
# or a shop plugin), e.g. as a VIP perk. Grant "xstash.sell.boost.<percent>" (e.g.
# "xstash.sell.boost.10" for +10%) - same "highest permission wins" rule as
# "xstash.number_chest.<n>"/"xstash.number_row.<n>" (see PermissionUtil), NOT additive: a player
# with both +10% and +25% gets +25%, not +35%.
sell-boost:
  # Safety cap - a misconfigured node can never grant more than this, no matter how high its
  # own number is.
  max-percent: 100
```

## Chests Module

### chests/config.yml

```yaml
# ============================================================
#              XStash - chests module settings
#  (toggled on/off via "modules.chests.enabled" in ../config.yml)
# ============================================================

chests:
  # Number of virtual chests granted by default, without any extra permission.
  default-amount: 5

  # Default number of rows in each chest (1 to 6), without any extra permission. 4 by default
  # so there are still 3 rows of real storage once the utility bar (below) reserves the first
  # row for its buttons.
  default-rows: 4

  # A player's chest amount can be increased with the permission:
  #   xstash.number_chest.<amount>   (e.g. xstash.number_chest.5)
  # The highest value found among the player's permissions is used.

  # A player's rows per chest can be increased with the permission:
  #   xstash.number_row.<amount>   (e.g. xstash.number_row.4)
  # The highest value found among the player's permissions is used.

  # Absolute limits (safety net), regardless of granted permissions.
  max-amount: 30
  max-rows: 6

  # If true, opening a vanilla ender chest (right-clicking the block, /enderchest,
  # or a third-party command like Essentials' /ec) opens the XStash chest selector
  # instead. This works no matter which plugin owns the command - it intercepts
  # the ender chest inventory itself, not any specific command. Doesn't trigger
  # when an admin opens another player's ender chest (e.g. Essentials "/ec <target>").
  enderchest-redirect:
    enabled: true
    # Optional extra permission required to trigger the redirect. Leave empty to
    # apply to anyone who can use XStash ("xstash.use"). Players without this
    # permission keep the normal ender chest.
    permission: ""

# Lets players search across every chest they've unlocked for an item by name (matches the
# vanilla material name and any custom display name, case-insensitive, partial match) - see
# the "search" button in menus.yml ("selector.navigation.search-slot" / "items.search").
# Results are reported in chat as "Chest #n: <amount>x <item>", nothing opens automatically.
search:
  enabled: true

# A carryable item that opens the chest selector (/xstash) when right-clicked - not a new
# chest, just a shortcut so players don't have to type a command. Give one out with
# "/xstash backpack [player]" (requires xstash.admin).
travel-backpack:
  enabled: true
  # A vanilla item id (see https://minecraft.wiki/w/Java_Edition_data_values#Items). Kept
  # inert by default on purpose: not a block (nothing to accidentally place) and not a
  # functional item like a bundle or shulker box (nothing for players to store real items
  # into by mistake) - right-click is always intercepted to open the menu instead anyway,
  # but a plain item avoids any of that entirely.
  material: ""
  # (optional) a base64 texture value from minecraft-heads.com or similar - if set, this is
  # used instead of "material" (a custom-textured player head).
  head: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYmRmY2VlODMwNmUwNDM0YTc0NzcxMGUyYmRjMjU1OGM1YTIyMmU5YjY5MzQ3NzkwOWYxMGQ2Y2MyMjBmNjc2NCJ9fX0="
  name: "&6Travel Backpack"
  lore:
    - "&7Right-click to open your"
    - "&7chest selector."

  # An optional crafting-table recipe for the item above (in addition to any other way of
  # obtaining it: "/xstash backpack <player>", or another plugin's shop/reward via the public
  # API). Off by default. Every ingredient below (in EITHER form) accepts the same four item-key
  # forms as sacks/sacks.yml "items": a plain Material, "Material:CustomModelData", "ei:<id>"
  # for an ExecutableItems item, or "pdc:<namespace>:<key>:<value>" - not just vanilla items.
  craft:
    enabled: false
    # Leave empty ("") to let anyone with access to a crafting table craft it.
    permission: ""

    # Fill "shape" in (uncomment it) for a SHAPED recipe - grid position matters, like a
    # vanilla ShapedRecipe. 3 rows of 3 characters, a space means that cell must stay empty;
    # every other character is looked up in "keys" below. Only ever matches a real 3x3
    # crafting table, never the player's own 2x2 grid. Whenever "shape" is non-empty,
    # "ingredients" further below is ignored entirely.
    #shape:
    #  - "LLL"
    #  - "LCL"
    #  - "LLL"
    #keys:
    #  L: LEATHER
    #  C: CHEST

    # SHAPELESS ingredients (used only while "shape" above is empty/commented out) - item key
    # -> how many of the 9 crafting-grid slots must hold it. Vanilla crafting always consumes
    # exactly 1 item per OCCUPIED slot per craft (not the stack size in that slot), so this is
    # really "how many separate slots", the same as any vanilla shapeless recipe - e.g. 4 below
    # means 4 different grid cells each holding at least 1 leather, not one cell holding a
    # stack of 4.
    ingredients:
      LEATHER: 4
      CHEST: 1

# A row of action buttons shown at the TOP of every virtual chest, letting players manage its
# contents without leaving it: sort/stack everything, auto-smelt whatever is smeltable, compact
# groups of 9 into their block form (e.g. iron ingots -> iron blocks, from whatever 3x3 recipes
# are actually registered - no hardcoded list, so custom datapacks work too), and sell
# everything at once. Never touches renamed/custom items, only plain stacks.
#
# Once "enabled" below is true, the chest's first row (9 slots) is ENTIRELY reserved for
# every player, no matter their permissions - no storage there at all. Buttons are placed
# within that row via menus.yml "chest.utility-bar.<key>.column" (0-8); any column with no
# active button (unassigned, or gated by a "permission" the player lacks) is simply filled
# with the customizable "filler" item (menus.yml "chest.utility-bar.filler" - glass panes by
# default) so the bar always looks intentional. If a player already had real items in that
# row, they're just hidden (not lost) while the bar is on, and come back if it's turned off.
utility-bar:
  enabled: true

  # Every button needs the base "xstash.utility_bar" permission (see plugin.yml) AND, if set,
  # its own extra "permission" below. "click" is the click type that triggers it - SHIFT_RIGHT
  # (sneak + right-click) by default specifically so a destructive action (sell-all) can't be
  # triggered by an ordinary click, without needing a confirmation menu. Valid values: LEFT,
  # RIGHT, SHIFT_LEFT, SHIFT_RIGHT, MIDDLE, DOUBLE_CLICK, DROP, SWAP_OFFHAND.

  sort:
    enabled: true
    click: SHIFT_RIGHT
    permission: ""

  auto-smelt:
    enabled: true
    click: SHIFT_RIGHT
    permission: ""

  compact:
    enabled: true
    click: SHIFT_RIGHT
    permission: ""

  # Prices are set per item in sell-prices.yml (plugin folder root - shared with each sack's
  # own "Quick sell" button, see sacks/config.yml "quick-sell") - money via Vault, or points via
  # PlayerPoints. Items with no price there are simply skipped, not sold for 0. Off by default
  # until you've actually filled in sell-prices.yml.
  sell-all:
    enabled: true
    click: SHIFT_RIGHT
    permission: ""

  # Jump to the previous/next UNLOCKED chest without going back to the selector - skips over
  # any not-yet-unlocked chest in between rather than stopping right at it, so e.g. chests 1-5
  # (base) plus chest 10 (a rank perk) with nothing bought in between still lets chest 5 jump
  # straight to chest 10. Each is only shown when such a chest actually exists in that
  # direction. Plain LEFT click by default (not SHIFT_RIGHT like the others above) since
  # navigating isn't destructive.
  previous-chest:
    enabled: true
    click: LEFT
    permission: ""

  next-chest:
    enabled: true
    click: LEFT
    permission: ""

  # Jumps straight back to the chest selector (on whichever page this chest itself is on),
  # without needing to close the chest first. Plain LEFT click by default, same as the
  # previous/next-chest buttons above.
  back:
    enabled: true
    click: LEFT
    permission: ""

# Admin audit log for virtual chests: every item deposited/withdrawn (from normal play as well
# as the net effect of the utility bar's sort/auto-smelt/compact) and every "sell-all" - who
# did what, when, in which chest. Never shown to players, only to admins via
# "/xstash logs <player> [page]" (requires xstash.admin). Entries older than "retention-days"
# are pruned automatically once a day.
logging:
  enabled: true
  log-deposits: true
  log-withdrawals: true
  log-sell-all: true
  retention-days: 30

# Interval (in seconds) at which modified chests are automatically saved.
autosave-interval: 300

navigation:
  # If true, closing a virtual chest automatically reopens the chest selector menu.
  return-to-menu-on-close: false

  # If true, players can override the choice above for themselves via a toggle button
  # in the selector menu (see menus.yml "selector.navigation.toggle-slot" and the
  # "items.return-to-menu-enabled" / "items.return-to-menu-disabled" icons). If false,
  # the server-wide setting above always applies and no toggle button is shown.
  allow-player-toggle: true

customization:
  # Master switch for the chest rename / icon customization feature (see icons.yml
  # for the icon catalog). If false, the feature is fully disabled regardless of the
  # "xstash.customize" permission and the per-action settings below: chests just
  # open normally, no matter which button is clicked.
  enabled: true

  # Every action below needs the base "xstash.customize" permission AND, if set,
  # its own extra "permission" node. Valid "click" values: LEFT, RIGHT, SHIFT_LEFT,
  # SHIFT_RIGHT, MIDDLE, DOUBLE_CLICK, DROP, SWAP_OFFHAND. Keep the three "click"
  # values different from each other, or whichever action is checked first wins.

  icon-change:
    enabled: true
    click: RIGHT
    # Extra permission required on top of "xstash.customize". Leave empty to only
    # require the base permission. Individual icons can also have their own
    # permission in icons.yml, checked separately when picking that specific icon.
    permission: ""

  rename:
    enabled: true
    click: SHIFT_RIGHT
    permission: ""
    # Renaming closes the menu and asks the player to type the new name in chat
    # (or "cancel" to abort).

  reset:
    # Resets both the custom name and icon back to default.
    enabled: true
    click: MIDDLE
    permission: ""

# Feedback shown when a chest purchase (chest-prices.yml) succeeds.
purchase:
  # A chest that has a price in chest-prices.yml is normally still unlocked for free if the
  # player's "xstash.number_chest.<n>" permission covers its number (e.g. a VIP rank granting
  # extra free chests as a perk can end up covering a chest slot that was meant to stay a
  # separate purchase). Set this to true to make any priced chest ALWAYS require an actual
  # purchase (or an admin/API grant via unlockChest), no matter how high that permission goes -
  # a chest with no price entry is never affected either way.
  force-for-priced-chests: true

  totem-animation:
    # Plays the vanilla "Totem of Undying" resurrection animation (particles + sound) on
    # the buyer. While this is true, the player is NOT automatically sent back to the
    # chest selector after a successful purchase (their inventory just closes) so the
    # animation isn't immediately covered by a new menu opening. If false, purchasing
    # goes straight back to the selector like before, no animation.
    enabled: true
    # Minecraft always renders this animation with the Totem of Undying model - that's
    # hardcoded client-side, changing the item does NOT change what's shown, so there is
    # no "material" option here. The only way to make it look like something else (a
    # chest, a coin, etc.) is a resource pack that reskins the totem model via custom
    # model data. If your server has one, set the matching value below; otherwise leave
    # it at 0 (vanilla totem look).
    custom-model-data: 0

# Sounds played to a player for each event below. Leave "sound" empty ("") to
# disable that particular sound entirely. "sound" accepts any vanilla sound key
# (see https://minecraft.wiki/w/Sounds.json, e.g. "block.chest.open") or a
# custom resource-pack sound. "volume" and "pitch" are optional, both around
# 0.0-2.0, default 1.0 if omitted.
sounds:
  open-chest:
    sound: "block.chest.open"
    volume: 1.0
    pitch: 1.0

  open-selector:
    sound: "block.ender_chest.open"
    volume: 1.0
    pitch: 1.0

  change-icon:
    sound: "block.note_block.pling"
    volume: 1.0
    pitch: 1.3

  change-page:
    sound: "ui.button.click"
    volume: 0.6
    pitch: 1.0

  chest-locked:
    sound: "entity.villager.no"
    volume: 1.0
    pitch: 1.0

  toggle-return-to-menu:
    sound: "ui.button.click"
    volume: 0.6
    pitch: 1.3

  rename:
    sound: "entity.experience_orb.pickup"
    volume: 1.0
    pitch: 1.0

  item-blocked:
    sound: "block.note_block.bass"
    volume: 1.0
    pitch: 0.6

  purchase-success:
    sound: "entity.player.levelup"
    volume: 1.0
    pitch: 1.0

  utility-sort:
    sound: "ui.button.click"
    volume: 0.6
    pitch: 1.0

  utility-smelt:
    sound: "block.campfire.crackle"
    volume: 1.0
    pitch: 1.0

  utility-compact:
    sound: "block.anvil.use"
    volume: 1.0
    pitch: 1.2

  utility-sell:
    sound: "entity.villager.yes"
    volume: 1.0
    pitch: 1.0
```

### chests/chest-prices.yml

```yaml
# ============================================================
#                        XStash
#              Chest purchase prices (economy)
# ============================================================
# Lets a player BUY access to a specific chest number with money (Vault, works
# with any Vault-compatible economy plugin - EssentialsX, CMI, etc.) or points
# (PlayerPoints), IN ADDITION to chests already unlocked via permission
# (chests.default-amount / xstash.number_chest.<n> in config.yml). A chest
# only needs ONE of the two: permission OR purchase - whichever comes first.
#
# If the matching plugin (Vault+economy, or PlayerPoints) isn't installed,
# purchases using that currency are simply unavailable - the player gets a
# message instead of an error.
#
# Ranges are checked in order, the first match wins. Chest numbers not covered
# by any range here can't be purchased at all (only unlocked via permission -
# useful for rank-only chests, e.g. VIP/VIP+ tiers, where you just grant
# xstash.number_chest.<n> to the rank instead of listing a price).
#
# "range" accepts "from-to" or a single chest number, e.g. "6" or "7-9".
# "currency" is "money" (Vault), "points" (PlayerPoints), or "placeholder" (PlaceholderAPI).
# "amount" is the price, charged once per chest number.
#
# "placeholder" is different from "money"/"points": it's a CONDITION, not a spend. It also
# requires a "value" field - any PlaceholderAPI placeholder (e.g. "%vault_eco_balance%",
# "%statistic_mine_block%", another economy/points plugin's own placeholder, ...). The
# placeholder is resolved for the buying player and its numeric value must be >= "amount" to
# unlock the chest - nothing is withdrawn, since XStash has no generic way to decrement an
# arbitrary placeholder. Useful as a wealth/progress gate (e.g. "own at least 1,000,000 on
# another server-wide balance") rather than an actual purchase. Requires PlaceholderAPI.

prices:
  - range: "6-10"
    currency: money
    amount: 20000

  - range: "11-15"
    currency: money
    amount: 50000

  - range: "16-20"
    currency: points
    amount: 350

  - range: "21"
    currency: placeholder
    value: "%vault_eco_balance%"
    amount: 100
```

### chests/blocked-items.yml

```yaml
# ============================================================
#                        XStash
#                Blocked items configuration
# ============================================================
# Prevents specific items from being placed into virtual chests (covers
# direct placement, shift-click, hotbar swap, and drag). Players with the
# base permission "xstash.bypass_blocked_items" ignore every entry below.
# Each item can also have its own specific bypass permission for
# finer-grained control (e.g. grant it to staff only, so they alone can
# store spawners).
#
# "material" is any Bukkit Material name (see https://hub.spigotmc.org/javadocs/
# for the full list). "permission" is optional - leave it out if you only want
# the item gated behind the base bypass permission above.

blocked-items:
  - material: BEDROCK

  - material: BARRIER

  - material: COMMAND_BLOCK
    permission: "xstash.bypass_blocked_items.command_block"

  - material: CHAIN_COMMAND_BLOCK
    permission: "xstash.bypass_blocked_items.command_block"

  - material: REPEATING_COMMAND_BLOCK
    permission: "xstash.bypass_blocked_items.command_block"

  - material: STRUCTURE_BLOCK
    permission: "xstash.bypass_blocked_items.structure_block"

  - material: STRUCTURE_VOID

  - material: JIGSAW

  - material: END_PORTAL_FRAME

  - material: DEBUG_STICK
```

### chests/icons.yml

```yaml
# ============================================================
#                        XStash
#              Chest icon catalog (customization)
# ============================================================
# Icons players can pick from when customizing a chest's appearance in the
# selector menu (requires the "xstash.customize" permission, and access
# to that specific chest). Colors: legacy (&c) and hex (&#RRGGBB) supported.
#
# Each entry needs a unique id (the key), and either "material" (any Bukkit
# Material name) or "head" (a base64 "Value" from https://minecraft-heads.com).
# "name" and "lore" are shown in the picker menu. "permission" is optional:
# if set, only players with that permission node can pick this icon - others
# see it locked. Leave it out to make an icon available to everyone who has
# the base "xstash.customize" permission.
#
# The heads below were pulled from minecraft-heads.com and their texture
# hashes verified against Mojang's texture server before being added here.

icons:
  # --- Vanilla materials ---
  chest:
    material: CHEST
    name: "&fChest"

  ender_chest:
    material: ENDER_CHEST
    name: "&5Ender Chest"

  trapped_chest:
    material: TRAPPED_CHEST
    name: "&cTrapped Chest"

  barrel:
    material: BARREL
    name: "&6Barrel"

  shulker_box:
    material: SHULKER_BOX
    name: "&dShulker Box"
    permission: "xstash.icon.shulker_box"

  bundle:
    material: BUNDLE
    name: "&eBundle"

  hopper:
    material: HOPPER
    name: "&7Hopper"

  dispenser:
    material: DISPENSER
    name: "&7Dispenser"

  dropper:
    material: DROPPER
    name: "&7Dropper"

  chest_minecart:
    material: CHEST_MINECART
    name: "&6Minecart with Chest"

  diamond:
    material: DIAMOND
    name: "&bDiamond"

  diamond_block:
    material: DIAMOND_BLOCK
    name: "&bDiamond Block"
    permission: "xstash.icon.diamond_block"

  emerald:
    material: EMERALD
    name: "&aEmerald"

  emerald_block:
    material: EMERALD_BLOCK
    name: "&aEmerald Block"
    permission: "xstash.icon.emerald_block"

  gold_ingot:
    material: GOLD_INGOT
    name: "&6Gold Ingot"

  gold_block:
    material: GOLD_BLOCK
    name: "&6Gold Block"
    permission: "xstash.icon.gold_block"

  iron_block:
    material: IRON_BLOCK
    name: "&fIron Block"

  netherite_ingot:
    material: NETHERITE_INGOT
    name: "&8Netherite Ingot"
    permission: "xstash.icon.netherite_ingot"

  nether_star:
    material: NETHER_STAR
    name: "&fNether Star"
    permission: "xstash.icon.nether_star"

  beacon:
    material: BEACON
    name: "&bBeacon"
    permission: "xstash.icon.beacon"

  totem_of_undying:
    material: TOTEM_OF_UNDYING
    name: "&eTotem of Undying"
    permission: "xstash.icon.totem_of_undying"

  enchanted_book:
    material: ENCHANTED_BOOK
    name: "&dEnchanted Book"

  # --- Custom heads (minecraft-heads.com) ---
  wood_chest:
    head: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvY2JhNzc4NTZkODBkYWRlNTU2OTk1NDRkZGNkNjg1OTY0YjAxODA4MjNmZTRmZjI3MGRlN2U1ZjU4YWVjZjNhNSJ9fX0="
    name: "&6Wood Chest"
    permission: "xstash.icon.wood_chest"

  head_chest_classic:
    head: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvODhjZDQyZjkyMDYxZWQ4OTZjZTVjNDRmYzg4ODllYmI2NGFiMjY4ZWQ1ZWZmYzVjZjY1MWEyMDliYTA4YjQzIn19fQ=="
    name: "&fClassic Chest"

  head_ender_chest:
    head: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjU0NGE3NzBlODk0YTFmYWIxMWUyYTJiYWMxNWZlM2Q5Njk0NmZhNTIzOTZiNTMxOTc4ZWIzN2FjNjRiOGE5MCJ9fX0="
    name: "&5Ender Chest"
    permission: "xstash.icon.head_ender_chest"

  head_golden_chest:
    head: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjA4NmE5NTBkMGEzMDNmNDhhYWIzYTVmMmY2YTQwMzNlODBiYWZjYWY3Y2I1YmRhMTM5N2I4M2U1MjlmNjNiNSJ9fX0="
    name: "&6Golden Chest"
    permission: "xstash.icon.head_golden_chest"

  head_diamond_chest:
    head: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvM2FkYmNmYjI4ODIxNWE4ZDE1M2RkZmRkYjM2YmQyZWQ3YTM3YWRkMzU2NjJmODYzM2Y3MTFkMmRmY2ViNDE3YyJ9fX0="
    name: "&bDiamond Chest"
    permission: "xstash.icon.head_diamond_chest"

  head_barrel:
    head: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYTgyNzBjOGFjMjVhMDdhZTJhNzFkYmQwNjFiNmRlZTEwNTZiZjYyNWY4Yjg4MWExZjJlZjQ2NGY3MDUzYWNhOCJ9fX0="
    name: "&6Barrel"

  head_crate:
    head: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMTg1ZjFjNTMxMjI5ODY0MGJmOWU3YWNhNWU4YjFmOTM3N2M5N2ZlYzc0NzAyZDY3YmU2MmM3NTEwOTVjOWI2YiJ9fX0="
    name: "&eWooden Crate"

  head_present:
    head: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMThmMzRhNWE2YjZhOTRlNzI4MjNkNmVkNGJmYTBiMmIzMmU4M2Y4N2VjZjg2MmNkN2ZkZTE4NzA5ZmJhZjc3NCJ9fX0="
    name: "&cPresent"
    permission: "xstash.icon.head_present"

  head_backpack:
    head: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYmRmY2VlODMwNmUwNDM0YTc0NzcxMGUyYmRjMjU1OGM1YTIyMmU5YjY5MzQ3NzkwOWYxMGQ2Y2MyMjBmNjc2NCJ9fX0="
    name: "&2Backpack"

  head_cardboard_box:
    head: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNzMzYjFhZDUxNzA5NjU2NGMwYThhZmQyOGMxZWQ2OWJiNTUzNzc1NWNhNzdmMGI0NWMxZTVkYjc4NjY1Mzg0ZiJ9fX0="
    name: "&fCardboard Box"

  head_piggy_bank:
    head: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNTM5YTlhNGIxNWE1YzdlZDFjNTRlMGUwZjVhMDJiM2I2ZDk0NWRjYTNiNzNmNTEwZWY4NDdiZjk0NjAwYzRiNyJ9fX0="
    name: "&dPiggy Bank"
    permission: "xstash.icon.head_piggy_bank"
```

### chests/admin-menu.yml

```yaml
# ============================================================
#                        XStash
#        "/xstash view <player>" admin management menu
# ============================================================
# The chest icons themselves reuse chests/menus.yml "items.unlocked-chest"/"locked-chest" as-is,
# and the selector reuses that same file's "selector.decoration" too (so both look identical to
# the player's own selector) - this file only adds what's admin-only on top: extra action-hint
# lore lines, and the content view's title/header-row buttons (that view reserves just its first
# row for chrome - decoration, back, previous/next-chest - exactly like the player's own chest
# utility bar reserves its first row; the rest of the grid is the target's REAL stored items,
# directly editable).
#
# Placeholders: {number} -> chest number, {player} -> target's name, {page}/{max_page} -> selector
# pagination.

selector:
  title: "&8Chests - &e{player} &8({page}/{max_page})"

  action-hints-unlocked:
    - " "
    - "&c&lADMIN &c&m-----------------"
    - "&e▸ &7Left-click: &fview/edit contents"
    - "&e▸ &7Right-click: &frevoke access"
    - "&e▸ &7Shift + Right-click: &frename"
    - "&e▸ &7Middle-click: &fchange icon"
    - "&c&m------------------------"

  action-hints-locked:
    - " "
    - "&e▸ &7Left-click: &fgrant access"

  offline-note:
    - " "
    - "&8(offline - permission-only chests may look locked until they log back in)"

content:
  title: "&8Chest #{number} - &e{player}"

  filler:
    material: GRAY_STAINED_GLASS_PANE
    name: " "

  previous-chest-column: 0
  previous-chest:
    #material: ARROW
    head: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYTE4NWM5N2RiYjgzNTNkZTY1MjY5OGQyNGI2NDMyN2I3OTNhM2YzMmE5OGJlNjdiNzE5ZmJlZGFiMzVlIn19fQ=="
    name: "&e« &fChest #{number}"
    lore:
      - "&7Go to chest &f#{number}&7."

  back-column: 4
  back:
    material: BARRIER
    name: "&c« &fBack to Chest List"
    lore:
      - "&7Return to the chest list."

  next-chest-column: 8
  next-chest:
    #material: ARROW
    head: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMzFjMGVkZWRkNzExNWZjMWIyM2Q1MWNlOTY2MzU4YjI3MTk1ZGFmMjZlYmI2ZTQ1YTY2YzM0YzY5YzM0MDkxIn19fQ=="
    name: "&fChest #{number} &e»"
    lore:
      - "&7Go to chest &f#{number}&7."
```

### chests/menus.yml

```yaml
# ============================================================
#            Selector & chest menu customization
# ============================================================
# Placeholders available:
#   {number}      -> chest number (in chest items)
#   {rows}        -> number of rows the player currently has access to in each chest
#                    (in chest items, navigation items, decoration and the selector title)
#   {used-slots}  -> occupied slots in that chest (in the "unlocked-chest" item only)
#   {free-slots}  -> empty slots in that chest (in the "unlocked-chest" item only)
#   {total-slots} -> {used-slots} + {free-slots} (in the "unlocked-chest" item only)
#   {bar}         -> a 10-character fill bar for {used-slots}/{total-slots}, e.g.
#                    "&8[&a■■■■■&7■■■■■&8]" (in the "unlocked-chest" item only)
#   {page}        -> page number (in navigation items and decoration)
#   {max_page}    -> total number of pages (in the selector title and decoration)
#   {player}      -> clicking player's name (in "locked-actions" commands only)
#
# Colors: legacy codes (&a, &c, &l, ...) AND hex codes in the "&#RRGGBB" format
# (e.g. "&#FFD700Chest") are both supported everywhere in this file and in the
# lang/messages_*.yml files.
#
# Icons: every item below accepts either a vanilla "material" (any Bukkit Material
# name, e.g. CHEST, BARRIER, ENDER_CHEST...) OR a custom player head texture via
# "head". To use a head from https://minecraft-heads.com: open a head, copy the
# "Value" field at the bottom (a long base64 string) and paste it as "head" below.
# When "head" is set, "material" is ignored.

selector:
  size: 54
  title: "&#FFD700✦ &fYour Virtual Chests &#FFD700✦ &8(&7{page}/{max_page}&8)"
  chests-per-page: 15

  chest-slots:
    - 11
    - 12
    - 13
    - 14
    - 15
    - 20
    - 21
    - 22
    - 23
    - 24
    - 29
    - 30
    - 31
    - 32
    - 33

  navigation:
    previous-page-slot: 45
    next-page-slot: 53
    toggle-slot: 50
    search-slot: 48

  decoration:
    - material: LIGHT_BLUE_STAINED_GLASS_PANE
      name: " "
      slots: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 17, 18, 26, 27, 35]

    - material: CYAN_STAINED_GLASS_PANE
      name: " "
      slots: [36, 37, 38, 39, 40, 41, 42, 43, 44, 47, 51]

    - material: BOOK
      name: "&#55FFFFPage &f{page}&7/&f{max_page}"
      lore:
        - "&7Use the arrows below to"
        - "&7browse your chest pages."
      slots: [49]

items:
  unlocked-chest:
    #material: CHEST
    head: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNDU2M2NmZjk1MGExNDNiYzVjODBlZTMxNjk0MjZkNjA0OWIwYTE5MTNiYTljMzY1NmFmZTNlODllMWM5ZTlhIn19fQ=="
    name: "&#FFD700Chest #{number}"
    lore:
      - "&7Click to open this chest."
      - "&7Filled: &f{used-slots}&7/&f{total-slots} {bar}"
      - " "
      - "&#55FF55●&7 Unlocked"
      - " "
    icon-hint-lore:
      - "&7Right-click: &fchange icon"
    rename-hint-lore:
      - "&8&m-----------------------------------"
      - "&7Shift + Right-click: &frename"
    reset-hint-lore:
      - "&7Middle-click: &freset to default"
      - "&8&m-----------------------------------"

  locked-chest:
    head: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvM2VkMWFiYTczZjYzOWY0YmM0MmJkNDgxOTZjNzE1MTk3YmUyNzEyYzNiOTYyYzk3ZWJmOWU5ZWQ4ZWZhMDI1In19fQ=="
    name: "&#FF5555Chest #{number}"
    lore:
      - "&7You haven't unlocked this chest yet."
      - "&7Unlock more chests through your rank."
      - "&7Rows: &f{rows}"
      - " "
      - "&#FF5555●&7 Locked"
    purchasable-lore:
      - " "
      - "&8&m-----------------------------------"
      - "&2&l❖ Available for purchase"
      - "  &6&l▸ &fClick to buy for &e&n{price}"
      - "&8&m-----------------------------------"

  previous-page:
    material: ARROW
    name: "&#FFAA00« &fPrevious Page"
    lore:
      - "&7Go to page {page}"

  next-page:
    material: ARROW
    name: "&fNext Page &#FFAA00»"
    lore:
      - "&7Go to page {page}"

  return-to-menu-enabled:
    material: LIME_DYE
    name: "&aReturn to menu: &2ON"
    lore:
      - "&7Closing a chest brings you"
      - "&7back to this menu."
      - " "
      - "&7Click to disable."

  return-to-menu-disabled:
    material: GRAY_DYE
    name: "&7Return to menu: &cOFF"
    lore:
      - "&7Closing a chest keeps you"
      - "&7in the game."
      - " "
      - "&7Click to enable."

  search:
    material: COMPASS
    name: "&bSearch your chests"
    lore:
      - "&7Click to search for an item"
      - "&7across every chest you own."

chest:
  title: "&#FFD700Virtual Chest #{number}"

  utility-bar:
    previous-chest:
      column: 7
      #material: ARROW
      head: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYTE4NWM5N2RiYjgzNTNkZTY1MjY5OGQyNGI2NDMyN2I3OTNhM2YzMmE5OGJlNjdiNzE5ZmJlZGFiMzVlIn19fQ=="
      name: "&e« &fPrevious Chest"
      lore:
        - "&7Go to chest &f#{number}&7."
    sort:
      column: 1
      #material: HOPPER
      head: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNjhlODRmYTYzMTJlMDViZmY0OGNlZWM3NTBjZTViODUyNjkzOWNlZjYzYjZlZmE3YTUzOWE1YjFkMjVkMDViMCJ9fX0="
      name: "&e↕ &fSort"
      lore:
        - "&7Sorts and stacks the items"
        - "&7in this chest."
        - " "
        - "&e▸ &7Shift + Right-click to sort."
    auto-smelt:
      column: 2
      #material: FURNACE
      head: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZTEyY2U3OTgyNDZhZGRiY2E2NThmZmJlMWZmYzA1N2I1NmQ0YjM4N2E3MTk1YmY5NTlhYjRjOTdlYTNlNSJ9fX0="
      name: "&6♨ &fAuto-Smelt"
      lore:
        - "&7Smelts every smeltable item"
        - "&7in this chest (ores, food...)."
        - " "
        - "&e▸ &7Shift + Right-click to smelt."
    compact:
      column: 3
      #material: IRON_BLOCK
      head: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNDZhNWRhNWE0ZDJiODIxM2IyZTk4ZTJjNWJlNWJkODlhNWM3OTE0OTJjYTdjNDZjMTc0ZDlhMTM3NmYwNTAzZCJ9fX0="
      name: "&b■ &fCompact"
      lore:
        - "&7Turns every group of 9 items"
        - "&7into its block form (e.g."
        - "&7iron ingots -> iron blocks)."
        - " "
        - "&e▸ &7Shift + Right-click to compact."
    sell-all:
      column: 4
      #material: EMERALD
      head: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjg4OWNmY2JhY2JlNTk4ZThhMWNkODYxMGI0OWZjYjYyNjQ0ZThjYmE5ZDQ5MTFkMTIxMTM0NTA2ZDhlYTFiNyJ9fX0="
      name: "&a$ &fSell All"
      lore:
        - "&7Sells every item in this chest"
        - "&7with a price in sell-prices.yml."
        - " "
        - "&e▸ &7Shift + Right-click to sell."
    next-chest:
      column: 8
      #material: ARROW
      head: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMzFjMGVkZWRkNzExNWZjMWIyM2Q1MWNlOTY2MzU4YjI3MTk1ZGFmMjZlYmI2ZTQ1YTY2YzM0YzY5YzM0MDkxIn19fQ=="
      name: "&fNext Chest &e»"
      lore:
        - "&7Go to chest &f#{number}&7."
    back:
      column: 6
      material: ""
      head: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZjg0ZjU5NzEzMWJiZTI1ZGMwNThhZjg4OGNiMjk4MzFmNzk1OTliYzY3Yzk1YzgwMjkyNWNlNGFmYmEzMzJmYyJ9fX0="
      name: "&c« &fBack to Selector"
      lore:
        - "&7Return to the chest selector."
    filler:
      material: GRAY_STAINED_GLASS_PANE
      name: " "

icon-picker:
  title: "&8Choose an icon &7(&f{page}&7/&f{max_page}&7)"

  border:
    material: BLACK_STAINED_GLASS_PANE
    name: " "

  back:
    material: ARROW
    name: "&cBack"
    lore:
      - "&7Return to the chest selector."

  previous-page:
    material: ARROW
    name: "&e« Previous page"
    lore:
      - "&7Go to page {page}"

  next-page:
    material: ARROW
    name: "&eNext page »"
    lore:
      - "&7Go to page {page}"

  selected-lore-suffix:
    - " "
    - "&a★ Currently selected"
  available-lore-suffix:
    - " "
    - "&aClick to select this icon."
  locked-lore-suffix:
    - " "
    - "&cYou don't have permission for this icon."
  locked-material: GRAY_DYE

purchase-confirm:
  title: "&8Buy Chest #{number}"
  size: 27
  info-slot: 13
  confirm-slot: 11
  cancel-slot: 15

  info:
    material: CHEST
    name: "&6Chest #{number}"
    lore:
      - "&7Price: &f{price}"
      - " "
      - "&7Click the green wool to confirm,"
      - "&7or the red wool to cancel."

  confirm:
    material: LIME_WOOL
    name: "&aConfirm Purchase"
    lore:
      - "&7Buy chest #{number} for &f{price}&7."

  cancel:
    material: RED_WOOL
    name: "&cCancel"

# Optional per-chest overrides. Lets you give a specific chest number a unique icon
# (material or head), name/lore in the selector, and a unique title when opened,
# instead of the generic templates above. Any field you omit falls back to the
# generic template. Example:
#
# overrides:
#   1:
#     name: "&#FFD700Ores & Minerals"
#     lore:
#       - "&7Perfect for your mining loot."
#     chest-title: "&#FFD700Ores & Minerals"
#     head: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvLi4uIn19fQ=="
overrides: { }

# Per-range behavior for chests a player hasn't unlocked. Ranges are checked in
# order, the first match wins; chests not covered by any range just use the plain
# "locked-chest" item above with no extra lore/message/command.
locked-actions:
  - range: "21-25"
    extra-lore:
      - "&7Requires the &6VIP &7rank."
    message: "&cYou need the &6VIP &crank to unlock this chest."
    commands: []

  - range: "26-30"
    extra-lore:
      - "&7Requires the &6VIP+ &7rank."
    message: "&cYou need the &6VIP+ &crank to unlock this chest."
    commands: []
```

## Sacks Module

### sacks/config.yml

```yaml
# ============================================================
#                        XStash
#               Sacks module settings
#  (toggled on/off via "modules.sacks.enabled" in ../config.yml)
# ============================================================
# The sack catalog itself (which sacks exist, what they hold, their upgrade tiers and
# recipes) lives in sacks/sacks.yml, not here - this file only covers the module-wide bits:
# the "Sack of Sacks" storage menu and auto-collect.
#
# Every sack feature needs the base "xstash.sacks.use" permission (see plugin.yml, default
# true) - on top of that, individual sacks/tiers can require their own extra permission (see
# sacks/sacks.yml "open-permission", "starter-permission" and each tier's "upgrade.permission").

sack-of-sacks:
  title: "&8Sack of Sacks"
  default-slots: 5
  max-slots: 84 #3 pages

auto-collect:
  enabled: true
  allow-player-toggle: true
  default: true

quick-sell:
  enabled: true
  permission: "xstash.sacks.quicksell"
  cooldown-seconds: 5
  bypass-permission: "xstash.sacks.quicksell.bypasscooldown"

sounds:
  deposit:
    sound: "entity.item.pickup"
    volume: 0.5
    pitch: 1.5

  withdraw:
    sound: "ui.button.click"
    volume: 0.6
    pitch: 1.0

  toggle:
    sound: "ui.button.click"
    volume: 0.6
    pitch: 1.3

  craft-denied:
    sound: "entity.villager.no"
    volume: 1.0
    pitch: 1.0

  upgrade:
    sound: "entity.player.levelup"
    volume: 1.0
    pitch: 1.0

  sell:
    sound: "entity.experience_orb.pickup"
    volume: 1.0
    pitch: 1.0

  open:
    sound: "block.chest.open"
    volume: 0.6
    pitch: 1.0

  quicksell-error:
    sound: "entity.villager.no"
    volume: 1.0
    pitch: 1.0
```

### sacks/sacks.yml

```yaml
# ============================================================
#                        XStash
#                  Sacks module - sack catalog
# ============================================================
# Define as many sacks as you want, each under its own id (the "farming"/"mining"/... keys
# below are just examples - add, remove or rename freely).
#
# Each sack is a SINGLE physical item (not one per tier) - its capacity tier is tracked
# per-player and upgraded IN PLACE from the sack's own menu. Hand the base item out with
# "/sacks give <sack> [player]" - it always starts (or stays) at whatever tier that player is
# already tracked at, since tier is per-player state, not baked into the item.
#
# "items" entries accept: a plain Material ("WHEAT"), "<Material>:<customModelData>",
# "ei:<id>" (ExecutableItems), or "pdc:<namespace>:<key>:<value>" (PersistentDataContainer tag).

sacks:
  farming:
    display-name: "&aFarming Sack"
    material: ""
    head: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMmFiODc5ZTFlNTkwMDQxMTQ2YmM3OGMwMThhZjU4NzdkMzllNTQ3NWViN2RiMzY4ZmNhZjJhY2RhMzczODMzZCJ9fX0="
    open-permission: ""
    require-open-permission: false
    items:
      - WHEAT
      - CARROT
      - POTATO
      - BEETROOT

    tiers:
      - id: small
        display-name: "&7Small"
        capacities:
          WHEAT: 256
          CARROT: 128
          POTATO: 128
          BEETROOT: 128

      - id: medium
        display-name: "&eMedium&7"
        capacities:
          WHEAT: 512
          CARROT: 256
          POTATO: 256
          BEETROOT: 256
        upgrade:
          permission: ""
          require-permission: false
          cost:
            items:
              IRON_INGOT: 32
            money: 5000
            exp-levels: 10
            points: 200

      - id: large
        display-name: "&6Large&7"
        capacities:
          WHEAT: 1024
          CARROT: 512
          POTATO: 512
          BEETROOT: 512
        upgrade:
          permission: ""
          require-permission: false
          cost:
            items:
              DIAMOND: 16
              GOLD_BLOCK: 4

  mining:
    display-name: "&7Mining Sack"
    material: ""
    head: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZjA3ZGZmNjU3ZDYxZjMwMmM3ZDJlNzI1MjY1ZDE3YjY0YWE3MzY0MjM5MTk2NGZiNDhmYzE1YmU5NTA4MzFkOCJ9fX0="
    open-permission: ""
    require-open-permission: false
    items:
      - COBBLESTONE
      - COAL
      - IRON_INGOT
      - GOLD_INGOT
      # - "DIAMOND:5001"
      # - "ei:raw_mythril"

    tiers:
      - id: small
        display-name: "&7Small"
        capacities:
          COBBLESTONE: 512
          COAL: 128
          IRON_INGOT: 128
          GOLD_INGOT: 64
          #"DIAMOND:5001": 16
          #"ei:raw_mythril": 16

      - id: medium
        display-name: "&eMedium&7"
        capacities:
          COBBLESTONE: 1024
          COAL: 256
          IRON_INGOT: 256
          GOLD_INGOT: 128
          #"DIAMOND:5001": 32
          #"ei:raw_mythril": 32
        upgrade:
          permission: ""
          require-permission: false
          cost:
            money: 8000

  fishing:
    display-name: "&bFishing Sack"
    material: ""
    head: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzRmYmM3N2QyN2RhYjEwZGU1YWJmOWQwYmNjNDcxOThmOTIzYjBlNmMxNzlhM2MzOTgzZTc3ZjEyZjdjMDMzZSJ9fX0="
    open-permission: ""
    require-open-permission: false
    items:
      - COD
      - SALMON
      - STRING
      - BONE

    tiers:
      - id: small
        display-name: "&7Small"
        capacities:
          COD: 128
          SALMON: 128
          STRING: 256
          BONE: 128

      - id: medium
        display-name: "&eMedium&7"
        capacities:
          COD: 256
          SALMON: 256
          STRING: 512
          BONE: 256
        upgrade:
          permission: ""
          require-permission: false
          cost:
            money: 6000

  combat:
    display-name: "&cCombat Sack"
    material: ""
    head: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOWI4ZjQ1MmM5ZDZiNjI1NGI1NDc4NTY5YTYwYjBiNmZiMDMxYzdhZDJmMDZlYTNkYWNmMmNlODc0Y2E3MDgzIn19fQ=="
    open-permission: ""
    require-open-permission: false
    items:
      - ROTTEN_FLESH
      - BONE
      - STRING
      - GUNPOWDER

    tiers:
      - id: small
        display-name: "&7Small"
        capacities:
          ROTTEN_FLESH: 256
          BONE: 256
          STRING: 128
          GUNPOWDER: 128

      - id: medium
        display-name: "&eMedium&7"
        capacities:
          ROTTEN_FLESH: 512
          BONE: 512
          STRING: 256
          GUNPOWDER: 256
        upgrade:
          permission: ""
          require-permission: false
          cost:
            exp-levels: 15

  woodcutting:
    display-name: "&6Woodcutting Sack"
    material: ""
    head: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNGY5NjBjNjM5ZDQwMDRkMTg4MjU3NWFlYmE2OWY0NTZmYjNjNzQ0MDc3OTM1NzE0OTQ3ZTE5YzEzMDZkMjczMyJ9fX0="
    open-permission: ""
    require-open-permission: false
    items:
      - OAK_LOG
      - SPRUCE_LOG
      - BIRCH_LOG
      - JUNGLE_LOG

    tiers:
      - id: small
        display-name: "&7Small"
        capacities:
          OAK_LOG: 256
          SPRUCE_LOG: 256
          BIRCH_LOG: 256
          JUNGLE_LOG: 256

      - id: medium
        display-name: "&eMedium&7"
        capacities:
          OAK_LOG: 512
          SPRUCE_LOG: 512
          BIRCH_LOG: 512
          JUNGLE_LOG: 512
        upgrade:
          permission: ""
          require-permission: false
          cost:
            money: 4000
```

### sacks/menus.yml

```yaml
# ============================================================
#                  Sacks module - menu customization
# ============================================================
sack-of-sacks:
  border:
    material: GRAY_STAINED_GLASS_PANE
    name: " "

  info-enabled: true
  info-column: 4
  info:
    material: BOOK
    name: "&6What is this?"
    lore:
      - "&7This is your Sack of Sacks - it stores"
      - "&7the physical sack items you own."
      - " "
      - "&7Pick up an item that fits in one of your"
      - "&7sacks and it goes straight there instead"
      - "&7of your inventory, IF that sack's own"
      - "&7auto-collect toggle is turned on (open"
      - "&7that sack, it's a button in its own menu)."

  close-column: 4
  close:
    material: NETHER_STAR
    head: ""
    name: "&cClose"
    lore: []
    command: ""

  locked:
    material: RED_STAINED_GLASS_PANE
    name: "&cLocked slot"
    lore:
      - "&7You haven't unlocked this slot yet."

  previous-page-column: 0
  previous-page:
    material: ARROW
    name: "&e◂ Previous page"
  next-page-column: 8
  next-page:
    material: ARROW
    name: "&eNext page ▸"

sack-item:
  lore:
    - "&7Tier: &f{tier}"
    - " "

  show-capacities: true
  capacity-line: "&7{item}: {bar} &f{percent}%"
```

### sacks/admin-menu.yml

```yaml
# ============================================================
#            Sacks module - admin management menu
# ============================================================
# Opened via "/sacks view <player>" (needs "xstash.admin") - not player-facing. Works for an
# offline target too: manages their stored amounts/tier directly, no ownership requirement, no
# upgrade cost.

selector:
  title: "&8Sacks - {player}"
  rows: 3
  border:
    material: GRAY_STAINED_GLASS_PANE
    name: " "
  item-name: "&f{sack}"
  item-lore:
    - "&7Tier: &f{tier}"
    - " "
    - "&e▸ &7Click to manage"

  previous-page-column: 0
  previous-page:
    material: ARROW
    name: "&e◂ Previous page"
  next-page-column: 8
  next-page:
    material: ARROW
    name: "&eNext page ▸"
  sack-of-sacks-column: 4
  sack-of-sacks:
    material: CHEST
    name: "&6Sack of Sacks"
    lore:
      - "&7View/manage the physical sack"
      - "&7items this player is carrying."

  slots-column: 5
  slots:
    material: STONE_BUTTON
    name: "&eSack of Sacks slots: &f{slots}"
    lore:
      - "&7Left-click: &f-1"
      - "&7Right-click: &f+1"
      - "&7Shift + Left-click: &f-10"
      - "&7Shift + Right-click: &f+10"
      - " "
      - "&7Use &f/sacks clearslots &7to reset to default."

content:
  back-column: 0
  back:
    material: ARROW
    head: ""
    name: "&cBack"
    lore:
      - "&7Return to the sack list."
  tier-column: 4
  tier:
    material: EMERALD
    name: "&eTier: {tier}"
    lore:
      - "&7Left-click: previous tier"
      - "&7Right-click: next tier"
  edit-lore:
    - " "
    - "&c&lADMIN &c&m-----------------"
    - " &e▸ &7Left-click: remove a stack"
    - " &e▸ &7Shift + Left-click: clear to 0"
    - " &e▸ &7Right-click: add a stack"
    - " &e▸ &7Shift + Right-click: fill to max"
    - "&c&m------------------------"
```

{% hint style="info" %}
Each sack also gets its own auto-generated `sacks/menus/<sack-id>.yml` (content-view layout: border, pagination, upgrade/toggle button placement) the first time that sack is loaded — not reproduced here since it's per-sack and generated, not shipped as a static default.
{% endhint %}


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.xandtech.fr/home/xstash/reference/configuration-files.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
