SkinsRestorer LogoSkinsRestorer

Configuration Options

Understand and change the SkinsRestorer configuration.

SkinsRestorer works with the default configuration. If you need different behavior, use this page to find the correct option.

After you change the configuration, run /sr reload or restart the server.

On a proxy network, use the same config.yml file on the proxy and every backend server. After each change, run /sr reload on the proxy. Then restart every backend server.

File structure

This example shows the SkinsRestorer files. Select a folder to expand it.

config.yml

Storage settings

Choose how SkinsRestorer saves and refreshes skin data.

storage:
  defaultSkins:
    enabled: false
    applyForPremium: false
    list:
      - "xknat"
      - "pistonmaster"
      - "<random>"
  disallowAutoUpdateSkin: false
  skinExpiresAfter: 15
  uuidExpiresAfter: 60
OptionDefaultDescription
defaultSkins.enabledfalseEnable default skins for players without a set skin
defaultSkins.applyForPremiumfalseApply default skins even to premium players
defaultSkins.list["xknat", "pistonmaster", "<random>"]List of default skins. Use <random> for recommended skins
disallowAutoUpdateSkinfalseRequire players to run /skin update manually
skinExpiresAfter15Minutes before SkinsRestorer requests skin data again
uuidExpiresAfter60Minutes before SkinsRestorer requests a player UUID again

A cache expiration value of 0 requests new API data each time. This can cause rate-limit errors on production servers.

Command settings

Set command cooldowns and access limits.

commands:
  skinChangeCooldown: 30
  skinErrorCooldown: 5
  skullCooldown: 30
  skullErrorCooldown: 5
  disabledSkins:
    - "steve"
    - "owner"
  restrictSkinUrls:
    enabled: false
    list:
      - "https://i.imgur.com"
      - "https://storage.googleapis.com"
      - "https://cdn.discordapp.com"
      - "https://textures.minecraft.net"
  perSkinPermissions:
    enabled: false
    list: []
  forceDefaultPermissions: true
  customPlayerHistory: 18
  customFavourites: 90
  disableSkinCommand: false
  disableSkullCommand: false
  disableGUICommand: false
OptionDefaultDescription
skinChangeCooldown30Seconds between /skin commands
skinErrorCooldown5Seconds to wait after a failed skin change
skullCooldown30Seconds between /skull commands
skullErrorCooldown5Seconds to wait after a failed skull command
disabledSkins["steve", "owner"]Skins that cannot be used
restrictSkinUrls.enabledfalseOnly allow URLs from whitelisted domains
restrictSkinUrls.list(see above)Allowed URL domains when restriction is enabled
perSkinPermissions.enabledfalseRequire skinsrestorer.skin.<name> for specific skins
perSkinPermissions.list[]Skins that require permissions
forceDefaultPermissionstrueGive all players skinsrestorer.player by default
customPlayerHistory18Max entries in /skin undo history
customFavourites90Max entries in /skin favourite list
disableSkinCommandfalseDisable the /skin command registration
disableSkullCommandfalseDisable the /skull command registration
disableGUICommandfalseDisable the /skins command registration

Login settings

Choose how SkinsRestorer applies skins when a player joins.

login:
  noSkinIfLoginCanceled: true
  alwaysApplyPremium: false
OptionDefaultDescription
noSkinIfLoginCanceledtrueDo not apply skins when another plugin cancels login
alwaysApplyPremiumfalseApply skins even for premium players on online-mode servers

Server settings (Backend only)

These options apply only to backend servers. They do not apply to proxies.

server:
  resourcePackFix: true
  dismountPlayerOnUpdate: true
  remountPlayerOnUpdate: true
  dismountPassengersOnUpdate: false
  sound:
    enabled: true
    value: "ENTITY_PLAYER_TELEPORT, 0.7"
  proxyMode:
    detection: AUTO
    api: true
OptionDefaultDescription
resourcePackFixtrueReapply skins after resource pack loads
dismountPlayerOnUpdatetrueDismount player from vehicle during skin update
remountPlayerOnUpdatetrueRemount player after skin update
dismountPassengersOnUpdatefalseDismount passengers riding the player
sound.enabledtruePlay sound when skin changes
sound.value"ENTITY_PLAYER_TELEPORT, 0.7"Sound to play (format: SOUND_NAME, volume)
proxyMode.detectionAUTOProxy detection: AUTO, ENABLED, or DISABLED
proxyMode.apitrueEnable API on backend servers (requires database)

