CatSkinC is a Minecraft client mod for cloud skin upload, skin history, and live skin sync. It is built with Architectury for Fabric and Forge.
- Upload PNG skins directly in-game.
- Keep local skin history with quick re-select.
- Sync selected skin from API.
- Live updates via SSE (server-sent events).
- Minecraft:
1.20.1 - Loaders:
Fabric,Forge - Java:
17(recommended for Gradle + runtime)
- Fabric:
fabric-apiarchitectury
- Forge:
architectury
common/shared mod logicfabric/Fabric entrypoints and packagingforge/Forge entrypoints and packaging
Windows:
.\gradlew.bat :common:compileJava :fabric:remapJar :forge:remapJarLinux/macOS:
./gradlew :common:compileJava :fabric:remapJar :forge:remapJarOutput jars are generated under each module build/libs/ directory.
- GitHub Actions:
.github/workflows/ci.yml - GitLab CI:
.gitlab-ci.yml - Jenkins:
Jenkinsfile
All pipelines build using Java 17 and run:
:common:compileJava:fabric:compileJava:forge:compileJava:fabric:remapJar:forge:remapJar
Fabric client:
.\gradlew.bat :fabric:runClientForge client:
.\gradlew.bat :forge:runClientClient config file is created at:
<minecraft>/config/catskinc-remake.json
Important values:
apiBaseUrlpathUpload,pathSelect,pathSelected,pathPublic,pathEventstimeoutMsselectedCacheTtlMs,pingCacheTtlMsallowInsecureHttp(defaultfalse, allows only HTTPS except localhost)requestSigningKey(optional shared HMAC key with server)tlsPinSha256(optional SHA-256 public-key pin for HTTPS)allowedAssetHosts(comma/semicolon-separated trusted host[:port] list for absolute texture URLs)maxJsonBytes,maxImageBytes(response guard rails)debugLogging,traceLogging
Sensitive values can be injected without writing to config file:
CATSKINC_REQUEST_SIGNING_KEYCATSKINC_TLS_PIN_SHA256- JVM properties
catskinc.requestSigningKey/catskinc.tlsPinSha256
Security request headers sent by client API calls:
x-catskinc-request-idx-catskinc-content-sha256x-catskinc-timestampx-catskinc-noncex-catskinc-signature
- Build hardening is enabled by default via
harden_build=true(strips Java debug metadata and makes jars reproducible). - To disable for local debugging:
-Pharden_build=false
- This repository contains version-specific mixins for 1.20/1.21 method differences with graceful fallback behavior.
- If you see Architectury transformer instability in IDE run tasks, prefer
:forge:runClient/:fabric:runClientwith JDK 17.
See CONTRIBUTING.md.
See SECURITY.md.
See LICENSE.