Tags
Creators
Details
Licensed ARR
Published last month
Updated 3 days ago
All versions
1.1.5
Release
DynamicSkins 1.1.52 months ago 75
Compatibility
Minecraft: Java Edition
1.20.1
Platform
Fabric
Supported environments
Client and server
Required content
Changes
DynamicSkins 1.1.5
Added
- Added an instance-local skin library.
- Saved skins are stored inside the active launcher profile:
dynamicskins/library/<skin-name>/ - Added separate
skin_normal.pngandskin_mouth.pngstates. - Added support for Default/Steve and Slim/Alex models.
- Added library search, thumbnails, scrolling, rename, and delete controls.
- Added instant skin switching in singleplayer without rejoining the world.
- Added server upload acknowledgements and clearer status messages.
Security
- Removed persistent client-side skin caching.
- Remote player skins are no longer written to the client's disk.
- Removed the packet that allowed clients to request arbitrary player UUIDs.
- The server now pushes skins only for the local player and currently tracked players.
- Remote textures are removed from memory when a player is no longer tracked.
- Temporary transfer data and textures are cleared on disconnect.
- Legacy
dynamicskins/cachefolders are removed automatically without affecting the local skin library. - Added strict packet size, chunk count, index, duplicate, timeout, and upload rate validation.
- Added real PNG decoding and dimension validation on both client and server.
- Added path traversal and symbolic-link protection for the local library.
- Added atomic file writes and rollback protection for server-side skin storage.
Changed
- The server remains the authoritative storage location for active player skins.
- Multiplayer skins are synchronized only with players who need to render them.
- Client-side remote skin handling is now memory-only.
- Client and server must both use DynamicSkins 1.1.5 because the network protocol has changed.
Fixed
- Fixed skin changes not appearing immediately in singleplayer.
- Fixed packet and join handlers being registered multiple times after switching worlds.
- Fixed incomplete or reordered chunks being accepted.
- Fixed corrupted or mismatched Normal/Mouth textures being loaded.
- Fixed a server crash during the first skin save caused by a missing backup path.
- Fixed stale textures remaining after players left tracking range.
Storage Format
Local saved skins:
dynamicskins/library/<skin-name>/
├── skin_normal.png
├── skin_mouth.png
└── skin.json
Server-side active skins remain compatible with the existing format:
dynamicskins/<player-uuid>/
├── idle.png
├── talk.png
└── meta.json
Notes
- Install this version on both the server and every participating client.
- The local library is isolated per launcher instance or profile.
- Plasmo Voice remains optional and is used for automatic Normal/Mouth switching.
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle. To learn more about the Modrinth Maven API, click here.
Note: When available, you should use the creator's maven repo instead as it will have transitive dependency information that the Modrinth Maven API does not. You may also end up with duplicate dependencies if you use a mix of Modrinth and non-Modrinth Maven repositories for your dependencies, because the group identifier will be different when served through the Modrinth Maven API.
Maven coordinates:
Version ID:
build.gradle:
repositories {
exclusiveContent {
forRepository {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
// forRepositories(fg.repository) // Uncomment when using ForgeGradle
filter {
includeGroup "maven.modrinth"
}
}
}
// Standard Gradle dependency
dependencies {
implementation "maven.modrinth:RQtFfZ30:eu0WeQbG"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:RQtFfZ30:eu0WeQbG"
}