Proxy settings (Proxy only)

These options apply only to BungeeCord and Velocity proxies.

proxy:
  notAllowedCommandServers:
    enabled: true
    ifNoneBlockCommand: true
    allowList: false
    list:
      - "auth"
OptionDefaultDescription
notAllowedCommandServers.enabledtrueEnable server-based command restrictions
notAllowedCommandServers.ifNoneBlockCommandtrueBlock commands before joining any server
notAllowedCommandServers.allowListfalseIf true, only listed servers allow commands
notAllowedCommandServers.list["auth"]Servers to block/allow commands on

API settings

Configure connections to external APIs.

api:
  mineSkinApiKey: ""
  mineSkinSecretSkins: false
  fetchRecommendedSkins: true
  mojangBatchWindowSeconds: 1
OptionDefaultDescription
mineSkinApiKey(empty)Your MineSkin API key for faster requests
mineSkinSecretSkinsfalseHide generated skins from MineSkin's public gallery
fetchRecommendedSkinstrueLoad curated recommended skins (required for /skin random)
mojangBatchWindowSeconds1Batch window for Mojang API requests to avoid rate limits

Use coupon code SKINSRESTORER10 for 10% off your first three months of MineSkin API plans (except Lite).

GUI settings

Choose what the /skins GUI shows and how it looks.

gui:
  notUnlockedSkin: "c10591e6909e6a281b371836e462d67a2c78fa0952e910f32b41a26c48c1757c"
  customSkins:
    enabled: true
    index: 0
    onlyList: false
    list:
      - "xknat"
      - "pistonmaster"
  playerSkins:
    enabled: false
    index: 1
    onlyList: false
    list: []
  recommendations:
    enabled: true
    index: 2
    onlyList: false
    list:
      - "vampire"
      - "space-suit"
OptionDefaultDescription
notUnlockedSkin(texture hash)Skin shown for locked skins (when using perSkinPermissions)
customSkins.enabledtrueShow custom skins tab in GUI
customSkins.index0Tab order (lower = first)
customSkins.onlyListfalseOnly show skins in the list
customSkins.list["xknat", "pistonmaster"]Skins to show in custom tab
playerSkins.enabledfalseShow online player skins tab
playerSkins.index1Tab order
recommendations.enabledtrueShow recommended skins tab
recommendations.index2Tab order

Advanced settings

CAUTION: These options can cause unexpected behavior. If you do not understand an option, do not change it.

advanced:
  disableOnJoinSkins: false
  enablePaperJoinListener: true
  teleportRefresh: false
  noConnections: false
  playerHeadChatObjects: false
OptionDefaultDescription
disableOnJoinSkinsfalseDo not apply skins when a player joins
enablePaperJoinListenertrueUse Paper's join event for instant skin application
teleportRefreshfalseUse teleport instead of hiding for skin refresh
noConnectionsfalseDisable all web connections (offline mode)
playerHeadChatObjectsfalseShow player heads in chat messages

Debug settings

dev:
  debug: false
OptionDefaultDescription
debugfalseEnable debug logging for API requests and troubleshooting

Who can change skins?

Players use /skin <skin> to change their skin. Use a permissions plugin to control access to this command.

Read Commands and Permissions for setup instructions.

Default skins

By default, SkinsRestorer applies the skin from the player's Minecraft account. Players without an account skin receive a Steve skin.

Default skins apply only to players who have not selected a skin with /skin <skin>.

Use storage.defaultSkins in config.yml to select the default skins.

If applyForPremium is true, default skins also replace skins from Minecraft accounts.

Disabled skins

Add blocked skin names to commands.disabledSkins in config.yml.

Use this option to block inappropriate skins or reserved names.

Permissions per skin

By default, /skin <skin> can apply any available skin.

To restrict a skin, add it to commands.perSkinPermissions in config.yml. Give players skinsrestorer.skin.<name> for each listed skin that they can use.

How is this guide?

Last updated on

On this page